ROOT logo
#ifndef ALITPCCALIBPULSER_H
#define ALITPCCALIBPULSER_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/////////////////////////////////////////////////////////////////////////////////////////
//                                                                                     //
//                  Implementation of the TPC pulser calibration                       //
//                                                                                     //
/////////////////////////////////////////////////////////////////////////////////////////

#include <TVectorT.h>
#include "AliTPCCalibRawBase.h"
#include <TObjArray.h>
class TH2S;
class TH2F;
class TTreeSRedirector;
class AliTPCCalPad;
class AliTPCROC;
class AliTPCCalROC;
class AliTPCParam;
class AliRawReader;
class TMap;

struct eventHeaderStruct;

class AliTPCCalibPulser : public AliTPCCalibRawBase {

public:
  AliTPCCalibPulser();
  AliTPCCalibPulser(const AliTPCCalibPulser &sig);
  AliTPCCalibPulser(const TMap *config);
  virtual ~AliTPCCalibPulser();
  
  void Reset();
  
  AliTPCCalibPulser& operator = (const  AliTPCCalibPulser &source);
  
  
  virtual Int_t Update(const Int_t isector, const Int_t iRow, const Int_t iPad,
                       const Int_t iTimeBin, const Float_t signal);
  virtual void Analyse();
     //
  AliTPCCalROC* GetCalRocT0 (Int_t sector, Bool_t force=kFALSE);  // get calibration object - sector
  AliTPCCalROC* GetCalRocQ  (Int_t sector, Bool_t force=kFALSE);  // get calibration object - sector
  AliTPCCalROC* GetCalRocRMS(Int_t sector, Bool_t force=kFALSE);  // get calibration object - sector
  AliTPCCalROC* GetCalRocOutliers(Int_t sector, Bool_t force=kFALSE);  // get calibration object - sector
  
  const TObjArray* GetCalPadT0()  const { return &fCalRocArrayT0; }      // get calibration object
  const TObjArray* GetCalPadQ()   const { return &fCalRocArrayQ;  }      // get calibration object
  const TObjArray* GetCalPadRMS() const{ return &fCalRocArrayRMS;}      // get calibration object
  const TObjArray* GetCalPadOutliers() const { return &fCalRocArrayOutliers;}      // get calibration object
  
  TH2S* GetHistoQ  (Int_t sector, Bool_t force=kFALSE);           // get refernce histogram
  TH2S* GetHistoT0 (Int_t sector, Bool_t force=kFALSE);           // get refernce histogram
  TH2S* GetHistoRMS(Int_t sector, Bool_t force=kFALSE);           // get refernce histogram
  
  TH2F* GetHistoTSec();                                        // mean abs time distribution histogram
  
  Float_t GetMeanTimeSector(Int_t sector) const {return fVMeanTimeSector[sector];}
  const TVectorF* GetMeanTimeSectorArray() const {return &fVMeanTimeSector;}
  
  Short_t GetDebugLevel()     const { return fDebugLevel;    }
    //
  void  SetRangeTime (Int_t firstTimeBin, Int_t lastTimeBin) { fFirstTimeBin=firstTimeBin;   fLastTimeBin=lastTimeBin;  } //Set range in which the pulser signal is expected
    //
  void  SetRangeRefQ  (Int_t nBins, Float_t xMin, Float_t xMax){ fNbinsQ   = nBins; fXminQ   = xMin; fXmaxQ   = xMax; }   //Set range for Q reference histograms
  void  SetRangeRefT0 (Int_t nBins, Float_t xMin, Float_t xMax){ fNbinsT0  = nBins; fXminT0  = xMin; fXmaxT0  = xMax; }   //Set range for T0 reference histograms
  void  SetRangeRefRMS(Int_t nBins, Float_t xMin, Float_t xMax){ fNbinsRMS = nBins; fXminRMS = xMin; fXmaxRMS = xMax; }   //Set range for T0 reference histograms
  void  SetRangePeakIntegral(Int_t minus, Int_t plus) { fPeakIntMinus=minus; fPeakIntPlus=plus;}
  
  void  SetDebugLevel(Short_t debug=1){ fDebugLevel = debug;}
  
  void  SetIsZeroSuppressed(Bool_t zs=kTRUE){ fIsZeroSuppressed=zs;}
  
  void  SetPedestalDatabase(AliTPCCalPad * const pedestalTPC, AliTPCCalPad * const padNoiseTPC) {fPedestalTPC = pedestalTPC; fPadNoiseTPC = padNoiseTPC;}
  void  SetOutliers(AliTPCCalPad * const outliers)  {fOutliers = outliers;}
  
