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