#ifndef ALIMAGF_H
#define ALIMAGF_H
#include <TVirtualMagField.h>
class AliMagWrapCheb;
class AliMagF : public TVirtualMagField
{
public:
enum BMap_t {k2kG, k5kG, k5kGUniform};
enum BeamType_t {kNoBeamField, kBeamTypepp, kBeamTypeAA, kBeamTypepA, kBeamTypeAp};
enum PolarityConvention_t {kConvLHC,kConvDCS2008,kConvMap2005};
enum {kOverrideGRP=BIT(14)};
AliMagF();
AliMagF(const char *name, const char* title,Double_t factorSol=1., Double_t factorDip=1.,
BMap_t maptype = k5kG, BeamType_t btype=kBeamTypepp, Double_t benergy=-1,
Int_t integ=2, Double_t fmax=15,const char* path="$(ALICE_ROOT)/data/maps/mfchebKGI_sym.root");
AliMagF(const AliMagF& src);
AliMagF& operator=(const AliMagF& src);
virtual ~AliMagF();
virtual void Field(const Double_t *x, Double_t *b);
void GetTPCInt(const Double_t *xyz, Double_t *b) const;
void GetTPCRatInt(const Double_t *xyz, Double_t *b) const;
void GetTPCIntCyl(const Double_t *rphiz, Double_t *b) const;
void GetTPCRatIntCyl(const Double_t *rphiz, Double_t *b) const;
Double_t GetBz(const Double_t *xyz) const;
AliMagWrapCheb* GetMeasuredMap() const {return fMeasuredMap;}
void SetFactorSol(Float_t fc=1.);
void SetFactorDip(Float_t fc=1.);
Double_t GetFactorSol() const;
Double_t GetFactorDip() const;
Double_t Factor() const {return GetFactorSol();}
Double_t GetCurrentSol() const {return GetFactorSol()*(fMapType==k2kG ? 12000:30000);}
Double_t GetCurrentDip() const {return GetFactorDip()*6000;}
Bool_t IsUniform() const {return fMapType == k5kGUniform;}
void MachineField(const Double_t *x, Double_t *b) const;
BMap_t GetMapType() const {return fMapType;}
BeamType_t GetBeamType() const {return fBeamType;}
const char* GetBeamTypeText() const;
Double_t GetBeamEnergy() const {return fBeamEnergy;}
Double_t Max() const {return fMax;}
Int_t Integ() const {return fInteg;}
Int_t PrecInteg() const {return fPrecInteg;}
Double_t SolenoidField() const {return fFactorSol*fSolenoid;}
Char_t* GetDataFileName() const {return (Char_t*)fParNames.GetName();}
Char_t* GetParamName() const {return (Char_t*)fParNames.GetTitle();}
void SetDataFileName(const Char_t* nm) {fParNames.SetName(nm);}
void SetParamName(const Char_t* nm) {fParNames.SetTitle(nm);}
virtual void Print(Option_t *opt) const;
Bool_t LoadParameterization();
static Int_t GetPolarityConvention() {return Int_t(fgkPolarityConvention);}
static AliMagF* CreateFieldMap(Float_t l3Current=-30000., Float_t diCurrent=-6000.,
Int_t convention=0, Bool_t uniform = kFALSE,
Float_t beamenergy=7000, const Char_t* btype="pp",
const Char_t* path="$(ALICE_ROOT)/data/maps/mfchebKGI_sym.root");
protected:
void InitMachineField(BeamType_t btype, Double_t benergy);
void SetBeamType(BeamType_t type) {fBeamType = type;}
void SetBeamEnergy(Float_t energy) {fBeamEnergy = energy;}
protected:
AliMagWrapCheb* fMeasuredMap;
BMap_t fMapType;
Double_t fSolenoid;
BeamType_t fBeamType;
Double_t fBeamEnergy;
Int_t fInteg;
Int_t fPrecInteg;
Double_t fFactorSol;
Double_t fFactorDip;
Double_t fMax;
Bool_t fDipoleOFF;
Double_t fQuadGradient;
Double_t fDipoleField;
Double_t fCCorrField;
Double_t fACorr1Field;
Double_t fACorr2Field;
TNamed fParNames;
static const Double_t fgkSol2DipZ;
static const UShort_t fgkPolarityConvention;
ClassDef(AliMagF, 2)
};
#endif