]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliMagFC.cxx
- machine parameters for pp@900 GeV
[u/mrichter/AliRoot.git] / STEER / AliMagFC.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 //     Constant magnetic field class
20 //     Used by AliRun class
21 //     Author:
22 //-------------------------------------------------------------------------
23
24 #include <stdlib.h>
25
26 #include "AliLog.h"
27 #include "AliMagFC.h"
28
29 ClassImp(AliMagFC)
30
31 //________________________________________
32 AliMagFC::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
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),
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
61 {
62   // 
63   // Standard constructor
64   //
65   fType = kConst;
66   fMap  = 1;
67   
68   //////////////////////////////////////////////////////////////////////
69   // ---- Magnetic field values (according to beam type and energy) ----
70   if(fBeamType==kBeamTypepp && fBeamEnergy==5000.){
71   // p-p @ 5+5 TeV
72       fQuadGradient = 15.7145;
73       fDipoleField  = 27.0558;
74       // SIDE C
75       fCCorrField   = 9.7017;
76       // SIDE A
77       fACorr1Field  = -13.2143;
78       fACorr2Field  = -11.9909;
79   } else if (fBeamType == kBeamTypepp && fBeamEnergy == 450.) {
80   // p-p 0.45+0.45 TeV
81       Float_t const kEnergyRatio = fBeamEnergy / 7000.;
82       
83       fQuadGradient = 22.0002 * kEnergyRatio;
84       fDipoleField  = 37.8781 * kEnergyRatio;
85       // SIDE C
86       fCCorrField   =  9.6908 * kEnergyRatio;
87       // SIDE A
88       fACorr1Field  = -13.2014;
89       fACorr2Field  = -9.6908;
90   } else if ((fBeamType == kBeamTypepp && fBeamEnergy == 7000.) ||
91              (fBeamType == kBeamTypeAA))
92   {
93       // Pb-Pb @ 2.7+2.7 TeV or p-p @ 7+7 TeV
94       fQuadGradient = 22.0002;
95       fDipoleField  = 37.8781;
96       // SIDE C
97       fCCorrField   = 9.6908;
98       // SIDE A
99       fACorr1Field  = -13.2014;
100       fACorr2Field  = -9.6908;
101   }
102 }
103
104 //________________________________________
105 void AliMagFC::Field(Float_t *x, Float_t *b) const
106 {
107   //
108   // Method to return the field in a point
109   //
110   b[0]=b[1]=b[2]=0;
111   if(fMap==1) {
112     if(TMath::Abs(x[2])<700 && x[0]*x[0]+(x[1]+30)*(x[1]+30) < 560*560) {
113       b[2]=2;
114     } 
115     else {
116       if(-725 >= x[2] && x[2] >= -1225 ){
117         Float_t dz = TMath::Abs(-975-x[2])*0.01;
118         b[0] = - (1-0.1*dz*dz)*7;
119         if(fFactor!=1) {
120             b[0]*=fFactor;
121             b[1]*=fFactor;
122             b[2]*=fFactor;
123         }
124       }
125       else {
126           ZDCField(x, b);
127       }
128     }
129
130   } 
131   else {
132       AliFatal(Form("Invalid field map for constant field %d",fMap));
133   }
134 }
135
136 //___________________________________________________
137 void AliMagFC::ZDCField(Float_t *x, Float_t *b) const
138 {
139   // ---- This is the ZDC part
140   
141   Float_t rad2 = x[0] * x[0] + x[1] * x[1];
142   
143   // SIDE C **************************************************
144   if(x[2]<0.){  
145     if(x[2] < kCCorrBegin && x[2] > kCCorrEnd && rad2 < kCCorrSqRadius){
146         if (fFactor != 0.) {
147             b[0] = fCCorrField;
148             b[1] = 0.;
149             b[2] = 0.;
150         } 
151     }
152     else if(x[2] < kCQ1Begin && x[2] > kCQ1End && rad2 < kCQ1SqRadius){
153         b[0] = fQuadGradient*x[1];
154         b[1] = fQuadGradient*x[0];
155         b[2] = 0.;
156     }
157     else if(x[2] < kCQ2Begin && x[2] > kCQ2End && rad2 < kCQ2SqRadius){
158         b[0] = -fQuadGradient*x[1];
159         b[1] = -fQuadGradient*x[0];
160         b[2] = 0.;
161     }
162     else if(x[2] < kCQ3Begin && x[2] > kCQ3End && rad2 < kCQ3SqRadius){
163         b[0] = -fQuadGradient*x[1];
164         b[1] = -fQuadGradient*x[0];
165         b[2] = 0.;
166     }
167     else if(x[2] < kCQ4Begin && x[2] > kCQ4End && rad2 < kCQ4SqRadius){
168         b[0] = fQuadGradient*x[1];
169         b[1] = fQuadGradient*x[0];
170         b[2] = 0.;
171     }
172     else if(x[2] < kCD1Begin && x[2] > kCD1End && rad2 < kCD1SqRadius){
173         b[1] = fDipoleField;
174         b[2] = 0.;
175         b[2] = 0.;
176     }
177     else if(x[2] < kCD2Begin && x[2] > kCD2End){
178         if(((x[0]-kCD2XCentre1)*(x[0]-kCD2XCentre1)+(x[1]*x[1]))<kCD2SqRadius
179            || ((x[0]-kCD2XCentre2)*(x[0]-kCD2XCentre2)+(x[1]*x[1]))<kCD2SqRadius){
180           b[1] = -fDipoleField;
181           b[2] = 0.;
182           b[2] = 0.;
183         }
184     }
185   }
186   
187   // SIDE A **************************************************
188   else{        
189     if(fCompensator && (x[2] > kACorr1Begin && x[2] < kACorr1End) && rad2 < kCCorr1SqRadius) {
190       // Compensator magnet at z = 1075 m 
191         if (fFactor != 0.) {
192             b[0] = fACorr1Field;
193             b[1] = 0.;
194             b[2] = 0.;
195         }
196         return;
197     }
198     
199     if(x[2] > kACorr2Begin && x[2] < kACorr2End && rad2 < kCCorr2SqRadius){
200         if (fFactor != 0.) {
201             b[0] = fACorr2Field;
202             b[1] = 0.;
203             b[2] = 0.;
204         }
205     }          
206     else if(x[2] > kAQ1Begin && x[2] < kAQ1End && rad2 < kAQ1SqRadius){
207         // First quadrupole of inner triplet de-focussing in x-direction
208         b[0] = -fQuadGradient*x[1];
209         b[1] = -fQuadGradient*x[0];
210         b[2] = 0.;
211     }
212     else if(x[2] > kAQ2Begin && x[2] < kAQ2End && rad2 < kAQ2SqRadius){
213         b[0] = fQuadGradient*x[1];
214         b[1] = fQuadGradient*x[0];
215         b[2] = 0.;
216     }
217     else if(x[2] > kAQ3Begin && x[2] < kAQ3End && rad2 < kAQ3SqRadius){
218         b[0] = fQuadGradient*x[1];
219         b[1] = fQuadGradient*x[0];
220         b[2] = 0.;
221     }
222     else if(x[2] > kAQ4Begin && x[2] < kAQ4End && rad2 < kAQ4SqRadius){
223         b[0] = -fQuadGradient*x[1];
224         b[1] = -fQuadGradient*x[0];
225         b[2] = 0.;
226     }
227     else if(x[2] > kAD1Begin && x[2] < kAD1End && rad2 < kAD1SqRadius){
228         b[0] = 0.;
229         b[1] = -fDipoleField;
230         b[2] = 0.;
231     }
232     else if(x[2] > kAD2Begin && x[2] < kAD2End){
233         if(((x[0]-kAD2XCentre1)*(x[0]-kAD2XCentre1)+(x[1]*x[1])) < kAD2SqRadius
234            || ((x[0]-kAD2XCentre2)*(x[0]-kAD2XCentre2)+(x[1]*x[1])) < kAD2SqRadius){
235             b[1] = fDipoleField;
236         }
237     }
238   }
239 }
240