ROOT logo
#ifndef ALITPCSPACECHARGE3D_H
#define ALITPCSPACECHARGE3D_H

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

////////////////////////////////////////////////////////////////////////////
// AliTPCSpaceCharge3D class                                              //
// Authors: Stefan Rossegger                                              //
////////////////////////////////////////////////////////////////////////////

#include "AliTPCCorrection.h"
class TH3F;
class TH3;

class AliTPCSpaceCharge3D : public AliTPCCorrection {
public:
  AliTPCSpaceCharge3D();
  virtual ~AliTPCSpaceCharge3D();

  // initialization and update functions
  virtual void Init();
  virtual void Update(const TTimeStamp &timeStamp);

  // common setters and getters for tangled ExB effect
  virtual void SetOmegaTauT1T2(Float_t omegaTau,Float_t t1,Float_t t2) {
    fT1=t1; fT2=t2;
    const Double_t wt0=t2*omegaTau;     fC0=1./(1.+wt0*wt0);
    const Double_t wt1=t1*omegaTau;     fC1=wt1/(1.+wt1*wt1);
  };
  void SetC0C1(Float_t c0,Float_t c1) {fC0=c0;fC1=c1;} // CAUTION: USE WITH CARE
  Float_t GetC0() const {return fC0;}
  Float_t GetC1() const {return fC1;}

  // setters and getters
  void SetCorrectionFactor(Float_t correctionFactor) {fCorrectionFactor=correctionFactor;}
  Float_t GetCorrectionFactor() const {return fCorrectionFactor;}

  void  SetSCDataFileName(TString fname);
  const char* GetSCDataFileName() { return fSCDataFileName.Data(); }

  void InitSpaceCharge3DDistortion();       // faster model and more accurate ;-)
  void InitSpaceCharge3DDistortionCourse(); // real 3D but not accurate enough
  void ForceInitSpaceCharge3DDistortion() { fInitLookUp=kFALSE; InitSpaceCharge3DDistortion(); }

  void  InitSpaceCharge3DPoisson(Int_t kRows, Int_t kColumns, Int_t kPhiSlices, Int_t kIterations);
  void ForceInitSpaceCharge3DPoisson(Int_t kRows, Int_t kColumns, Int_t kPhiSlices, Int_t kIterations) { fInitLookUp=kFALSE; InitSpaceCharge3DPoisson(kRows,kColumns,kPhiSlices,kIterations); }
  Float_t GetSpaceChargeDensity(Float_t r, Float_t phi, Float_t z, Int_t mode);
  TH2F* CreateHistoSCinXY(Float_t z, Int_t nx=100, Int_t ny=100, Int_t mode=0);
  TH2F* CreateHistoSCinZR(Float_t phi, Int_t nz=100, Int_t nr=100, Int_t mode=0);


  void WriteChargeDistributionToFile(const char* fname = "SC-Alice.root");

  virtual void Print(const Option_t* option="") const;
  // MI - Add the "real" 3D histogram as an optional input (26.06.2013)
  //
  void    SetInputSpaceCharge(TH3 * hisSpaceCharge3D, TH2 * hisRPhi, TH2* hisRZ, Double_t norm);
  void    SetInputSpaceCharge3D(TH3 * hisSpaceCharge3D){fSpaceChargeHistogram3D= hisSpaceCharge3D;}

  const TH3 *   GetInputSpaceCharge3D(){return fSpaceChargeHistogram3D;}       // MI add 
  const TH2 *   GetInputSpaceChargeRPhi(){return fSpaceChargeHistogramRPhi;}       // MI add 
  const TH2 *   GetInputSpaceChargeRZ(){return fSpaceChargeHistogramRZ;}       // MI add 

  virtual void GetCorrection(const Float_t x[],const Short_t roc,Float_t dx[]);

  static AliTPCSpaceCharge3D *MakeCorrection22D(const char * filename = "SpaceChargeMap.root", Double_t multiplicity = 950., Double_t intRate = 5e4, Double_t epsIROC = 10., Double_t epsOROC=10,
						Double_t gasfactor = 1., 
						Double_t radialScaling = 1.5);
private:

