f21246ec4732041d455af9efde570a0bad95dc7b
[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(Float_t tl, Float_t th){
29     fLowThreshold=tl;
30     fHighThreshold=th;
31   }
32   void SetInjLineRange(Int_t jlin, Int_t tbmin, Int_t tbmax){
33     fTbMin[jlin]=tbmin;
34     fTbMax[jlin]=tbmax;
35   }
36   void Set20MHzConfig(){
37     SetInjLineRange(0,10,20);
38     SetInjLineRange(1,50,70);
39     SetInjLineRange(2,100,120);
40     SetTimeStep(50.);
41   }
42   void Set40MHzConfig(){
43     SetInjLineRange(0,20,50);
44     SetInjLineRange(1,90,160);
45     SetInjLineRange(2,170,240);
46     SetTimeStep(25.);
47   }
48   void SetPolDegree(Int_t n){fPolDegree=n;}
49   void SetMinDriftSpeed(Float_t vmin){fMinDriftSpeed=vmin;}
50   void SetMaxDriftSpeed(Float_t vmax){fMaxDriftSpeed=vmax;}
51   void SetMaxDriftSpeedErr(Float_t maxval){
52     fMaxDriftSpeedErr=maxval;
53   }
54   void SetFitLimits(Int_t firstpad,Int_t lastpad){
55     fFirstPadForFit=firstpad;
56     fLastPadForFit=lastpad;
57   }
58   void SetPadStatusCutForFit(Int_t cutval=4){
59     fPadStatusCutForFit=cutval;
60   }
61   void SetDefaults();
62   void SetTimeStep(Double_t tstep) {
63     fTimeStep=tstep;
64   }
65   void SetUseTimeZeroSignal(Bool_t useTZ=kTRUE){
66     fUseTimeZeroSignal=useTZ;
67   }
68   void SetUseLine(Int_t iLine, Bool_t use=kTRUE){
69     if(iLine>=0 && iLine<kInjLines) fUseLine[iLine]=use;
70   }
71   TH1F* GetMeanDriftSpeedVsPadHisto() const;
72   TGraphErrors* GetTimeVsDistGraph(Int_t jpad) const;
73   TGraphErrors* GetDriftSpeedGraph() const;
74   TGraphErrors* GetSelectedDriftSpeedGraph(Int_t minAcceptStatus) const;
75   Double_t* GetDriftSpeedFitParam()const{ return fParam;}
76   Double_t GetDriftSpeed(Int_t jpad) const{return fDriftSpeed[jpad];}
77   Double_t GetDriftSpeedErr(Int_t jpad) const{return fDriftSpeedErr[jpad];}
78   Double_t GetTimeBinZero() const{return fTbZero;}
79
80   Double_t GetTimeStep() const{return fTimeStep;}
81   Int_t GetAnodeNumber(Int_t iInjPad) const;
82   Int_t GetInjPadNumberFromAnode(Int_t nAnode) const;
83   Int_t GetInjPadStatus(Int_t jpad) const;  
84   Int_t GetAnodeStatus(Int_t nAnode) const{
85     Int_t jpad=GetInjPadNumberFromAnode(nAnode);
86     return GetInjPadStatus(jpad);
87   }  
88   Double_t GetCentroid(Int_t jpad, Int_t jlin) const {
89     if(jpad<kInjPads && jlin<kInjLines) return fCentroid[jpad][jlin];
90     else return -9999.;
91   }
92   Bool_t IsInjectorGood(Int_t jpad, Int_t jlin) const {
93     if(jpad<kInjPads && jlin<kInjLines) return fGoodInj[jpad][jlin];
94     else return 0;
95   }
96   void PrintInjectorStatus();
97   void PrintCentroids();
98   void WriteToASCII(Int_t evNumb, UInt_t timeStamp, Int_t optAppend=0);
99   void WriteInjectorStatusToASCII();
100   Bool_t WriteToROOT(TFile *fil) const;
101
102   void Reset();
103   void AnalyzeEvent(TH2F* his);
104   void AddEvent(TH2F* his);
105   void FindGoodInjectors();
106   void FindCentroids();
107   void CalcDriftSpeed(Int_t jpad);
108   void CalcTimeBinZero();
109   void FitDriftSpeedVsAnode();
110   void FitDriftSpeedVsAnodeOld();
111   Double_t GetMeanDriftSpeed(Int_t ipad) const{
112     if(fNEvents==0) return 0.;
113     return fSumDriftSpeed[ipad]/(Double_t)fNEvents;
114   }
115   Double_t GetRMSDriftSpeed(Int_t ipad) const;
116   void FitMeanDriftSpeedVsAnode();
117
118  protected:
119   void SetPositions();
120  private:
121
122   enum {kInjPads  = 33};
123   enum {kInjLines = 3};
124
125   AliITSOnlineSDDInjectors(const AliITSOnlineSDDInjectors& source);
126   AliITSOnlineSDDInjectors& operator = (const AliITSOnlineSDDInjectors& source);
127   static const Float_t fgkSaturation;        // ADC saturation value (1008)
128   static const Float_t fgkDefaultLThreshold;  // Default for fLowThreshold
129   static const Float_t fgkDefaultHThreshold;  // Default for fHighThreshold
130   static const Float_t fgkDefaultMinSpeed;   // Default for fMinDriftSpeed
131   static const Float_t fgkDefaultMaxSpeed;   // Default for fMaxDriftSpeed
132   static const Float_t fgkDefaultMaxErr;     // Default for fMaxDriftSpeedErr
133   static const Int_t   fgkDefaultPolDegree;   // Default for fPolDegree
134   static const Float_t fgkDefaultTimeStep;   // Default for fTimeStep
135   static const UShort_t   fgkDefaultTbMin[kInjLines];  // Defaults for fTbMin
136   static const UShort_t   fgkDefaultTbMax[kInjLines];  // Defaults for fTbMax
137
138
139   TH2F* fHisto;                              // histogram of channel counts
140   Double_t fTbZero;                           // Time zero for injector event
141   Double_t fRMSTbZero;                        // Error on time zero 
142   Double_t fPosition[kInjLines];              // Coordinates of injector lines
143   UShort_t fTbMin[kInjLines];                // Minimum time bin for each line
144   UShort_t fTbMax[kInjLines];                // Maximum time bin for each line
145   Bool_t fGoodInj[kInjPads][kInjLines];      // array of good injectors
146   Double_t fCentroid[kInjPads][kInjLines];    // array of time bin centroids
147   Double_t fRMSCentroid[kInjPads][kInjLines]; // array of time rms of injectors
148   Double_t fDriftSpeed[kInjPads];             // drift speed  
149   Double_t fDriftSpeedErr[kInjPads];          // error on drift speed
150   Int_t fNEvents;                            // number of events
151   Double_t fSumDriftSpeed[kInjPads];          // drift speed summed over events  
152   Double_t fSumSqDriftSpeed[kInjPads];        // drift speed^2 sum
153   
154   Double_t *fParam;                           // parameters of polinomial fit to
155                                              // drift speed vs. anode number
156   Int_t fPolDegree;                   // Degree of polynomial fit
157   Int_t fActualPolDegree;             // Degree actually used (<=fPolDegree)
158   Float_t fMinDriftSpeed;            // Minimum value for drift speed
159   Float_t fMaxDriftSpeed;            // Maximum value for drift speed
160   Float_t fMaxDriftSpeedErr;         // Maximum value for error on drift speed
161   Float_t fLowThreshold;             // Low threshold for injector signal
162   Float_t fHighThreshold;            // High threshold for injector signal
163
164   Bool_t fUseLine[kInjLines];        // Flag to use/not use a line
165   Int_t fFirstPadForFit;             // first injector pad used in fit
166   Int_t fLastPadForFit;              // last injector pad used in fit
167   Int_t fPadStatusCutForFit;         // minimum value of pad status for fit
168
169   Double_t fTimeStep;                 // time bin value (25 or 50 ns)
170   Bool_t fUseTimeZeroSignal;         // flag for usage of time zero signal
171                                      // in drift speed calculation
172
173   ClassDef(AliITSOnlineSDDInjectors,7)
174 };
175 #endif