1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 //-------------------------------------------------------------------------
19 // Constant magnetic field class
20 // Used by AliRun class
22 //-------------------------------------------------------------------------
31 //________________________________________
35 fBeamType(kBeamTypepp),
44 // Default constructor
48 //________________________________________
49 AliMagFC::AliMagFC(const char *name, const char *title, Int_t integ,
50 Float_t factor, Float_t fmax)
51 : AliMagF(name,title,integ,factor,fmax),
53 fBeamType(kBeamTypepp),
63 // Standard constructor
70 //________________________________________
71 void AliMagFC::Field(const float *x, float *b) const
74 // Method to return the field in a point
78 if(TMath::Abs(x[2])<700 && x[0]*x[0]+(x[1]+30)*(x[1]+30) < 560*560) {
82 if(-725 >= x[2] && x[2] >= -1225 ){
83 Float_t dz = TMath::Abs(-975-x[2])*0.01;
84 b[0] = - (1-0.1*dz*dz)*7;
98 AliFatal(Form("Invalid field map for constant field %d",fMap));
101 //________________________________________
102 void AliMagFC::Field(const double *x, double *b) const
105 // Method to return the field in a point
109 if(TMath::Abs(x[2])<700 && x[0]*x[0]+(x[1]+30)*(x[1]+30) < 560*560) {
113 if(-725 >= x[2] && x[2] >= -1225 ){
114 Float_t dz = TMath::Abs(-975-x[2])*0.01;
115 b[0] = - (1-0.1*dz*dz)*7;
129 AliFatal(Form("Invalid field map for constant field %d",fMap));
133 //___________________________________________________
134 void AliMagFC::ZDCField(const float *x, float *b) const
136 // ---- This is the ZDC part
138 float rad2 = x[0] * x[0] + x[1] * x[1];
139 static Bool_t init = kFALSE;
143 //////////////////////////////////////////////////////////////////////
144 // ---- Magnetic field values (according to beam type and energy) ----
145 if(fBeamType==kBeamTypepp && fBeamEnergy == 5000.){
147 fQuadGradient = 15.7145;
148 fDipoleField = 27.0558;
150 fCCorrField = 9.7017;
152 fACorr1Field = -13.2143;
153 fACorr2Field = -11.9909;
154 } else if (fBeamType == kBeamTypepp && fBeamEnergy == 450.) {
156 Float_t const kEnergyRatio = fBeamEnergy / 7000.;
158 fQuadGradient = 22.0002 * kEnergyRatio;
159 fDipoleField = 37.8781 * kEnergyRatio;
161 fCCorrField = 9.6908;
163 fACorr1Field = -13.2014;
164 fACorr2Field = -9.6908;
165 } else if ((fBeamType == kBeamTypepp && fBeamEnergy == 7000.) ||
166 (fBeamType == kBeamTypeAA))
168 // Pb-Pb @ 2.7+2.7 TeV or p-p @ 7+7 TeV
169 fQuadGradient = 22.0002;
170 fDipoleField = 37.8781;
172 fCCorrField = 9.6908;
174 fACorr1Field = -13.2014;
175 fACorr2Field = -9.6908;
180 // SIDE C **************************************************
182 if(x[2] < kCCorrBegin && x[2] > kCCorrEnd && rad2 < kCCorrSqRadius){
189 else if(x[2] < kCQ1Begin && x[2] > kCQ1End && rad2 < kCQ1SqRadius){
190 b[0] = fQuadGradient*x[1];
191 b[1] = fQuadGradient*x[0];
194 else if(x[2] < kCQ2Begin && x[2] > kCQ2End && rad2 < kCQ2SqRadius){
195 b[0] = -fQuadGradient*x[1];
196 b[1] = -fQuadGradient*x[0];
199 else if(x[2] < kCQ3Begin && x[2] > kCQ3End && rad2 < kCQ3SqRadius){
200 b[0] = -fQuadGradient*x[1];
201 b[1] = -fQuadGradient*x[0];
204 else if(x[2] < kCQ4Begin && x[2] > kCQ4End && rad2 < kCQ4SqRadius){
205 b[0] = fQuadGradient*x[1];
206 b[1] = fQuadGradient*x[0];
209 else if(x[2] < kCD1Begin && x[2] > kCD1End && rad2 < kCD1SqRadius){
214 else if(x[2] < kCD2Begin && x[2] > kCD2End){
215 if(((x[0]-kCD2XCentre1)*(x[0]-kCD2XCentre1)+(x[1]*x[1]))<kCD2SqRadius
216 || ((x[0]-kCD2XCentre2)*(x[0]-kCD2XCentre2)+(x[1]*x[1]))<kCD2SqRadius){
217 b[1] = -fDipoleField;
224 // SIDE A **************************************************
226 if(fCompensator && (x[2] > kACorr1Begin && x[2] < kACorr1End) && rad2 < kCCorr1SqRadius) {
227 // Compensator magnet at z = 1075 m
236 if(x[2] > kACorr2Begin && x[2] < kACorr2End && rad2 < kCCorr2SqRadius){
243 else if(x[2] > kAQ1Begin && x[2] < kAQ1End && rad2 < kAQ1SqRadius){
244 // First quadrupole of inner triplet de-focussing in x-direction
245 b[0] = -fQuadGradient*x[1];
246 b[1] = -fQuadGradient*x[0];
249 else if(x[2] > kAQ2Begin && x[2] < kAQ2End && rad2 < kAQ2SqRadius){
250 b[0] = fQuadGradient*x[1];
251 b[1] = fQuadGradient*x[0];
254 else if(x[2] > kAQ3Begin && x[2] < kAQ3End && rad2 < kAQ3SqRadius){
255 b[0] = fQuadGradient*x[1];
256 b[1] = fQuadGradient*x[0];
259 else if(x[2] > kAQ4Begin && x[2] < kAQ4End && rad2 < kAQ4SqRadius){
260 b[0] = -fQuadGradient*x[1];
261 b[1] = -fQuadGradient*x[0];
264 else if(x[2] > kAD1Begin && x[2] < kAD1End && rad2 < kAD1SqRadius){
266 b[1] = -fDipoleField;
269 else if(x[2] > kAD2Begin && x[2] < kAD2End){
270 if(((x[0]-kAD2XCentre1)*(x[0]-kAD2XCentre1)+(x[1]*x[1])) < kAD2SqRadius
271 || ((x[0]-kAD2XCentre2)*(x[0]-kAD2XCentre2)+(x[1]*x[1])) < kAD2SqRadius){
278 void AliMagFC::ZDCField(const double *x, double *b) const
280 // ---- This is the ZDC part
282 double rad2 = x[0] * x[0] + x[1] * x[1];
283 static Bool_t init = kFALSE;
287 //////////////////////////////////////////////////////////////////////
288 // ---- Magnetic field values (according to beam type and energy) ----
289 if(fBeamType==kBeamTypepp && fBeamEnergy == 5000.){
291 fQuadGradient = 15.7145;
292 fDipoleField = 27.0558;
294 fCCorrField = 9.7017;
296 fACorr1Field = -13.2143;
297 fACorr2Field = -11.9909;
298 } else if (fBeamType == kBeamTypepp && fBeamEnergy == 450.) {
300 Float_t const kEnergyRatio = fBeamEnergy / 7000.;
302 fQuadGradient = 22.0002 * kEnergyRatio;
303 fDipoleField = 37.8781 * kEnergyRatio;
305 fCCorrField = 9.6908;
307 fACorr1Field = -13.2014;
308 fACorr2Field = -9.6908;
309 } else if ((fBeamType == kBeamTypepp && fBeamEnergy == 7000.) ||
310 (fBeamType == kBeamTypeAA))
312 // Pb-Pb @ 2.7+2.7 TeV or p-p @ 7+7 TeV
313 fQuadGradient = 22.0002;
314 fDipoleField = 37.8781;
316 fCCorrField = 9.6908;
318 fACorr1Field = -13.2014;
319 fACorr2Field = -9.6908;
324 // SIDE C **************************************************
326 if(x[2] < kCCorrBegin && x[2] > kCCorrEnd && rad2 < kCCorrSqRadius){
333 else if(x[2] < kCQ1Begin && x[2] > kCQ1End && rad2 < kCQ1SqRadius){
334 b[0] = fQuadGradient*x[1];
335 b[1] = fQuadGradient*x[0];
338 else if(x[2] < kCQ2Begin && x[2] > kCQ2End && rad2 < kCQ2SqRadius){
339 b[0] = -fQuadGradient*x[1];
340 b[1] = -fQuadGradient*x[0];
343 else if(x[2] < kCQ3Begin && x[2] > kCQ3End && rad2 < kCQ3SqRadius){
344 b[0] = -fQuadGradient*x[1];
345 b[1] = -fQuadGradient*x[0];
348 else if(x[2] < kCQ4Begin && x[2] > kCQ4End && rad2 < kCQ4SqRadius){
349 b[0] = fQuadGradient*x[1];
350 b[1] = fQuadGradient*x[0];
353 else if(x[2] < kCD1Begin && x[2] > kCD1End && rad2 < kCD1SqRadius){
358 else if(x[2] < kCD2Begin && x[2] > kCD2End){
359 if(((x[0]-kCD2XCentre1)*(x[0]-kCD2XCentre1)+(x[1]*x[1]))<kCD2SqRadius
360 || ((x[0]-kCD2XCentre2)*(x[0]-kCD2XCentre2)+(x[1]*x[1]))<kCD2SqRadius){
361 b[1] = -fDipoleField;
368 // SIDE A **************************************************
370 if(fCompensator && (x[2] > kACorr1Begin && x[2] < kACorr1End) && rad2 < kCCorr1SqRadius) {
371 // Compensator magnet at z = 1075 m
380 if(x[2] > kACorr2Begin && x[2] < kACorr2End && rad2 < kCCorr2SqRadius){
387 else if(x[2] > kAQ1Begin && x[2] < kAQ1End && rad2 < kAQ1SqRadius){
388 // First quadrupole of inner triplet de-focussing in x-direction
389 b[0] = -fQuadGradient*x[1];
390 b[1] = -fQuadGradient*x[0];
393 else if(x[2] > kAQ2Begin && x[2] < kAQ2End && rad2 < kAQ2SqRadius){
394 b[0] = fQuadGradient*x[1];
395 b[1] = fQuadGradient*x[0];
398 else if(x[2] > kAQ3Begin && x[2] < kAQ3End && rad2 < kAQ3SqRadius){
399 b[0] = fQuadGradient*x[1];
400 b[1] = fQuadGradient*x[0];
403 else if(x[2] > kAQ4Begin && x[2] < kAQ4End && rad2 < kAQ4SqRadius){
404 b[0] = -fQuadGradient*x[1];
405 b[1] = -fQuadGradient*x[0];
408 else if(x[2] > kAD1Begin && x[2] < kAD1End && rad2 < kAD1SqRadius){
410 b[1] = -fDipoleField;
413 else if(x[2] > kAD2Begin && x[2] < kAD2End){
414 if(((x[0]-kAD2XCentre1)*(x[0]-kAD2XCentre1)+(x[1]*x[1])) < kAD2SqRadius
415 || ((x[0]-kAD2XCentre2)*(x[0]-kAD2XCentre2)+(x[1]*x[1])) < kAD2SqRadius){