make the update of the period level QA safe (by running in a temp location and only...
[u/mrichter/AliRoot.git] / TPC / Base / AliTPCCalibPulser.h
1 #ifndef ALITPCCALIBPULSER_H
2 #define ALITPCCALIBPULSER_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5
6 /////////////////////////////////////////////////////////////////////////////////////////
7 //                                                                                     //
8 //                  Implementation of the TPC pulser calibration                       //
9 //                                                                                     //
10 /////////////////////////////////////////////////////////////////////////////////////////
11
12 #include <TVectorT.h>
13 #include "AliTPCCalibRawBase.h"
14 #include <TObjArray.h>
15 class TH2S;
16 class TH2F;
17 class TTreeSRedirector;
18 class AliTPCCalPad;
19 class AliTPCROC;
20 class AliTPCCalROC;
21 class AliTPCParam;
22 class AliRawReader;
23 class TMap;
24
25 struct eventHeaderStruct;
26
27 class AliTPCCalibPulser : public AliTPCCalibRawBase {
28
29 public:
30   AliTPCCalibPulser();
31   AliTPCCalibPulser(const AliTPCCalibPulser &sig);
32   AliTPCCalibPulser(const TMap *config);
33   virtual ~AliTPCCalibPulser();
34   
35   void Reset();
36   
37   AliTPCCalibPulser& operator = (const  AliTPCCalibPulser &source);
38   
39   
40   virtual Int_t Update(const Int_t isector, const Int_t iRow, const Int_t iPad,
41                        const Int_t iTimeBin, const Float_t signal);
42   virtual void Analyse();
43      //
44   AliTPCCalROC* GetCalRocT0 (Int_t sector, Bool_t force=kFALSE);  // get calibration object - sector
45   AliTPCCalROC* GetCalRocQ  (Int_t sector, Bool_t force=kFALSE);  // get calibration object - sector
46   AliTPCCalROC* GetCalRocRMS(Int_t sector, Bool_t force=kFALSE);  // get calibration object - sector
47   AliTPCCalROC* GetCalRocOutliers(Int_t sector, Bool_t force=kFALSE);  // get calibration object - sector
48   
49   const TObjArray* GetCalPadT0()  const { return &fCalRocArrayT0; }      // get calibration object
50   const TObjArray* GetCalPadQ()   const { return &fCalRocArrayQ;  }      // get calibration object
51   const TObjArray* GetCalPadRMS() const{ return &fCalRocArrayRMS;}      // get calibration object
52   const TObjArray* GetCalPadOutliers() const { return &fCalRocArrayOutliers;}      // get calibration object
53   
54   TH2S* GetHistoQ  (Int_t sector, Bool_t force=kFALSE);           // get refernce histogram
55   TH2S* GetHistoT0 (Int_t sector, Bool_t force=kFALSE);           // get refernce histogram
56   TH2S* GetHistoRMS(Int_t sector, Bool_t force=kFALSE);           // get refernce histogram
57   
58   TH2F* GetHistoTSec();                                        // mean abs time distribution histogram
59   
60   Float_t GetMeanTimeSector(Int_t sector) const {return fVMeanTimeSector[sector];}
61   const TVectorF* GetMeanTimeSectorArray() const {return &fVMeanTimeSector;}
62   
63   Short_t GetDebugLevel()     const { return fDebugLevel;    }
64     //
65   void  SetRangeTime (Int_t firstTimeBin, Int_t lastTimeBin) { fFirstTimeBin=firstTimeBin;   fLastTimeBin=lastTimeBin;  } //Set range in which the pulser signal is expected
66     //
67   void  SetRangeRefQ  (Int_t nBins, Float_t xMin, Float_t xMax){ fNbinsQ   = nBins; fXminQ   = xMin; fXmaxQ   = xMax; }   //Set range for Q reference histograms
68   void  SetRangeRefT0 (Int_t nBins, Float_t xMin, Float_t xMax){ fNbinsT0  = nBins; fXminT0  = xMin; fXmaxT0  = xMax; }   //Set range for T0 reference histograms
69   void  SetRangeRefRMS(Int_t nBins, Float_t xMin, Float_t xMax){ fNbinsRMS = nBins; fXminRMS = xMin; fXmaxRMS = xMax; }   //Set range for T0 reference histograms
70   void  SetRangePeakIntegral(Int_t minus, Int_t plus) { fPeakIntMinus=minus; fPeakIntPlus=plus;}
71   
72   void  SetDebugLevel(Short_t debug=1){ fDebugLevel = debug;}
73   
74   void  SetIsZeroSuppressed(Bool_t zs=kTRUE){ fIsZeroSuppressed=zs;}
75   
76   void  SetPedestalDatabase(AliTPCCalPad * const pedestalTPC, AliTPCCalPad * const padNoiseTPC) {fPedestalTPC = pedestalTPC; fPadNoiseTPC = padNoiseTPC;}
77   void  SetOutliers(AliTPCCalPad * const outliers)  {fOutliers = outliers;}
78   
79   Bool_t GetIsZeroSupperssed() const { return fIsZeroSuppressed; }
80
81   Float_t GetPeakIntegralMinus() const {return fPeakIntMinus;}
82   Float_t GetPeakIntegralPlus() const {return fPeakIntPlus;}
83   
84   void Merge(AliTPCCalibPulser * const sig);
85   virtual Long64_t Merge(TCollection * const list);
86   
87   //
88   // Test functions
89   TObjArray* TestBinning();
90   
91 protected:
92   virtual void ResetEvent();
93   virtual void EndEvent();
94   
95 private:
96     // reference histogram ranges
97   Int_t   fNbinsT0;                 //  Number of bins for T0 reference histogram
98   Float_t fXminT0;                  //  xmin   of T0 reference histogram
99   Float_t fXmaxT0;                  //  xmax   of T0 reference histogram
100   Int_t   fNbinsQ;                  //  Number of bins for T0 reference histogram
101   Float_t fXminQ;                   //  xmin   of T0 reference histogram
102   Float_t fXmaxQ;                   //  xmax   of T0 reference histogram
103   Int_t   fNbinsRMS;                //  Number of bins for T0 reference histogram
104   Float_t fXminRMS;                 //  xmin   of T0 reference histogram
105   Float_t fXmaxRMS;                 //  xmax   of T0 reference histogram
106   Int_t   fPeakIntMinus;            //  Peak integral range for COG determination. Bins used before max bin
107   Int_t   fPeakIntPlus;             //  Peak integral range for COG determination. Bins used after max bin
108   
109   Bool_t  fIsZeroSuppressed;        //  if data is zero suppressed
110   
111   Int_t     fLastSector;            //! Last sector processed
112
113   AliTPCParam *fParam;              //! TPC information
114   
115   AliTPCCalPad *fPedestalTPC;       //! Pedestal Information
116   AliTPCCalPad *fPadNoiseTPC;       //! Pad noise Information whole TPC
117   AliTPCCalPad *fOutliers;          //! Outlier information. Those will not be used for calculating the T0
118   AliTPCCalROC *fPedestalROC;       //! Pedestal Information for current ROC
119   AliTPCCalROC *fPadNoiseROC;       //! Pad noise Information for current ROC
120   
121   TObjArray fCalRocArrayT0;         //  Array of AliTPCCalROC class for Time0 calibration
122   TObjArray fCalRocArrayQ;          //  Array of AliTPCCalROC class for Charge calibration
123   TObjArray fCalRocArrayRMS;        //  Array of AliTPCCalROC class for signal width calibration
124   TObjArray fCalRocArrayOutliers;  //  Array of AliTPCCalROC class for signal outliers
125   
126   TObjArray fHistoQArray;           //  Calibration histograms for Charge distribution
127   TObjArray fHistoT0Array;          //  Calibration histograms for Time0  distribution
128   TObjArray fHistoRMSArray;         //  Calibration histograms for signal width distribution
129   
130   TH2F *fHMeanTimeSector;           //  Timing distribution per sector
131   TVectorF  fVMeanTimeSector;       //  Mean time per sector from analysis of fHMeanTimeSector
132   
133   TObjArray fPadTimesArrayEvent;    //! Pad Times for the event, before mean Time0 corrections
134   TObjArray fPadQArrayEvent;        //! Charge for the event, only needed for debugging streamer
135   TObjArray fPadRMSArrayEvent;      //! Signal width for the event, only needed for debugging streamer
136   TObjArray fPadPedestalArrayEvent; //! Signal width for the event, only needed for debugging streamer
137   
138   Int_t     fCurrentChannel;         //! current channel processed
139   Int_t     fCurrentSector;          //! current sector processed
140   Int_t     fCurrentRow;             //! current row processed
141   Int_t     fCurrentPad;             //! current pad processed
142   Float_t   fMaxPadSignal;           //! maximum bin of current pad
143   Int_t     fMaxTimeBin;             //! time bin with maximum value
144   TVectorF  fPadSignal;              //! signal of current Pad
145   Float_t   fPadPedestal;            //! Pedestal Value of current pad
146   Float_t   fPadNoise;               //! Noise Value of current pad
147   
148   TVectorF  fVTime0Offset;          //!  Time0 Offset from preprocessing for each sector;
149   TVectorF  fVTime0OffsetCounter;   //!  Time0 Offset from preprocessing for each sector;
150   
151   
152   void   FindPedestal(Float_t part=.6);
153   void FindPulserSignal(TVectorD &param, Float_t &qSum);
154   
155   TH2S* GetHisto(Int_t sector, TObjArray *arr,
156                  Int_t nbinsY, Float_t ymin, Float_t ymax,
157                  const Char_t *type, Bool_t force);
158   
159   
160   AliTPCCalROC* GetCalRoc(Int_t sector, TObjArray* arr, Bool_t force) const;
161   
162   TVectorF* GetPadTimesEvent(Int_t sector, Bool_t force=kFALSE);
163   
164   Bool_t IsEdgePad(Int_t sector, Int_t row, Int_t pad);
165   
166   void ResetPad();
167   void ProcessPad();
168   
169   
170   //debug
171   TVectorF* GetPadInfoEvent(Int_t sector, TObjArray *arr, Bool_t force=kFALSE);
172   TVectorF* GetPadQEvent(Int_t sector, Bool_t force=kFALSE);
173   TVectorF* GetPadRMSEvent(Int_t sector, Bool_t force=kFALSE);
174   TVectorF* GetPadPedestalEvent(Int_t sector, Bool_t force=kFALSE);
175
176   
177   ClassDef(AliTPCCalibPulser,5)           //Implementation of the TPC pulser calibration
178 };
179
180
181
182 #endif
183