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

/* $Id: AliTPCClusterParam.h,v */

////////////////////////////////////////////////////
//                                                //
//  TPC cluster error and shape parameterization  //
//                                                //
////////////////////////////////////////////////////


#include <TObject.h>
#include <TVectorDfwd.h>
#include <TMatrixDfwd.h>

class TTree;
class TObjArray;
class TH1;
class THnBase;
//_____________________________________________________________________________
class AliTPCClusterParam : public TObject {
 public:
  static AliTPCClusterParam* Instance();
  AliTPCClusterParam();
  AliTPCClusterParam(const AliTPCClusterParam& param);
  AliTPCClusterParam & operator=(const AliTPCClusterParam& param);
  virtual           ~AliTPCClusterParam();
  virtual void	Print(Option_t* option = "") const;
  void SetInstance(AliTPCClusterParam *const param){fgInstance = param;}
  //
  // Seting functions
  //
  void FitData(TTree * tree);
  void FitResol(TTree * tree);
  void FitRMS(TTree * tree);
  void SetQnorm(Int_t ipad, Int_t itype,  const TVectorD *const norm); 
  void SetQnormCorr(Int_t ipad, Int_t itype, Int_t corrType, Float_t val, Int_t mode=1); 
  Double_t  GetQnormCorr(Int_t ipad, Int_t itype, Int_t corrType) const;
  TMatrixD *GetQnormCorrMatrix(){return fQNormCorr;};
  void ResetQnormCorr(); 
  void SetWaveCorrectionMap( THnBase *WaveCorrectionMap);
  void SetResolutionYMap( THnBase *ResolutionYMap);
  //
  // Charge parameterization
  //
  Float_t Qnorm(Int_t ipad, Int_t itype, Float_t dr, Float_t ty, Float_t tz);   
  Float_t QnormHis(Int_t ipad, Int_t itype, Float_t dr, Float_t ty, Float_t tz);


  Float_t QnormPos(Int_t ipad, Bool_t isMax,  Float_t pad, Float_t time, Float_t z, Float_t sy2, Float_t sz2, Float_t qm, Float_t qt);
  static Float_t SQnormPos(Int_t ipad, Bool_t isMax,  Float_t pad, Float_t time, Float_t z, Float_t sy2, Float_t sz2, Float_t qm, Float_t qt){ return fgInstance->QnormPos(ipad,isMax,pad,time,z,sy2,sz2,qm,qt);;}
 
  Float_t PosCorrection(Int_t type, Int_t ipad,  Float_t pad, Float_t time, Float_t z, Float_t sy2, Float_t sz2, Float_t qm);
  static Float_t  SPosCorrection(Int_t type, Int_t ipad,  Float_t pad, Float_t time, Float_t z, Float_t sy2, Float_t sz2, Float_t qm){ return fgInstance->PosCorrection(type,ipad,pad,time,z,sy2,sz2,qm);}
  //
  // Error parameterization
  //
  Float_t GetError0(Int_t dim, Int_t type, Float_t z, Float_t angle) const;
  Float_t GetError0Par(Int_t dim, Int_t type, Float_t z, Float_t angle) const;
  Float_t GetError1(Int_t dim, Int_t type, Float_t z, Float_t angle) const;
  Float_t GetErrorQ(Int_t dim, Int_t type, Float_t z, Float_t angle, Float_t Qmean) const;
  Float_t GetErrorQPar(Int_t dim, Int_t type, Float_t z, Float_t angle, Float_t Qmean) const;
  Float_t GetErrorQParScaled(Int_t dim, Int_t type, Float_t z, Float_t angle, Float_t Qmean) const;
  //
  // Shape parameterization
  //
  Float_t GetRMS0(Int_t dim, Int_t type, Float_t z, Float_t angle) const;
  Float_t GetRMS1(Int_t dim, Int_t type, Float_t z, Float_t angle) const;
  Float_t GetRMSQ(Int_t dim, Int_t type, Float_t z, Float_t angle, Float_t Qmean) const;
  Float_t GetRMSSigma(Int_t dim, Int_t type, Float_t z, Float_t angle, Float_t Qmean) const;
  Float_t GetShapeFactor(Int_t dim, Int_t type, Float_t z, Float_t angle, Float_t Qmean, Float_t rmsL, Float_t rmsM) const;
  // 
  // Correction and resolution maps
  //
  const THnBase *GetWaveCorrectionMap() const { return fWaveCorrectionMap; }
  const THnBase *GetResolutionYMap() const { return  fResolutionYMap; }
  Float_t GetWaveCorrection(Int_t Type, Float_t Z, Int_t QMax, Float_t Pad, Float_t angleY ) const;
  static Float_t SGetWaveCorrection(Int_t Type, Float_t Z, Int_t QMax, Float_t Pad, Float_t angleY ){return (fgInstance) ? fgInstance->GetWaveCorrection(Type,Z,QMax,Pad,angleY):0;}
  //
  //
  //
  void Test(TTree * tree, const char *output="TestClusterParam.root");
  //
  // static methods equivalents  - use instance of param object - useful for tree draw and TF2 visualization 
  static Float_t SGetError0(Int_t dim, Int_t type, Float_t z, Float_t angle){
    return fgInstance->GetError0(dim,type,z,angle);
  }
  static Float_t SGetError0Par(Int_t dim, Int_t type, Float_t z, Float_t angle){
    return fgInstance->GetError0Par(dim,type,z,angle);
  }
  static Float_t SGetError1(Int_t dim, Int_t type, Float_t z, Float_t angle){
    return fgInstance->GetError1(dim,type,z,angle);
  }
  static Float_t SGetErrorQ(Int_t dim, Int_t type, Float_t z, Float_t angle, Float_t Qmean){
    return fgInstance->GetErrorQ(dim,type,z,angle,Qmean);
  }
  static Float_t SGetErrorQPar(Int_t dim, Int_t type, Float_t z, Float_t angle, Float_t Qmean){
    return fgInstance->GetErrorQPar(dim,type,z,angle,Qmean);
  }
  static Float_t SGetErrorQParScaled(Int_t dim, Int_t type, Float_t z, Float_t angle, Float_t Qmean){
    return fgInstance->GetErrorQParScaled(dim,type,z,angle,Qmean);
  }

