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

//
// Interface between the TVirtualMagField and AliMagWrapCheb: wrapper to
// the set of magnetic field data + Tosca parameterization by 
// Chebyshev polynomials
// 
// Author: ruben.shahoyan@cern.ch
//

//#include <TGeoGlobalMagField.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)}; // don't recreate from GRP if set
  //
  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;}
  //
  // former AliMagF methods or their aliases
  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:
  // not supposed to be changed during the run, set only at the initialization via constructor
  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;     //! Measured part of the field map
  BMap_t           fMapType;         // field map type
  Double_t         fSolenoid;        // Solenoid field setting
  BeamType_t       fBeamType;        // Beam type: A-A (fBeamType=0) or p-p (fBeamType=1)
  Double_t         fBeamEnergy;      // Beam energy in GeV
  // 
  Int_t            fInteg;           // Default integration method as indicated in Geant
  Int_t            fPrecInteg;       // Alternative integration method, e.g. for higher precision
  Double_t         fFactorSol;       // Multiplicative factor for solenoid
  Double_t         fFactorDip;       // Multiplicative factor for dipole
  Double_t         fMax;             // Max Field as indicated in Geant
  Bool_t           fDipoleOFF;       // Dipole ON/OFF flag
  //
  Double_t         fQuadGradient;    // Gradient field for inner triplet quadrupoles
  Double_t         fDipoleField;     // Field value for D1 and D2 dipoles
  Double_t         fCCorrField;      // Side C 2nd compensator field
  Double_t         fACorr1Field;     // Side A 1st compensator field 
  Double_t         fACorr2Field;     // Side A 2nd compensator field
  //
  TNamed           fParNames;        // file and parameterization loadad
  //
  static const Double_t  fgkSol2DipZ;    // conventional Z of transition from L3 to Dipole field
  static const UShort_t  fgkPolarityConvention; // convention for the mapping of the curr.sign on main component sign
  //   
  ClassDef(AliMagF, 2)           // Class for all Alice MagField wrapper for measured data + Tosca parameterization
};


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