  Bool_t GetIsZeroSupperssed() const { return fIsZeroSuppressed; }

  Float_t GetPeakIntegralMinus() const {return fPeakIntMinus;}
  Float_t GetPeakIntegralPlus() const {return fPeakIntPlus;}
  
  void Merge(AliTPCCalibPulser * const sig);
  virtual Long64_t Merge(TCollection * const list);
  
  //
  // Test functions
  TObjArray* TestBinning();
  
protected:
  virtual void ResetEvent();
  virtual void EndEvent();
  
private:
    // reference histogram ranges
  Int_t   fNbinsT0;                 //  Number of bins for T0 reference histogram
  Float_t fXminT0;                  //  xmin   of T0 reference histogram
  Float_t fXmaxT0;                  //  xmax   of T0 reference histogram
  Int_t   fNbinsQ;                  //  Number of bins for T0 reference histogram
  Float_t fXminQ;                   //  xmin   of T0 reference histogram
  Float_t fXmaxQ;                   //  xmax   of T0 reference histogram
  Int_t   fNbinsRMS;                //  Number of bins for T0 reference histogram
  Float_t fXminRMS;                 //  xmin   of T0 reference histogram
  Float_t fXmaxRMS;                 //  xmax   of T0 reference histogram
  Int_t   fPeakIntMinus;            //  Peak integral range for COG determination. Bins used before max bin
  Int_t   fPeakIntPlus;             //  Peak integral range for COG determination. Bins used after max bin
  
  Bool_t  fIsZeroSuppressed;        //  if data is zero suppressed
  
  Int_t     fLastSector;            //! Last sector processed

  AliTPCParam *fParam;              //! TPC information
  
  AliTPCCalPad *fPedestalTPC;       //! Pedestal Information
  AliTPCCalPad *fPadNoiseTPC;       //! Pad noise Information whole TPC
  AliTPCCalPad *fOutliers;          //! Outlier information. Those will not be used for calculating the T0
  AliTPCCalROC *fPedestalROC;       //! Pedestal Information for current ROC
  AliTPCCalROC *fPadNoiseROC;       //! Pad noise Information for current ROC
  
  TObjArray fCalRocArrayT0;         //  Array of AliTPCCalROC class for Time0 calibration
  TObjArray fCalRocArrayQ;          //  Array of AliTPCCalROC class for Charge calibration
  TObjArray fCalRocArrayRMS;        //  Array of AliTPCCalROC class for signal width calibration
  TObjArray fCalRocArrayOutliers;  //  Array of AliTPCCalROC class for signal outliers
  
  TObjArray fHistoQArray;           //  Calibration histograms for Charge distribution
  TObjArray fHistoT0Array;          //  Calibration histograms for Time0  distribution
  TObjArray fHistoRMSArray;         //  Calibration histograms for signal width distribution
  
  TH2F *fHMeanTimeSector;           //  Timing distribution per sector
  TVectorF  fVMeanTimeSector;       //  Mean time per sector from analysis of fHMeanTimeSector
  
  TObjArray fPadTimesArrayEvent;    //! Pad Times for the event, before mean Time0 corrections
  TObjArray fPadQArrayEvent;        //! Charge for the event, only needed for debugging streamer
  TObjArray fPadRMSArrayEvent;      //! Signal width for the event, only needed for debugging streamer
  TObjArray fPadPedestalArrayEvent; //! Signal width for the event, only needed for debugging streamer
  
  Int_t     fCurrentChannel;         //! current channel processed
  Int_t     fCurrentSector;          //! current sector processed
  Int_t     fCurrentRow;             //! current row processed
  Int_t     fCurrentPad;             //! current pad processed
  Float_t   fMaxPadSignal;           //! maximum bin of current pad
  Int_t     fMaxTimeBin;             //! time bin with maximum value
  TVectorF  fPadSignal;              //! signal of current Pad
  Float_t   fPadPedestal;            //! Pedestal Value of current pad
  Float_t   fPadNoise;               //! Noise Value of current pad
  
  TVectorF  fVTime0Offset;          //!  Time0 Offset from preprocessing for each sector;
  TVectorF  fVTime0OffsetCounter;   //!  Time0 Offset from preprocessing for each sector;
  
  
  void   FindPedestal(Float_t part=.6);
  void FindPulserSignal(TVectorD &param, Float_t &qSum);
  
