]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliMagFMaps.cxx
Removing semaphore .done files.
[u/mrichter/AliRoot.git] / STEER / AliMagFMaps.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 /* $Id$ */
17
18 //------------------------------------------------------------------------
19 // Magnetic field composed by 3 maps: the L3 magnet, extended region, and
20 // dipole magnet
21 // Used in the configuration macros (macros/Config.C, etc.)
22 // Author: Andreas Morsch <andreas.morsch@cern.ch>
23 //------------------------------------------------------------------------
24
25 #include <TFile.h>
26 #include <TSystem.h>
27
28 #include "AliLog.h"
29 #include "AliFieldMap.h"
30 #include "AliMagFMaps.h"
31
32 ClassImp(AliMagFMaps)
33     
34
35 //_______________________________________________________________________
36 AliMagFMaps::AliMagFMaps():
37   fSolenoid(0),
38   fSolenoidUser(0.),
39   fL3Option(0)
40 {
41   //
42   // Default constructor
43   //
44   //
45   // Don't replicate field information in gAlice
46   fFieldMap[0] = fFieldMap[1] = fFieldMap[2] = 0;
47 }
48
49 //_______________________________________________________________________
50 AliMagFMaps::AliMagFMaps(const char *name, const char *title, Int_t integ, 
51                          Float_t factor, Float_t fmax, Int_t map, 
52                          Int_t l3):
53   AliMagFC(name,title,integ,factor,fmax),
54   fSolenoid(0),
55   fSolenoidUser(0),
56   fL3Option(l3)
57 {
58   //
59   // Standard constructor
60   //
61   fType         = kConMesh;
62   fFieldMap[0]  = 0;
63   fMap          = map;
64   fL3Option     = l3;
65   ReadField();
66   //
67   // Don't replicate field information in gAlice
68   for (Int_t i = 0; i < 3; i++)  fFieldMap[i]->SetWriteEnable(0);
69   //
70 }
71
72 //_______________________________________________________________________
73 AliMagFMaps::AliMagFMaps(const AliMagFMaps &magf):
74   AliMagFC(magf),
75   fSolenoid(0),
76   fSolenoidUser(0),
77   fL3Option(0)
78 {
79   //
80   // Copy constructor
81   //
82   magf.Copy(*this);
83 }
84
85 //_______________________________________________________________________
86 AliMagFMaps::~AliMagFMaps()
87 {
88   //
89   //  Destructor
90   //
91   delete fFieldMap[0];
92   delete fFieldMap[1];
93   delete fFieldMap[2];    
94   fgReadField = kTRUE;
95 }
96
97 //_______________________________________________________________________
98 void AliMagFMaps::ReadField()
99 {
100   //  Read Field Map from file
101   //
102   //  don't read twice
103   //
104     if (!fgReadField) return;
105     fgReadField = 0;
106   //    
107   char* fname;
108   TFile* file = 0;
109   if (fMap == k2kG) {
110       fSolenoid = 2.;
111       fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/L3B02.root");
112       file = new TFile(fname);
113       fFieldMap[0] = dynamic_cast<AliFieldMap*>(file->Get("L3B02"));
114       file->Close();
115       delete file;
116       fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/DipB02.root");
117       file = new TFile(fname);
118       fFieldMap[1] = dynamic_cast<AliFieldMap*>(file->Get("DipB02"));
119       file->Close();
120       delete file;;
121       
122       fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/ExtB02.root");
123       file = new TFile(fname);
124       fFieldMap[2] = dynamic_cast<AliFieldMap*>(file->Get("ExtB02"));
125       file->Close();
126       delete file;
127   } else if (fMap == k4kG) {
128       fSolenoid = 4.;
129       fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/L3B04.root");
130       file = new TFile(fname);
131       fFieldMap[0] = dynamic_cast<AliFieldMap*>(file->Get("L3B04"));
132       file->Close();
133       delete file;
134       fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/DipB04.root");
135       file = new TFile(fname);
136       fFieldMap[1] = dynamic_cast<AliFieldMap*>(file->Get("DipB04"));
137       file->Close();
138       delete file;
139       
140       fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/ExtB04.root");
141       file = new TFile(fname);
142       fFieldMap[2] = dynamic_cast<AliFieldMap*>(file->Get("ExtB04"));
143       file->Close();
144       delete file;
145   } else if (fMap == k5kG) {
146       fSolenoid = 5.;
147       fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/L3B05.root");
148       file = new TFile(fname);
149       fFieldMap[0] = dynamic_cast<AliFieldMap*>(file->Get("L3B05"));
150       file->Close();
151       delete file;
152       fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/DipB05.root");
153       file = new TFile(fname);
154       fFieldMap[1] = dynamic_cast<AliFieldMap*>(file->Get("DipB05"));
155       file->Close();
156       delete file;
157       
158       fname = gSystem->ExpandPathName("$(ALICE_ROOT)/data/maps/ExtB05.root");
159       file = new TFile(fname);
160       fFieldMap[2] = dynamic_cast<AliFieldMap*>(file->Get("ExtB05"));
161       file->Close();
162       delete file;
163   }
164
165   if (!fL3Option) fSolenoidUser = fSolenoid;
166
167 }
168
169 //_______________________________________________________________________
170 Float_t AliMagFMaps::SolenoidField() const
171 {
172   //
173   // Returns max. L3 (solenoid) field strength 
174   // according to field map setting 
175   //
176   return -Factor()*fSolenoid;
177 }
178
179 //_______________________________________________________________________
180 void AliMagFMaps::Field(Float_t *x, Float_t *b) const
181 {
182   //
183   // Method to calculate the magnetic field
184   //
185   // --- find the position in the grid ---
186   
187
188     
189  //    if (!fFieldRead) ReadField();
190
191   //
192   // Field Maps have been calculated for the coordinate system in which 
193   // the Muon Spectrometer is placed at z > 0
194   // Transform coordinates corresponingly 
195   //
196   
197   b[0]=b[1]=b[2]=0;
198   Float_t xm[3];
199   xm[0] = - x[0];
200   xm[1] =   x[1];
201   xm[2] = - x[2];
202   
203   AliFieldMap* map = 0;
204   if (fFieldMap[0]->Inside(xm[0], xm[1], xm[2])) {
205       map = fFieldMap[0];
206       Float_t r = TMath::Sqrt(xm[0] * xm[0] + xm[1] * xm[1]);
207       
208       if (!fL3Option && TMath::Abs(xm[2]) < 370. && r < 550.) {
209       //
210       //     Constant L3 field , if this option was selected
211       //
212         b[2] = (- fSolenoid)*fFactor;
213           return;
214       } 
215   } else if (fFieldMap[1]->Inside(xm[0], xm[1], xm[2])) {
216     map = fFieldMap[1];
217   } else if (fFieldMap[2]->Inside(xm[0], xm[1], xm[2])) {
218     map = fFieldMap[2];
219   }
220   
221   if(map){
222     map->Field(xm,b);
223     b[0] = - b[0];
224     b[2] = - b[2];
225
226   } else {
227       //This is the ZDC part
228       ZDCField(x, b);
229   }
230
231   
232   if(fFactor!=1) {
233       b[0]*=fFactor;
234       b[1]*=fFactor;
235       b[2]*=fFactor;
236   }
237 }
238
239 //_______________________________________________________________________
240 void AliMagFMaps::Copy(TObject & /* magf */) const
241 {
242   //
243   // Copy *this onto magf -- Not implemented
244   //
245   AliFatal("Not implemented!");
246 }
247
248 //_______________________________________________________________________
249 void AliMagFMaps::Streamer(TBuffer &R__b)
250 {
251   // Stream an object of class AliMagFMaps.
252   if (R__b.IsReading()) {
253     AliMagFMaps::Class()->ReadBuffer(R__b, this);
254     ReadField();
255   } else {
256     AliMagFMaps::Class()->WriteBuffer(R__b, this);
257   }
258 }