fe4da5cc |
1 | /////////////////////////////////////////////////////////////////////////////// |
2 | // // |
3 | // Time Projection Chamber version 2 -- detailed TPC and slow simulation // |
4 | // // |
5 | //Begin_Html |
6 | /* |
1439f98e |
7 | <img src="picts/AliTPCv2Class.gif"> |
fe4da5cc |
8 | */ |
9 | //End_Html |
10 | // // |
11 | // // |
12 | /////////////////////////////////////////////////////////////////////////////// |
2a49965d |
13 | #include <stdlib.h> |
fe4da5cc |
14 | |
15 | #include <TMath.h> |
bcac8ae4 |
16 | |
fe4da5cc |
17 | #include "AliTPCv2.h" |
bcac8ae4 |
18 | #include "AliTPCD.h" |
fe4da5cc |
19 | #include "AliRun.h" |
fe4da5cc |
20 | #include "AliConst.h" |
8c555625 |
21 | |
fe4da5cc |
22 | ClassImp(AliTPCv2) |
23 | |
24 | //_____________________________________________________________________________ |
25 | AliTPCv2::AliTPCv2(const char *name, const char *title) : |
26 | AliTPC(name, title) |
27 | { |
28 | // |
29 | // Standard constructor for Time Projection Chamber version 2 |
30 | // |
31 | fIdSens1=0; |
32 | fIdSens2=0; |
33 | SetBufferSize(128000); |
34 | } |
35 | |
36 | //_____________________________________________________________________________ |
37 | void AliTPCv2::CreateGeometry() |
38 | { |
39 | // |
40 | // Create the geometry of Time Projection Chamber version 2 |
41 | // |
42 | //Begin_Html |
43 | /* |
1439f98e |
44 | <img src="picts/AliTPCv2.gif"> |
fe4da5cc |
45 | */ |
46 | //End_Html |
47 | //Begin_Html |
48 | /* |
1439f98e |
49 | <img src="picts/AliTPCv2Tree.gif"> |
fe4da5cc |
50 | */ |
51 | //End_Html |
52 | |
ad51aeb0 |
53 | Int_t *idtmed = fIdtmed->GetArray()-399; |
fe4da5cc |
54 | |
8c555625 |
55 | AliTPCParam * fTPCParam = &(fDigParam->GetParam()); |
56 | |
57 | Float_t tana; |
fe4da5cc |
58 | Int_t isll; |
59 | Float_t rlsl, wlsl, rssl, rlsu, wssl, wlsu, rssu, wssu; |
60 | Int_t i; |
61 | Float_t alpha, x, y, z, sec_thick; |
62 | |
63 | Float_t r1, r2, x1, z0, z1, x2, theta1, theta2, theta3, dm[21]; |
64 | Int_t il, iu; |
65 | Float_t z_side, zz; |
66 | Int_t idrotm[100]; |
67 | |
68 | Float_t x0l, x0u; |
69 | Int_t idr; |
70 | Float_t thl, opl; |
71 | Int_t ils, iss; |
8c555625 |
72 | Float_t thu, opu; |
fe4da5cc |
73 | Int_t ifl1 = 0, ifl2 = 0; |
74 | Float_t phi1, phi2, phi3; |
75 | |
76 | // --------------------------------------------------- |
77 | // sector specification check |
78 | // --------------------------------------------------- |
79 | if (fSecAL >= 0) { |
80 | ifl1 = 0; |
81 | |
82 | for (i = 0; i < 6; ++i) { |
83 | if (fSecLows[i] > 0 && fSecLows[i] <25) { |
84 | ifl1 = 1; |
85 | printf("*** SECTOR %d selected\n",fSecLows[i]); |
86 | } |
87 | } |
88 | |
89 | } else { |
90 | printf("*** ALL LOWER SECTORS SELECTED ***\n"); |
8c555625 |
91 | ifl1 = 1; |
fe4da5cc |
92 | } |
93 | |
94 | if (fSecAU >= 0) { |
95 | ifl2 = 0; |
96 | |
97 | for (i = 0; i < 12; ++i) { |
98 | if (fSecUps[i] > 24 && fSecUps[i] < 73) { |
99 | ifl2 = 1; |
100 | printf("*** SECTOR %d selected\n",fSecUps[i]); |
101 | } |
102 | } |
103 | |
104 | } else { |
105 | printf("*** ALL UPPER SECTORS SELECTED ***\n"); |
8c555625 |
106 | ifl1 = 1; |
fe4da5cc |
107 | } |
108 | |
109 | if (ifl1 == 0 && ifl2 == 0) { |
110 | printf("*** ERROR: AT LEAST ONE SECTOR MUST BE SPECIFIED ***\n"); |
111 | printf("!!! PROGRAM STOPPED !!!\n"); |
112 | exit(1); |
113 | } |
114 | |
115 | if ((fSecAL < 0 || fSecAU < 0) && fSens >= 0) { |
116 | printf("** ERROR: STRIPS CANNOT BE SPECIFIED FOR ALL SECTORS **\n"); |
117 | printf("!!! PROGRAM STOPPED !!!\n"); |
118 | exit(1); |
119 | } |
120 | // ---------------------------------------------------- |
121 | // FIELD CAGE WITH ENDCAPS - CARBON FIBER |
122 | // THIS IS ALSO A TPC MOTHER VOLUME |
123 | // ---------------------------------------------------- |
124 | dm[0] = 76.; |
125 | dm[1] = 278.; |
126 | dm[2] = 275.; |
127 | |
cfce8870 |
128 | gMC->Gsvolu("TPC ", "TUBE", idtmed[407], dm, 3); |
fe4da5cc |
129 | // ------------------------------------------------------- |
130 | // drift gas Ne/CO2 (90/10 volume) - nonsensitive |
131 | // field cage thickness = 0.52% X0 |
132 | // ---------------------------------------------------- |
133 | dm[0] = 76.+0.09776; |
134 | dm[1] = 257.; |
135 | dm[2] = 250.; |
136 | |
cfce8870 |
137 | gMC->Gsvolu("TGAS", "TUBE", idtmed[402], dm, 3); |
fe4da5cc |
138 | // ------------------------------------------------------ |
139 | // "side" gas volume (the same as drift gas), |
140 | // here the readout chambers are positioned |
141 | // ------------------------------------------------------ |
142 | dm[2] = 0.5*(275.-250.); |
143 | z_side = dm[2]; |
144 | |
cfce8870 |
145 | gMC->Gsvolu("TPSG", "TUBE", idtmed[401], dm, 3); |
fe4da5cc |
146 | // ------------------------------------------------------ |
147 | // HV midplane - 20 microns of mylar |
148 | // ----------------------------------------------------- |
149 | dm[2] = .001; |
150 | |
cfce8870 |
151 | gMC->Gsvolu("TPHV", "TUBE", idtmed[405], dm, 3); |
fe4da5cc |
152 | |
153 | // ==================================================== |
154 | // lower and upper readout chambers |
155 | // ==================================================== |
156 | // sectros opening angles in degrees |
157 | // --------------------------------------------------- |
158 | opl = 30.; |
159 | opu = 15.; |
160 | thl = TMath::Tan(opl * .5 * kDegrad); |
161 | thu = TMath::Tan(opu * .5 * kDegrad); |
162 | // --------------------------------------------------- |
163 | // S and L-sectors radii |
164 | // --------------------------------------------------- |
165 | rssl = 88.; |
166 | rssu = 136.; |
167 | rlsl = 142.; |
168 | rlsu = 250.; |
169 | // -------------------------------------------------- |
170 | // Sectors widths |
171 | // -------------------------------------------------- |
172 | wssl = 46.5; |
173 | wssu = 72.2; |
174 | wlsl = 37.; |
175 | wlsu = 65.4; |
176 | // --------------------------------------------------- |
177 | // Sector thickness 25% of X0 (Al) |
178 | // --------------------------------------------------- |
179 | sec_thick = 2.225; |
180 | // --------------------------------------------------- |
181 | // S-sectors (lower sectors) |
182 | // --------------------------------------------------- |
183 | dm[0] = wssl * .5; |
184 | dm[1] = wssu * .5; |
185 | dm[2] = sec_thick * .5; |
186 | dm[3] = (rssu - rssl) * .5; |
187 | |
188 | x0l = rssl + dm[3]; |
189 | |
cfce8870 |
190 | gMC->Gsvolu("TRCS", "TRD1", idtmed[399], dm, 4); |
fe4da5cc |
191 | // ----------------------------------------------------- |
192 | // S-sectors --> "gas sectors" - sensitive |
193 | // ----------------------------------------------------- |
194 | dm[2] = (250.-0.001)/2.; |
cfce8870 |
195 | gMC->Gsvolu("TSGA", "TRD1", idtmed[403], dm, 4); |
fe4da5cc |
196 | // ------------------------------------------------------------- |
197 | // Only for the debugging purpose and resolution calculation |
198 | // Sensitive strips at the pad-row center |
199 | // ------------------------------------------------------------- |
200 | if (fSens >= 0) { |
cfce8870 |
201 | gMC->Gsvolu("TSST", "TRD1", idtmed[403], dm, 0); |
fe4da5cc |
202 | dm[3] = .005; |
8c555625 |
203 | |
204 | z0 = rssl + (rssu - rssl) * .5; |
fe4da5cc |
205 | |
8c555625 |
206 | for (iss = 0; iss < fTPCParam->GetNRowLow(); ++iss) { |
207 | r1 = fTPCParam->GetPadRowRadiiLow(iss); |
fe4da5cc |
208 | r2 = r1 + dm[3] * 2.; |
9f84158c |
209 | dm[0] = r1 * thl - 2.63; |
210 | dm[1] = r2 * thl - 2.63; |
8c555625 |
211 | |
212 | zz = -z0 + r1 +dm[3]; |
213 | |
cfce8870 |
214 | gMC->Gsposp("TSST", iss+1, "TSGA", 0, 0, zz, 0, "ONLY", dm, 4); |
fe4da5cc |
215 | } |
cfce8870 |
216 | gMC->Gsord("TSGA", 3); |
fe4da5cc |
217 | } |
218 | // --------------------------------------------------- |
219 | // L-sectors (upper sectors) |
220 | // --------------------------------------------------- |
221 | dm[0] = wlsl * .5; |
222 | dm[1] = wlsu * .5; |
223 | dm[2] = sec_thick * .5; |
224 | dm[3] = (rlsu - rlsl) * .5; |
225 | |
226 | x0u = rlsl + dm[3]; |
227 | |
cfce8870 |
228 | gMC->Gsvolu("TRCL", "TRD1", idtmed[399], dm, 4); |
fe4da5cc |
229 | // ----------------------------------------------------- |
230 | // L-sectors - "gas sectors" - sensitive! |
231 | // ----------------------------------------------------- |
232 | dm[2] = (250.-0.001)/2.; |
cfce8870 |
233 | gMC->Gsvolu("TLGA", "TRD1", idtmed[403], dm, 4); |
fe4da5cc |
234 | // ------------------------------------------------------------- |
235 | // Only for the debugging purpose and resolution calculation |
236 | // Sensitive strips at the pad-row center |
237 | // ------------------------------------------------------------- |
238 | if (fSens >= 0) { |
cfce8870 |
239 | gMC->Gsvolu("TLST", "TRD1", idtmed[403], dm, 0); |
fe4da5cc |
240 | |
241 | dm[3] = .005; |
8c555625 |
242 | |
243 | z0 = rlsl+ (rlsu - rlsl) * .5; |
fe4da5cc |
244 | |
8c555625 |
245 | for (ils = 0; ils <fTPCParam->GetNRowUp(); ++ils) { |
246 | r1 = fTPCParam->GetPadRowRadiiUp(ils); |
fe4da5cc |
247 | r2 = r1 + dm[3] * 2.; |
8c555625 |
248 | dm[0] = r1 * thu - 2.63; |
249 | dm[1] = r2 * thu - 2.63; |
250 | |
251 | zz = -z0 + r1 +dm[3]; |
252 | |
cfce8870 |
253 | gMC->Gsposp("TLST", ils+1, "TLGA", 0, 0, zz, 0, "ONLY", dm, 4); |
fe4da5cc |
254 | } |
cfce8870 |
255 | gMC->Gsord("TLGA", 3); |
fe4da5cc |
256 | } |
257 | // ****************************************************** |
258 | // ------------------------------------------------ |
259 | // positioning of lower sectors (1-12)*2 |
260 | // rotation matrices 1-12 |
261 | |
262 | // the isec_al flag allows to select all (<0) or |
263 | // only a few (up to 6) sectors |
264 | // ------------------------------------------------ |
265 | z = (250.+0.001)/2.; |
266 | z1 = -z_side + sec_thick * .5; |
267 | |
268 | for (il = 1; il <= 12; ++il) { |
269 | phi1 = (il - 1) * opl + 270.; |
270 | if (phi1 > 360.) { |
271 | phi1 += -360.; |
272 | } |
273 | theta1 = 90.; |
274 | phi2 = 90.; |
275 | theta2 = 180.; |
276 | phi3 = (il - 1) * opl; |
277 | theta3 = 90.; |
278 | |
279 | idr = il; |
280 | AliMatrix(idrotm[idr], theta1, phi1, theta2, phi2, theta3, phi3); |
281 | |
282 | alpha = (il - 1) * opl * kDegrad; |
283 | x = x0l * TMath::Cos(alpha); |
284 | y = x0l * TMath::Sin(alpha); |
285 | |
286 | if (fSecAL < 0) { |
287 | // ----------------------------------------------------------- |
288 | // position ALL lower sectors |
289 | // ----------------------------------------------------------- |
cfce8870 |
290 | gMC->Gspos("TSGA", il, "TGAS", x, y, z, idrotm[idr], "ONLY"); |
291 | gMC->Gspos("TSGA",il+12 , "TGAS", x, y, -z, idrotm[idr], "ONLY"); |
fe4da5cc |
292 | } else { |
293 | // ----------------------------------------------------------- |
294 | // position selected lower sectors |
295 | // ----------------------------------------------------------- |
296 | for (isll = 1; isll <= 6; ++isll) { |
297 | if (fSecLows[isll - 1] == il) { |
cfce8870 |
298 | gMC->Gspos("TSGA", il, "TGAS", x, y, z, idrotm[idr], "ONLY"); |
fe4da5cc |
299 | } else if (fSecLows[isll - 1] == il + 12) { |
cfce8870 |
300 | gMC->Gspos("TSGA",il+12 , "TGAS", x, y, -z, idrotm[idr],"ONLY"); |
fe4da5cc |
301 | } |
302 | } |
303 | } |
304 | |
cfce8870 |
305 | gMC->Gspos("TRCS", il, "TPSG", x, y, z1, idrotm[idr], "ONLY"); |
fe4da5cc |
306 | |
307 | } |
308 | // ---------------------------------------------------- |
309 | // positioning of upper sectors (1-24)*2 |
310 | // rotation matrices 13-36 |
311 | // the isec_au flag allows to select all (<0) or |
312 | // only a few (up to 12) sectors |
313 | // ---------------------------------------------------- |
314 | for (iu = 1; iu <= 24; ++iu) { |
315 | phi1 = (iu - 1) * opu + 270.; |
316 | if (phi1 > 360.) { |
317 | phi1 += -360.; |
318 | } |
319 | theta1 = 90.; |
320 | phi2 = 90.; |
321 | theta2 = 180.; |
322 | phi3 = (iu - 1) * opu; |
323 | theta3 = 90.; |
324 | |
325 | idr = iu + 12; |
326 | AliMatrix(idrotm[idr], theta1, phi1, theta2, phi2, theta3, phi3); |
327 | |
328 | alpha = (iu - 1) * opu * kDegrad; |
329 | x = x0u * TMath::Cos(alpha); |
330 | y = x0u * TMath::Sin(alpha); |
331 | |
332 | if (fSecAU < 0) { |
333 | // ------------------------------------------------------------- |
334 | // position ALL upper sectors |
335 | // ------------------------------------------------------------- |
cfce8870 |
336 | gMC->Gspos("TLGA", iu, "TGAS", x, y, z, idrotm[idr], "ONLY"); |
337 | gMC->Gspos("TLGA",iu+24 , "TGAS", x, y, -z, idrotm[idr], "ONLY"); |
fe4da5cc |
338 | } else { |
339 | // ------------------------------------------------------------- |
340 | // position selected upper sectors |
341 | // ------------------------------------------------------------- |
342 | for (isll = 1; isll <= 12; ++isll) { |
343 | if (fSecUps[isll - 1] == iu + 24) { |
cfce8870 |
344 | gMC->Gspos("TLGA", iu, "TGAS", x, y, z, idrotm[idr], "ONLY"); |
fe4da5cc |
345 | } else if (fSecUps[isll - 1] == iu + 48) { |
cfce8870 |
346 | gMC->Gspos("TLGA",iu+24 , "TGAS", x, y, -z, idrotm[idr],"ONLY"); |
fe4da5cc |
347 | } |
348 | } |
349 | } |
350 | |
cfce8870 |
351 | gMC->Gspos("TRCL", iu, "TPSG", x, y, z1, idrotm[idr], "ONLY"); |
fe4da5cc |
352 | } |
353 | // -------------------------------------------------------- |
354 | // Spoke wheel structures |
355 | // -------------------------------------------------------- |
cfce8870 |
356 | gMC->Gsvolu("TSWS", "TUBE", idtmed[399], dm, 0); |
fe4da5cc |
357 | |
358 | z0 = -z_side + 2.; |
359 | |
360 | dm[0] = 82.; |
361 | dm[1] = 86.; |
362 | dm[2] = 1.; |
363 | |
cfce8870 |
364 | gMC->Gsposp("TSWS", 1, "TPSG", 0, 0, z0, 0, "ONLY", dm, 3); |
fe4da5cc |
365 | |
366 | dm[0] = 253.; |
367 | dm[1] = 257.; |
368 | |
cfce8870 |
369 | gMC->Gsposp("TSWS", 2, "TPSG", 0, 0, z0, 0, "ONLY", dm, 3); |
fe4da5cc |
370 | |
371 | dm[0] = 140.9; |
372 | dm[1] = 141.9; |
373 | |
cfce8870 |
374 | gMC->Gsposp("TSWS", 3, "TPSG", 0, 0, z0, 0, "ONLY", dm, 3); |
fe4da5cc |
375 | |
376 | // ------------------------------------------------------- |
377 | // this volumes are to avoid overlaping |
378 | // ------------------------------------------------------- |
379 | z0 = 253.; |
380 | |
381 | dm[0] = 76.; |
382 | dm[1] = 76.+0.09776; |
383 | |
cfce8870 |
384 | gMC->Gsposp("TSWS", 4, "TPC ", 0, 0, z0, 0, "ONLY", dm, 3); |
385 | gMC->Gsposp("TSWS", 5, "TPC ", 0, 0, -z0, 0, "ONLY", dm, 3); |
fe4da5cc |
386 | |
387 | z0 += 21.; |
388 | |
cfce8870 |
389 | gMC->Gsposp("TSWS", 6, "TPC ", 0, 0, z0, 0, "ONLY", dm, 3); |
390 | gMC->Gsposp("TSWS", 7, "TPC ", 0, 0, -z0, 0, "ONLY", dm, 3); |
fe4da5cc |
391 | |
392 | dm[0] = 257.; |
393 | dm[1] = 257.+0.09776; |
394 | dm[2] = 11.5; |
395 | |
396 | z0 = 263.5; |
397 | |
cfce8870 |
398 | gMC->Gsposp("TSWS", 8, "TPC ", 0, 0, z0, 0, "ONLY", dm, 3); |
399 | gMC->Gsposp("TSWS", 9, "TPC ", 0, 0, -z0, 0, "ONLY", dm, 3); |
fe4da5cc |
400 | // ========================================================== |
401 | // wheels |
402 | // ========================================================== |
403 | // ---------------------------------------------------------- |
404 | // Large wheel -> positioned in the TPC |
405 | // ---------------------------------------------------------- |
406 | dm[0] = 257.+0.09776; |
407 | dm[1] = 278.; |
408 | dm[2] = 11.5; |
cfce8870 |
409 | gMC->Gsvolu("TPW1", "TUBE", idtmed[399], dm, 3); |
fe4da5cc |
410 | |
411 | dm[0] = 259.; |
412 | dm[1] = 278.; |
413 | dm[2] = 9.5; |
414 | |
cfce8870 |
415 | gMC->Gsvolu("TPW2", "TUBE", idtmed[498], dm, 3); |
fe4da5cc |
416 | |
cfce8870 |
417 | gMC->Gspos("TPW2", 1, "TPW1", 0, 0, 0, 0, "ONLY"); |
fe4da5cc |
418 | |
cfce8870 |
419 | gMC->Gspos("TPW1", 1, "TPC ", 0, 0, z0, 0, "ONLY"); |
420 | gMC->Gspos("TPW1", 2, "TPC ", 0, 0, -z0, 0, "ONLY"); |
fe4da5cc |
421 | // ----------------------------------------------------------- |
422 | // Small wheel -> positioned in the TPSG |
423 | // ----------------------------------------------------------- |
424 | dm[0] = 76.+0.09776; |
425 | dm[1] = 82.; |
426 | dm[2] = 11.5; |
427 | |
cfce8870 |
428 | gMC->Gsvolu("TPW3", "TUBE", idtmed[399], dm, 3); |
fe4da5cc |
429 | |
430 | dm[0] = 76.+0.09776; |
431 | dm[1] = 80.; |
432 | dm[2] = 9.5; |
433 | |
cfce8870 |
434 | gMC->Gsvolu("TPW4", "TUBE", idtmed[401], dm, 3); |
fe4da5cc |
435 | |
cfce8870 |
436 | gMC->Gspos("TPW4", 1, "TPW3", 0, 0, 0, 0, "ONLY"); |
fe4da5cc |
437 | |
438 | z0 = 1.; |
439 | |
cfce8870 |
440 | gMC->Gspos("TPW3", 1, "TPSG", 0, 0, z0, 0, "ONLY"); |
fe4da5cc |
441 | // --------------------------------------------------------- |
442 | // spokes, inner and outer, also the inner ring |
443 | // --------------------------------------------------------- |
444 | dm[0] = 0.5*(135.9-82.1); |
445 | dm[1] = 3.; |
446 | dm[2] = 2.; |
447 | |
448 | x1 = dm[0] + 82.; |
449 | |
cfce8870 |
450 | gMC->Gsvolu("TSPI", "BOX ", idtmed[399], dm, 3); |
fe4da5cc |
451 | |
452 | dm[1] = 2.; |
453 | dm[2] = 1.; |
454 | |
cfce8870 |
455 | gMC->Gsvolu("TSP1", "BOX ", idtmed[498], dm, 3); |
fe4da5cc |
456 | |
cfce8870 |
457 | gMC->Gspos("TSP1", 1, "TSPI", 0, 0, 0, 0, "ONLY"); |
fe4da5cc |
458 | |
459 | dm[0] = 0.5*(256.9-142.1); |
460 | dm[1] = 3.; |
461 | dm[2] = 2.; |
462 | |
463 | x2 = dm[0] + 142.; |
464 | |
cfce8870 |
465 | gMC->Gsvolu("TSPO", "BOX ", idtmed[399], dm, 3); |
fe4da5cc |
466 | |
467 | dm[1] = 2.; |
468 | dm[2] = 1.; |
469 | |
cfce8870 |
470 | gMC->Gsvolu("TSP2", "BOX ", idtmed[498], dm, 3); |
fe4da5cc |
471 | |
cfce8870 |
472 | gMC->Gspos("TSP2", 1, "TSPO", 0, 0, 0, 0, "ONLY"); |
fe4da5cc |
473 | // -------------------------------------------------------- |
474 | dm[0] = 136.; |
475 | dm[1] = 142.; |
476 | dm[2] = 2.; |
477 | |
cfce8870 |
478 | gMC->Gsvolu("TSWH", "TUBE", idtmed[399], dm, 3); |
fe4da5cc |
479 | |
480 | dm[0] = 137.; |
481 | dm[1] = 141.; |
482 | dm[2] = 1.; |
483 | |
cfce8870 |
484 | gMC->Gsvolu("TSW1", "TUBE", idtmed[498], dm, 3); |
fe4da5cc |
485 | |
cfce8870 |
486 | gMC->Gspos("TSW1", 1, "TSWH", 0, 0, 0, 0, "ONLY"); |
fe4da5cc |
487 | |
488 | z0 = z_side - .16168 - 2.; |
489 | // -------------------------------------------------------- |
cfce8870 |
490 | gMC->Gspos("TSWH", 1, "TPSG", 0, 0, z0, 0, "ONLY"); |
fe4da5cc |
491 | // ------------------------------------------------------- |
492 | // posiioning of the inner spokes |
493 | // ------------------------------------------------------- |
494 | for (il = 1; il <= 6; ++il) { |
495 | phi1 = opl * .5 + (il - 1) * 2. * opl; |
496 | theta1 = 90.; |
497 | phi2 = opl * .5 + 90. + (il - 1) * 2. * opl; |
498 | if (phi2 > 360.) { |
499 | phi2 += -360.; |
500 | } |
501 | theta2 = 90.; |
502 | phi3 = 0.; |
503 | theta3 = 0.; |
504 | |
505 | alpha = phi1 * kDegrad; |
506 | x = x1 * TMath::Cos(alpha); |
507 | y = x1 * TMath::Sin(alpha); |
508 | |
509 | idr = il + 36; |
510 | |
511 | AliMatrix(idrotm[idr], theta1, phi1, theta2, phi2, theta3, phi3); |
cfce8870 |
512 | gMC->Gspos("TSPI", il, "TPSG", x, y, z0, idrotm[idr], "ONLY"); |
fe4da5cc |
513 | |
514 | } |
515 | |
516 | for (iu = 1; iu <= 12; ++iu) { |
517 | phi1 = opu * .5 + (iu - 1) * 2. * opu; |
518 | theta1 = 90.; |
519 | phi2 = opu * .5 + 90. + (iu - 1) * 2. * opu; |
520 | if (phi2 > 360.) { |
521 | phi2 += -360.; |
522 | } |
523 | theta2 = 90.; |
524 | phi3 = 0.; |
525 | theta3 = 0.; |
526 | |
527 | alpha = phi1 * kDegrad; |
528 | x = x2 * TMath::Cos(alpha); |
529 | y = x2 * TMath::Sin(alpha); |
530 | |
531 | idr = iu + 42; |
532 | |
533 | AliMatrix(idrotm[idr], theta1, phi1, theta2, phi2, theta3, phi3); |
cfce8870 |
534 | gMC->Gspos("TSPO", iu, "TPSG", x, y, z0, idrotm[idr], "ONLY"); |
fe4da5cc |
535 | } |
536 | // -------------------------------------------------------- |
537 | // endcap cover (C, 0.86% X0) |
538 | // -------------------------------------------------------- |
539 | dm[0] = 76.+0.09776; |
540 | dm[1] = 257.; |
541 | dm[2] = 0.16168*0.5; |
542 | |
cfce8870 |
543 | gMC->Gsvolu("TCOV", "TUBE", idtmed[407], dm, 3); |
fe4da5cc |
544 | |
545 | z0 = z_side - dm[2]; |
546 | |
cfce8870 |
547 | gMC->Gspos("TCOV", 1, "TPSG", 0, 0, z0, 0, "ONLY"); |
fe4da5cc |
548 | // -------------------------------------------------------- |
549 | // put the readout chambers into the TPC |
550 | // -------------------------------------------------------- |
551 | theta1 = 90.; |
552 | phi1 = 0.; |
553 | theta2 = 90.; |
554 | phi2 = 270.; |
555 | theta3 = 180.; |
556 | phi3 = 0.; |
557 | |
558 | AliMatrix(idrotm[55], theta1, phi1, theta2, phi2, theta3, phi3); |
559 | |
560 | z0 = z_side + 250.; |
561 | |
cfce8870 |
562 | gMC->Gspos("TPSG", 1, "TPC ", 0, 0, z0, 0, "ONLY"); |
563 | gMC->Gspos("TPSG", 2, "TPC ", 0, 0, -z0, idrotm[55], "ONLY"); |
fe4da5cc |
564 | // --------------------------------------------------------- |
565 | // outer gas insulation (CO2) |
566 | // --------------------------------------------------------- |
567 | dm[0] = 257.+0.09776; |
568 | dm[1] = 278.-0.25004; |
569 | dm[2] = 275.-23.; |
570 | |
cfce8870 |
571 | gMC->Gsvolu("TPOI", "TUBE", idtmed[406], dm, 3); |
fe4da5cc |
572 | |
cfce8870 |
573 | gMC->Gspos("TPHV", 1, "TGAS", 0, 0, 0, 0, "ONLY"); |
574 | gMC->Gspos("TGAS", 1, "TPC ", 0, 0, 0, 0, "ONLY"); |
575 | gMC->Gspos("TPOI", 1, "TPC ", 0, 0, 0, 0, "ONLY"); |
fe4da5cc |
576 | |
cfce8870 |
577 | gMC->Gspos("TPC ", 1, "ALIC", 0, 0, 0, 0, "ONLY"); |
fe4da5cc |
578 | // ====================================================== |
579 | // all volumes below are positioned in ALIC |
580 | // ====================================================== |
581 | // ------------------------------------------------------ |
582 | // the last parts of the smaller wheel (TSWS) |
583 | // ------------------------------------------------------ |
584 | dm[0] = 74.; |
585 | dm[1] = 76.; |
586 | dm[2] = 1.; |
587 | |
588 | z0 = 253.; |
589 | |
cfce8870 |
590 | gMC->Gsposp("TSWS", 10, "TPC ", 0, 0, z0, 0, "ONLY", dm, 3); |
591 | gMC->Gsposp("TSWS", 11, "TPC ", 0, 0, -z0, 0, "ONLY", dm, 3); |
fe4da5cc |
592 | |
593 | dm[0] = 70.; |
594 | |
595 | z0 += 21.; |
596 | |
cfce8870 |
597 | gMC->Gsposp("TSWS", 12, "TPC ", 0, 0, z0, 0, "ONLY", dm, 3); |
598 | gMC->Gsposp("TSWS", 13, "TPC ", 0, 0, -z0, 0, "ONLY", dm, 3); |
fe4da5cc |
599 | // ---------------------------------------------------- |
600 | // Inner vessel (PCON) |
601 | // This volume is to be positioned directly in ALIC |
602 | // ---------------------------------------------------- |
603 | dm[0] = 0.; |
604 | dm[1] = 360.; |
605 | dm[2] = 4.; |
606 | |
607 | dm[3] = -250.; |
608 | dm[4] = 75.; |
609 | dm[5] = 76.; |
610 | |
611 | dm[6] = -64.5; |
612 | dm[7] = 50.; |
613 | dm[8] = 76.; |
614 | |
615 | dm[9] = 64.5; |
616 | dm[10] = 50.; |
617 | dm[11] = 76.; |
618 | |
619 | dm[12] = 250.; |
620 | dm[13] = 75.; |
621 | dm[14] = 76.; |
622 | |
cfce8870 |
623 | gMC->Gsvolu("TPIV", "PCON", idtmed[407], dm, 15); |
fe4da5cc |
624 | // -------------------------------------------------------- |
625 | // fill the inner vessel with CO2, (HV kDegrader) |
626 | // cone parts have different thickness |
627 | // than the central barrel, according to the TP |
628 | // -------------------------------------------------------- |
629 | tana = 75./185.5; |
630 | |
631 | dm[0] = 0.; |
632 | dm[1] = 360.; |
633 | dm[2] = 6.; |
634 | |
635 | dm[3] = -(250.-0.2162); |
636 | dm[4] = (185.5-0.2126)*tana+0.2126; |
637 | dm[5] = 76-0.001; |
638 | |
639 | dm[6] = -64.5; |
640 | dm[7] = 50.+0.2162; |
641 | dm[8] = 76-0.001; |
642 | |
643 | dm[9] = -64.5; |
644 | dm[10] = 50+0.05076; |
645 | dm[11] = 76-0.001; |
646 | |
647 | dm[12] = 64.5; |
648 | dm[13] = 50+0.05076; |
649 | dm[14] = 76-0.001; |
650 | |
651 | dm[15] = 64.5; |
652 | dm[16] = 50.+0.2162; |
653 | dm[17] = 76-0.001; |
654 | |
655 | dm[18] = (250.-0.2162); |
656 | dm[19] = (185.5-0.2126)*tana+0.2126; |
657 | dm[20] = 76-0.001; |
658 | |
cfce8870 |
659 | gMC->Gsvolu("TPVD", "PCON", idtmed[406], dm, 21); |
fe4da5cc |
660 | |
cfce8870 |
661 | gMC->Gspos("TPVD", 1, "TPIV", 0, 0, 0, 0, "ONLY"); |
fe4da5cc |
662 | |
cfce8870 |
663 | gMC->Gspos("TPIV", 1, "ALIC", 0, 0, 0, 0, "ONLY"); |
fe4da5cc |
664 | // --------------------------------------------------- |
665 | // volumes ordering |
666 | // --------------------------------------------------- |
cfce8870 |
667 | gMC->Gsord("TGAS", 6); |
668 | gMC->Gsord("TPSG", 6); |
fe4da5cc |
669 | } |
670 | |
671 | //_____________________________________________________________________________ |
8c555625 |
672 | void AliTPCv2::DrawDetector() |
fe4da5cc |
673 | { |
674 | // |
675 | // Draw a shaded view of the Time Projection Chamber version 1 |
676 | // |
677 | |
fe4da5cc |
678 | // Set everything unseen |
cfce8870 |
679 | gMC->Gsatt("*", "seen", -1); |
fe4da5cc |
680 | // |
681 | // Set ALIC mother transparent |
cfce8870 |
682 | gMC->Gsatt("ALIC","SEEN",0); |
fe4da5cc |
683 | // |
684 | // Set the volumes visible |
cfce8870 |
685 | gMC->Gsatt("TPC","SEEN",0); |
686 | gMC->Gsatt("TGAS","SEEN",0); |
687 | gMC->Gsatt("TPSG","SEEN",0); |
688 | gMC->Gsatt("TPHV","SEEN",1); |
689 | gMC->Gsatt("TRCS","SEEN",1); |
690 | gMC->Gsatt("TRCL","SEEN",1); |
691 | gMC->Gsatt("TSWS","SEEN",1); |
692 | gMC->Gsatt("TPW1","SEEN",1); |
693 | gMC->Gsatt("TPW3","SEEN",1); |
694 | gMC->Gsatt("TSPI","SEEN",1); |
695 | gMC->Gsatt("TSPO","SEEN",1); |
696 | gMC->Gsatt("TSWH","SEEN",1); |
697 | gMC->Gsatt("TPOI","SEEN",1); |
698 | gMC->Gsatt("TPIV","SEEN",1); |
699 | gMC->Gsatt("TPVD","SEEN",1); |
fe4da5cc |
700 | // |
cfce8870 |
701 | gMC->Gdopt("hide", "on"); |
702 | gMC->Gdopt("shad", "on"); |
703 | gMC->Gsatt("*", "fill", 7); |
704 | gMC->SetClipBox("."); |
705 | gMC->SetClipBox("*", 0, 1000, -1000, 1000, -1000, 1000); |
706 | gMC->DefaultRange(); |
707 | gMC->Gdraw("alic", 40, 30, 0, 12, 9.5, .025, .025); |
708 | gMC->Gdhead(1111, "Time Projection Chamber"); |
709 | gMC->Gdman(18, 4, "MAN"); |
710 | gMC->Gdopt("hide","off"); |
fe4da5cc |
711 | } |
712 | |
713 | //_____________________________________________________________________________ |
714 | void AliTPCv2::CreateMaterials() |
715 | { |
716 | // |
717 | // Define materials for version 2 of the Time Projection Chamber |
718 | // |
719 | |
fe4da5cc |
720 | // |
721 | // Increase maximum number of steps |
cfce8870 |
722 | gMC->SetMaxNStep(30000); |
fe4da5cc |
723 | // |
724 | AliTPC::CreateMaterials(); |
725 | } |
726 | |
727 | //_____________________________________________________________________________ |
728 | void AliTPCv2::Init() |
729 | { |
730 | // |
731 | // Initialises version 2 of the TPC after that it has been built |
732 | // |
ad51aeb0 |
733 | Int_t *idtmed = fIdtmed->GetArray()-399; |
fe4da5cc |
734 | AliTPC::Init(); |
cfce8870 |
735 | fIdSens1=gMC->VolId("TLGA"); // L-sector |
736 | fIdSens2=gMC->VolId("TSGA"); // S-sector |
737 | fIdSens3=gMC->VolId("TSST"); // strip - S-sector (not always used) |
738 | fIdSens4=gMC->VolId("TLST"); // strip - S-sector (not always used) |
fe4da5cc |
739 | |
cfce8870 |
740 | gMC->SetMaxNStep(30000); // max. number of steps increased |
fe4da5cc |
741 | |
cfce8870 |
742 | gMC->Gstpar(idtmed[403],"LOSS",5); |
fe4da5cc |
743 | |
744 | printf("*** TPC version 2 initialized ***\n"); |
cfce8870 |
745 | printf("Maximum number of steps = %d\n",gMC->GetMaxNStep()); |
fe4da5cc |
746 | |
747 | // |
748 | |
749 | } |
750 | |
751 | //_____________________________________________________________________________ |
752 | void AliTPCv2::StepManager() |
753 | { |
754 | // |
755 | // Called for every step in the Time Projection Chamber |
756 | // |
757 | |
758 | // |
759 | // parameters used for the energy loss calculations |
760 | // |
761 | const Float_t prim = 14.35; // number of primary collisions per 1 cm |
762 | const Float_t poti = 20.77e-9; // first ionization potential for Ne/CO2 |
763 | const Float_t w_ion = 35.97e-9; // energy for the ion-electron pair creation |
764 | |
765 | |
766 | const Float_t big = 1.e10; |
767 | |
768 | Int_t id,copy; |
769 | Float_t hits[4]; |
770 | Int_t vol[2]; |
771 | TClonesArray &lhits = *fHits; |
0a6d8768 |
772 | TLorentzVector pos; |
fe4da5cc |
773 | |
774 | vol[1]=0; |
775 | |
776 | // |
777 | |
cfce8870 |
778 | gMC->SetMaxStep(big); |
fe4da5cc |
779 | |
0a6d8768 |
780 | if(!gMC->IsTrackAlive()) return; // particle has disappeared |
fe4da5cc |
781 | |
cfce8870 |
782 | Float_t charge = gMC->TrackCharge(); |
fe4da5cc |
783 | |
784 | if(TMath::Abs(charge)<=0.) return; // take only charged particles |
785 | |
786 | |
0a6d8768 |
787 | id=gMC->CurrentVolID(copy); |
fe4da5cc |
788 | |
789 | // Check the sensitive volume |
790 | |
791 | if(id == fIdSens1) |
792 | { |
793 | vol[0] = copy + 24; // L-sector number |
794 | } |
795 | else if(id == fIdSens2) |
796 | { |
797 | vol[0] = copy; // S-sector number |
798 | } |
0a6d8768 |
799 | else if(id == fIdSens3 && gMC->IsTrackEntering()) |
fe4da5cc |
800 | { |
801 | vol[1] = copy; // row number |
0a6d8768 |
802 | id = gMC->CurrentVolOffID(1,copy); |
fe4da5cc |
803 | vol[0] = copy; // sector number (S-sector) |
804 | |
0a6d8768 |
805 | gMC->TrackPosition(pos); |
806 | hits[0]=pos[0]; |
807 | hits[1]=pos[1]; |
808 | hits[2]=pos[2]; |
fe4da5cc |
809 | hits[3]=0.; // this hit has no energy loss |
810 | new(lhits[fNhits++]) AliTPChit(fIshunt,gAlice->CurrentTrack(),vol,hits); |
811 | } |
0a6d8768 |
812 | else if(id == fIdSens4 && gMC->IsTrackEntering()) |
fe4da5cc |
813 | { |
814 | vol[1] = copy; // row number |
0a6d8768 |
815 | id = gMC->CurrentVolOffID(1,copy); |
fe4da5cc |
816 | vol[0] = copy+24; // sector number (L-sector) |
817 | |
0a6d8768 |
818 | gMC->TrackPosition(pos); |
819 | hits[0]=pos[0]; |
820 | hits[1]=pos[1]; |
821 | hits[2]=pos[2]; |
fe4da5cc |
822 | hits[3]=0.; // this hit has no energy loss |
823 | new(lhits[fNhits++]) AliTPChit(fIshunt,gAlice->CurrentTrack(),vol,hits); |
824 | } |
825 | else return; |
826 | |
827 | // |
828 | // charged particle is in the sensitive volume |
829 | // |
830 | |
cfce8870 |
831 | if(gMC->TrackStep() > 0) { |
fe4da5cc |
832 | |
cfce8870 |
833 | Int_t nel = (Int_t)(((gMC->Edep())-poti)/w_ion) + 1; |
fe4da5cc |
834 | nel=TMath::Min(nel,300); // 300 electrons corresponds to 10 keV |
835 | |
0a6d8768 |
836 | gMC->TrackPosition(pos); |
837 | hits[0]=pos[0]; |
838 | hits[1]=pos[1]; |
839 | hits[2]=pos[2]; |
fe4da5cc |
840 | hits[3]=(Float_t)nel; |
841 | |
842 | // Add this hit |
843 | |
844 | new(lhits[fNhits++]) AliTPChit(fIshunt,gAlice->CurrentTrack(),vol,hits); |
845 | |
846 | } |
847 | |
848 | // Stemax calculation for the next step |
849 | |
850 | Float_t pp; |
0a6d8768 |
851 | TLorentzVector mom; |
852 | gMC->TrackMomentum(mom); |
853 | Float_t ptot=mom.Rho(); |
854 | Float_t beta_gamma = ptot/gMC->TrackMass(); |
fe4da5cc |
855 | |
cfce8870 |
856 | if(gMC->TrackPid() <= 3 && ptot > 0.002) |
fe4da5cc |
857 | { |
858 | pp = prim*1.58; // electrons above 20 MeV/c are on the plateau! |
859 | } |
860 | else |
861 | { |
862 | pp=prim*BetheBloch(beta_gamma); |
863 | if(TMath::Abs(charge) > 1.) pp *= (charge*charge); |
864 | } |
865 | |
866 | Float_t random[1]; |
cfce8870 |
867 | gMC->Rndm(random,1); // good, old GRNDM from Geant3 |
fe4da5cc |
868 | |
869 | Double_t rnd = (Double_t)random[0]; |
870 | |
cfce8870 |
871 | gMC->SetMaxStep(-TMath::Log(rnd)/pp); |
fe4da5cc |
872 | |
873 | } |
874 | |
875 | //_____________________________________________________________________________ |
876 | Float_t AliTPCv2::BetheBloch(Float_t bg) |
877 | { |
878 | // |
879 | // Bethe-Bloch energy loss formula |
880 | // |
881 | const Double_t p1=0.76176e-1; |
882 | const Double_t p2=10.632; |
883 | const Double_t p3=0.13279e-4; |
884 | const Double_t p4=1.8631; |
885 | const Double_t p5=1.9479; |
886 | |
887 | Double_t dbg = (Double_t) bg; |
888 | |
889 | Double_t beta = dbg/TMath::Sqrt(1.+dbg*dbg); |
890 | |
891 | Double_t aa = TMath::Power(beta,p4); |
892 | Double_t bb = TMath::Power(1./dbg,p5); |
893 | |
894 | bb=TMath::Log(p3+bb); |
895 | |
896 | return ((Float_t)((p2-aa-bb)*p1/aa)); |
897 | } |