34a31f4b4cff9438722e497e10329c7ebe340e8d
[u/mrichter/AliRoot.git] / STEER / AliMagFCheb.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16
17 #include <TClass.h>
18 #include <TFile.h>
19 #include <TSystem.h>
20
21 #include "AliMagFCheb.h"
22 #include "AliMagWrapCheb.h"
23 #include "AliLog.h"
24
25 ClassImp(AliMagFCheb)
26     
27
28 //_______________________________________________________________________
29 AliMagFCheb::AliMagFCheb():
30   AliMagFC(),
31   fMeasuredMap(0),
32   fSolenoid(5.)
33 {
34   // Default constructor
35   //
36 }
37
38 //_______________________________________________________________________
39 AliMagFCheb::AliMagFCheb(const char *name, const char *title, Int_t integ, 
40                          Float_t factor, Float_t fmax, Int_t map, 
41                          Bool_t dipoleON,const char* path):
42   AliMagFC(name, title, integ, factor, fmax),
43   fMeasuredMap(0),
44   fSolenoid(5.)
45 {
46   //
47   fMap = map;
48   char* fname = gSystem->ExpandPathName(path);
49   TFile* file = TFile::Open(fname);
50   if (!file) {
51     AliError(Form("Failed to open magnetic field data file %s\n",fname)); 
52     return;
53   }
54   const char* parname = 0;
55   if        (fMap == k2kG) {
56     fSolenoid = 2.;
57     parname = dipoleON ? "Sol12_Dip6_Hole":"Sol12_Dip0_Hole";
58   } else if (fMap == k5kG) {
59     fSolenoid = 5.;
60     parname = dipoleON ? "Sol30_Dip6_Hole":"Sol30_Dip0_Hole";
61   } else {
62     AliError(Form("Unknown field identifier %d is requested\n",fMap)); 
63     return;
64   }
65   //
66   fMeasuredMap = dynamic_cast<AliMagWrapCheb*>(file->Get(parname));
67   if (!fMeasuredMap) {
68     AliError(Form("Did not find field %s in %s\n",parname,fname)); 
69     return;
70   }
71   file->Close();
72   delete file;
73 }
74
75
76 //_______________________________________________________________________
77 AliMagFCheb::AliMagFCheb(const AliMagFCheb &src):
78   AliMagFC(src),
79   fMeasuredMap(0),
80   fSolenoid(src.fSolenoid)
81 {
82   if (src.fMeasuredMap) fMeasuredMap = new AliMagWrapCheb(*src.fMeasuredMap);
83 }
84
85 //_______________________________________________________________________
86 AliMagFCheb::~AliMagFCheb()
87 {
88   delete fMeasuredMap;
89 }
90
91 //_______________________________________________________________________
92 void AliMagFCheb::GetTPCInt(const Float_t *xyz, Float_t *b) const
93 {
94   // Method to calculate the integral of magnetic integral from xyz to nearest cathode plane
95   //
96   b[0]=b[1]=b[2]=0.0;
97   if (fMeasuredMap) fMeasuredMap->GetTPCInt(xyz,b);
98   for (int i=3;i--;) b[i] *= fFactor;
99 }
100
101 //_______________________________________________________________________
102 void AliMagFCheb::GetTPCIntCyl(const Float_t *rphiz, Float_t *b) const
103 {
104   // Method to calculate the integral of magnetic integral from point to nearest cathode plane
105   // in cylindrical coordiates ( -pi<phi<pi convention )
106   b[0]=b[1]=b[2]=0.0;
107   if (fMeasuredMap) fMeasuredMap->GetTPCIntCyl(rphiz,b);
108   for (int i=3;i--;) b[i] *= fFactor;
109 }
110
111 //_______________________________________________________________________
112 void AliMagFCheb::Field(const Float_t *xyz, Float_t *b) const
113 {
114   // Method to calculate the field at point  xyz
115   //
116   b[0]=b[1]=b[2]=0.0;
117   if (xyz[2] > 919. || xyz[2] < -1972.) {
118     ZDCField(xyz, b);
119   } else {
120     if (fMeasuredMap && fFactor !=0.) {
121       fMeasuredMap->Field(xyz,b);
122       for (int i=3;i--;) b[i] *= fFactor;
123     }
124   }
125 }
126
127 //_______________________________________________________________________
128 void AliMagFCheb::Field(const Double_t *xyz, Double_t *b) const
129 {
130   // Method to calculate the field at point  xyz
131   //
132   b[0]=b[1]=b[2]=0.0;
133   if (xyz[2] > 919. || xyz[2] < -1972.) {
134     ZDCField(xyz, b);
135   } 
136   else {
137     if (fMeasuredMap && fFactor !=0.) {
138       fMeasuredMap->Field(xyz,b);
139       for (int i=3;i--;) b[i] *= fFactor;
140     }
141   }
142 }
143
144 //_______________________________________________________________________
145 AliMagFCheb& AliMagFCheb::operator=(const AliMagFCheb& maps)
146 {
147   fSolenoid=maps.fSolenoid;
148   if (this != &maps && maps.fMeasuredMap) { 
149     if (fMeasuredMap) delete fMeasuredMap;
150     fMeasuredMap = new AliMagWrapCheb(*maps.fMeasuredMap);
151   }
152   return *this;
153 }
154
155 //_______________________________________________________________________
156 void AliMagFCheb::SetMeasuredMap(AliMagWrapCheb* parm) 
157 {
158   if (fMeasuredMap) delete fMeasuredMap; 
159   fMeasuredMap = parm;
160 }