  TH2S* GetHisto(Int_t sector, TObjArray *arr,
                 Int_t nbinsY, Float_t ymin, Float_t ymax,
                 const Char_t *type, Bool_t force);
  
  
  AliTPCCalROC* GetCalRoc(Int_t sector, TObjArray* arr, Bool_t force) const;
  
  TVectorF* GetPadTimesEvent(Int_t sector, Bool_t force=kFALSE);
  
  Bool_t IsEdgePad(Int_t sector, Int_t row, Int_t pad);
  
  void ResetPad();
  void ProcessPad();
  
  
  //debug
  TVectorF* GetPadInfoEvent(Int_t sector, TObjArray *arr, Bool_t force=kFALSE);
  TVectorF* GetPadQEvent(Int_t sector, Bool_t force=kFALSE);
  TVectorF* GetPadRMSEvent(Int_t sector, Bool_t force=kFALSE);
  TVectorF* GetPadPedestalEvent(Int_t sector, Bool_t force=kFALSE);

  
  ClassDef(AliTPCCalibPulser,5)           //Implementation of the TPC pulser calibration
};



#endif

 AliTPCCalibPulser.h:1
 AliTPCCalibPulser.h:2
 AliTPCCalibPulser.h:3
 AliTPCCalibPulser.h:4
 AliTPCCalibPulser.h:5
 AliTPCCalibPulser.h:6
 AliTPCCalibPulser.h:7
 AliTPCCalibPulser.h:8
 AliTPCCalibPulser.h:9
 AliTPCCalibPulser.h:10
 AliTPCCalibPulser.h:11
 AliTPCCalibPulser.h:12
 AliTPCCalibPulser.h:13
 AliTPCCalibPulser.h:14
 AliTPCCalibPulser.h:15
 AliTPCCalibPulser.h:16
 AliTPCCalibPulser.h:17
 AliTPCCalibPulser.h:18
 AliTPCCalibPulser.h:19
 AliTPCCalibPulser.h:20
 AliTPCCalibPulser.h:21
 AliTPCCalibPulser.h:22
 AliTPCCalibPulser.h:23
 AliTPCCalibPulser.h:24
 AliTPCCalibPulser.h:25
 AliTPCCalibPulser.h:26
 AliTPCCalibPulser.h:27
 AliTPCCalibPulser.h:28
 AliTPCCalibPulser.h:29
 AliTPCCalibPulser.h:30
 AliTPCCalibPulser.h:31
 AliTPCCalibPulser.h:32
 AliTPCCalibPulser.h:33
 AliTPCCalibPulser.h:34
 AliTPCCalibPulser.h:35
 AliTPCCalibPulser.h:36
 AliTPCCalibPulser.h:37
 AliTPCCalibPulser.h:38
 AliTPCCalibPulser.h:39
 AliTPCCalibPulser.h:40
 AliTPCCalibPulser.h:41
 AliTPCCalibPulser.h:42
 AliTPCCalibPulser.h:43
 AliTPCCalibPulser.h:44
 AliTPCCalibPulser.h:45
 AliTPCCalibPulser.h:46
 AliTPCCalibPulser.h:47
 AliTPCCalibPulser.h:48
 AliTPCCalibPulser.h:49
 AliTPCCalibPulser.h:50
 AliTPCCalibPulser.h:51
 AliTPCCalibPulser.h:52
 AliTPCCalibPulser.h:53
 AliTPCCalibPulser.h:54
 AliTPCCalibPulser.h:55
 AliTPCCalibPulser.h:56
 AliTPCCalibPulser.h:57
 AliTPCCalibPulser.h:58
 AliTPCCalibPulser.h:59
 AliTPCCalibPulser.h:60
 AliTPCCalibPulser.h:61
 AliTPCCalibPulser.h:62
 AliTPCCalibPulser.h:63
 AliTPCCalibPulser.h:64
 AliTPCCalibPulser.h:65
 AliTPCCalibPulser.h:66
 AliTPCCalibPulser.h:67
 AliTPCCalibPulser.h:68
 AliTPCCalibPulser.h:69
 AliTPCCalibPulser.h:70
 AliTPCCalibPulser.h:71
 AliTPCCalibPulser.h:72
 AliTPCCalibPulser.h:73
 AliTPCCalibPulser.h:74
 AliTPCCalibPulser.h:75
 AliTPCCalibPulser.h:76
 AliTPCCalibPulser.h:77
 AliTPCCalibPulser.h:78
 AliTPCCalibPulser.h:79
 AliTPCCalibPulser.h:80
 AliTPCCalibPulser.h:81
 AliTPCCalibPulser.h:82
 AliTPCCalibPulser.h:83
 AliTPCCalibPulser.h:84
 AliTPCCalibPulser.h:85
 AliTPCCalibPulser.h:86
 AliTPCCalibPulser.h:87
 AliTPCCalibPulser.h:88
 AliTPCCalibPulser.h:89
 AliTPCCalibPulser.h:90
 AliTPCCalibPulser.h:91
 AliTPCCalibPulser.h:92
 AliTPCCalibPulser.h:93
 AliTPCCalibPulser.h:94
 AliTPCCalibPulser.h:95
 AliTPCCalibPulser.h:96
 AliTPCCalibPulser.h:97
 AliTPCCalibPulser.h:98
 AliTPCCalibPulser.h:99
 AliTPCCalibPulser.h:100
 AliTPCCalibPulser.h:101
 AliTPCCalibPulser.h:102
 AliTPCCalibPulser.h:103
 AliTPCCalibPulser.h:104
 AliTPCCalibPulser.h:105
 AliTPCCalibPulser.h:106
 AliTPCCalibPulser.h:107
 AliTPCCalibPulser.h:108
 AliTPCCalibPulser.h:109
 AliTPCCalibPulser.h:110
 AliTPCCalibPulser.h:111
 AliTPCCalibPulser.h:112
 AliTPCCalibPulser.h:113
 AliTPCCalibPulser.h:114
 AliTPCCalibPulser.h:115
 AliTPCCalibPulser.h:116
 AliTPCCalibPulser.h:117
 AliTPCCalibPulser.h:118
 AliTPCCalibPulser.h:119
 AliTPCCalibPulser.h:120
 AliTPCCalibPulser.h:121
 AliTPCCalibPulser.h:122
 AliTPCCalibPulser.h:123
 AliTPCCalibPulser.h:124
 AliTPCCalibPulser.h:125
 AliTPCCalibPulser.h:126
 AliTPCCalibPulser.h:127
 AliTPCCalibPulser.h:128
 AliTPCCalibPulser.h:129
 AliTPCCalibPulser.h:130
 AliTPCCalibPulser.h:131
 AliTPCCalibPulser.h:132
 AliTPCCalibPulser.h:133
 AliTPCCalibPulser.h:134
 AliTPCCalibPulser.h:135
 AliTPCCalibPulser.h:136
 AliTPCCalibPulser.h:137
 AliTPCCalibPulser.h:138
 AliTPCCalibPulser.h:139
 AliTPCCalibPulser.h:140
 AliTPCCalibPulser.h:141
 AliTPCCalibPulser.h:142
 AliTPCCalibPulser.h:143
 AliTPCCalibPulser.h:144
 AliTPCCalibPulser.h:145
 AliTPCCalibPulser.h:146
 AliTPCCalibPulser.h:147
 AliTPCCalibPulser.h:148
 AliTPCCalibPulser.h:149
 AliTPCCalibPulser.h:150
 AliTPCCalibPulser.h:151
 AliTPCCalibPulser.h:152
 AliTPCCalibPulser.h:153
 AliTPCCalibPulser.h:154
 AliTPCCalibPulser.h:155
 AliTPCCalibPulser.h:156
 AliTPCCalibPulser.h:157
 AliTPCCalibPulser.h:158
 AliTPCCalibPulser.h:159
 AliTPCCalibPulser.h:160
 AliTPCCalibPulser.h:161
 AliTPCCalibPulser.h:162
 AliTPCCalibPulser.h:163
 AliTPCCalibPulser.h:164
 AliTPCCalibPulser.h:165
 AliTPCCalibPulser.h:166
 AliTPCCalibPulser.h:167
 AliTPCCalibPulser.h:168
 AliTPCCalibPulser.h:169
 AliTPCCalibPulser.h:170
 AliTPCCalibPulser.h:171
 AliTPCCalibPulser.h:172
 AliTPCCalibPulser.h:173
 AliTPCCalibPulser.h:174
 AliTPCCalibPulser.h:175
 AliTPCCalibPulser.h:176
 AliTPCCalibPulser.h:177
 AliTPCCalibPulser.h:178
 AliTPCCalibPulser.h:179
 AliTPCCalibPulser.h:180
 AliTPCCalibPulser.h:181
 AliTPCCalibPulser.h:182
 AliTPCCalibPulser.h:183