Fix for the case of non-existent calibration files
[u/mrichter/AliRoot.git] / ITS / AliITSOnlineSDDInjectors.h
1 #ifndef ALIITSONLINESDDINJECTORS_H
2 #define ALIITSONLINESDDINJECTORS_H
3
4
5 /* $Id$ */
6
7 ///////////////////////////////////////////////////////////////////
8 //                                                               //
9 // Class used for SDD injector analysis                           //
10 // Origin: F.Prino, Torino, prino@to.infn.it                     //
11 //                                                               //
12 ///////////////////////////////////////////////////////////////////
13
14 #include "AliITSOnlineSDD.h"
15
16
17 class TH1F;
18 class TH2F;
19 class TGraphErrors;
20 class AliITSOnlineSDDInjectors : public AliITSOnlineSDD {
21
22  public:
23   AliITSOnlineSDDInjectors();      
24   AliITSOnlineSDDInjectors(Int_t nddl, Int_t ncarlos, Int_t sid);
25   virtual ~AliITSOnlineSDDInjectors();
26
27
28   void SetThresholds(Int_t ilin, Float_t tl, Float_t th){
29     fLowThreshold[ilin]=tl;
30     fHighThreshold[ilin]=th;
31   }
32   void SetMaxNumberOfCellsPerAnode(Int_t maxc=40){
33     fMaxCellsAboveThreshold=maxc;
34   }
35
36   void SetInjLineRange(Int_t jlin, Int_t tbmin, Int_t tbmax){
37     fTbMin[jlin]=tbmin;
38     fTbMax[jlin]=tbmax;
39   }
40   void Set20MHzConfig();
41   void Set40MHzConfig();
42
43   void SetPolDegree(Int_t n){fPolDegree=n;}
44   void SetMinDriftSpeed(Float_t vmin){fMinDriftSpeed=vmin;}
45   void SetMaxDriftSpeed(Float_t vmax){fMaxDriftSpeed=vmax;}
46   void SetMaxDriftSpeedErr(Float_t maxval){
47     fMaxDriftSpeedErr=maxval;
48   }
49   void SetFitLimits(Int_t firstpad,Int_t lastpad){
50     fFirstPadForFit=firstpad;
51     fLastPadForFit=lastpad;
52   }
53   void SetPadStatusCutForFit(Int_t cutval=4){
54     fPadStatusCutForFit=cutval;
55   }
56   void SetDefaults();
57   void SetTimeStep(Double_t tstep) {
58     fTimeStep=tstep;
59   }
60   void SetUseTimeZeroSignal(Bool_t useTZ=kTRUE){
61     fUseTimeZeroSignal=useTZ;
62   }
63   void SetUseLine(Int_t iLine, Bool_t use=kTRUE){
64     if(iLine>=0 && iLine<kInjLines) fUseLine[iLine]=use;
65   }
66   TH1F* GetMeanDriftSpeedVsPadHisto() const;
67   TGraphErrors* GetTimeVsDistGraph(Int_t jpad) const;
68   TGraphErrors* GetDriftSpeedGraph() const;
69   TGraphErrors* GetSelectedDriftSpeedGraph(Int_t minAcceptStatus) const;
70   Double_t* GetDriftSpeedFitParam()const{ return fParam;}
71   Double_t GetDriftSpeed(Int_t jpad) const{return fDriftSpeed[jpad];}
72   Double_t GetDriftSpeedErr(Int_t jpad) const{return fDriftSpeedErr[jpad];}
73   Double_t GetTimeBinZero() const{return fTbZero;}
74
75   Double_t GetTimeStep() const{return fTimeStep;}
76   Int_t GetAnodeNumber(Int_t iInjPad) const;
77   Int_t GetInjPadNumberFromAnode(Int_t nAnode) const;
78   Int_t GetInjPadStatus(Int_t jpad) const;  
79   Int_t GetAnodeStatus(Int_t nAnode) const{
80     Int_t jpad=GetInjPadNumberFromAnode(nAnode);
81     return GetInjPadStatus(jpad);
82   }  
83   Double_t GetCentroid(Int_t jpad, Int_t jlin) const {
84     if(jpad<kInjPads && jlin<kInjLines) return fCentroid[jpad][jlin];
85     else return -9999.;
86   }
87   Bool_t IsInjectorGood(Int_t jpad, Int_t jlin) const {
88     if(jpad<kInjPads && jlin<kInjLines) return fGoodInj[jpad][jlin];
89     else return 0;
90   }
91   void PrintInjectorStatus();
92   void PrintCentroids();
93   void WriteToASCII(Int_t evNumb, UInt_t timeStamp, Int_t optAppend=0);
94   void WriteInjectorStatusToASCII();
95   Bool_t WriteToROOT(TFile *fil) const;
96
97   void Reset();
98   void AnalyzeEvent(TH2F* his);
99   void AddEvent(TH2F* his);
100   void FindGoodInjectors();
101   void FindCentroids();
102   void CalcDriftSpeed(Int_t jpad);
103   void CalcTimeBinZero();
104   void FitDriftSpeedVsAnode();
105   void PolyFit(Int_t degree=3);
106   Double_t GetMeanDriftSpeed(Int_t ipad) const{
107     if(fNEventsInPad[ipad]==0) return 0.;
108     return fSumDriftSpeed[ipad]/(Double_t)fNEventsInPad[ipad];
109   }
110   Double_t GetRMSDriftSpeed(Int_t ipad) const;
111   Double_t GetMeanPadStatusCut(Int_t ipad) const{
112     if(fNEventsInPad[ipad]==0) return 0.;
113     return (Double_t)fSumPadStatusCut[ipad]/(Double_t)fNEventsInPad[ipad];
114   }
115   Double_t GetMeanPadStatus(Int_t ipad) const{
116     if(fNEvents==0) return 0.;
117     return (Double_t)fSumPadStatus[ipad]/(Double_t)fNEvents;
118   }
119
120   void FitMeanDriftSpeedVsAnode();
121
122  protected:
123   void SetPositions();
124  private:
125
126   enum {kInjPads  = 33};
127   enum {kInjLines = 3};
128
129   AliITSOnlineSDDInjectors(const AliITSOnlineSDDInjectors& source);
130   AliITSOnlineSDDInjectors& operator = (const AliITSOnlineSDDInjectors& source);
131   static const Float_t fgkSaturation;        // ADC saturation value (1008)
132   static const Float_t fgkDefaultLThreshold;  // Default for fLowThreshold
133   static const Float_t fgkDefaultLThreshold1;  // Default for fLowThreshold
134   static const Float_t fgkDefaultHThreshold;  // Default for fHighThreshold
135   static const Float_t fgkDefaultHThreshold1;  // Default for fHighThreshold
136   static const Float_t fgkDefaultMinSpeed;   // Default for fMinDriftSpeed
137   static const Float_t fgkDefaultMaxSpeed;   // Default for fMaxDriftSpeed
138   static const Float_t fgkDefaultMaxErr;     // Default for fMaxDriftSpeedErr
139   static const Int_t   fgkDefaultPolDegree;   // Default for fPolDegree
140   static const Float_t fgkDefaultTimeStep;   // Default for fTimeStep
141   static const UShort_t   fgkDefaultTbMin[kInjLines];  // Defaults for fTbMin
142   static const UShort_t   fgkDefaultTbMax[kInjLines];  // Defaults for fTbMax
143
144
145   TH2F* fHisto;                              // histogram of channel counts
146   Double_t fTbZero;                           // Time zero for injector event
147   Double_t fRMSTbZero;                        // Error on time zero 
148   Double_t fPosition[kInjLines];              // Coordinates of injector lines
149   UShort_t fTbMin[kInjLines];                 // Minimum time bin for each line
150   UShort_t fTbMax[kInjLines];                 // Maximum time bin for each line
151   Bool_t fGoodInj[kInjPads][kInjLines];       // array of good injectors
152   Double_t fCentroid[kInjPads][kInjLines];    // array of time bin centroids
153   Double_t fRMSCentroid[kInjPads][kInjLines]; // array of time rms of injectors
154   Double_t fDriftSpeed[kInjPads];             // drift speed  
155   Double_t fDriftSpeedErr[kInjPads];          // error on drift speed
156   Int_t fNEvents;                             // number of events
157   Int_t fNEventsInPad[kInjPads];              // number of events per pad
158   Double_t fSumDriftSpeed[kInjPads];          // drift speed summed over events  
159   Double_t fSumSqDriftSpeed[kInjPads];        // drift speed^2 sum
160   Int_t fSumPadStatus[kInjPads];              // pad status sum
161   Int_t fSumPadStatusCut[kInjPads];           // pad status (> cut) sum
162   
163   Double_t *fParam;                          // parameters of polinomial fit to
164                                              // drift speed vs. anode number
165   Int_t fPolDegree;                  // Degree of polynomial fit
166   Int_t fActualPolDegree;            // Degree actually used (<=fPolDegree)
167   Float_t fMinDriftSpeed;            // Minimum value for drift speed
168   Float_t fMaxDriftSpeed;            // Maximum value for drift speed
169   Float_t fMaxDriftSpeedErr;         // Maximum value for error on drift speed
170   Float_t fLowThreshold[kInjLines];  // Low threshold for injector signal
171   Float_t fHighThreshold[kInjLines]; // High threshold for injector signal
172
173   Bool_t fUseLine[kInjLines];        // Flag to use/not use a line
174   Int_t fFirstPadForFit;             // first injector pad used in fit
175   Int_t fLastPadForFit;              // last injector pad used in fit
176   Int_t fPadStatusCutForFit;         // minimum value of pad status for fit
177
178   Double_t fTimeStep;                // time bin value (25 or 50 ns)
179   Bool_t fUseTimeZeroSignal;         // flag for usage of time zero signal
180                                      // in drift speed calculation
181
182   Int_t fMaxCellsAboveThreshold;     // cut to remove noisy anodes
183
184   ClassDef(AliITSOnlineSDDInjectors,9)
185 };
186 #endif