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)
31 for(Int_t idDet=0; idDet<kNMaxDet; idDet++){
35 fErrorRPhi[idDet] = 0;
47 //_____________________________________________________________________________
48 void AliFDet::InitDetParam()
50 //initialisation of the detector material to the TP status.
51 //needed for multiple scattering formula used in AliFTrackMaker
52 //for track resolution calculation
55 //the errors in bending and r direction are due to detector precision and alignement
56 //the error in radial direction r is due to alignement only
57 //the errors are momentum dependent; for iFlagDet=2 as for TPC are calculated properly
59 //fErrorVertexX,fErrorVertexY, fErrorVertexZ
61 //the vertex precision depends on particle multiplicity mult_density
62 //optimistic errors for/high multiplicity
64 Double_t rDet[kNMaxDet]; // radius of detector material in cm
65 Double_t thickDet[kNMaxDet]; // thickness divided by X
66 Double_t errorRPhi[kNMaxDet]; // error in bending direction
67 Double_t errorZ[kNMaxDet]; // error in z direction
68 Double_t errorR[kNMaxDet]; // error in r direction,from alignement only
69 Int_t iFlagDet[kNMaxDet]; // 1: sensitive detector
70 // 2: errors will be calculated
71 Int_t iFlagGas[kNMaxDet]; // for gas detectors
84 thickDet[nDet] = 0.06/35.3; // berylium
85 iFlagDet[nDet] = 0; // no detection
90 thickDet[nDet] = 1.0000/30420.0; // air
91 iFlagDet[nDet] = 0; // no detection
96 thickDet[nDet] = 0.06/9.36; // silicon
97 errorRPhi[nDet] = 0.0015 + 0.0005;
98 errorZ[nDet] = 0.009 + 0.0005;
105 thickDet[nDet] = 3.5/30420.0; // silicon
111 thickDet[nDet] = 0.06/9.36; // silicon
112 errorRPhi[nDet] = 0.0015 + 0.0005;
113 errorZ[nDet] = 0.009 + 0.0005;
114 errorR[nDet] = 0.001;
120 thickDet[nDet] = 6.5/30420.0; // air
123 // first silicon drift
126 thickDet[nDet] = 0.06/9.36; // silicon
127 errorRPhi[nDet] = 0.0025 + 0.0005;
128 errorZ[nDet] = 0.0025 + 0.0005;
129 errorR[nDet] = 0.001;
135 thickDet[nDet] = 10.0/30420.0; // air
138 // second silicon drift
141 thickDet[nDet] = 0.06/9.36; // silicon
142 errorRPhi[nDet] = 0.0025 + 0.0005;
143 errorZ[nDet] = 0.0025 + 0.0005;
144 errorR[nDet] = 0.001;
150 thickDet[nDet] = 16.0/30420.0; // air
153 // first silicon strips
156 thickDet[nDet] = 0.06/9.36; // silicon
157 errorRPhi[nDet] = 0.003 + 0.0005;
158 errorZ[nDet] = 0.100 + 0.0005;
159 errorR[nDet] = 0.001;
165 thickDet[nDet] = 5.0/30420.0; // air
168 // second silicon strips
171 thickDet[nDet] = 0.06/9.36; // silicon
172 errorRPhi[nDet] = 0.003 + 0.0005;
173 errorZ[nDet] = 0.100 + 0.0005;
174 errorR[nDet] = 0.001;
180 thickDet[nDet] = 5.0/30420.0; // air
186 thickDet[nDet] = 0.01; // 1% of something ITS
192 thickDet[nDet] = 2.0/30420.0; // air
198 thickDet[nDet] = 0.0018; // 0.18 % of something TPC
204 thickDet[nDet] = 12.5/18310.0; // CO2
210 thickDet[nDet] = 12.5/18310.0; // CO2
213 // TPC inner field cage
216 thickDet[nDet] = 0.0041; // 0.41 % of something
222 thickDet[nDet] = 11.0/32155.6; // neon
228 thickDet[nDet] = 11.0/32155.6; // neon
233 Double_t rCurrent = 99.0;
234 Double_t deltaR = 2.0;
235 for(Int_t ipad=1; ipad<nPadRow+1; ipad++){
237 rCurrent = rCurrent + deltaR;
238 rDet[nDet] = rCurrent;
239 thickDet[nDet] = 2.0/32155.6; // neon
240 errorRPhi[nDet] = 0.0; //errors are momentum dependent
241 errorZ[nDet] = 0.0; //to be calculated latter
242 errorR[nDet] = 0.0075;
243 iFlagDet[nDet] = 2; //means error defined latter
248 Double_t multDensity = 3906.25;
250 fErrorVertexX = 0.010/TMath::Sqrt(multDensity) + 0.00060;
251 fErrorVertexY = fErrorVertexX;
252 fErrorVertexZ = 0.025/TMath::Sqrt(multDensity) + 0.00075;
257 fConstMag = 1.0/(fBMag*0.297792458e-3);
260 // prepare more suitables variables
262 Int_t nDetActive = 0;
264 for(Int_t idDet=0; idDet<nDet+1; idDet++){
265 fRDet[idDet] = rDet[idDet];
266 fRDetSQ[idDet] = rDet[idDet]*rDet[idDet];
267 fThickDet[idDet] = 0.0136* TMath::Sqrt(thickDet[idDet]);
268 fIFlagDet[idDet] = iFlagDet[idDet];
269 fIFlagGas[idDet] = iFlagGas[idDet];
270 if(iFlagDet[idDet] > 0){
271 nDetActive = nDetActive+1;
272 fErrorR[idDet] = errorR[idDet]*errorR[idDet];
273 if(iFlagDet[idDet] == 1){
274 fErrorRPhi[idDet] = errorRPhi[idDet]*errorRPhi[idDet];
275 fErrorZ[idDet] = errorZ[idDet]*errorZ[idDet];
280 fErrorVertexX = fErrorVertexX*fErrorVertexX;
281 fErrorVertexY = fErrorVertexY*fErrorVertexY;
282 fErrorVertexZ = fErrorVertexZ*fErrorVertexZ;
284 fNDetActive = nDetActive;
290 //_____________________________________________________________________________
291 void AliFDet::PrintDetInfo()
293 //to print information for the initialisation of the detector
294 printf("**************************************************************\n");
296 printf("* ALICE detector *\n");
298 printf("**************************************************************\n");
300 for(Int_t idDet=0; idDet<fNDet+1; idDet++){
301 if(fIFlagDet[idDet] == 0){
302 printf("%5s %3d %8.1f %2s %10.5f %20s\n",
303 "det=",idDet,fRDet[idDet],"cm",
304 TMath::Power(fThickDet[idDet]/0.0136,2),
305 "of X0 <---- pasive material");
307 printf("%5s %3d %8.1f %2s %10.5f %6s %6.4f %6.4f \n",
308 "det=",idDet,fRDet[idDet],"cm",
309 TMath::Power(fThickDet[idDet]/0.0136,2),"of X0, errors",
310 TMath::Sqrt(fErrorRPhi[idDet]),TMath::Sqrt(fErrorZ[idDet]));
313 printf("%20s %10.4f %10.4f %10.4f\n","vertex precision(x,y,z)",
314 TMath::Sqrt(fErrorVertexX),
315 TMath::Sqrt(fErrorVertexY),
316 TMath::Sqrt(fErrorVertexZ));
317 printf("%20s %10.4f %10s %8.1f %5s\n","magnetic field (kGauss)",fBMag,
318 "(constant",fConstMag,")");