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

#include <TBits.h>
#include <TH1F.h>
#include <TProfile.h>
#include <TProfile2D.h>
#include "AliRecoParam.h"

#include <TArray.h>

class TH2F;
class TTreeSRedirector;
class AliTPCROC;
class AliTPCCalROC;
class AliTPCRawStreamV3;
class AliRawReader;
class AliTPCAltroMapping;
class AliTPCCalPad;
class TMap;
class TObjArray;
struct eventHeaderStruct;

class AliTPCdataQA : public TH1F {

public:
  AliTPCdataQA();
  AliTPCdataQA(const AliTPCdataQA &ped);
  AliTPCdataQA(const TMap *config);
  virtual ~AliTPCdataQA();

  AliTPCdataQA& operator = (const  AliTPCdataQA &source);
 void  DumpToFile(const Char_t *filename, const Char_t *dir="", Bool_t append=kFALSE);
 void MakeTree(const char *fname="QApad.root") const;

  //
  Bool_t ProcessEvent(AliTPCRawStreamV3 *const rawStreamV3);
  Bool_t ProcessEvent(AliRawReader    *const rawReader);
  Bool_t ProcessEvent(eventHeaderStruct   *const event);

  void   Analyse();
  //
  //
  void SetPedestal(AliTPCCalPad *const pedestalCal){ fPedestal = pedestalCal;}
  void SetNoise(AliTPCCalPad *const noiseCal){ fNoise = noiseCal;}

  void SetMinQMax               (Float_t minQmax  ) { fMinQMax                = minQmax; }
  void SetRequireNeighbouringPad(Bool_t  req=kTRUE) { fRequireNeighbouringPad = req;     }
  
  // DQM methods
  void FillOccupancyProfile();
  void ResetProfiles();


  AliTPCCalPad *GetNoThreshold() const { return fNoThreshold;}
  AliTPCCalPad *GetMaxCharge() const { return fMaxCharge;}
  AliTPCCalPad *GetMeanCharge() const { return fMeanCharge;}
  AliTPCCalPad *GetNLocalMaxima() const { return fNLocalMaxima;}
  AliTPCCalPad *GetOverThreshold10() const { return fOverThreshold10;}
  AliTPCCalPad *GetOverThreshold20() const { return fOverThreshold20;}
  AliTPCCalPad *GetOverThreshold30() const { return fOverThreshold30;}
  AliTPCCalPad *GetNTimeBins() const { return fNTimeBins;}
  AliTPCCalPad *GetNPads() const { return fNPads;}
  AliTPCCalPad *GetTimePosition() const { return fTimePosition;}
  TProfile* GetHistQVsTimeSideA()    const {return fHistQVsTimeSideA;}
  TProfile* GetHistQVsTimeSideC()    const {return fHistQVsTimeSideC;}
  TProfile* GetHistQMaxVsTimeSideA() const {return fHistQMaxVsTimeSideA;}
  TProfile* GetHistQMaxVsTimeSideC() const {return fHistQMaxVsTimeSideC;}
  TH1F*     GetHistOccupancyVsEventConst() const {return fHistOccupancyVsEvent;}
  TH1F*     GetHistNclustersVsEventConst() const {return fHistNclustersVsEvent;}
  TH1F*     GetHistOccupancyVsEvent();
  TH1F*     GetHistNclustersVsEvent();

  // DQM output
  TProfile* GetHistOccVsSector()  const { return fHistOccVsSector; }
  TProfile2D* GetHistOcc2dVsSector() const { return fHistOcc2dVsSector; }
  TProfile* GetHistQVsSector()    const { return fHistQVsSector; }
  TProfile* GetHistQmaxVsSector() const { return fHistQmaxVsSector; }

  //
  AliTPCAltroMapping **GetAltroMapping() const { return fMapping; };
  void  SetAltroMapping(AliTPCAltroMapping **mapp) { fMapping = mapp; };
  //
  //
  Int_t  GetFirstTimeBin() const { return fFirstTimeBin; }
  Int_t  GetLastTimeBin()  const { return fLastTimeBin;  }
  Int_t  GetAdcMin()       const { return fAdcMin;       }
  Int_t  GetAdcMax()       const { return fAdcMax;       }
  Int_t  GetEventCounter() const { return fEventCounter; }
  Bool_t GetIsAnalysed()   const { return fIsAnalysed;   }
  Int_t  GetMaxEvents()      const { return fMaxEvents;     }
  Int_t  GetEventsPerBin()   const { return fEventsPerBin;  }
  Int_t  GetSignalCounter()  const { return fSignalCounter; }
  Int_t  GetClusterCounter() const { return fClusterCounter;}

  Float_t GetMinQMax()                const { return fMinQMax;                }
  Bool_t  GetRequireNeighbouringPad() const { return fRequireNeighbouringPad; }
  
  // DQM getter
  Bool_t    GetIsDQM() const { return fIsDQM; }

  void  SetRangeTime(Int_t tMin, Int_t tMax){ fFirstTimeBin=tMin; fLastTimeBin=tMax;}  // Set time bin range that is used for the pedestal calibration
  void  SetRangeAdc (Int_t aMin, Int_t aMax){ fAdcMin=aMin; fAdcMax=aMax; }  // Set adc range for the pedestal calibration
  void  SetMaxEvents   (Int_t value) { fMaxEvents = value; }
  void  SetEventsPerBin(Int_t value) { fEventsPerBin = value; }
  