  // maximum sizes of lookup tables
  enum {kNRows= 90 };       // the maximum on row-slices so far ~ 2cm slicing    
  enum {kNPhiSlices= 144 }; // the maximum of phi-slices so far = (8 per sector) 
  enum {kNColumns= 130 };   // the maximum on column-slices so  ~ 2cm slicing    

  AliTPCSpaceCharge3D(const AliTPCSpaceCharge3D &);               // not implemented
  AliTPCSpaceCharge3D &operator=(const AliTPCSpaceCharge3D &);    // not implemented

  Float_t fC0; // coefficient C0                 (compare Jim Thomas's notes for definitions)
  Float_t fC1; // coefficient C1                 (compare Jim Thomas's notes for definitions)
  Float_t fCorrectionFactor;       // Space Charge Correction factor in comparison to initialized
                                   // look up table which was created for M_mb = 900 and IR = 3000
                                   // compare Internal Note Nr: ???

  Bool_t fInitLookUp;                 // flag to check if the Look Up table was created

  TMatrixF *fLookUpErOverEz[kNPhi];   // Array to store electric field integral (int Er/Ez)
  TMatrixF *fLookUpEphiOverEz[kNPhi]; // Array to store electric field integral (int Er/Ez)
  TMatrixF *fLookUpDeltaEz[kNPhi];    // Array to store electric field integral (int Er/Ez)

  TString fSCDataFileName;          // file which contains the space charge distribution
  TString fSCLookUpPOCsFileName3D;  // filename of the precalculated lookup tables (for individual voxels)
  TString fSCLookUpPOCsFileNameRZ;  // filename of the precalculated lookup tables (for individual voxels)
  TString fSCLookUpPOCsFileNameRPhi;  // filename of the precalculated lookup tables (for individual voxels)


  TMatrixF *fSCdensityDistribution[kNPhi]; // 3D space charge distribution
  TMatrixD *fSCdensityInRZ;       // (r,z) space charge distribution
  TMatrixD *fSCdensityInRPhiA;     // (r,phi) space charge distribution
  TMatrixD *fSCdensityInRPhiC;     // (r,phi) space charge distribution
  TH3 *    fSpaceChargeHistogram3D;      // Histogram with the input space charge histogram - used as an optional input 
  TH2 *    fSpaceChargeHistogramRPhi;      // Histogram with the input space charge histogram - used as an optional input 
  TH2 *    fSpaceChargeHistogramRZ;      // Histogram with the input space charge histogram - used as an optional input 
  ClassDef(AliTPCSpaceCharge3D,2); 
};

