ROOT logo
#ifndef ALITRDRECOTASK_H
#define ALITRDRECOTASK_H

///////////////////////////////////////////////////////
//
// Basic class for Performance/Calibration TRD tasks
//
// Author: Alexandru Bercuci, 10/09/2008
//
//////////////////////////////////////////////////

#ifndef ALIANALYSISTASKSE_H
#include "AliAnalysisTaskSE.h"
#endif

#ifndef ALITRDTRACKINFO_H
#include "info/AliTRDtrackInfo.h"
#endif

#ifndef ALITRDEVENTINFO_H
#include "info/AliTRDeventInfo.h"
#endif

class TAxis;
class TH1;
class TH2;
class TH3;
class TF1;
class TList;
class TObjArray;
class TTreeSRedirector;
class AliTRDtrackV1;
class AliTRDrecoTask : public AliAnalysisTaskSE
{
friend class AliEveTRDTrackList;
public:
  enum AliTRDrecoSteeringBits{
     kMCdata      = BIT(18)
    ,kFriends     = BIT(19)
    ,kPostProcess = BIT(20)
    ,kHeavyIon    = BIT(21)
  };
  
  class AliTRDrecoProjection : public TNamed
  {
  public:
    AliTRDrecoProjection();
    virtual ~AliTRDrecoProjection();
    AliTRDrecoProjection& operator+=(const AliTRDrecoProjection& other);
    AliTRDrecoProjection& operator=(const AliTRDrecoProjection& other);
    void      Build(const Char_t *n, const Char_t *t, Int_t ix, Int_t iy, Int_t iz, TAxis *aa[]);
    Double_t  GetTrendValue(const Int_t mid=0, Double_t *m=NULL, Double_t *s=NULL, Double_t *se=NULL) const;
    TH3*      H() const { return fH;}
    void      Increment(Int_t bin[], Double_t v);
    TH2*      Projection2D(const Int_t nstat, const Int_t ncol, const Int_t mid=0, Bool_t del=kTRUE);
    TH2*      Projection2Dbin(Int_t ibin=-1, Bool_t mc=kFALSE);
    void      SetRebinStrategy(Int_t n, Int_t rebx[], Int_t reby[]);
    void      SetShowRange(Float_t zm, Float_t zM, Float_t em=0., Float_t eM=0.) {fRange[0] = zm; fRange[1] = zM; fRange[2] = em; fRange[3] = eM;}
  private:
    AliTRDrecoProjection(const AliTRDrecoProjection&);
  protected:
    TH3  *fH;          // data container
    Int_t fAx[3];      // projection axes
    Int_t fNrebin;     // no. of rebinning steps
    Int_t *fRebin[2];  //[fNrebin] rebinning of the X nd Y axes
    Float_t fRange[4]; //show range of the z processed

    ClassDef(AliTRDrecoProjection, 2)  // wrapper for a projection container THnSparse -> TH3
  };

  AliTRDrecoTask();
  AliTRDrecoTask(const char *name, const char *title);
  virtual ~AliTRDrecoTask();
  
  
  virtual void   UserCreateOutputObjects();
  virtual void   UserExec(Option_t *opt);
  virtual void   SetDebugLevel(Int_t level);
  
    
  static Float_t GetMeanStat(TH1 *h, Float_t cut=0., Int_t opt=0, Float_t *sigma=NULL);
  Int_t          GetNRefFigures() const; 
  const Char_t*  GetNameId() const       { return fNameId;}
  TList*         GetPlotFunctors() const { return fPlotFuncList;}
  Int_t          GetPtBin(Float_t pt);
  virtual Bool_t GetRefFigure(Int_t ifig);
  virtual void   MakeSummary();
  void           MakeDetectorPlot(Int_t ly=0, const Option_t *opt="");
  void           MakeDetectorPlotOLD(Int_t ly=0, const Option_t *opt="");
  Bool_t         IsHeavyIon() const      { return TestBit(kHeavyIon);};
  Bool_t         IsPP() const            { return !TestBit(kHeavyIon);};
  Bool_t         HasFriends() const      { return TestBit(kFriends);};
  Bool_t         HasMCdata() const       { return TestBit(kMCdata);};
  Bool_t         HasPostProcess() const  { return TestBit(kPostProcess);};
  Bool_t         HasRunTerminate() const { return fRunTerminate; }
  virtual TObjArray* Histos()            { return fContainer;}