  static Float_t SGetRMS0(Int_t dim, Int_t type, Float_t z, Float_t angle){
    return fgInstance->GetRMS0(dim,type,z,angle);
  }
  static Float_t SGetRMS1(Int_t dim, Int_t type, Float_t z, Float_t angle){
    return fgInstance->GetRMS1(dim,type,z,angle);
  }
  static Float_t SGetRMSQ(Int_t dim, Int_t type, Float_t z, Float_t angle, Float_t Qmean){
    return fgInstance->GetRMSQ(dim,type,z,angle,Qmean);
  }
  static Float_t SGetRMSSigma(Int_t dim, Int_t type, Float_t z, Float_t angle, Float_t Qmean){
    return fgInstance->GetRMSSigma(dim,type,z,angle,Qmean);
  }
  static Float_t SGetShapeFactor(Int_t dim, Int_t type, Float_t z, Float_t angle, Float_t Qmean, Float_t rmsL, Float_t rmsM){
    return fgInstance->GetShapeFactor(dim,type,z,angle,Qmean, rmsL, rmsM);
  }
  //
  //
  static Float_t SQnorm(Int_t ipad, Int_t itype,Float_t dr, Float_t ty, Float_t tz) {return fgInstance->Qnorm(ipad, itype, dr,ty,tz);}
  static Float_t SQnormHis(Int_t ipad, Int_t itype,Float_t dr, Float_t ty, Float_t tz) {return fgInstance->QnormHis(ipad, itype, dr,ty,tz);}

  //
  // Analytical position angular correction
  //
  static Double_t  GaussConvolution(Double_t x0, Double_t x1, Double_t k0, Double_t k1, Double_t s0, Double_t s1);
  static Double_t  GaussConvolutionTail(Double_t x0, Double_t x1, Double_t k0, Double_t k1, Double_t s0, Double_t s1, Double_t tau);
  static Double_t  GaussConvolutionGamma4(Double_t x0, Double_t x1, Double_t k0, Double_t k1, Double_t s0, Double_t s1, Double_t tau);
  static Double_t QmaxCorrection(Int_t sector, Int_t row, Float_t cpad, Float_t ctime, Float_t ky, Float_t kz, Float_t rmsy0, Float_t rmsz0,  Float_t effLength=0, Float_t effDiff=1);
  static Double_t QtotCorrection(Int_t sector, Int_t row, Float_t cpad, Float_t ctime, Float_t ky, Float_t kz, Float_t rmsy0, Float_t rmsz0, Float_t qtot, Float_t thr,  Float_t effLength=0, Float_t effDiff=1);

