]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TRD/AliTRDCalibraFillHisto.h
Fix some memory leaks
[u/mrichter/AliRoot.git] / TRD / AliTRDCalibraFillHisto.h
1 #ifndef ALITRDCALIBRAFILLHISTO_H
2 #define ALITRDCALIBRAFILLHISTOs_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5
6 /* $Id$ */
7
8 ///////////////////////////////////////////////////////////////////////////////
9 //                                                                           //
10 //  TRD calibration class for the HLT parameters                             //
11 //                                                                           //
12 ///////////////////////////////////////////////////////////////////////////////
13
14 #ifndef ROOT_TObject
15 #  include <TObject.h>
16 #endif
17 #ifndef ROOT_TLinearFitter
18 #  include <TLinearFitter.h> 
19 #endif
20 #ifndef ROOT_TProfile2D
21 #  include <TProfile2D.h> 
22 #endif
23 #ifndef ROOT_TH2I
24 #  include <TH2I.h> 
25 #endif
26
27 class TProfile2D;
28 class TObjArray;
29 class TH1F;
30 class TH2I;
31 class TH2F;
32 class TH2;
33 class TLinearFitter;
34 class TTreeSRedirector;
35
36 class AliLog;
37 class AliRawReader;
38
39 class AliTRDCalibraMode;
40 class AliTRDCalibraVector;
41 class AliTRDCalibraVdriftLinearFit;
42 class AliTRDrawStreamBase;
43 class AliTRDcluster;
44 class AliTRDtrackV1;
45 class AliTRDtrack;
46 class AliTRDseedV1;
47 class AliTRDmcm;
48 class AliTRDmcmTracklet;
49 class AliTRDgeometry;
50 class AliTRDCalDet;
51 class AliTRDCalROC;
52
53
54 struct eventHeaderStruct;
55
56 class AliTRDCalibraFillHisto : public TObject {
57
58  public: 
59
60   // Instance
61   static AliTRDCalibraFillHisto *Instance();
62   static void Terminate();
63   static void Destroy();
64   void DestroyDebugStreamer();
65
66
67   AliTRDCalibraFillHisto(const AliTRDCalibraFillHisto &c);
68   AliTRDCalibraFillHisto &operator=(const AliTRDCalibraFillHisto &) { return *this; }
69
70   // Functions for initialising and filling with AliTRDtrackV1
71           Bool_t  Init2Dhistos();
72           Bool_t  UpdateHistograms(AliTRDtrack *t);
73           Bool_t  UpdateHistogramsV1(AliTRDtrackV1 *t);
74  
75   // Process events DAQ
76           Int_t   ProcessEventDAQ(AliTRDrawStreamBase *rawStream, Bool_t nocheck = kFALSE);
77           Int_t   ProcessEventDAQ(AliRawReader *rawReader, Bool_t nocheck = kFALSE);
78           Int_t   ProcessEventDAQ(eventHeaderStruct *event, Bool_t nocheck = kFALSE);
79
80           Int_t   ProcessEventDAQV1(AliTRDrawStreamBase *rawStream, Bool_t nocheck = kFALSE);
81           Int_t   ProcessEventDAQV1(AliRawReader *rawReader, Bool_t nocheck = kFALSE);
82           Int_t   ProcessEventDAQV1(eventHeaderStruct *event, Bool_t nocheck = kFALSE);
83
84   // Is Pad on
85           Bool_t   IsPadOn(Int_t detector, Int_t row, Int_t col) const;
86
87   // Functions for write
88           void     Write2d(const Char_t *filename = "TRD.calibration.root", Bool_t append = kFALSE);
89
90   //For the statistics
91           Double_t *StatH(TH2 *ch, Int_t i);
92           Double_t *GetMeanMedianRMSNumberCH();
93           Double_t *GetMeanMedianRMSNumberLinearFitter() const;
94        
95          
96   //
97   // Set of Get the variables
98   //
99
100   // Choice to fill or not the 2D
101           void     SetMcmCorrectAngle(Bool_t mcmcorrectangle = kTRUE)        { fMcmCorrectAngle = mcmcorrectangle;   }
102           void     SetPH2dOn(Bool_t ph2don = kTRUE)                          { fPH2dOn          = ph2don;            }
103           void     SetCH2dOn(Bool_t ch2don = kTRUE)                          { fCH2dOn          = ch2don;            }
104           void     SetPRF2dOn(Bool_t prf2don = kTRUE)                        { fPRF2dOn         = prf2don;           }
105           void     SetHisto2d(Bool_t histo2d = kTRUE)                        { fHisto2d         = histo2d;           }
106           void     SetVector2d(Bool_t vector2d = kTRUE)                      { fVector2d        = vector2d;          }
107           void     SetLinearFitterOn(Bool_t linearfitteron = kTRUE)          { fLinearFitterOn      = linearfitteron;}
108           void     SetLinearFitterDebugOn(Bool_t debug = kTRUE)              { fLinearFitterDebugOn = debug;         }
109                   
110   
111           Bool_t   GetMcmCorrectAngle() const                                { return fMcmCorrectAngle;        }
112           Bool_t   GetPH2dOn() const                                         { return fPH2dOn;                 }
113           Bool_t   GetCH2dOn() const                                         { return fCH2dOn;                 }
114           Bool_t   GetPRF2dOn() const                                        { return fPRF2dOn;                }
115           Bool_t   GetHisto2d() const                                        { return fHisto2d;                }
116           Bool_t   GetVector2d() const                                       { return fVector2d;               }
117           Bool_t   GetLinearFitterOn() const                                 { return fLinearFitterOn;         }
118           Bool_t   GetLinearFitterDebugOn() const                            { return fLinearFitterDebugOn; }
119
120
121   // Get stuff that are filled
122   TH2I            *GetCH2d();
123   TProfile2D      *GetPH2d(Int_t nbtimebin=24, Float_t samplefrequency= 10.0);
124   TProfile2D      *GetPRF2d() const                                          { return fPRF2d;                  } 
125   TObjArray        GetLinearFitterArray() const                              { return fLinearFitterArray;      }
126   TLinearFitter   *GetLinearFitter(Int_t detector, Bool_t force=kFALSE);
127   AliTRDCalibraVdriftLinearFit *GetVdriftLinearFit() const                   { return fLinearVdriftFit;        }
128   
129  
130   // How to fill the 2D
131           void     SetRelativeScale(Float_t relativeScale);                      
132           void     SetThresholdClusterPRF2(Float_t thresholdClusterPRF2)     { fThresholdClusterPRF2 = thresholdClusterPRF2; }
133           void     SetLimitChargeIntegration(Bool_t limitChargeIntegration)  { fLimitChargeIntegration = limitChargeIntegration; }
134           void     SetFillWithZero(Bool_t fillWithZero)                      { fFillWithZero = fillWithZero;   }
135           void     SetNz(Int_t i, Short_t nz);
136           void     SetNrphi(Int_t i, Short_t nrphi);
137           void     SetProcent(Float_t procent)                               { fProcent              = procent;              }
138           void     SetDifference(Short_t difference)                         { fDifference           = difference;           }
139           void     SetNumberClusters(Short_t numberClusters)                 { fNumberClusters       = numberClusters;       }
140           void     SetNumberClustersf(Short_t numberClustersf)               { fNumberClustersf      = numberClustersf;      }
141           void     SetNumberBinCharge(Short_t numberBinCharge)               { fNumberBinCharge      = numberBinCharge;      }
142           void     SetNumberBinPRF(Short_t numberBinPRF)                     { fNumberBinPRF         = numberBinPRF;         }
143           void     SetNumberGroupsPRF(Short_t numberGroupsPRF);
144   
145           Float_t  GetRelativeScale() const                                  { return fRelativeScale;          }
146           Float_t  GetThresholdClusterPRF2() const                           { return fThresholdClusterPRF2;   }
147           Bool_t   GetLimitChargeIntegration() const                         { return fLimitChargeIntegration; }
148           Bool_t   GetFillWithZero() const                                   { return fFillWithZero;           }
149           Float_t  GetProcent() const                                        { return fProcent;                }
150           Short_t  GetDifference() const                                     { return fDifference;             }
151           Short_t  GetNumberClusters() const                                 { return fNumberClusters;         }
152           Short_t  GetNumberClustersf() const                                { return fNumberClustersf;        }
153           Short_t  GetNumberBinCharge() const                                { return fNumberBinCharge;        }
154           Short_t  GetNumberBinPRF() const                                   { return fNumberBinPRF;           }
155           Short_t  GetNumberGroupsPRF() const                                { return fNgroupprf;              }
156           Int_t    *GetEntriesLinearFitter() const                           { return fEntriesLinearFitter;    }
157
158  // Debug
159           void     SetDebugLevel(Short_t level)                              { fDebugLevel = level;           }
160
161   // Vector method
162 AliTRDCalibraVector *GetCalibraVector() const                                { return fCalibraVector;          }   
163   
164  protected:
165
166   // Geometry
167   AliTRDgeometry  *fGeo;                    //! The TRD geometry
168
169   // Choice to fill or not the 2D
170           Bool_t   fMcmCorrectAngle;        // Apply correction due to the mcmtrackletangle in the z direction (only) assuming  from vertex
171           Bool_t   fCH2dOn;                 // Chose to fill the 2D histos or vectors for the relative gain calibration 
172           Bool_t   fPH2dOn;                 // Chose to fill the 2D histos or vectors for the drift velocity and T0
173           Bool_t   fPRF2dOn;                // Chose to fill the 2D histos or vectors for the pad response function calibration
174           Bool_t   fHisto2d;                // Chose to fill the 2D histos
175           Bool_t   fVector2d;               // Chose to fill vectors
176           Bool_t   fLinearFitterOn;         // Method with linear fit for drift velocity
177           Bool_t   fLinearFitterDebugOn;    // Method with linear fit for drift velocity
178
179   // How to fill the 2D
180           Float_t  fRelativeScale;          // Scale of the deposited charge
181           Float_t  fThresholdClusterPRF2;   // Threshold on cluster pad signals
182           Bool_t   fLimitChargeIntegration; // Integration range for the gain calibration
183           Bool_t   fFillWithZero;           // Fill with zero or not the average pulse height
184   // Calibration mode
185           AliTRDCalibraMode *fCalibraMode;  // Calibration mode
186
187   //For debugging
188           TTreeSRedirector          *fDebugStreamer;                 //!Debug streamer
189           Short_t     fDebugLevel;                                   // Flag for debugging
190   //
191   // Internal variables
192   //
193
194   // Fill the 2D histos in the offline tracking
195           Int_t    fDetectorPreviousTrack;  // Change of detector
196           Int_t    fMCMPrevious;            // Change of MCM
197           Int_t    fROBPrevious;            // Change of ROB
198           Short_t  fNumberClusters;         // Minimum number of clusters in the tracklets
199           Short_t  fNumberClustersf;        // Maximum number of clusters in the tracklets
200           Float_t  fProcent;                // Limit to take the info of the most important calibration group if the track goes through 2 groups (CH)
201           Short_t  fDifference;             // Limit to take the info of the most important calibration group if the track goes through 2 groups (CH)
202           Int_t    fNumberTrack;            // How many tracks could be used (Debug for the moment)
203           Int_t    fNumberUsedCh[2];        // How many tracks have been really used for the gain (0, strict; 1 with fProcent)
204           Int_t    fNumberUsedPh[2];        // How many tracks have been really used for the drift velocity (0, strict; 1 with fDifference)
205           Int_t    fTimeMax;                // Number of time bins
206           Float_t  fSf;                     // Sampling frequence
207           Short_t  fNumberBinCharge;        // Number of bins for the gain factor
208           Short_t  fNumberBinPRF;           // Number of bin for the PRF
209           Short_t  fNgroupprf;              // Number of groups in tnp bins for PRF /2.0
210
211   // Variables per tracklet
212           Float_t       *fAmpTotal;                  // Energy deposited in the calibration group by the track
213           Short_t       *fPHPlace;                   // Calibration group of PH
214           Float_t       *fPHValue;                   // PH
215           Bool_t         fGoodTracklet;              // Good tracklet
216           TLinearFitter *fLinearFitterTracklet;      // linear fitter tracklet  
217   //Statistics
218           Int_t         *fEntriesCH;                 // Number of entries CH
219           Int_t         *fEntriesLinearFitter;       // Number of entries LinearFitter
220
221
222   //
223   // Vector method
224   //
225           
226           AliTRDCalibraVector *fCalibraVector; // The vector object
227  
228  
229   // Histograms to store the info from the digits, from the tracklets or from the tracks
230           TProfile2D      *fPH2d;                         // 2D average pulse height
231           TProfile2D      *fPRF2d;                        // 2D PRF
232           TH2I            *fCH2d;                         // 2D deposited charge
233           TObjArray       fLinearFitterArray;             // TObjArray of Linear Fitters for the detectors 
234           AliTRDCalibraVdriftLinearFit *fLinearVdriftFit; // Info Linear Fit
235           
236  // Current calib object: to correct for the database used
237           AliTRDCalDet *fCalDetGain;                      // Current calib object gain
238           AliTRDCalROC *fCalROCGain;                      // Current calib object gain
239            
240   //
241   // A lot of internal functions......
242   //
243   // Create the 2D histo to be filled Online
244           void     CreateCH2d(Int_t nn);
245           void     CreatePH2d(Int_t nn);
246           void     CreatePRF2d(Int_t nn);
247   
248   // Calibration with AliTRDtrackV1
249           void     FillTheInfoOfTheTrackPH();
250           void     FillTheInfoOfTheTrackCH(Int_t nbclusters);
251           Bool_t   FindP1TrackPHtracklet(AliTRDtrack *t, Int_t index0, Int_t index1);
252           Bool_t   FindP1TrackPHtrackletV1(const AliTRDseedV1 *tracklet, Int_t nbclusters);
253           Bool_t   HandlePRFtracklet(AliTRDtrack *t, Int_t index0, Int_t index1);
254           Bool_t   HandlePRFtrackletV1(const AliTRDseedV1 *tracklet, Int_t nbclusters);
255           void     ResetfVariablestracklet();
256           void     StoreInfoCHPHtrack(AliTRDcluster *cl, Double_t dqdl, Int_t *group, Int_t row, Int_t col);
257           void     FillCH2d(Int_t x, Float_t y);
258
259   // Calibration on DAQ
260
261           Int_t    FillDAQ(Double_t phvalue[16][144][36]);
262           Int_t    FillDAQ(AliTRDmcm *mcm);
263           Int_t    TestTracklet( Int_t idet, Int_t row, Int_t iSeed, AliTRDmcm *mcm);
264           Bool_t   UpdateDAQ(Int_t det, Int_t /*row*/, Int_t /*col*/, Int_t timebin, Float_t signal, Int_t nbtimebins);
265           Int_t    UpdateHistogramcm(AliTRDmcmTracklet *trk);
266
267   // row col calibration groups stuff
268           Bool_t   LocalisationDetectorXbins(Int_t detector);
269           Int_t    CalculateTotalNumberOfBins(Int_t i);
270           void     CheckGoodTrackletV0(Int_t detector, Int_t row, Int_t col);
271           void     CheckGoodTrackletV1(AliTRDcluster *cl);
272           Int_t    CalculateCalibrationGroup(Int_t i, Int_t row, Int_t col) const;
273  
274   // LinearFitter
275           void     AnalyseLinearFitter();
276           
277   // Clear
278           void     ClearHistos();
279       
280   // Some basic geometry function
281   virtual Int_t    GetLayer(Int_t d) const;
282   virtual Int_t    GetStack(Int_t d) const;
283   virtual Int_t    GetSector(Int_t d) const;
284           
285           
286   // Instance of this class and so on
287   static  AliTRDCalibraFillHisto *fgInstance;                // Instance
288   static  Bool_t   fgTerminated;                             // If terminated
289
290  private:
291   
292   // This is a singleton, contructor is private!
293   AliTRDCalibraFillHisto();
294   virtual ~AliTRDCalibraFillHisto(); 
295     
296   ClassDef(AliTRDCalibraFillHisto,4)                         // TRD Calibration class
297
298 };
299   
300 #endif
301
302