ROOT logo
#ifndef ALITPCEXB_H
#define ALITPCEXB_H

class AliMagF;
#include "TObject.h"
#include "TVectorDfwd.h"

class AliTPCExB:public TObject {
public:
  AliTPCExB();
  AliTPCExB& operator=(const AliTPCExB &exb);
  AliTPCExB(const AliTPCExB& exb);
  virtual ~AliTPCExB() {};
  virtual void Correct(const Double_t *position,Double_t *corrected)=0;
  virtual void CorrectInverse(const Double_t *position,Double_t *corrected) {
    Correct(position,corrected);
    for (Int_t i=0;i<3;++i)
      corrected[i]=position[i]-(corrected[i]-position[i]);
  }
  //
  // Test and visualization
  //
  void TestExB(const char* fileName);
  static Double_t GetDr(Double_t r, Double_t phi, Double_t z, Double_t bz=5);
  static Double_t GetDrphi(Double_t r, Double_t phi, Double_t z, Double_t bz=5);
  static Double_t GetDphi(Double_t r, Double_t phi, Double_t z, Double_t bz=5);
  static Double_t GetDz(Double_t r, Double_t phi, Double_t z, Double_t bz=5);
  static AliTPCExB*  Instance(){return fgInstance;}
  static void SetInstance(AliTPCExB *const param){fgInstance = param;}
  //
  // Mag field scans
  //
  static  void RegisterField(Int_t index, AliMagF * magf);
  static  Double_t GetBx(Double_t r, Double_t phi, Double_t z,Int_t index=0);
  static  Double_t GetBy(Double_t r, Double_t phi, Double_t z,Int_t index=0);
  static  Double_t GetBz(Double_t r, Double_t phi, Double_t z,Int_t index=0);
  static  Double_t GetBr(Double_t r, Double_t phi, Double_t z,Int_t index=0);
  static  Double_t GetBrfi(Double_t r, Double_t phi, Double_t z,Int_t index=0);
  //
  static  Double_t GetBxI(Double_t r, Double_t phi, Double_t z,Int_t index=0);
  static  Double_t GetByI(Double_t r, Double_t phi, Double_t z,Int_t index=0);
  static  Double_t GetBzI(Double_t r, Double_t phi, Double_t z,Int_t index=0);
  static  Double_t GetBrI(Double_t r, Double_t phi, Double_t z,Int_t index=0);
  static  Double_t GetBrfiI(Double_t r, Double_t phi, Double_t z,Int_t index=0);
  //
  //
  Double_t Eval(Int_t type, Double_t r, Double_t phi, Double_t z);
  Double_t SEval(Int_t type, Double_t r, Double_t phi, Double_t z){return Instance()->Eval(type,r,phi,z);}
  static Double_t EvalMat(const TVectorD &vec, Double_t r, Double_t phi, Double_t z);     // evalute parameterization
 
 private:
  TVectorD *          fMatBrBz;       //param matrix Br/Bz
  TVectorD *          fMatBrfiBz;     //param matrix Br/Bz
  TVectorD *          fMatBrBzI0;     //param matrix Br/Bz integral  z>0 
  TVectorD *          fMatBrBzI1;     //param matrix Br/Bz integral  z<0 
  TVectorD *          fMatBrfiBzI0;   //param matrix Br/Bz integral  z>0 
  TVectorD *          fMatBrfiBzI1;   //param matrix Br/Bz integral  z<0
  
  static AliTPCExB*   fgInstance;  //! Instance of this class (singleton implementation)
  static TObjArray    fgArray;     //! array of magnetic fields
  //
  ClassDef(AliTPCExB,2)
};

#endif
 AliTPCExB.h:1
 AliTPCExB.h:2
 AliTPCExB.h:3
 AliTPCExB.h:4
 AliTPCExB.h:5
 AliTPCExB.h:6
 AliTPCExB.h:7
 AliTPCExB.h:8
 AliTPCExB.h:9
 AliTPCExB.h:10
 AliTPCExB.h:11
 AliTPCExB.h:12
 AliTPCExB.h:13
 AliTPCExB.h:14
 AliTPCExB.h:15
 AliTPCExB.h:16
 AliTPCExB.h:17
 AliTPCExB.h:18
 AliTPCExB.h:19
 AliTPCExB.h:20
 AliTPCExB.h:21
 AliTPCExB.h:22
 AliTPCExB.h:23
 AliTPCExB.h:24
 AliTPCExB.h:25
 AliTPCExB.h:26
 AliTPCExB.h:27
 AliTPCExB.h:28
 AliTPCExB.h:29
 AliTPCExB.h:30
 AliTPCExB.h:31
 AliTPCExB.h:32
 AliTPCExB.h:33
 AliTPCExB.h:34
 AliTPCExB.h:35
 AliTPCExB.h:36
 AliTPCExB.h:37
 AliTPCExB.h:38
 AliTPCExB.h:39
 AliTPCExB.h:40
 AliTPCExB.h:41
 AliTPCExB.h:42
 AliTPCExB.h:43
 AliTPCExB.h:44
 AliTPCExB.h:45
 AliTPCExB.h:46
 AliTPCExB.h:47
 AliTPCExB.h:48
 AliTPCExB.h:49
 AliTPCExB.h:50
 AliTPCExB.h:51
 AliTPCExB.h:52
 AliTPCExB.h:53
 AliTPCExB.h:54
 AliTPCExB.h:55
 AliTPCExB.h:56
 AliTPCExB.h:57
 AliTPCExB.h:58
 AliTPCExB.h:59
 AliTPCExB.h:60
 AliTPCExB.h:61
 AliTPCExB.h:62
 AliTPCExB.h:63
 AliTPCExB.h:64
 AliTPCExB.h:65