  //
  //
  //
  void FitResol0(TTree * tree, Int_t dim, Int_t type, Float_t *param0, Float_t *error);
  void FitResol0Par(TTree * tree, Int_t dim, Int_t type, Float_t *param0, Float_t *error);
  void FitResol1(TTree * tree, Int_t dim, Float_t *param0, Float_t *error);
  void FitResolQ(TTree * tree, Int_t dim, Int_t type, Float_t *param0, Float_t *error);
  void FitResolQPar(TTree * tree, Int_t dim, Int_t type, Float_t *param0, Float_t *error);
  void FitRMS0(TTree * tree, Int_t dim, Int_t type, Float_t *param0, Float_t *error);
  void FitRMS1(TTree * tree, Int_t dim, Float_t *param0, Float_t *error);
  void FitRMSQ(TTree * tree, Int_t dim, Int_t type, Float_t *param0, Float_t *error);  
  void FitRMSSigma(TTree * tree, Int_t dim, Int_t type, Float_t *param0, Float_t *error);  
  //
  TVectorD*& PosYcor(Int_t ind) {return fPosYcor[ind];}
  TVectorD*& PosZcor(Int_t ind) {return fPosZcor[ind];}
  Float_t ParamS0Par(Int_t i, Int_t j, Int_t k) const {return fParamS0Par[i][j][k];}
  TVectorD* QpadTnorm() const {return fQpadTnorm;}
  TVectorD* QpadMnorm() const {return fQpadMnorm;}

protected:
  Float_t fRatio;               //ratio of values constibution to error
  Float_t fParamS0[2][3][4];    //error parameterization coeficients
  Float_t fErrorS0[2][3][4];    //error parameterization coeficients
  Float_t fParamS0Par[2][3][7];    //error parameterization coeficients
  Float_t fErrorS0Par[2][3][7];    //error parameterization coeficients  
  Float_t fParamSQ[2][3][6];    //error parameterization coeficients
  Float_t fErrorSQ[2][3][6];    //error parameterization coeficients
  Float_t fParamSQPar[2][3][9];    //error parameterization coeficients
  Float_t fErrorSQPar[2][3][9];    //error parameterization coeficients
  Float_t fParamS1[2][4];       //error parameterization coeficients
  Float_t fErrorS1[2][4];       //error parameterization coeficients
  //
  Float_t fParamRMS0[2][3][4];   //shape parameterization coeficients
  Float_t fErrorRMS0[2][3][4];   //shape parameterization coeficients
  Float_t fParamRMSQ[2][3][6];   //shape parameterization coeficients
  Float_t fErrorRMSQ[2][3][6];   //shape parameterization coeficients
  Float_t fParamRMS1[2][5];      //shape parameterization coeficients
  Float_t fErrorRMS1[2][5];      //shape parameterization coeficients
  Float_t fErrorRMSSys[2];        // systematic relative error of the parametererization
  Float_t fRMSSigmaRatio[2][2];   // mean value of the varation of RMS to RMS
  Float_t fRMSSigmaFit[2][3][2];   // mean value of the varation of RMS to RMS
  //
  // charge normalization parametrization
  //
  TObjArray *fQNorm;              // q norm paramters
  TMatrixD  *fQNormCorr;          // q norm correction for analytica  correction
  TObjArray *fQNormHis;           // q norm correction for analytical correction 
  //
  TVectorD  *fPosQTnorm[3];       // q position normalization
  TVectorD  *fPosQMnorm[3];       // q position normalization
  TVectorD  *fQpadTnorm;          // q pad normalization - Total charge
  TVectorD  *fQpadMnorm;          // q pad normalization - Max charge
  //
  // Position corrections
  // 
  TVectorD  *fPosYcor[3];       //  position correction parameterization 
  TVectorD  *fPosZcor[3];       //  position correction parameterization
  //
  // Wave Correction Map 
  //
  THnBase* fWaveCorrectionMap; //dY with respect to the distance to the center of the pad
  Bool_t   fWaveCorrectionMirroredPad;   // flag is the cog axis mirrored at 0.5
  Bool_t   fWaveCorrectionMirroredZ;     // flag is the Z axis mirrored at 0
  Bool_t   fWaveCorrectionMirroredAngle; // flag is the Angle axis mirrored at 0
  //
  // Resolution Map
  //
  THnBase* fResolutionYMap; // Map of resolution in Y
  //
  static AliTPCClusterParam*   fgInstance; //! Instance of this class (singleton implementation)
  ClassDef(AliTPCClusterParam,7)    //  TPC Cluster parameter class
};

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