]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliMagFC.cxx
add aliroot macros to look at data from strip modules and from LED reference system
[u/mrichter/AliRoot.git] / STEER / AliMagFC.cxx
CommitLineData
aee8290b 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
acd84897 16/* $Id$ */
d8408e76 17
116cbefd 18//-------------------------------------------------------------------------
116cbefd 19// Constant magnetic field class
5d8718b8 20// Used by AliRun class
21// Author:
116cbefd 22//-------------------------------------------------------------------------
23
fb17acd4 24#include <stdlib.h>
aee8290b 25
594d8990 26#include "AliLog.h"
aee8290b 27#include "AliMagFC.h"
28
29ClassImp(AliMagFC)
30
60378f15 31//________________________________________
32AliMagFC::AliMagFC()
33 :AliMagF(),
34 fCompensator(kFALSE),
35 fBeamType(kBeamTypepp),
36 fBeamEnergy(0),
37 fQuadGradient(0),
38 fDipoleField(0),
39 fCCorrField(0),
40 fACorr1Field(0),
41 fACorr2Field(0)
42{
43 //
44 // Default constructor
45 //
46}
47
aee8290b 48//________________________________________
d0f1ee3b 49AliMagFC::AliMagFC(const char *name, const char *title, Int_t integ,
50 Float_t factor, Float_t fmax)
c28c3a0b 51 : AliMagF(name,title,integ,factor,fmax),
60378f15 52 fCompensator(kFALSE),
53 fBeamType(kBeamTypepp),
54 fBeamEnergy(7000.),
55 fQuadGradient(0),
56 fDipoleField(0),
57 fCCorrField(0),
58 fACorr1Field(0),
59 fACorr2Field(0)
60
aee8290b 61{
62 //
63 // Standard constructor
64 //
aee8290b 65 fType = kConst;
d8408e76 66 fMap = 1;
60378f15 67
aee8290b 68}
69
70//________________________________________
ff66b122 71void AliMagFC::Field(float *x, float *b) const
72{
73 //
74 // Method to return the field in a point
75 //
76 b[0]=b[1]=b[2]=0;
77 if(fMap==1) {
78 if(TMath::Abs(x[2])<700 && x[0]*x[0]+(x[1]+30)*(x[1]+30) < 560*560) {
79 b[2]=2;
80 }
81 else {
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;
85 if(fFactor!=1) {
86 b[0]*=fFactor;
87 b[1]*=fFactor;
88 b[2]*=fFactor;
89 }
90 }
91 else {
92 ZDCField(x, b);
93 }
94 }
95
96 }
97 else {
98 AliFatal(Form("Invalid field map for constant field %d",fMap));
99 }
100}
101//________________________________________
102void AliMagFC::Field(double *x, double *b) const
aee8290b 103{
104 //
105 // Method to return the field in a point
106 //
107 b[0]=b[1]=b[2]=0;
108 if(fMap==1) {
109 if(TMath::Abs(x[2])<700 && x[0]*x[0]+(x[1]+30)*(x[1]+30) < 560*560) {
110 b[2]=2;
60378f15 111 }
112 else {
113 if(-725 >= x[2] && x[2] >= -1225 ){
575c700d 114 Float_t dz = TMath::Abs(-975-x[2])*0.01;
115 b[0] = - (1-0.1*dz*dz)*7;
95d9681f 116 if(fFactor!=1) {
117 b[0]*=fFactor;
118 b[1]*=fFactor;
119 b[2]*=fFactor;
120 }
aee8290b 121 }
122 else {
575c700d 123 ZDCField(x, b);
d95ea23f 124 }
125 }
95d9681f 126
60378f15 127 }
128 else {
594d8990 129 AliFatal(Form("Invalid field map for constant field %d",fMap));
575c700d 130 }
131}
132
60378f15 133//___________________________________________________
ff66b122 134void AliMagFC::ZDCField(float *x, float *b) const
135{
136 // ---- This is the ZDC part
137
138 float rad2 = x[0] * x[0] + x[1] * x[1];
139 static Bool_t init = kFALSE;
140
141 if (! init) {
142 init = kTRUE;
143 //////////////////////////////////////////////////////////////////////
144 // ---- Magnetic field values (according to beam type and energy) ----
145 if(fBeamType==kBeamTypepp && fBeamEnergy == 5000.){
146 // p-p @ 5+5 TeV
147 fQuadGradient = 15.7145;
148 fDipoleField = 27.0558;
149 // SIDE C
150 fCCorrField = 9.7017;
151 // SIDE A
152 fACorr1Field = -13.2143;
153 fACorr2Field = -11.9909;
154 } else if (fBeamType == kBeamTypepp && fBeamEnergy == 450.) {
155 // p-p 0.45+0.45 TeV
156 Float_t const kEnergyRatio = fBeamEnergy / 7000.;
157
158 fQuadGradient = 22.0002 * kEnergyRatio;
159 fDipoleField = 37.8781 * kEnergyRatio;
160 // SIDE C
161 fCCorrField = 9.6908;
162 // SIDE A
163 fACorr1Field = -13.2014;
164 fACorr2Field = -9.6908;
165 } else if ((fBeamType == kBeamTypepp && fBeamEnergy == 7000.) ||
166 (fBeamType == kBeamTypeAA))
167 {
168 // Pb-Pb @ 2.7+2.7 TeV or p-p @ 7+7 TeV
169 fQuadGradient = 22.0002;
170 fDipoleField = 37.8781;
171 // SIDE C
172 fCCorrField = 9.6908;
173 // SIDE A
174 fACorr1Field = -13.2014;
175 fACorr2Field = -9.6908;
176 }
177 }
178
179
180 // SIDE C **************************************************
181 if(x[2]<0.){
182 if(x[2] < kCCorrBegin && x[2] > kCCorrEnd && rad2 < kCCorrSqRadius){
183 if (fFactor != 0.) {
184 b[0] = fCCorrField;
185 b[1] = 0.;
186 b[2] = 0.;
187 }
188 }
189 else if(x[2] < kCQ1Begin && x[2] > kCQ1End && rad2 < kCQ1SqRadius){
190 b[0] = fQuadGradient*x[1];
191 b[1] = fQuadGradient*x[0];
192 b[2] = 0.;
193 }
194 else if(x[2] < kCQ2Begin && x[2] > kCQ2End && rad2 < kCQ2SqRadius){
195 b[0] = -fQuadGradient*x[1];
196 b[1] = -fQuadGradient*x[0];
197 b[2] = 0.;
198 }
199 else if(x[2] < kCQ3Begin && x[2] > kCQ3End && rad2 < kCQ3SqRadius){
200 b[0] = -fQuadGradient*x[1];
201 b[1] = -fQuadGradient*x[0];
202 b[2] = 0.;
203 }
204 else if(x[2] < kCQ4Begin && x[2] > kCQ4End && rad2 < kCQ4SqRadius){
205 b[0] = fQuadGradient*x[1];
206 b[1] = fQuadGradient*x[0];
207 b[2] = 0.;
208 }
209 else if(x[2] < kCD1Begin && x[2] > kCD1End && rad2 < kCD1SqRadius){
210 b[1] = fDipoleField;
211 b[2] = 0.;
212 b[2] = 0.;
213 }
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;
218 b[2] = 0.;
219 b[2] = 0.;
220 }
221 }
222 }
223
224 // SIDE A **************************************************
225 else{
226 if(fCompensator && (x[2] > kACorr1Begin && x[2] < kACorr1End) && rad2 < kCCorr1SqRadius) {
227 // Compensator magnet at z = 1075 m
228 if (fFactor != 0.) {
229 b[0] = fACorr1Field;
230 b[1] = 0.;
231 b[2] = 0.;
232 }
233 return;
234 }
235
236 if(x[2] > kACorr2Begin && x[2] < kACorr2End && rad2 < kCCorr2SqRadius){
237 if (fFactor != 0.) {
238 b[0] = fACorr2Field;
239 b[1] = 0.;
240 b[2] = 0.;
241 }
242 }
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];
247 b[2] = 0.;
248 }
249 else if(x[2] > kAQ2Begin && x[2] < kAQ2End && rad2 < kAQ2SqRadius){
250 b[0] = fQuadGradient*x[1];
251 b[1] = fQuadGradient*x[0];
252 b[2] = 0.;
253 }
254 else if(x[2] > kAQ3Begin && x[2] < kAQ3End && rad2 < kAQ3SqRadius){
255 b[0] = fQuadGradient*x[1];
256 b[1] = fQuadGradient*x[0];
257 b[2] = 0.;
258 }
259 else if(x[2] > kAQ4Begin && x[2] < kAQ4End && rad2 < kAQ4SqRadius){
260 b[0] = -fQuadGradient*x[1];
261 b[1] = -fQuadGradient*x[0];
262 b[2] = 0.;
263 }
264 else if(x[2] > kAD1Begin && x[2] < kAD1End && rad2 < kAD1SqRadius){
265 b[0] = 0.;
266 b[1] = -fDipoleField;
267 b[2] = 0.;
268 }
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){
272 b[1] = fDipoleField;
273 }
274 }
275 }
276}
277
278void AliMagFC::ZDCField(double *x, double *b) const
575c700d 279{
60378f15 280 // ---- This is the ZDC part
281
ff66b122 282 double rad2 = x[0] * x[0] + x[1] * x[1];
27bf203e 283 static Bool_t init = kFALSE;
284
285 if (! init) {
286 init = kTRUE;
287 //////////////////////////////////////////////////////////////////////
288 // ---- Magnetic field values (according to beam type and energy) ----
289 if(fBeamType==kBeamTypepp && fBeamEnergy == 5000.){
290 // p-p @ 5+5 TeV
291 fQuadGradient = 15.7145;
292 fDipoleField = 27.0558;
293 // SIDE C
294 fCCorrField = 9.7017;
295 // SIDE A
296 fACorr1Field = -13.2143;
297 fACorr2Field = -11.9909;
298 } else if (fBeamType == kBeamTypepp && fBeamEnergy == 450.) {
299 // p-p 0.45+0.45 TeV
300 Float_t const kEnergyRatio = fBeamEnergy / 7000.;
301
302 fQuadGradient = 22.0002 * kEnergyRatio;
303 fDipoleField = 37.8781 * kEnergyRatio;
304 // SIDE C
305 fCCorrField = 9.6908;
306 // SIDE A
307 fACorr1Field = -13.2014;
308 fACorr2Field = -9.6908;
309 } else if ((fBeamType == kBeamTypepp && fBeamEnergy == 7000.) ||
310 (fBeamType == kBeamTypeAA))
311 {
312 // Pb-Pb @ 2.7+2.7 TeV or p-p @ 7+7 TeV
313 fQuadGradient = 22.0002;
314 fDipoleField = 37.8781;
315 // SIDE C
316 fCCorrField = 9.6908;
317 // SIDE A
318 fACorr1Field = -13.2014;
319 fACorr2Field = -9.6908;
320 }
27bf203e 321 }
322
60378f15 323
324 // SIDE C **************************************************
325 if(x[2]<0.){
326 if(x[2] < kCCorrBegin && x[2] > kCCorrEnd && rad2 < kCCorrSqRadius){
95d9681f 327 if (fFactor != 0.) {
328 b[0] = fCCorrField;
329 b[1] = 0.;
330 b[2] = 0.;
331 }
c28c3a0b 332 }
60378f15 333 else if(x[2] < kCQ1Begin && x[2] > kCQ1End && rad2 < kCQ1SqRadius){
334 b[0] = fQuadGradient*x[1];
335 b[1] = fQuadGradient*x[0];
336 b[2] = 0.;
d95ea23f 337 }
60378f15 338 else if(x[2] < kCQ2Begin && x[2] > kCQ2End && rad2 < kCQ2SqRadius){
339 b[0] = -fQuadGradient*x[1];
340 b[1] = -fQuadGradient*x[0];
341 b[2] = 0.;
d95ea23f 342 }
60378f15 343 else if(x[2] < kCQ3Begin && x[2] > kCQ3End && rad2 < kCQ3SqRadius){
344 b[0] = -fQuadGradient*x[1];
345 b[1] = -fQuadGradient*x[0];
346 b[2] = 0.;
d95ea23f 347 }
60378f15 348 else if(x[2] < kCQ4Begin && x[2] > kCQ4End && rad2 < kCQ4SqRadius){
349 b[0] = fQuadGradient*x[1];
350 b[1] = fQuadGradient*x[0];
351 b[2] = 0.;
d95ea23f 352 }
60378f15 353 else if(x[2] < kCD1Begin && x[2] > kCD1End && rad2 < kCD1SqRadius){
354 b[1] = fDipoleField;
355 b[2] = 0.;
356 b[2] = 0.;
d95ea23f 357 }
60378f15 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;
362 b[2] = 0.;
363 b[2] = 0.;
575c700d 364 }
aee8290b 365 }
60378f15 366 }
367
368 // SIDE A **************************************************
369 else{
370 if(fCompensator && (x[2] > kACorr1Begin && x[2] < kACorr1End) && rad2 < kCCorr1SqRadius) {
371 // Compensator magnet at z = 1075 m
95d9681f 372 if (fFactor != 0.) {
373 b[0] = fACorr1Field;
374 b[1] = 0.;
375 b[2] = 0.;
376 }
60378f15 377 return;
aee8290b 378 }
575c700d 379
60378f15 380 if(x[2] > kACorr2Begin && x[2] < kACorr2End && rad2 < kCCorr2SqRadius){
95d9681f 381 if (fFactor != 0.) {
382 b[0] = fACorr2Field;
383 b[1] = 0.;
384 b[2] = 0.;
385 }
5ba7c883 386 }
60378f15 387 else if(x[2] > kAQ1Begin && x[2] < kAQ1End && rad2 < kAQ1SqRadius){
5ba7c883 388 // First quadrupole of inner triplet de-focussing in x-direction
60378f15 389 b[0] = -fQuadGradient*x[1];
390 b[1] = -fQuadGradient*x[0];
391 b[2] = 0.;
5ba7c883 392 }
60378f15 393 else if(x[2] > kAQ2Begin && x[2] < kAQ2End && rad2 < kAQ2SqRadius){
394 b[0] = fQuadGradient*x[1];
395 b[1] = fQuadGradient*x[0];
396 b[2] = 0.;
5ba7c883 397 }
60378f15 398 else if(x[2] > kAQ3Begin && x[2] < kAQ3End && rad2 < kAQ3SqRadius){
399 b[0] = fQuadGradient*x[1];
400 b[1] = fQuadGradient*x[0];
401 b[2] = 0.;
5ba7c883 402 }
60378f15 403 else if(x[2] > kAQ4Begin && x[2] < kAQ4End && rad2 < kAQ4SqRadius){
404 b[0] = -fQuadGradient*x[1];
405 b[1] = -fQuadGradient*x[0];
406 b[2] = 0.;
5ba7c883 407 }
60378f15 408 else if(x[2] > kAD1Begin && x[2] < kAD1End && rad2 < kAD1SqRadius){
409 b[0] = 0.;
410 b[1] = -fDipoleField;
411 b[2] = 0.;
5ba7c883 412 }
60378f15 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){
416 b[1] = fDipoleField;
5ba7c883 417 }
418 }
60378f15 419 }
aee8290b 420}
60378f15 421