Updates by Ionut
[u/mrichter/AliRoot.git] / PWGPP / TRD / AliTRDcheckESD.h
index 62f2ad97e3c3cfd4b5cb72e28c1d6fd80f2a7c33..e5172e8d63df28391cc5ee0a5a89b0d6ef624687 100644 (file)
-#ifndef ALITRDCHECKESD_H\r
-#define ALITRDCHECKESD_H\r
-/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
- * See cxx source for full Copyright notice                               */\r
-\r
-/* $Id: AliTRDcheckESD.h 27496 2008-07-22 08:35:45Z cblume $ */\r
-\r
-/////////////////////////////////////////////////////\r
-//\r
-// Check basic detector results at ESD level\r
-//\r
-// Author\r
-//   Alex Bercuci <A.Bercuci@gsi.de>\r
-//\r
-//////////////////////////////////////////////////////\r
-\r
-#ifndef ALIANALYSISTASK_H\r
-#include "AliAnalysisTaskSE.h"\r
-#endif\r
-\r
-class AliESDEvent;\r
-class AliMCEvent;\r
-class AliESDpid;\r
-class AliCFContainer;\r
-class AliAnalysisCuts;\r
-class TH1;\r
-class TH2;\r
-class TH1F;\r
-class TH1D;\r
-class TH2F;\r
-class TH3F;\r
-class TH3;\r
-class TObjArray;\r
-class TGraph;\r
-class TGraphErrors;\r
-class TAxis;\r
-\r
-class AliTRDcheckESD : public AliAnalysisTaskSE {\r
-public:\r
-  enum ETRDcheckESDstatus {\r
-     kMC        = BIT(0)  // use MC info\r
-    ,kCollision = BIT(1)  // \r
-  };\r
-  enum ETRDcheckESDhistos {\r
-    kNCl = 1                // number of clusters per track\r
-   ,kTRDstat                // TRD tracks status\r
-   ,kTRDmom                 // TRD track momentum\r
-   ,kPtRes                  // Pt resolution @ vertex for TRD\r
-   ,kTPCVertex              // event vertex from TPC\r
-   ,kEventVertex            // event vertex\r
-   ,kNTracksAll             // ntracks - all\r
-   ,kNTracksAcc             // ntracks - inside acc. and DCA cut\r
-   ,kNTracksTPC             // additional cut on number of TPC clusters\r
-   ,kDCAxy                  // transverse DCA \r
-   ,kDCAz                   // z - DCA\r
-   ,kPt1                    // Pt distribution, eta and ptmin cuts\r
-   ,kPt2                    // Pt distribution, cuts from kPt1 and DCA cuts\r
-   ,kPt3pos                 // Pt distribution, cuts from kPt2 and cut on TPC clusters for positives (>100)\r
-   ,kPt3neg                 // Pt distribution, cuts from kPt2 and cut on TPC clusters for negatives (>100)\r
-   ,kPt4pos                 // Pt distribution, cuts from kPt3pos and at least one TRD tracklet\r
-   ,kPt4neg                 // Pt distribution, cuts from kPt3neg and at least one TRD tracklet\r
-   ,kTheta                  // distribution of theta for tracks passing the cuts from kPt4pos and kPt4neg\r
-   ,kPhi                    // distribution of phi for tracks passing the cuts from kPt4pos and kPt4neg\r
-   ,kNTPCCl                 // number of TPC clusters, cuts from kPt2\r
-   ,kNTPCCl2                // number of TPC clusters, cuts from kPt2 + pt>1 GeV/c\r
-   ,kTPCDedx                // TPC dE/dx, cuts from kPt3pos or kPt3neg\r
-   ,kEtaPhi                 // (eta,phi) distrib. for tracks after the cuts from kPt3pos or kPt3neg\r
-   ,kEtaNclsTPC             // (TPC_Ncls,eta) distrib. for tracks after the cuts from kPt3pos or kPt3neg\r
-   ,kPhiNclsTPC             // (TPC_Ncls,phi) distrib. for tracks after the cuts from kPt3pos or kPt3neg\r
-   ,kSPDMult                // SPD multiplicity\r
-   ,kNTrackletsTRD          // (TRD tracklets per track, P) distribution, after cuts from kPt4pos or kPt4neg\r
-   ,kNClsTrackTRD=kNTrackletsTRD+6    // (TRD clusters per track, P) distribution, after cuts from kPt4pos or kPt4neg\r
-   ,kPHSlice=kNClsTrackTRD+6         // (slicePH,sliceNo) distribution, after cuts from kPt4pos or kPt4neg\r
-   ,kPHSliceTPCpions=kPHSlice+6      // (slicePH,sliceNo) distribution for TPC pions, after cuts from kPt4pos or kPt4neg \r
-   ,kTPCdedxPions=kPHSliceTPCpions+6     // (TPC dedx,P) for selected TPC pions\r
-   ,kPHSliceTPCelectrons=kTPCdedxPions+6    // (slicePH,sliceNo) distribution for TPC electrons, after cuts from kPt4pos or kPt4neg\r
-   ,kTPCdedxElectrons=kPHSliceTPCelectrons+6   // (TPC dedx,P) for selected TPC electrons\r
-   ,kQtotP=kTPCdedxElectrons+6              // (total Q from slices, momentum) distribution, after cuts from kPt4pos or kPt4neg\r
-   ,kPropagXYvsP=kQtotP+6       // (X,Y,momentum) distribution after AliESDtrack::PropagateTo(r=300.)\r
-   ,kPropagRZvsP            // (R,Z,momentum) distribution after AliESDtrack::PropagateTo(r=300.)\r
-   ,kTPCRefTracksPos        // (eta,detector phi,Pt) distribution of reference TPC positive tracks (fulfill cuts from kPt3pos)\r
-   ,kTPCRefTracksNeg=kTPCRefTracksPos+6    // (eta,detector phi,Pt) distribution of reference TPC negative tracks (fulfill cuts from kPt3neg)\r
-   ,kTRDRefTracksPos=kTPCRefTracksNeg+6        // (eta,detector phi,Pt) distribution of reference TRD positive tracks (fulfill cuts from kPt4pos)\r
-   ,kTRDRefTracksNeg=kTRDRefTracksPos+6        // (eta,detector phi,Pt) distribution of reference TRD negative tracks (fulfill cuts from kPt4neg)\r
-   ,kTRDRefTracksPos4=kTRDRefTracksNeg+6        // (eta,detector phi,Pt) distribution of reference TRD positive tracks with 4 tracklets (fulfill cuts from kPt4pos)\r
-   ,kTRDRefTracksNeg4=kTRDRefTracksPos4+6        // (eta,detector phi,Pt) distribution of reference TRD negative tracks with 4 tracklets (fulfill cuts from kPt4neg)\r
-   ,kTRDRefTracksPos5=kTRDRefTracksNeg4+6\r
-   ,kTRDRefTracksNeg5=kTRDRefTracksPos5+6\r
-   ,kTRDRefTracksPos6=kTRDRefTracksNeg5+6\r
-   ,kTRDRefTracksNeg6=kTRDRefTracksPos6+6\r
-   ,kTRDEtaPhiAvNtrkl=kTRDRefTracksNeg6+6       // (eta, detector phi) profile of average number of tracklets\r
-   ,kTRDEtaDeltaPhiAvNtrkl=kTRDEtaPhiAvNtrkl+6  // (eta, delta-phi) profile of average number of tracklets\r
-                                         // delta-phi is the angle made by the track with the normal to the chamber entrance plane\r
-   ,kTRDEtaPhiAvQtot=kTRDEtaDeltaPhiAvNtrkl+6      // (eta, detector phi) profile of total tracklet charge from slices                     \r
-   ,kTriggerDefs=kTRDEtaPhiAvQtot+36\r
-   ,kMatchingPhiEtaCF\r
-   ,kMatchingPtCF\r
-   ,kBunchCrossingsCF\r
-   ,kCentralityCF\r
-   ,kQtotCF\r
-   ,kPulseHeightCF\r
-   ,kExpertCF\r
-   ,kNhistos      // number of histograms\r
-   ,kNrefs   = 4  // number of reference plots\r
-  };\r
-  enum ETrdCfVariables {\r
-    kEventVtxZ=0,\r
-    kEventMult,\r
-    kEventTrigger,\r
-    kEventBC,\r
-    kTrackTOFBC,\r
-    kTrackDCAxy,\r
-    kTrackDCAz,\r
-    kTrackCharge,\r
-    kTrackPhi,\r
-    kTrackEta,\r
-    kTrackPt,\r
-    kTrackP,\r
-    kTrackTrdTracklets,\r
-    kTrackTrdClusters,\r
-    kTrackPHslice,\r
-    kTrackQtot=kTrackPHslice+8,\r
-    kNTrdCfVariables=kTrackQtot+6,\r
-    kNMaxAssignedTriggers = 50\r
-  };\r
-  enum ETRDcheckESDbits {\r
-    kTPCout = 1 // track left TPC\r
-   ,kTRDin      // track reach TRD fiducial volume\r
-   ,kTRDout     // track reconstructed in TRD\r
-   ,kTRDpid     // PID calculated in TRD\r
-   ,kTRDref     // track refitted in TRD\r
-  };\r
-  \r
-  AliTRDcheckESD();\r
-  AliTRDcheckESD(char* name);\r
-  virtual ~AliTRDcheckESD();\r
-  \r
-  void          UserCreateOutputObjects();\r
-  Bool_t        GetRefFigure(Int_t ifig);\r
-  Int_t         GetNRefFigures() const  { return fNRefFigures; } \r
-  void          UserExec(Option_t *);\r
-\r
-  void          SetRefTrackFilter(AliAnalysisCuts* const filter) {fReferenceTrackFilter = filter;}\r
-  \r
-  Bool_t        HasMC() const { return TESTBIT(fStatus, kMC);}\r
-  Bool_t        IsCollision() const {return TESTBIT(fStatus, kCollision);}\r
-  void          SetCollision(Bool_t set=kTRUE) {set ? SETBIT(fStatus, kCollision) : CLRBIT(fStatus, kCollision);}\r
-  TObjArray*    Histos();\r
-  AliCFContainer* GetMatchingPhiEtaCF() const {return fMatchingPhiEtaCF;}\r
-  AliCFContainer* GetMatchingPtCF() const {return fMatchingPtCF;}\r
-  AliCFContainer* GetBunchCrossingsCF() const {return fBunchCrossingsCF;}\r
-  AliCFContainer* GetCentralityCF() const {return fCentralityCF;}\r
-  AliCFContainer* GetQtotCF() const {return fQtotCF;}\r
-  AliCFContainer* GetPulseHeightCF() const {return fPulseHeightCF;}\r
-  AliCFContainer* GetExpertCF() const {return fExpertCF;}\r
-  Int_t         GetTriggerCounter(const Char_t* triggerName) const;\r
-  void          PrintTriggers() const;\r
-  Bool_t        Load(const Char_t *fn="AnalysisResults.root", const Char_t *dir="TRD_Performance", const Char_t *name=NULL);\r
-  void          SetMC(Bool_t mc = kTRUE) { mc ? SETBIT(fStatus, kMC) : CLRBIT(fStatus, kMC);}\r
-  Bool_t        PutTrendValue(const Char_t *name, Double_t val);\r
-  void          Terminate(Option_t *);\r
-  void          MakeSummary(Double_t* trendValues=0x0);\r
-  void          MakeSummaryFromCF(Double_t* trendValues=0x0, const Char_t* triggerName="", Bool_t useIsolatedBC=kFALSE, Bool_t cutTOFbc=kFALSE);\r
-  //virtual Long64_t Merge(TCollection* list);\r
-  Int_t         GetNAssignedTriggers();\r
-  void          AddUserTrigger(const Char_t* name) {fUserEnabledTriggers += name; fUserEnabledTriggers += ";";}\r
-  \r
-  // configure the expert CF container\r
-  void          AddExpertCFVar(AliTRDcheckESD::ETrdCfVariables var, Int_t nbins, Double_t lowLim, Double_t highLim);\r
-  void          AddExpertCFVar(AliTRDcheckESD::ETrdCfVariables var, const Char_t* bins);\r
-  void          EnableExpertCFStep(Int_t step) {if(step>=0 && step<3) fExpertCFEnabledSteps[step] = kTRUE;}\r
-  \r
-private:\r
-  static const Float_t fgkxTPC; // end radial position of TPC\r
-  static const Float_t fgkxTOF; // start radial position of TOF\r
-  static const UChar_t fgkNgraph[kNrefs]; // number of graphs/ref plot\r
-\r
-  Bool_t PlotTrackingSummary(Int_t centralityClass=1, Double_t* trendValues=0x0);     // 1 <= centralityClass <= 5; 0-all centrality classes together\r
-  Bool_t PlotPidSummary(Int_t centralityClass=1, Double_t* trendValues=0x0);          // 1 <= centralityClass <= 5; 0-all centrality classes together\r
-  Bool_t PlotCentSummary(Double_t* trendValues=0x0);                                  // centrality dependent plots\r
-\r
-  void PlotTrackingSummaryFromCF(Double_t* trendValues=0x0,\r
-                                const Char_t* triggerName="",\r
-                                 Bool_t useIsolatedBC=kFALSE, Bool_t cutTOFbc=kFALSE);   // 1 <= centralityClass <= 5; 0-all centrality classes together\r
-  void PlotPidSummaryFromCF(Double_t* trendValues=0x0,\r
-                           const Char_t* triggerName="",\r
-                            Bool_t useIsolatedBC=kFALSE, Bool_t cutTOFbc=kFALSE);        // 1 <= centralityClass <= 5; 0-all centrality classes together\r
-  void PlotCentSummaryFromCF(Double_t* trendValues=0x0, const Char_t* triggerName="",\r
-                             Bool_t useIsolatedBC=kFALSE, Bool_t cutTOFbc=kFALSE);       // centrality dependent plots\r
-  \r
-  AliTRDcheckESD(const AliTRDcheckESD&);\r
-  AliTRDcheckESD& operator=(const AliTRDcheckESD&);\r
-  Int_t         Pdg2Idx(Int_t pdg) const;\r
-  void          Process(TH1 **h, TGraphErrors *g);\r
-  void          Process2D(TH2 * const h, TGraphErrors **g);\r
-  void          PrintStatus(ULong_t s);\r
-  TH2F*         Proj3D(TH3* hist, TH2* accMap, Int_t binLow, Int_t binHigh, Float_t &entries);\r
-  TH1D*         Proj2D(TH2* hist, TH1* fitErr=0x0);\r
-  TH1F*         EfficiencyTRD(TH3* tpc3D, TH3* trd3D, Bool_t useAcceptance=kTRUE);\r
-  TH1F*         EfficiencyFromPhiPt(AliCFContainer* cf, Int_t minNtrkl, Int_t maxNtrkl, Int_t stepNom, Int_t stepDenom, const Char_t* varStr="pt", const Char_t* type="TPCTRD");\r
-  void          DrawTRDGrid();\r
-  void          SetStyle(TH1* hist, Int_t lineStyle, Int_t lineColor, Int_t lineWidth, \r
-                         Int_t markerStyle, Int_t markerColor, Int_t markerSize);\r
-  void          SetStyle(TAxis* axis, const Char_t* title, Float_t titleSize, Float_t titleOffset, Bool_t centerTitle, \r
-                         Float_t labelSize);\r
-  void          CheckActiveSM(TH1D* phiProj, Bool_t activeSM[18]);\r
-  void          FindIsolatedBCs(TH1D* bcHist, Bool_t isIsolated[3500]);\r
-  void          InitializeCFContainers();\r
-  AliCFContainer* CreateCFContainer(const Char_t* name, const Char_t *title);\r
-  Int_t         GetTriggerIndex(const Char_t* name, Bool_t createNew=kTRUE);\r
-  \r
-  Int_t            fStatus;            // bit mask for controlling the task\r
-  Int_t            fNRefFigures;       // number of current ref plots\r
-  AliESDEvent      *fESD;              //! ESD event\r
-  AliMCEvent       *fMC;               //! MC event\r
-  AliESDpid        *fESDpid;           //  ESD pid object \r
-  TObjArray        *fHistos;           //! QA histos\r
-  TObjArray        *fResults;          // QA graphs\r
-  static FILE      *fgFile;            //! trend file streamer\r
-  \r
-  AliCFContainer*  fExpertCF;          // CF container configured for expert checks\r
-  Int_t            fExpertCFVars[kNTrdCfVariables];\r
-  Bool_t           fExpertCFVarsEnabled[kNTrdCfVariables];\r
-  Int_t            fExpertCFVarNBins[kNTrdCfVariables];\r
-  Double_t         fExpertCFVarRanges[kNTrdCfVariables][2];\r
-  TString          fExpertCFVarBins[kNTrdCfVariables];\r
-  Bool_t           fExpertCFEnabledSteps[3];      // enabled steps 0-TPC; 1-TRD; 2-TOF\r
-  \r
-  AliCFContainer*  fMatchingPhiEtaCF;        // Small CF containers tuned for running over central QA \r
-  Int_t            fMatchingPhiEtaCFVars[kNTrdCfVariables];\r
-  AliCFContainer*  fMatchingPtCF;        // Small CF containers tuned for running over central QA \r
-  Int_t            fMatchingPtCFVars[kNTrdCfVariables];\r
-  AliCFContainer*  fBunchCrossingsCF;  //\r
-  Int_t            fBunchCrossingsCFVars[kNTrdCfVariables];\r
-  AliCFContainer*  fCentralityCF;        // Small CF containers tuned for running over central QA \r
-  Int_t            fCentralityCFVars[kNTrdCfVariables];\r
-  AliCFContainer*  fQtotCF;         //\r
-  Int_t            fQtotCFVars[kNTrdCfVariables];\r
-  AliCFContainer*  fPulseHeightCF;     //\r
-  Int_t            fPulseHeightCFVars[kNTrdCfVariables];\r
-  \r
-  AliAnalysisCuts* fReferenceTrackFilter;     // reference track filter\r
-  Bool_t           fPhysSelTriggersEnabled;   // flag wheter physics selection triggers were enabled\r
-  TString          fUserEnabledTriggers;      // list of user enabled triggers\r
-  Int_t            fNAssignedTriggers;        // number of assigned triggers\r
-    \r
-  // Vertex selection\r
-  static const Float_t fgkEvVertexZ;// cm\r
-  static const Int_t   fgkEvVertexN;// cm\r
-  // Track selection\r
-  static const Float_t fgkTrkDCAxy; // cm\r
-  static const Float_t fgkTrkDCAz;  // cm\r
-  static const Int_t   fgkNclTPC;   // N clusters TPC\r
-  static const Float_t fgkPt;       // min. pt\r
-  static const Float_t fgkEta;      // eta range\r
-  \r
-  static const Float_t fgkQs;      // scale for the total charge\r
-\r
-  ClassDef(AliTRDcheckESD, 9)          // user oriented TRD analysis based on ESD-MC data\r
-};\r
-#endif\r
+#ifndef ALITRDCHECKESD_H
+#define ALITRDCHECKESD_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id: AliTRDcheckESD.h 27496 2008-07-22 08:35:45Z cblume $ */
+
+/////////////////////////////////////////////////////
+//
+// Check basic detector results at ESD level
+//
+// Author
+//   Alex Bercuci <A.Bercuci@gsi.de>
+//
+//////////////////////////////////////////////////////
+
+#ifndef ALIANALYSISTASK_H
+#include "AliAnalysisTaskSE.h"
+#endif
+
+class AliESDEvent;
+class AliMCEvent;
+class AliESDpid;
+class AliCFContainer;
+class AliAnalysisCuts;
+class TH1;
+class TH2;
+class TH1F;
+class TH1D;
+class TH2F;
+class TH3F;
+class TH3;
+class TObjArray;
+class TGraph;
+class TGraphErrors;
+class TAxis;
+
+class AliTRDcheckESD : public AliAnalysisTaskSE {
+public:
+  enum ETRDcheckESDstatus {
+     kMC        = BIT(0)  // use MC info
+    ,kCollision = BIT(1)  // 
+  };
+  enum ETRDcheckESDhistos {
+    kNCl = 1                // number of clusters per track
+   ,kTRDstat                // TRD tracks status
+   ,kTRDmom                 // TRD track momentum
+   ,kPtRes                  // Pt resolution @ vertex for TRD
+   ,kTPCVertex              // event vertex from TPC
+   ,kEventVertex            // event vertex
+   ,kNTracksAll             // ntracks - all
+   ,kNTracksAcc             // ntracks - inside acc. and DCA cut
+   ,kNTracksTPC             // additional cut on number of TPC clusters
+   ,kDCAxy                  // transverse DCA 
+   ,kDCAz                   // z - DCA
+   ,kPt1                    // Pt distribution, eta and ptmin cuts
+   ,kPt2                    // Pt distribution, cuts from kPt1 and DCA cuts
+   ,kPt3pos                 // Pt distribution, cuts from kPt2 and cut on TPC clusters for positives (>100)
+   ,kPt3neg                 // Pt distribution, cuts from kPt2 and cut on TPC clusters for negatives (>100)
+   ,kPt4pos                 // Pt distribution, cuts from kPt3pos and at least one TRD tracklet
+   ,kPt4neg                 // Pt distribution, cuts from kPt3neg and at least one TRD tracklet
+   ,kTheta                  // distribution of theta for tracks passing the cuts from kPt4pos and kPt4neg
+   ,kPhi                    // distribution of phi for tracks passing the cuts from kPt4pos and kPt4neg
+   ,kNTPCCl                 // number of TPC clusters, cuts from kPt2
+   ,kNTPCCl2                // number of TPC clusters, cuts from kPt2 + pt>1 GeV/c
+   ,kTPCDedx                // TPC dE/dx, cuts from kPt3pos or kPt3neg
+   ,kEtaPhi                 // (eta,phi) distrib. for tracks after the cuts from kPt3pos or kPt3neg
+   ,kEtaNclsTPC             // (TPC_Ncls,eta) distrib. for tracks after the cuts from kPt3pos or kPt3neg
+   ,kPhiNclsTPC             // (TPC_Ncls,phi) distrib. for tracks after the cuts from kPt3pos or kPt3neg
+   ,kSPDMult                // SPD multiplicity
+   ,kNTrackletsTRD          // (TRD tracklets per track, P) distribution, after cuts from kPt4pos or kPt4neg
+   ,kNClsTrackTRD=kNTrackletsTRD+6    // (TRD clusters per track, P) distribution, after cuts from kPt4pos or kPt4neg
+   ,kPHSlice=kNClsTrackTRD+6         // (slicePH,sliceNo) distribution, after cuts from kPt4pos or kPt4neg
+   ,kPHSliceTPCpions=kPHSlice+6      // (slicePH,sliceNo) distribution for TPC pions, after cuts from kPt4pos or kPt4neg 
+   ,kTPCdedxPions=kPHSliceTPCpions+6     // (TPC dedx,P) for selected TPC pions
+   ,kPHSliceTPCelectrons=kTPCdedxPions+6    // (slicePH,sliceNo) distribution for TPC electrons, after cuts from kPt4pos or kPt4neg
+   ,kTPCdedxElectrons=kPHSliceTPCelectrons+6   // (TPC dedx,P) for selected TPC electrons
+   ,kQtotP=kTPCdedxElectrons+6              // (total Q from slices, momentum) distribution, after cuts from kPt4pos or kPt4neg
+   ,kPropagXYvsP=kQtotP+6       // (X,Y,momentum) distribution after AliESDtrack::PropagateTo(r=300.)
+   ,kPropagRZvsP            // (R,Z,momentum) distribution after AliESDtrack::PropagateTo(r=300.)
+   ,kTPCRefTracksPos        // (eta,detector phi,Pt) distribution of reference TPC positive tracks (fulfill cuts from kPt3pos)
+   ,kTPCRefTracksNeg=kTPCRefTracksPos+6    // (eta,detector phi,Pt) distribution of reference TPC negative tracks (fulfill cuts from kPt3neg)
+   ,kTRDRefTracksPos=kTPCRefTracksNeg+6        // (eta,detector phi,Pt) distribution of reference TRD positive tracks (fulfill cuts from kPt4pos)
+   ,kTRDRefTracksNeg=kTRDRefTracksPos+6        // (eta,detector phi,Pt) distribution of reference TRD negative tracks (fulfill cuts from kPt4neg)
+   ,kTRDRefTracksPos4=kTRDRefTracksNeg+6        // (eta,detector phi,Pt) distribution of reference TRD positive tracks with 4 tracklets (fulfill cuts from kPt4pos)
+   ,kTRDRefTracksNeg4=kTRDRefTracksPos4+6        // (eta,detector phi,Pt) distribution of reference TRD negative tracks with 4 tracklets (fulfill cuts from kPt4neg)
+   ,kTRDRefTracksPos5=kTRDRefTracksNeg4+6
+   ,kTRDRefTracksNeg5=kTRDRefTracksPos5+6
+   ,kTRDRefTracksPos6=kTRDRefTracksNeg5+6
+   ,kTRDRefTracksNeg6=kTRDRefTracksPos6+6
+   ,kTRDEtaPhiAvNtrkl=kTRDRefTracksNeg6+6       // (eta, detector phi) profile of average number of tracklets
+   ,kTRDEtaDeltaPhiAvNtrkl=kTRDEtaPhiAvNtrkl+6  // (eta, delta-phi) profile of average number of tracklets
+                                         // delta-phi is the angle made by the track with the normal to the chamber entrance plane
+   ,kTRDEtaPhiAvQtot=kTRDEtaDeltaPhiAvNtrkl+6      // (eta, detector phi) profile of total tracklet charge from slices                     
+   ,kTriggerDefs=kTRDEtaPhiAvQtot+36
+   ,kMatchingPhiEtaCF
+   ,kMatchingPtCF
+   ,kBunchCrossingsCF
+   ,kCentralityCF
+   ,kQtotCF
+   ,kPulseHeightCF
+   ,kExpertCF
+   ,kNhistos      // number of histograms
+   ,kNrefs   = 4  // number of reference plots
+  };
+  enum ETrdCfVariables {
+    kEventVtxZ=0,
+    kEventMult,
+    kEventTrigger,
+    kEventBC,
+    kTrackTOFBC,
+    kTrackDCAxy,
+    kTrackDCAz,
+    kTrackCharge,
+    kTrackPhi,
+    kTrackEta,
+    kTrackPt,
+    kTrackP,
+    kTrackTrdTracklets,
+    kTrackTrdClusters,
+    kTrackPHslice,
+    kTrackQtot=kTrackPHslice+8,
+    kNTrdCfVariables=kTrackQtot+6,
+    kNMaxAssignedTriggers = 100
+  };
+  enum ETRDcheckESDbits {
+    kTPCout = 1 // track left TPC
+   ,kTRDin      // track reach TRD fiducial volume
+   ,kTRDout     // track reconstructed in TRD
+   ,kTRDpid     // PID calculated in TRD
+   ,kTRDref     // track refitted in TRD
+  };
+  
+  AliTRDcheckESD();
+  AliTRDcheckESD(char* name);
+  virtual ~AliTRDcheckESD();
+  
+  void          UserCreateOutputObjects();
+  Bool_t        GetRefFigure(Int_t ifig);
+  Int_t         GetNRefFigures() const  { return fNRefFigures; } 
+  void          UserExec(Option_t *);
+
+  void          SetRefTrackFilter(AliAnalysisCuts* const filter) {fReferenceTrackFilter = filter;}
+  
+  Bool_t        HasMC() const { return TESTBIT(fStatus, kMC);}
+  Bool_t        IsCollision() const {return TESTBIT(fStatus, kCollision);}
+  void          SetCollision(Bool_t set=kTRUE) {set ? SETBIT(fStatus, kCollision) : CLRBIT(fStatus, kCollision);}
+  TObjArray*    Histos();
+  AliCFContainer* GetMatchingPhiEtaCF() const {return fMatchingPhiEtaCF;}
+  AliCFContainer* GetMatchingPtCF() const {return fMatchingPtCF;}
+  AliCFContainer* GetBunchCrossingsCF() const {return fBunchCrossingsCF;}
+  AliCFContainer* GetCentralityCF() const {return fCentralityCF;}
+  AliCFContainer* GetQtotCF() const {return fQtotCF;}
+  AliCFContainer* GetPulseHeightCF() const {return fPulseHeightCF;}
+  AliCFContainer* GetExpertCF() const {return fExpertCF;}
+  Int_t         GetTriggerCounter(const Char_t* triggerName) const;
+  void          PrintTriggers() const;
+  Bool_t        Load(const Char_t *fn="AnalysisResults.root", const Char_t *dir="TRD_Performance", const Char_t *name=NULL);
+  void          SetMC(Bool_t mc = kTRUE) { mc ? SETBIT(fStatus, kMC) : CLRBIT(fStatus, kMC);}
+  Bool_t        PutTrendValue(const Char_t *name, Double_t val);
+  void          Terminate(Option_t *);
+  void          MakeSummary(Double_t* trendValues=0x0);
+  void          MakeSummaryFromCF(Double_t* trendValues=0x0, const Char_t* triggerName="", Bool_t useIsolatedBC=kFALSE, Bool_t cutTOFbc=kFALSE);
+  //virtual Long64_t Merge(TCollection* list);
+  Int_t         GetNAssignedTriggers();
+  void          AddUserTrigger(const Char_t* name) {fUserEnabledTriggers += name; fUserEnabledTriggers += ";";}
+  
+  // configure the expert CF container
+  void          AddExpertCFVar(AliTRDcheckESD::ETrdCfVariables var, Int_t nbins, Double_t lowLim, Double_t highLim);
+  void          AddExpertCFVar(AliTRDcheckESD::ETrdCfVariables var, const Char_t* bins);
+  void          EnableExpertCFStep(Int_t step) {if(step>=0 && step<3) fExpertCFEnabledSteps[step] = kTRUE;}
+  
+private:
+  static const Float_t fgkxTPC; // end radial position of TPC
+  static const Float_t fgkxTOF; // start radial position of TOF
+  static const UChar_t fgkNgraph[kNrefs]; // number of graphs/ref plot
+
+  Bool_t PlotTrackingSummary(Int_t centralityClass=1, Double_t* trendValues=0x0);     // 1 <= centralityClass <= 5; 0-all centrality classes together
+  Bool_t PlotPidSummary(Int_t centralityClass=1, Double_t* trendValues=0x0);          // 1 <= centralityClass <= 5; 0-all centrality classes together
+  Bool_t PlotCentSummary(Double_t* trendValues=0x0);                                  // centrality dependent plots
+
+  void PlotTrackingSummaryFromCF(Double_t* trendValues=0x0,
+                                const Char_t* triggerName="",
+                                 Bool_t useIsolatedBC=kFALSE, Bool_t cutTOFbc=kFALSE);   // 1 <= centralityClass <= 5; 0-all centrality classes together
+  void PlotPidSummaryFromCF(Double_t* trendValues=0x0,
+                           const Char_t* triggerName="",
+                            Bool_t useIsolatedBC=kFALSE, Bool_t cutTOFbc=kFALSE);        // 1 <= centralityClass <= 5; 0-all centrality classes together
+  void PlotCentSummaryFromCF(Double_t* trendValues=0x0, const Char_t* triggerName="",
+                             Bool_t useIsolatedBC=kFALSE, Bool_t cutTOFbc=kFALSE);       // centrality dependent plots
+  
+  AliTRDcheckESD(const AliTRDcheckESD&);
+  AliTRDcheckESD& operator=(const AliTRDcheckESD&);
+  Int_t         Pdg2Idx(Int_t pdg) const;
+  void          Process(TH1 **h, TGraphErrors *g);
+  void          Process2D(TH2 * const h, TGraphErrors **g);
+  void          PrintStatus(ULong_t s);
+  TH2F*         Proj3D(TH3* hist, TH2* accMap, Int_t binLow, Int_t binHigh, Float_t &entries);
+  TH1D*         Proj2D(TH2* hist, TH1* fitErr=0x0);
+  TH1F*         EfficiencyTRD(TH3* tpc3D, TH3* trd3D, Bool_t useAcceptance=kTRUE);
+  TH1F*         EfficiencyFromPhiPt(AliCFContainer* cf, Int_t minNtrkl, Int_t maxNtrkl, Int_t stepNom, Int_t stepDenom, const Char_t* varStr="pt", const Char_t* type="TPCTRD");
+  void          DrawTRDGrid();
+  void          SetStyle(TH1* hist, Int_t lineStyle, Int_t lineColor, Int_t lineWidth, 
+                         Int_t markerStyle, Int_t markerColor, Int_t markerSize);
+  void          SetStyle(TAxis* axis, const Char_t* title, Float_t titleSize, Float_t titleOffset, Bool_t centerTitle, 
+                         Float_t labelSize);
+  void          CheckActiveSM(TH1D* phiProj, Bool_t activeSM[18]);
+  void          FindIsolatedBCs(TH1D* bcHist, Bool_t isIsolated[3500]);
+  void          InitializeCFContainers();
+  AliCFContainer* CreateCFContainer(const Char_t* name, const Char_t *title);
+  Int_t         GetTriggerIndex(const Char_t* name, Bool_t createNew=kTRUE);
+  
+  Int_t            fStatus;            // bit mask for controlling the task
+  Int_t            fNRefFigures;       // number of current ref plots
+  AliESDEvent      *fESD;              //! ESD event
+  AliMCEvent       *fMC;               //! MC event
+  AliESDpid        *fESDpid;           //  ESD pid object 
+  TObjArray        *fHistos;           //! QA histos
+  TObjArray        *fResults;          // QA graphs
+  static FILE      *fgFile;            //! trend file streamer
+  
+  AliCFContainer*  fExpertCF;          // CF container configured for expert checks
+  Int_t            fExpertCFVars[kNTrdCfVariables];
+  Bool_t           fExpertCFVarsEnabled[kNTrdCfVariables];
+  Int_t            fExpertCFVarNBins[kNTrdCfVariables];
+  Double_t         fExpertCFVarRanges[kNTrdCfVariables][2];
+  TString          fExpertCFVarBins[kNTrdCfVariables];
+  Bool_t           fExpertCFEnabledSteps[3];      // enabled steps 0-TPC; 1-TRD; 2-TOF
+  
+  AliCFContainer*  fMatchingPhiEtaCF;        // Small CF containers tuned for running over central QA 
+  Int_t            fMatchingPhiEtaCFVars[kNTrdCfVariables];
+  AliCFContainer*  fMatchingPtCF;        // Small CF containers tuned for running over central QA 
+  Int_t            fMatchingPtCFVars[kNTrdCfVariables];
+  AliCFContainer*  fBunchCrossingsCF;  //
+  Int_t            fBunchCrossingsCFVars[kNTrdCfVariables];
+  AliCFContainer*  fCentralityCF;        // Small CF containers tuned for running over central QA 
+  Int_t            fCentralityCFVars[kNTrdCfVariables];
+  AliCFContainer*  fQtotCF;         //
+  Int_t            fQtotCFVars[kNTrdCfVariables];
+  AliCFContainer*  fPulseHeightCF;     //
+  Int_t            fPulseHeightCFVars[kNTrdCfVariables];
+  
+  AliAnalysisCuts* fReferenceTrackFilter;     // reference track filter
+  Bool_t           fPhysSelTriggersEnabled;   // flag wheter physics selection triggers were enabled
+  TString          fUserEnabledTriggers;      // list of user enabled triggers
+  Int_t            fNAssignedTriggers;        // number of assigned triggers
+    
+  // Vertex selection
+  static const Float_t fgkEvVertexZ;// cm
+  static const Int_t   fgkEvVertexN;// cm
+  // Track selection
+  static const Float_t fgkTrkDCAxy; // cm
+  static const Float_t fgkTrkDCAz;  // cm
+  static const Int_t   fgkNclTPC;   // N clusters TPC
+  static const Float_t fgkPt;       // min. pt
+  static const Float_t fgkEta;      // eta range
+  
+  static const Float_t fgkQs;      // scale for the total charge
+
+  ClassDef(AliTRDcheckESD, 9)          // user oriented TRD analysis based on ESD-MC data
+};
+#endif