  // DQM setter
  void  SetIsDQM(Bool_t value) { fIsDQM = value; }

  void ResetData();

  void SetChamberStatus(UInt_t roc, Bool_t status) { fActiveChambers.SetBitNumber(roc,status); }
  Bool_t GetChamberStatus(UInt_t roc) {return fActiveChambers.TestBitNumber(roc);}
private:
  Int_t Update(const Int_t iSector, const Int_t iRow, const Int_t iPad,
	       const Int_t iTimeBin, Float_t signal,
	       const Int_t iPatch=-1, const Int_t iBranch=-1);
  void  FindLocalMaxima(const Int_t iSector);

  void MakeArrays();                // Create arrays for random data acces
  void CleanArrays();               // Clean arrays for random data acces
  void SetExpandDigit(const Int_t iRow, Int_t iPad, Int_t iTimeBin, 
		      const Float_t signal); // Fill arrays with signals
  void GetPadAndTimeBin(Int_t bin, Int_t& iPad, Int_t& iTimeBin); // Get pad and time bin corresponding to the 1d bin
  Float_t GetQ(const Float_t* adcArray, const Int_t time,
	       const Int_t pad, const Int_t maxTimeBins, 
	       Int_t& timeMin,Int_t& timeMax,Int_t& padMin,Int_t& padMax) const;
  void UpdateEventHistograms();

  void Init();

  TObjArray *ConfigArrRocs(TObjArray *arr, const Text_t* name);

  Int_t fFirstTimeBin;              //  First Time bin needed for analysis
  Int_t fLastTimeBin;               //  Last Time bin needed for analysis
  Int_t fAdcMin;                    //  min adc channel of pedestal value
  Int_t fAdcMax;                    //  max adc channel of pedestal value
  Float_t fMinQMax;                 //  Minimun charge for Maximum ADC in cluster
  Bool_t fRequireNeighbouringPad;   //  If clusterer should require a neighbouring pad to accept it
  

  AliTPCAltroMapping **fMapping;    //! Altro Mapping object
  //
  //
  AliTPCCalPad * fPedestal;         //! option to set pedestal cal object
  AliTPCCalPad * fNoise;            //! option to set noise cal object
  AliTPCCalPad * fNLocalMaxima;     // local maximas found
  AliTPCCalPad * fMaxCharge;        // max charge
  AliTPCCalPad * fMeanCharge;       // mean charge
  AliTPCCalPad * fNoThreshold;      // number of digits
  AliTPCCalPad * fNTimeBins;        // timebins width of cluster
  AliTPCCalPad * fNPads;            // pads with of cluster
  AliTPCCalPad * fTimePosition;     // Time position of local maximum
  AliTPCCalPad * fOverThreshold10;  //! local maxima with qMax over threshold
  AliTPCCalPad * fOverThreshold20;  //! local maxima with qMax over threshold
  AliTPCCalPad * fOverThreshold30;  //! local maxima with qMax over threshold

  TProfile* fHistQVsTimeSideA;      // Q vs time (side A)
  TProfile* fHistQVsTimeSideC;	    // Q vs time (side C)
  TProfile* fHistQMaxVsTimeSideA;   // QMax vs time (side A)
  TProfile* fHistQMaxVsTimeSideC;   // QMax vs time (side C)

  TH1F* fHistOccupancyVsEvent;      // Occupancy vs event number (~time)
  TH1F* fHistNclustersVsEvent;      // Nclusters vs event number (~time)

  Int_t   fEventCounter;            // event Counter
  Bool_t  fIsAnalysed;              // Set to true after Analyse has been called

  Int_t fMaxEvents;                 // Max events for event histograms
  Int_t fEventsPerBin;              // Events per bin for event histograms
  Int_t fSignalCounter;             // Signal counter
  Int_t fClusterCounter;            // Cluster counter

  TBits fActiveChambers;           // configured ROCs

  //
  //  Expand buffer
  //
  Float_t** fAllBins;              //! array for digit using random access
  Int_t**   fAllSigBins;           //! array of pointers to the indexes over threshold
  Int_t*    fAllNSigBins;          //! 
  Int_t fRowsMax;                  //!  Maximum number of time bins
  Int_t fPadsMax;                  //!  Maximum number of time bins
  Int_t fTimeBinsMax;              //!  Maximum number of time bins

  // DQM variables
  Bool_t fIsDQM;                   //!  Is DQM -> Simple output (no 2D!)
  TProfile* fHistOccVsSector;      //!  Occ vs sector (for DQM only)
  TProfile2D* fHistOcc2dVsSector;  //!  Occ vs sector 2D (for DQM only)
  TProfile* fHistQVsSector;        //!  Q vs sector (for DQM only)
  TProfile* fHistQmaxVsSector;     //!  QMax vs sector (for DQM only)
  TArrayD* fOccVec;                //!  Occupancy help counter for DQM
  TArrayD* fOccMaxVec;             //!  Occupancy help normlization for DQM
  TArrayD* fOccVecFine;            //!  "2D" occupancy help counter for DQM
  TArrayD* fOccMaxVecFine;         //!  "2D" occupancy help normlization for DQM
  

  ClassDef(AliTPCdataQA, 6)  // Implementation of the TPC Raw QA
};



#endif

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