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

/////////////////////////////////////////////////////////////////////////////////////////
//                                                                                     //
//                  QA checking class                                                  //
//                                                                                     //
/////////////////////////////////////////////////////////////////////////////////////////

#include <TNamed.h>
#include <TString.h>
#include <TH1.h>

class TTree;
class TIterator;
class TGraph;
class TObjArray;
class TVirtualPad;

class AliTPCCalibQAChecker : public TNamed {
public:
  enum { kNQualityFlags=5 };
  enum QualityFlag_t { kNULLFLAG=-1, kINFO, kWARNING, kERROR, kFATAL, kNFLAG };
  enum AlarmType_t   { kMean=0, kBinAny, kBinAll, kNentries};

  AliTPCCalibQAChecker();
  AliTPCCalibQAChecker(const char* name, const char *title);
  
  virtual ~AliTPCCalibQAChecker();
  
  void Process();

  void SetTreeChecker(TTree* &tree)       {fTreePtr=&tree;}
  void SetHistChecker(TH1* &hist)         {fHistPtr=&hist;}
  void SetGraphChecker(TGraph* &graph)    {fGraphPtr=&graph;}
  void SetNumberChecker(Double_t & number) {fNumberPtr=&number;}

  const AliTPCCalibQAChecker* GetSubChecker(const char* name, Bool_t recursive=kTRUE) const;
  AliTPCCalibQAChecker* NextSubChecker();
  Int_t GetNumberOfSubCheckers(Bool_t recursive=kTRUE) const;
  Bool_t HasSubCheckers() const {return GetNumberOfSubCheckers(kFALSE)>0;}
  
  void AddSubChecker(AliTPCCalibQAChecker *alarm);

  //getters
  void GetAlarmThreshold(Double_t &min, Double_t &max, QualityFlag_t quality=kERROR) const {min=fThresMin[quality]; max=fThresMax[quality];}
  //
  const char* GetDrawString() { return fStrDraw.Data(); }
  const char* GetCutsString() { return fStrCuts.Data(); }
  const char* GetDrawOptString() {return fStrDrawOpt.Data(); }
  
  //tree related
  void SetDrawRepresentation(const char *draw, const char* drawOpt="") {fStrDrawRep=draw; fStrDrawRepOpt=drawOpt;}
  void SetDrawAlarm(const char *draw, const char* drawOpt="")          {fStrDraw=draw; fStrDrawOpt=drawOpt;}
  void SetCutString(const char *cutString )                            {fStrCuts=cutString;}

  //general thresholds for the different qualities
  void SetAlarmThreshold(Double_t min, Double_t max, QualityFlag_t quality=kERROR);
  void ResetAlarmThreshold(QualityFlag_t quality);
  void ResetAlarmThresholds();

  //descriptions
  void SetQualityDescription(const char* text, QualityFlag_t quality=kERROR);
  
  //alarm type
  void SetAlarmType(AlarmType_t type) {fAlarmType=type;}
  

  QualityFlag_t GetQuality()      const {return fQualityLevel;}
  Color_t       GetQualityColor() const {return AliTPCCalibQAChecker::QualityColor(fQualityLevel);}
  const char*   GetQualityName()  const {return AliTPCCalibQAChecker::QualityName(fQualityLevel);}
  const char*   GetQualityDescription() const { return QualityDescription(fQualityLevel);}
  
  static const char* QualityName(AliTPCCalibQAChecker::QualityFlag_t quality);
  static Color_t QualityColor(AliTPCCalibQAChecker::QualityFlag_t quality);
  const char* QualityDescription(QualityFlag_t quality) const;
  
  virtual void Draw(Option_t *option="");
  virtual void Print(Option_t *option="") const;  

 private:
  //alarm decision variables
  TTree   **fTreePtr;                    //! Pointer to the Tree pointer
  TH1     **fHistPtr;                    //! Pointer to the hist pointer
  TGraph  **fGraphPtr;                   //! Pointer to the graph pointer
  Double_t *fNumberPtr;                  //! Pointer to number
  TH1      *fHist;                       //! Hist pointer for tree processing

  TIterator *fIterSubCheckers;           //! iterator over sub checkers

  TObjArray *fArrSubCheckers;      //array with checkers to process
  TObjArray *fArrAlarmDescriptions; //array with alarm descriptions
  
  TString fStrDrawRep;             //draw string for representation histogram to visualise
  TString fStrDrawRepOpt;          //draw option for representation histogram
  
  TString fStrDraw;                //draw string for alarm histogram
  TString fStrDrawOpt;             //draw option for alarm histogram

  TString fStrCuts;                //cut string
  
  AlarmType_t fAlarmType;          //type of the alarm
  QualityFlag_t fQualityLevel;     //quality level
  
  TObject* fHistRep;                   //visualised histogram

  Double_t fThresMin[kNQualityFlags];//minimum thresholds
  Double_t fThresMax[kNQualityFlags];//maximum thresholds
  
  void CreateRepresentationHist();
  void ResetRepresentationHist() {if (fHistRep) {delete fHistRep; fHistRep=0x0;}}
  //general processing
  void ProcessTree();
  void ProcessHist();
  void ProcessGraph();
  void ProcessNumber();
  void ProcessSub();
  //special processing
  void ProcessEntries();
  void ProcessMean();
  void ProcessBin();
  //
  void CreateAlarmHist();
  void ResetAlarmHist();
  //
  Int_t DrawInPad(TVirtualPad *pad, Int_t sub=1);
  void DrawSubNodes(Option_t *option);
  void DrawRepresentationHist(const Option_t *option);
  void AddQualityLines(TH1 *hist);
  //
  AliTPCCalibQAChecker(const AliTPCCalibQAChecker &cfg);
  AliTPCCalibQAChecker& operator = (const AliTPCCalibQAChecker &cfg);
  
  QualityFlag_t GetQuality(Double_t value) const;
  QualityFlag_t GetQuality(Int_t n, const Double_t *arr) const;
  
  ClassDef(AliTPCCalibQAChecker,1);
};

//
//inline functions
//

//_________________________________________________________________________
inline AliTPCCalibQAChecker::QualityFlag_t AliTPCCalibQAChecker::GetQuality(Double_t value) const
{
  //
  // check quality of a value
  //

  QualityFlag_t quality=kINFO;
  //loop over Quality levels
  for (Int_t i=(Int_t)kINFO; i<kNQualityFlags; ++i){
    if (fThresMin[i]>=fThresMax[i]) continue;
    if (value<fThresMin[i]||value>fThresMax[i]) quality=(QualityFlag_t)i;
  }
  return quality;
}
//_________________________________________________________________________
inline AliTPCCalibQAChecker::QualityFlag_t AliTPCCalibQAChecker::GetQuality(Int_t n, const Double_t *arr) const
{
  //
  // check quality of an array
  //
  
  QualityFlag_t quality=kINFO;
  //loop over Quality levels
  for (Int_t i=(Int_t)kINFO; i<kNQualityFlags; ++i){
    if (fThresMin[i]>=fThresMax[i]) continue;
    for (Int_t ientry=0; ientry<n; ++ientry){
      Double_t value=arr[ientry];
      if (value<fThresMin[i]||value>fThresMax[i]) quality=(QualityFlag_t)i;
    }
  }
  return quality;
}

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