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

/* $Id$ */
//////////////////////////////////////////////////////////////////
//  Manager class for AliTPCPRF2D                               //
//  This is to generate the 2-dimensional pad-response function //
//////////////////////////////////////////////////////////////////
#include "TObject.h"

class TF2;
class TArrayF;
class TH1F;
class AliH2F;
class TPaveText;

class AliTPCPRF2D : public TObject {
public : 
  AliTPCPRF2D();
  virtual ~AliTPCPRF2D(); 
  virtual void Update();  //recalculate tables for charge calculation
  Float_t GetGRF(Float_t xin, Float_t yin); 
  //return generic response function  in xin
  virtual TF2 * GetGRF(){return fGRF;}
  virtual Float_t GetPRF(Float_t xin, Float_t yin); 
  //return PRF in point xin,yin

  virtual void DrawX(Float_t x1 ,Float_t x2,Float_t y1,Float_t y2=0, Int_t N=1);
  virtual void DrawPRF(Float_t x1, Float_t x2, Float_t y1, Float_t y2, Int_t Nx=20, Int_t Ny=20);
  //draw two dimensional PRF

  virtual void DrawDist(Float_t x1, Float_t x2, Float_t y1, Float_t y2, Int_t Nx=20, Int_t Ny=20, 
		Float_t  thr=0);
  //draw distortion of COG method
  //we suppose threshold equal to thr
  TH1F *  GenerDrawXHisto(Float_t x1, Float_t x2,Float_t y);  
  AliH2F * GenerDrawHisto(Float_t x1, Float_t x2, Float_t y1, Float_t y2, Int_t Nx=20, Int_t Ny=20);
  AliH2F * GenerDrawDistHisto(Float_t x1, Float_t x2, Float_t y1, Float_t y2, Int_t Nx=20, Int_t Ny=20, 
		Float_t  thr=0);  
  
  virtual void SetPad(Float_t width, Float_t height);
  //set base chevron parameters
  virtual void SetChevron(Float_t hstep, Float_t shifty, Float_t fac);
  //set chevron parameters   
  virtual void SetChParam(Float_t width, Float_t height,
		  Float_t hstep, Float_t shifty, Float_t fac);
  //set all geometrical parameters     
  virtual void SetY(Float_t y1, Float_t y2, Int_t nYdiv) ;
  virtual void SetChargeAngle(Float_t angle){fChargeAngle = angle;} //set angle of pad and charge distribution
                                                            //axes
  virtual void SetCurrentAngle(Float_t /*angle*/){return;}
  virtual void SetPadAngle(Float_t angle){fPadAngle = angle;} //set pad angle
  void SetInterpolationType(Int_t interx, Int_t intery) {fInterX=interx; fInterY =intery;}
  virtual void SetGauss(Float_t sigmaX,Float_t sigmaY , Float_t kNorm=1);
  //adjust PRF with GAUSIAN as generic GRF 
  //if  direct = kTRUE then it does't convolute distribution
  virtual void SetCosh(Float_t sigmaX,Float_t sigmaY , Float_t kNorm=1);
  //adjust PRF with 1/Cosh  as generic GRF
  virtual void  SetGati(Float_t K3X, Float_t K3Y,
		     Float_t padDistance,
		     Float_t kNorm=1);
  void SetParam(TF2 *const GRF,Float_t kNorm, 
		Float_t sigmaX=0, Float_t sigmaY=0);
  void SetNdiv(Int_t Ndiv){fNdiv=Ndiv;}
  virtual Float_t GetSigmaX() const {return fSigmaX;}
  virtual Float_t GetSigmaY() const {return fSigmaY;}
  
  
protected:
  void Update1(); 
  virtual void UpdateSigma();  //recalculate sigma of PRF
  Float_t GetPRFActiv(Float_t xin); //return PRF in point xin and actual y
  Float_t  * fcharge; //!field with PRF 
  Float_t fY1;        //position of first "virtual" vire 
  Float_t fY2;        //position of last virtual vire
  Int_t fNYdiv;       //number of wires
  Int_t fNChargeArray;  //number of charge interpolation points
  Float_t * fChargeArray;  //[fNChargeArray]pointer to array of arrays
 
  void DrawComment(TPaveText * comment);  //draw comments to picture
  //chevron parameters
  Float_t fHeightFull;  //height of the full pad
  Float_t fHeightS;     //height of the one step
  Float_t fShiftY;      //shift of the step
  Float_t fWidth;       //width of the pad
  Float_t fK;           //k factor of the chewron

  Double_t funParam[5];//parameters of used charge function
  Int_t  fNPRF;      //number of interpolations point
  Int_t  fNdiv;      //number of division to calculate integral
  Float_t fDStep;    //element step for point 
  Float_t fKNorm;     //normalisation factor of the charge integral
  Float_t fInteg;     //integral of GRF on +- infinity
  TF2 *  fGRF;        //charge distribution function

  Float_t fK3X;       //KX parameter (only for Gati parametrization)
  Float_t fK3Y;       //KY parameter (only for Gati parametrisation)
  Float_t fPadDistance; //pad anode distnce (only for Gati parametrisation)

  Float_t  fOrigSigmaX; //sigma of original distribution;  
  Float_t  fOrigSigmaY; //sigma of original distribution;  

  Float_t  fChargeAngle;//'angle' of charge distribution refernce system to pad reference system
  Float_t  fPadAngle;   //'angle' of the pad assymetry

  Float_t  fSigmaX;    //sigma X of PAD response function
  Float_t  fSigmaY;    //sigma Y of PAD response function
  Float_t  fMeanX;     //mean X value
  Float_t  fMeanY;     //mean Y value
  Int_t    fInterX;    //interpolation in X
  Int_t    fInterY;    //interpolation in Y
  //calculated during update

  char  fType[5];       //charge type
  Float_t fCurrentY;    //in reality we calculate PRF only for one fixed y 
  Float_t fDYtoWire;    //! used to make PRF calculation faster in GetPRF
  Float_t fDStepM1;     //! used in GetPRFActiv to make calculation faster  
  //
  static const Double_t fgkDegtoRad; //numeric constant
  static const Double_t fgkSQRT12; //numeric constant
  static const Int_t   fgkNPRF;   //default number of division

private: 
  AliTPCPRF2D(const AliTPCPRF2D &prf);
  AliTPCPRF2D &operator = (const AliTPCPRF2D &/*prf*/) {return *this;}
  
  ClassDef(AliTPCPRF2D,1) 
};   

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