ROOT logo
#ifndef ALITRDCLUSTERRESOLUTION_H
#define ALITRDCLUSTERRESOLUTION_H

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//  TRD cluster error parameterization                  
//  Authors:                                                              //
//    Alexandru Bercuci <A.Bercuci@gsi.de>                                //
////////////////////////////////////////////////////////////////////////////

#ifndef ALITRDRECOTASK_H
#include "AliTRDrecoTask.h"
#endif

class TCanvas;
class TObjArray;
class AliTRDclusterResolution : public AliTRDrecoTask
{
public:
  enum EAxisBinning { // bins in z and x direction
    kND  = 1
  };
  enum EResultContainer { // results container type
    kYSys = 0   // cluster2center pad calibration
   ,kYRes   = 1   // resolution on charge dependence
   ,kSigm   = 2   // sigma cluster as func of x and z
   ,kMean   = 3   // shift cluster as func of x and z
   ,kNtasks = 4   // total number of subtasks
  };
  enum ECalibrationParam { // calibration parameters to be used from OCDB
    kVdrift = 0
   ,kT0     = 1
   ,kGain   = 2
  };
  enum ECheckBits {
    kSaveAs     = BIT(21) // save intermediary results
   ,kCalibrated = BIT(22) // load calibration
   ,kGlobal     = BIT(23) // load global position
  };
  AliTRDclusterResolution();
  AliTRDclusterResolution(const char *name);
  virtual ~AliTRDclusterResolution();

  void          UserCreateOutputObjects();
  void          UserExec(Option_t *);
  Int_t         GetDetector() const { return fDet; }
  void          GetPad(Int_t &c, Int_t &r) const { c=fCol, r=fRow; return;}
  inline void   GetDiffCoeff(Float_t &dt, Float_t &dl) const;
  inline Float_t GetExB() const;
  inline Float_t GetVdrift() const;
  inline Float_t GetT0() const;
  inline Float_t GetGain() const;
  Float_t       GetDyRange() const {return fDyRange;}
  Bool_t        GetRefFigure(Int_t ifig);
  Bool_t        HasProcess(EResultContainer bit) const {return TESTBIT(fSubTaskMap, bit);}
  Bool_t        IsCalibrated() const { return TestBit(kCalibrated);}
  Bool_t        HasGlobalPosition() const { return TestBit(kGlobal);}
  Bool_t        IsUsingCalibParam(ECalibrationParam par) const {return TESTBIT(fUseCalib, par);}

  TObjArray*    Histos(); 
  TObjArray*    Results() const {return fResults;}; 

  Bool_t        IsVisual() const {return Bool_t(fCanvas);}
  Bool_t        IsSaveAs() const {return TestBit(kSaveAs);}

  Bool_t        LoadCalibration();
  Bool_t        LoadGlobalChamberPosition();
  Bool_t        PostProcess();
  void          SetCalibrationRegion(Int_t det, Int_t col=-1, Int_t row=-1);
  void          SetVisual();
  void          SetDyRange(Float_t dy) {if(dy>0) fDyRange = dy;}
  void          SetProcess(EResultContainer bit, Bool_t v = kTRUE) {v ? SETBIT(fSubTaskMap, bit) : CLRBIT(fSubTaskMap, bit);}
  void          SetSaveAs(Bool_t v = kTRUE) {SetBit(kSaveAs, v);}
  void          SetUseCalibParam(ECalibrationParam par, Bool_t v = kTRUE) {v ? SETBIT(fUseCalib, par) : CLRBIT(fUseCalib, par);}
  inline void   ResetProcesses();

protected:
  void    ProcessCharge();
  Bool_t  ProcessNormalTracks();
  void    ProcessSigma();
  void    ProcessMean();

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

  TCanvas    *fCanvas; //! visualization canvas 
  TObjArray  *fInfo;   //! list of cluster info
  TObjArray  *fResults;// list of result graphs/histos/trees
  UChar_t    fSubTaskMap;  // steer map for subtasks
  UChar_t    fUseCalib;    // steer map for calibration params
  Short_t    fDet;     // detector (-1 for all)
  Char_t     fCol;     // pad column (-1 for all)
  Char_t     fRow;     // pad row (-1 for all)
  Float_t    fExB;     // tg of the Lorentz angle
  Float_t    fDt;      // diffusion coeff. transversal
  Float_t    fDl;      // diffusion coeff. longitudinal
  Float_t    fVdrift;  // mean drift velocity
  Float_t    fT0;      // time 0
  Float_t    fGain;    // gain
  Float_t    fXch;     // anode wire position for chamber
  Float_t    fZch;     // Z position for calibration element
  Float_t    fH;       // tg of tilting angle
  static const Float_t fgkTimeBinLength;// time bin length (invers of sampling frequency)

  // working named variables
  Float_t    fDyRange; // min/max dy
  UChar_t    fLy;      // TRD plane 
  Float_t    fT;       // calibrated time 
  Float_t    fX;       // local drift length 
  Float_t    fY;       // local rphi offset 
  Float_t    fZ;       // local anode wire offset 
  Float_t    fR[4];    // mean/sgm resolution
  Float_t    fP[4];    // mean/sgm pulls
  
  ClassDef(AliTRDclusterResolution, 6)  // cluster resolution
};

//___________________________________________________
inline void AliTRDclusterResolution::GetDiffCoeff(Float_t &dt, Float_t &dl) const
{
  if(!IsCalibrated()) printf(" - W - AliTRDclusterResolution::GetDiffCoeff() : Instance not calibrated.\n");
  dt=fDt; dl=fDl;
  return;
}


//___________________________________________________
inline Float_t AliTRDclusterResolution::GetExB() const
{ 
  if(!IsCalibrated()) printf(" - W - AliTRDclusterResolution::GetExB() : Instance not calibrated.\n");
  return fExB;
}

//___________________________________________________
inline Float_t AliTRDclusterResolution::GetVdrift() const
{ 
  if(!IsCalibrated()) printf(" - W - AliTRDclusterResolution::GetVdrift() : Instance not calibrated.\n");
  return fVdrift;
}

//___________________________________________________
inline Float_t AliTRDclusterResolution::GetT0() const
{
  if(!IsCalibrated()) printf(" - W - AliTRDclusterResolution::GetT0() : Instance not calibrated.\n");
  return fT0;
}

//___________________________________________________
inline Float_t AliTRDclusterResolution::GetGain() const
{
  if(!IsCalibrated()) printf(" - W - AliTRDclusterResolution::GetGain() : Instance not calibrated.\n");
  return fGain;
}

//___________________________________________________
inline void AliTRDclusterResolution::ResetProcesses()
{
  CLRBIT(fSubTaskMap, kYRes);
  CLRBIT(fSubTaskMap, kYSys);
  CLRBIT(fSubTaskMap, kSigm);
  CLRBIT(fSubTaskMap, kMean);
}

#endif

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