  virtual Bool_t Load(const Char_t *file = "AnalysisResults.root", const Char_t *dir = "TRD_Performance");
  virtual Bool_t LoadDetectorMap(const Char_t *file = "AnalysisResults.root", const Char_t *dir = "TRD_Performance");
  virtual Bool_t Save(TObjArray * const res);
  virtual Bool_t PostProcess();
  virtual Bool_t PutTrendValue(const Char_t *name, Double_t val, Double_t err=0);
  static Int_t   Rebin(TH2 *h, Int_t n, Int_t rebinX[], Int_t rebinY[], Int_t nstat);
  virtual void   SetFriends(Bool_t fr = kTRUE) {SetBit(kFriends, fr);}
  virtual void   SetMCdata(Bool_t mc = kTRUE) {SetBit(kMCdata, mc);}
  virtual void   SetNameId(const Char_t *nid) {snprintf(fNameId, 10, "%s", nid);}
  virtual void   SetPostProcess(Bool_t pp = kTRUE) {SetBit(kPostProcess, pp);}
  static Float_t SetNormZ(TH2 *h2, Int_t bxmin=1, Int_t bxmax=-1, Int_t bymin=1, Int_t bymax=-1, Float_t thr=0.);
  static void    SetRangeZ(TH2 *h2, Float_t m, Float_t M, Float_t thr=0.);
  void           SetRunTerminate(Bool_t runTerminate = kTRUE) { fRunTerminate = runTerminate; }
  void           SetTriggerList(const Char_t *tl);
  virtual void   Terminate(Option_t *);

protected:
  static TTreeSRedirector* DebugStream() { return fgDebugStream;}
  virtual void   InitFunctorList();
  Bool_t         HasFunctorList() const { return fPlotFuncList != NULL; }
  Bool_t         MakeMomSegmentation();

  Char_t                fNameId[10];       // unique identifier of task particularity
  UChar_t               fNRefFigures;      // no of reference figures reported by task
  TObjArray             *fDets;            //! OLD container to store detector position and status support should be discontinued 
  TObjArray             *fDetsV;           //! NEW container to store detector position and status
  TObjArray             *fContainer;       //! container to store results
  AliTRDeventInfo       *fEvent;           //! Event Info
  TObjArray             *fTracks;          //! Array of tracks
  TObjArray             *fClusters;        //! Array of clusters
  const TObjArray       *fkClusters;       //! current detector clusters array
  const AliTRDtrackV1   *fkTrack;          //! current track
  const AliTRDtrackInfo::AliMCinfo  *fkMC; //! MC info
  const AliTRDtrackInfo::AliESDinfo *fkESD;//! ESD info
  Char_t                 fSpecies;         //! species index +1 with charge sign
  Char_t                 fTriggerSlot;     //! selected triggers map (if requested)
  Float_t                fPt;              //! p_t of the track being analyzed
  Float_t                fPhi;             //! phi of the track being analyzed
  Float_t                fEta;             //! eta of the track being analyzed
  Int_t                  fNpt;             // no of pt/p bins actually used
  TObjArray             *fTriggerList;     //! optional trigger list to be monitored

private:
  AliTRDrecoTask(const AliTRDrecoTask&);
  AliTRDrecoTask& operator=(const AliTRDrecoTask&);

  TList             *fPlotFuncList;        //! track functors list
  TList             *fDetFuncList;         //! detector functors list
  Bool_t             fRunTerminate;        // Switch for Terminate Function
  static TTreeSRedirector *fgDebugStream;  //! Debug stream
  static TH1        *fgProjector;          //! Projector histogram for Z statistics
protected:
  static const Int_t fgNPt = 25;           //! No of debug pt bins
  static Float_t         fgPt[fgNPt+1];    //! Array with limits for debug pt bins

  ClassDef(AliTRDrecoTask, 5) // base TRD reconstruction task
};

#endif

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