#endif
 AliTPCSpaceCharge3D.h:1
 AliTPCSpaceCharge3D.h:2
 AliTPCSpaceCharge3D.h:3
 AliTPCSpaceCharge3D.h:4
 AliTPCSpaceCharge3D.h:5
 AliTPCSpaceCharge3D.h:6
 AliTPCSpaceCharge3D.h:7
 AliTPCSpaceCharge3D.h:8
 AliTPCSpaceCharge3D.h:9
 AliTPCSpaceCharge3D.h:10
 AliTPCSpaceCharge3D.h:11
 AliTPCSpaceCharge3D.h:12
 AliTPCSpaceCharge3D.h:13
 AliTPCSpaceCharge3D.h:14
 AliTPCSpaceCharge3D.h:15
 AliTPCSpaceCharge3D.h:16
 AliTPCSpaceCharge3D.h:17
 AliTPCSpaceCharge3D.h:18
 AliTPCSpaceCharge3D.h:19
 AliTPCSpaceCharge3D.h:20
 AliTPCSpaceCharge3D.h:21
 AliTPCSpaceCharge3D.h:22
 AliTPCSpaceCharge3D.h:23
 AliTPCSpaceCharge3D.h:24
 AliTPCSpaceCharge3D.h:25
 AliTPCSpaceCharge3D.h:26
 AliTPCSpaceCharge3D.h:27
 AliTPCSpaceCharge3D.h:28
 AliTPCSpaceCharge3D.h:29
 AliTPCSpaceCharge3D.h:30
 AliTPCSpaceCharge3D.h:31
 AliTPCSpaceCharge3D.h:32
 AliTPCSpaceCharge3D.h:33
 AliTPCSpaceCharge3D.h:34
 AliTPCSpaceCharge3D.h:35
 AliTPCSpaceCharge3D.h:36
 AliTPCSpaceCharge3D.h:37
 AliTPCSpaceCharge3D.h:38
 AliTPCSpaceCharge3D.h:39
 AliTPCSpaceCharge3D.h:40
 AliTPCSpaceCharge3D.h:41
 AliTPCSpaceCharge3D.h:42
 AliTPCSpaceCharge3D.h:43
 AliTPCSpaceCharge3D.h:44
 AliTPCSpaceCharge3D.h:45
 AliTPCSpaceCharge3D.h:46
 AliTPCSpaceCharge3D.h:47
 AliTPCSpaceCharge3D.h:48
 AliTPCSpaceCharge3D.h:49
 AliTPCSpaceCharge3D.h:50
 AliTPCSpaceCharge3D.h:51
 AliTPCSpaceCharge3D.h:52
 AliTPCSpaceCharge3D.h:53
 AliTPCSpaceCharge3D.h:54
 AliTPCSpaceCharge3D.h:55
 AliTPCSpaceCharge3D.h:56
 AliTPCSpaceCharge3D.h:57
 AliTPCSpaceCharge3D.h:58
 AliTPCSpaceCharge3D.h:59
 AliTPCSpaceCharge3D.h:60
 AliTPCSpaceCharge3D.h:61
 AliTPCSpaceCharge3D.h:62
 AliTPCSpaceCharge3D.h:63
 AliTPCSpaceCharge3D.h:64
 AliTPCSpaceCharge3D.h:65
 AliTPCSpaceCharge3D.h:66
 AliTPCSpaceCharge3D.h:67
 AliTPCSpaceCharge3D.h:68
 AliTPCSpaceCharge3D.h:69
 AliTPCSpaceCharge3D.h:70
 AliTPCSpaceCharge3D.h:71
 AliTPCSpaceCharge3D.h:72
 AliTPCSpaceCharge3D.h:73
 AliTPCSpaceCharge3D.h:74
 AliTPCSpaceCharge3D.h:75
 AliTPCSpaceCharge3D.h:76
 AliTPCSpaceCharge3D.h:77
 AliTPCSpaceCharge3D.h:78
 AliTPCSpaceCharge3D.h:79
 AliTPCSpaceCharge3D.h:80
 AliTPCSpaceCharge3D.h:81
 AliTPCSpaceCharge3D.h:82
 AliTPCSpaceCharge3D.h:83
 AliTPCSpaceCharge3D.h:84
 AliTPCSpaceCharge3D.h:85
 AliTPCSpaceCharge3D.h:86
 AliTPCSpaceCharge3D.h:87
 AliTPCSpaceCharge3D.h:88
 AliTPCSpaceCharge3D.h:89
 AliTPCSpaceCharge3D.h:90
 AliTPCSpaceCharge3D.h:91
 AliTPCSpaceCharge3D.h:92
 AliTPCSpaceCharge3D.h:93
 AliTPCSpaceCharge3D.h:94
 AliTPCSpaceCharge3D.h:95
 AliTPCSpaceCharge3D.h:96
 AliTPCSpaceCharge3D.h:97
 AliTPCSpaceCharge3D.h:98
 AliTPCSpaceCharge3D.h:99
 AliTPCSpaceCharge3D.h:100
 AliTPCSpaceCharge3D.h:101
 AliTPCSpaceCharge3D.h:102
 AliTPCSpaceCharge3D.h:103
 AliTPCSpaceCharge3D.h:104
 AliTPCSpaceCharge3D.h:105
 AliTPCSpaceCharge3D.h:106
 AliTPCSpaceCharge3D.h:107
 AliTPCSpaceCharge3D.h:108