1 ////////////////////////////////////////////////////////////////////////////
3 // AliFast Detector Class //
5 // to provide information of effective material (X/Xo) of the detector //
6 // needed for the multiple scattering formula used in AliFTrackMaker. //
8 // the number and dimensions of cylindrical layers of material are //
9 // initialised here for the TP status and are to be updated accordingly. //
12 // origin: "init_geometry" routine in "res.f" fortran by Karel Safarik //
13 // which was used to calculate the track resolution for TP. //
16 // AliFast: E. Richter-Was and Y. Foka //
17 // following general structure of Makers in ATLFast //
18 // by R. Brun and E. R. Was //
20 ////////////////////////////////////////////////////////////////////////////
28 //_____________________________________________________________________________
29 AliFDet::AliFDet(const char *name, const char *title) : TNamed(name,title)
32 // Standard constructor
34 for(Int_t idDet=0; idDet<kNMaxDet; idDet++){
38 fErrorRPhi[idDet] = 0;
50 //_____________________________________________________________________________
51 void AliFDet::InitDetParam()
53 //initialisation of the detector material to the TP status.
54 //needed for multiple scattering formula used in AliFTrackMaker
55 //for track resolution calculation
58 //the errors in bending and r direction are due to detector precision and alignement
59 //the error in radial direction r is due to alignement only
60 //the errors are momentum dependent; for iFlagDet=2 as for TPC are calculated properly
62 //fErrorVertexX,fErrorVertexY, fErrorVertexZ
64 //the vertex precision depends on particle multiplicity mult_density
65 //optimistic errors for/high multiplicity
67 Double_t rDet[kNMaxDet]; // radius of detector material in cm
68 Double_t thickDet[kNMaxDet]; // thickness divided by X
69 Double_t errorRPhi[kNMaxDet]; // error in bending direction
70 Double_t errorZ[kNMaxDet]; // error in z direction
71 Double_t errorR[kNMaxDet]; // error in r direction,from alignement only
72 Int_t iFlagDet[kNMaxDet]; // 1: sensitive detector
73 // 2: errors will be calculated
74 Int_t iFlagGas[kNMaxDet]; // for gas detectors
87 thickDet[nDet] = 0.06/35.3; // berylium
88 iFlagDet[nDet] = 0; // no detection
93 thickDet[nDet] = 1.0000/30420.0; // air
94 iFlagDet[nDet] = 0; // no detection
99 thickDet[nDet] = 0.06/9.36; // silicon
100 errorRPhi[nDet] = 0.0015 + 0.0005;
101 errorZ[nDet] = 0.009 + 0.0005;
102 errorR[nDet] = 0.001;
108 thickDet[nDet] = 3.5/30420.0; // silicon
114 thickDet[nDet] = 0.06/9.36; // silicon
115 errorRPhi[nDet] = 0.0015 + 0.0005;
116 errorZ[nDet] = 0.009 + 0.0005;
117 errorR[nDet] = 0.001;
123 thickDet[nDet] = 6.5/30420.0; // air
126 // first silicon drift
129 thickDet[nDet] = 0.06/9.36; // silicon
130 errorRPhi[nDet] = 0.0025 + 0.0005;
131 errorZ[nDet] = 0.0025 + 0.0005;
132 errorR[nDet] = 0.001;
138 thickDet[nDet] = 10.0/30420.0; // air
141 // second silicon drift
144 thickDet[nDet] = 0.06/9.36; // silicon
145 errorRPhi[nDet] = 0.0025 + 0.0005;
146 errorZ[nDet] = 0.0025 + 0.0005;
147 errorR[nDet] = 0.001;
153 thickDet[nDet] = 16.0/30420.0; // air
156 // first silicon strips
159 thickDet[nDet] = 0.06/9.36; // silicon
160 errorRPhi[nDet] = 0.003 + 0.0005;
161 errorZ[nDet] = 0.100 + 0.0005;
162 errorR[nDet] = 0.001;
168 thickDet[nDet] = 5.0/30420.0; // air
171 // second silicon strips
174 thickDet[nDet] = 0.06/9.36; // silicon
175 errorRPhi[nDet] = 0.003 + 0.0005;
176 errorZ[nDet] = 0.100 + 0.0005;
177 errorR[nDet] = 0.001;
183 thickDet[nDet] = 5.0/30420.0; // air
189 thickDet[nDet] = 0.01; // 1% of something ITS
195 thickDet[nDet] = 2.0/30420.0; // air
201 thickDet[nDet] = 0.0018; // 0.18 % of something TPC
207 thickDet[nDet] = 12.5/18310.0; // CO2
213 thickDet[nDet] = 12.5/18310.0; // CO2
216 // TPC inner field cage
219 thickDet[nDet] = 0.0041; // 0.41 % of something
225 thickDet[nDet] = 11.0/32155.6; // neon
231 thickDet[nDet] = 11.0/32155.6; // neon
236 Double_t rCurrent = 99.0;
237 Double_t deltaR = 2.0;
238 for(Int_t ipad=1; ipad<nPadRow+1; ipad++){
240 rCurrent = rCurrent + deltaR;
241 rDet[nDet] = rCurrent;
242 thickDet[nDet] = 2.0/32155.6; // neon
243 errorRPhi[nDet] = 0.0; //errors are momentum dependent
244 errorZ[nDet] = 0.0; //to be calculated latter
245 errorR[nDet] = 0.0075;
246 iFlagDet[nDet] = 2; //means error defined latter
251 Double_t multDensity = 3906.25;
253 fErrorVertexX = 0.010/TMath::Sqrt(multDensity) + 0.00060;
254 fErrorVertexY = fErrorVertexX;
255 fErrorVertexZ = 0.025/TMath::Sqrt(multDensity) + 0.00075;
260 fConstMag = 1.0/(fBMag*0.297792458e-3);
263 // prepare more suitables variables
265 Int_t nDetActive = 0;
267 for(Int_t idDet=0; idDet<nDet+1; idDet++){
268 fRDet[idDet] = rDet[idDet];
269 fRDetSQ[idDet] = rDet[idDet]*rDet[idDet];
270 fThickDet[idDet] = 0.0136* TMath::Sqrt(thickDet[idDet]);
271 fIFlagDet[idDet] = iFlagDet[idDet];
272 fIFlagGas[idDet] = iFlagGas[idDet];
273 if(iFlagDet[idDet] > 0){
274 nDetActive = nDetActive+1;
275 fErrorR[idDet] = errorR[idDet]*errorR[idDet];
276 if(iFlagDet[idDet] == 1){
277 fErrorRPhi[idDet] = errorRPhi[idDet]*errorRPhi[idDet];
278 fErrorZ[idDet] = errorZ[idDet]*errorZ[idDet];
283 fErrorVertexX = fErrorVertexX*fErrorVertexX;
284 fErrorVertexY = fErrorVertexY*fErrorVertexY;
285 fErrorVertexZ = fErrorVertexZ*fErrorVertexZ;
287 fNDetActive = nDetActive;
293 //_____________________________________________________________________________
294 void AliFDet::PrintDetInfo()
296 //to print information for the initialisation of the detector
297 printf("**************************************************************\n");
299 printf("* ALICE detector *\n");
301 printf("**************************************************************\n");
303 for(Int_t idDet=0; idDet<fNDet+1; idDet++){
304 if(fIFlagDet[idDet] == 0){
305 printf("%5s %3d %8.1f %2s %10.5f %20s\n",
306 "det=",idDet,fRDet[idDet],"cm",
307 TMath::Power(fThickDet[idDet]/0.0136,2),
308 "of X0 <---- pasive material");
310 printf("%5s %3d %8.1f %2s %10.5f %6s %6.4f %6.4f \n",
311 "det=",idDet,fRDet[idDet],"cm",
312 TMath::Power(fThickDet[idDet]/0.0136,2),"of X0, errors",
313 TMath::Sqrt(fErrorRPhi[idDet]),TMath::Sqrt(fErrorZ[idDet]));
316 printf("%20s %10.4f %10.4f %10.4f\n","vertex precision(x,y,z)",
317 TMath::Sqrt(fErrorVertexX),
318 TMath::Sqrt(fErrorVertexY),
319 TMath::Sqrt(fErrorVertexZ));
320 printf("%20s %10.4f %10s %8.1f %5s\n","magnetic field (kGauss)",fBMag,
321 "(constant",fConstMag,")");