]>
Commit | Line | Data |
---|---|---|
fe4da5cc | 1 | /////////////////////////////////////////////////////////////////////////////// |
2 | // // | |
3 | // Photon Multiplicity Detector // | |
4 | // This class contains the basic functions for the Photon Multiplicity // | |
5 | // Detector. Functions specific to one particular geometry are // | |
6 | // contained in the derived classes // | |
7 | // // | |
8 | //Begin_Html | |
9 | /* | |
10 | <img src="gif/AliPMDClass.gif"> | |
11 | </pre> | |
12 | <br clear=left> | |
13 | <font size=+2 color=red> | |
14 | <p>The responsible person for this module is | |
15 | <a href="mailto:sub@vecdec.veccal.ernet.in">Subhasis Chattopadhyay</a>. | |
16 | </font> | |
17 | <pre> | |
18 | */ | |
19 | //End_Html | |
20 | // // | |
21 | /////////////////////////////////////////////////////////////////////////////// | |
22 | ||
23 | #include <TBRIK.h> | |
24 | #include <TNode.h> | |
25 | #include "AliPMD.h" | |
26 | #include "AliRun.h" | |
27 | #include "AliMC.h" | |
28 | #include "AliConst.h" | |
29 | ||
30 | static Float_t smod1[3], smod2[3], smod3[3], smod4[3]; | |
31 | static Int_t maxbox, kdet; | |
32 | //static Float_t pmdin,pmdout,wafer; | |
33 | static Float_t thgas,thcell,thmin,thmax,zdist,thlow, | |
34 | thhigh,edge; | |
35 | static Int_t numqu; | |
36 | static Float_t xbox[40][40], ybox[40][40]; | |
37 | static Int_t pindex[40][40]; | |
38 | ||
39 | ClassImp(AliPMD) | |
40 | ||
41 | //_____________________________________________________________________________ | |
42 | AliPMD::AliPMD() | |
43 | { | |
44 | // | |
45 | // Default constructor | |
46 | // | |
47 | fIshunt = 0; | |
48 | } | |
49 | ||
50 | //_____________________________________________________________________________ | |
51 | AliPMD::AliPMD(const char *name, const char *title) | |
52 | : AliDetector(name,title) | |
53 | { | |
54 | // | |
55 | // Default constructor | |
56 | // | |
57 | ||
58 | // | |
59 | // Allocate the array of hits | |
60 | fHits = new TClonesArray("AliPMDhit", 405); | |
61 | ||
62 | fIshunt = 1; | |
63 | ||
64 | fPar[0] = 1; | |
65 | fPar[1] = 1; | |
66 | fPar[2] = 0.8; | |
67 | fPar[3] = 0.02; | |
68 | fIn[0] = 6; | |
69 | fIn[1] = 20; | |
70 | fIn[2] = 600; | |
71 | fIn[3] = 27; | |
72 | fIn[4] = 27; | |
73 | fGeo[0] = 0; | |
74 | fGeo[1] = 0.2; | |
75 | fGeo[2] = 4; | |
76 | fPadSize[0] = 0.8; | |
77 | fPadSize[1] = 1.0; | |
78 | fPadSize[2] = 1.2; | |
79 | fPadSize[3] = 1.5; | |
80 | } | |
81 | ||
82 | //_____________________________________________________________________________ | |
83 | void AliPMD::AddHit(Int_t track, Int_t *vol, Float_t *hits) | |
84 | { | |
85 | // | |
86 | // Add a PMD hit | |
87 | // | |
88 | TClonesArray &lhits = *fHits; | |
89 | AliPMDhit *newcell, *curcell; | |
90 | // printf("PMD++ Adding energy %f, prim %d, vol %d %d %d %d\n", | |
91 | // hits[3],gAlice->GetPrimary(track-1),vol[0],vol[1],vol[2],vol[3]); | |
92 | newcell = new AliPMDhit(fIshunt, track, vol, hits); | |
93 | Int_t i; | |
94 | for (i=0; i<fNhits; i++) { | |
95 | // | |
96 | // See if this cell has already been hit | |
97 | curcell=(AliPMDhit*) lhits[i]; | |
98 | if (*curcell==*newcell) { | |
99 | // printf("Cell with same numbers found\n") ; curcell->Print(); | |
100 | *curcell = *curcell+*newcell; | |
101 | // printf("Cell after addition\n") ; curcell->Print(); | |
102 | delete newcell; | |
103 | return; | |
104 | } | |
105 | } | |
106 | new(lhits[fNhits++]) AliPMDhit(newcell); | |
107 | delete newcell; | |
108 | } | |
109 | ||
110 | //_____________________________________________________________________________ | |
111 | void AliPMD::BuildGeometry() | |
112 | { | |
113 | // | |
114 | // Build simple ROOT TNode geometry for event display | |
115 | // | |
116 | ||
117 | TNode *Node, *Top; | |
118 | const int kColorPMD = kRed; | |
119 | ||
120 | // | |
121 | Top=gAlice->GetGeometry()->GetNode("alice"); | |
122 | ||
123 | // PMD | |
124 | new TBRIK("S_PMD","PMD box","void",300,300,5); | |
125 | Top->cd(); | |
126 | Node = new TNode("PMD","PMD","S_PMD",0,0,600,""); | |
127 | Node->SetLineColor(kColorPMD); | |
128 | fNodes->Add(Node); | |
129 | } | |
130 | ||
131 | //_____________________________________________________________________________ | |
132 | Int_t AliPMD::DistancetoPrimitive(Int_t , Int_t ) | |
133 | { | |
134 | // | |
135 | // Distance from mouse to detector on the screen | |
136 | // dummy routine | |
137 | // | |
138 | return 9999; | |
139 | } | |
140 | ||
141 | //_____________________________________________________________________________ | |
142 | void AliPMD::SetPAR(Float_t p1, Float_t p2, Float_t p3,Float_t p4) | |
143 | { | |
144 | // | |
145 | // Set PMD parameters | |
146 | // | |
147 | fPar[0] = p1; | |
148 | fPar[1] = p2; | |
149 | fPar[2] = p3; | |
150 | fPar[3] = p4; | |
151 | } | |
152 | ||
153 | //_____________________________________________________________________________ | |
154 | void AliPMD::SetIN(Float_t p1, Float_t p2, Float_t p3,Float_t p4,Float_t p5) | |
155 | { | |
156 | // | |
157 | // Set PMD parameters | |
158 | // | |
159 | fIn[0] = p1; | |
160 | fIn[1] = p2; | |
161 | fIn[2] = p3; | |
162 | fIn[3] = p4; | |
163 | fIn[4] = p5; | |
164 | } | |
165 | ||
166 | //_____________________________________________________________________________ | |
167 | void AliPMD::SetGEO(Float_t p1, Float_t p2, Float_t p3) | |
168 | { | |
169 | // | |
170 | // Set geometry parameters | |
171 | // | |
172 | fGeo[0] = p1; | |
173 | fGeo[1] = p2; | |
174 | fGeo[2] = p3; | |
175 | } | |
176 | ||
177 | //_____________________________________________________________________________ | |
178 | void AliPMD::SetPadSize(Float_t p1, Float_t p2, Float_t p3,Float_t p4) | |
179 | { | |
180 | // | |
181 | // Set pad size | |
182 | // | |
183 | fPadSize[0] = p1; | |
184 | fPadSize[1] = p2; | |
185 | fPadSize[2] = p3; | |
186 | fPadSize[3] = p4; | |
187 | } | |
188 | ||
189 | //_____________________________________________________________________________ | |
190 | void AliPMD::StepManager() | |
191 | { | |
192 | // | |
193 | // Called at every step in PMD | |
194 | // | |
195 | } | |
196 | ||
197 | ||
198 | //_____________________________________________________________________________ | |
199 | void AliPMD::Undulation(char *undul, Float_t pitch, Float_t thick, | |
200 | Float_t zundul, Float_t rundul, char (*cone)[5]) | |
201 | { | |
202 | // | |
203 | // RUNDUL : Internal radius of the undulated chamber | |
204 | // THICK : material thickness | |
205 | // PITCH : one-QUARTER wave of undulation (cm) | |
206 | // ZUNDUL : half length (cm) | |
207 | // | |
208 | // The undulated structure is desgned as a superposition of eight CONES | |
209 | // of suitable sizes, where the inner/outer radius of the cone increases, | |
210 | // then decreases, each half of the wave is assumed to be a semicircle, | |
211 | // which allows to calculate the thickness and the radii of the cone, by | |
212 | // dividing the semicircle into 4 parts of equal arc length. | |
213 | // Thus apear the constants 0.293 and 0.707. | |
214 | // | |
215 | ||
216 | const Float_t const1 = .293; | |
217 | const Float_t const2 = .707; | |
218 | ||
219 | AliMC* pMC = AliMC::GetMC(); | |
220 | ||
221 | // Local variables | |
222 | Int_t j, nwave; | |
223 | Float_t dcone1[5], dcone2[5], dcone3[5], dcone4[5], dcone5[5], | |
224 | dcone6[5], dcone7[5], dcone8[5]; | |
225 | Float_t xc, yc, zc, dundul[3]; | |
226 | Int_t *idtmed = gAlice->Idtmed(); | |
227 | ||
228 | // Function Body | |
229 | ||
230 | dcone1[0] = const1 * pitch / 2; | |
231 | dcone1[1] = rundul; | |
232 | dcone1[2] = dcone1[1] + thick; | |
233 | dcone1[3] = dcone1[1] + const2 * pitch; | |
234 | dcone1[4] = dcone1[3] + thick; | |
235 | ||
236 | dcone2[0] = const2 * pitch / 2; | |
237 | dcone2[1] = dcone1[3]; | |
238 | dcone2[2] = dcone1[4]; | |
239 | dcone2[3] = dcone2[1] + const1 * pitch; | |
240 | dcone2[4] = dcone2[3] + thick; | |
241 | ||
242 | dcone3[0] = dcone2[0]; | |
243 | dcone3[1] = dcone2[3]; | |
244 | dcone3[2] = dcone2[4]; | |
245 | dcone3[3] = dcone2[1]; | |
246 | dcone3[4] = dcone2[2]; | |
247 | ||
248 | dcone4[0] = dcone1[0]; | |
249 | dcone4[1] = dcone1[3]; | |
250 | dcone4[2] = dcone1[4]; | |
251 | dcone4[3] = dcone1[1]; | |
252 | dcone4[4] = dcone1[2]; | |
253 | ||
254 | dcone5[0] = dcone1[0]; | |
255 | dcone5[1] = dcone1[1] - thick; | |
256 | dcone5[2] = dcone1[1]; | |
257 | dcone5[3] = dcone5[1] - const2 * pitch; | |
258 | dcone5[4] = dcone5[3] + thick; | |
259 | ||
260 | dcone6[0] = dcone2[0]; | |
261 | dcone6[1] = dcone5[3]; | |
262 | dcone6[2] = dcone5[4]; | |
263 | dcone6[3] = dcone6[1] - const1 * pitch; | |
264 | dcone6[4] = dcone6[3] + thick; | |
265 | ||
266 | dcone7[0] = dcone6[0]; | |
267 | dcone7[1] = dcone6[3]; | |
268 | dcone7[2] = dcone6[4]; | |
269 | dcone7[3] = dcone5[3]; | |
270 | dcone7[4] = dcone5[4]; | |
271 | ||
272 | dcone8[0] = dcone5[0]; | |
273 | dcone8[1] = dcone7[3]; | |
274 | dcone8[2] = dcone7[4]; | |
275 | dcone8[3] = dcone5[1]; | |
276 | dcone8[4] = dcone5[2]; | |
277 | ||
278 | pMC->Gsvolu(cone[0], "CONE", idtmed[606-1], dcone1, 5); | |
279 | pMC->Gsvolu(cone[1], "CONE", idtmed[606-1], dcone2, 5); | |
280 | pMC->Gsvolu(cone[2], "CONE", idtmed[606-1], dcone3, 5); | |
281 | pMC->Gsvolu(cone[3], "CONE", idtmed[606-1], dcone4, 5); | |
282 | pMC->Gsvolu(cone[4], "CONE", idtmed[606-1], dcone5, 5); | |
283 | pMC->Gsvolu(cone[5], "CONE", idtmed[606-1], dcone6, 5); | |
284 | pMC->Gsvolu(cone[6], "CONE", idtmed[606-1], dcone7, 5); | |
285 | pMC->Gsvolu(cone[7], "CONE", idtmed[606-1], dcone8, 5); | |
286 | pMC->Gsatt(cone[0], "SEEN", 0); | |
287 | pMC->Gsatt(cone[1], "SEEN", 0); | |
288 | pMC->Gsatt(cone[2], "SEEN", 0); | |
289 | pMC->Gsatt(cone[3], "SEEN", 0); | |
290 | pMC->Gsatt(cone[4], "SEEN", 0); | |
291 | pMC->Gsatt(cone[5], "SEEN", 0); | |
292 | pMC->Gsatt(cone[6], "SEEN", 0); | |
293 | pMC->Gsatt(cone[7], "SEEN", 0); | |
294 | ||
295 | // DEFINE AN IMAGINARY TUBE VOLUME FOR UNDULATED CHAMBER, FILL WITH VACUUM | |
296 | ||
297 | nwave = Int_t (zundul / (pitch * 2) + .1); | |
298 | dundul[2] = pitch * 2 * nwave; | |
299 | dundul[1] = rundul + pitch + thick * 2; | |
300 | // | |
301 | dundul[0] = 1e-4; | |
302 | pMC->Gsvolu(undul, "TUBE", idtmed[698-1], dundul, 3); | |
303 | ||
304 | xc = 0; | |
305 | yc = 0; | |
306 | zc = -dundul[2] + dcone1[0]; | |
307 | for (j = 1; j <= nwave; ++j) { | |
308 | pMC->Gspos(cone[0], j, undul, xc, yc, zc, 0, "ONLY"); | |
309 | zc = zc + dcone1[0] + dcone2[0]; | |
310 | pMC->Gspos(cone[1], j, undul, xc, yc, zc, 0, "ONLY"); | |
311 | zc = zc + dcone2[0] + dcone3[0]; | |
312 | pMC->Gspos(cone[2], j, undul, xc, yc, zc, 0, "ONLY"); | |
313 | zc = zc + dcone3[0] + dcone4[0]; | |
314 | pMC->Gspos(cone[3], j, undul, xc, yc, zc, 0, "ONLY"); | |
315 | zc = zc + dcone4[0] + dcone5[0]; | |
316 | pMC->Gspos(cone[4], j, undul, xc, yc, zc, 0, "ONLY"); | |
317 | zc = zc + dcone5[0] + dcone6[0]; | |
318 | pMC->Gspos(cone[5], j, undul, xc, yc, zc, 0, "ONLY"); | |
319 | zc = zc + dcone6[0] + dcone7[0]; | |
320 | pMC->Gspos(cone[6], j, undul, xc, yc, zc, 0, "ONLY"); | |
321 | zc = zc + dcone7[0] + dcone8[0]; | |
322 | pMC->Gspos(cone[7], j, undul, xc, yc, zc, 0, "ONLY"); | |
323 | zc = zc + dcone8[0] + dcone1[0]; | |
324 | } | |
325 | } | |
326 | ||
327 | /////////////////////////////////////////////////////////////////////////////// | |
328 | // // | |
329 | // Photon Multiplicity Detector Version 1 // | |
330 | // // | |
331 | //Begin_Html | |
332 | /* | |
333 | <img src="gif/AliPMDv1Class.gif"> | |
334 | */ | |
335 | //End_Html | |
336 | // // | |
337 | /////////////////////////////////////////////////////////////////////////////// | |
338 | ||
339 | ClassImp(AliPMDv1) | |
340 | ||
341 | //_____________________________________________________________________________ | |
342 | AliPMDv1::AliPMDv1() : AliPMD() | |
343 | { | |
344 | // | |
345 | // Default constructor | |
346 | // | |
347 | fMedSens=0; | |
348 | } | |
349 | ||
350 | //_____________________________________________________________________________ | |
351 | AliPMDv1::AliPMDv1(const char *name, const char *title) | |
352 | : AliPMD(name,title) | |
353 | { | |
354 | // | |
355 | // Standard constructor | |
356 | // | |
357 | fMedSens=0; | |
358 | } | |
359 | ||
360 | //_____________________________________________________________________________ | |
361 | void AliPMDv1::Coordnew() | |
362 | { | |
363 | // | |
364 | // Find coordinates for pad geometry | |
365 | // | |
366 | // Author Y.P. Viyogi, VECC Calcutta | |
367 | // | |
368 | ||
369 | Float_t th1, th2, dbox, dist; | |
370 | //Float_t xoff[40][40], yoff[40][40]; | |
371 | Int_t i, j, nbox; | |
372 | Int_t xoff1[3], yoff1[3], l; | |
373 | Float_t dmax, hole; | |
374 | Int_t kk, nhol; | |
375 | Float_t rr, xx, yy; | |
376 | ||
377 | th1 = thmin * kPI / 180; | |
378 | th2 = thmax * kPI / 180; | |
379 | /* ESTIMATES FOR OCTAGON */ | |
380 | dist = zdist * TMath::Tan(th2); | |
381 | /* *** 04.06.97 Fixed Module size of 6 cm, 0 mm boundary. */ | |
382 | /* *** variable pad sizes of 0.3 mm, 0.5 mm, 1.0 mm and 1.2 mm */ | |
383 | dbox = edge * 2 + 24; | |
384 | maxbox = Int_t(dist / dbox + .5); | |
385 | dmax= maxbox * dbox; | |
386 | /* NOW GET THE HOLE SIZE ETC. */ | |
387 | hole = zdist * TMath::Tan(th1); | |
388 | nhol = Int_t(hole / dbox + .5); | |
389 | hole = nhol * dbox; | |
390 | ||
391 | //rlow = zdist * TMath::Tan(thlow * kPI / 180); | |
392 | //rhigh = zdist * TMath::Tan(thhigh * kPI / 180); | |
393 | for (i = 1; i <= 40; ++i) { | |
394 | for (j = 1; j <= 40; ++j) { | |
395 | //index[j][i] = 0; | |
396 | //xoff[j][i] = 0; | |
397 | //yoff[j][i] = 0; | |
398 | xbox[j][i] = 0; | |
399 | /* L5: */ | |
400 | ybox[j][i] = 0; | |
401 | } | |
402 | } | |
403 | ||
404 | // NOW START PLACING THE BOXES IN VARIOUS LAYERS, START FROM THE CENTRE | |
405 | ||
406 | yy = dbox / 2; | |
407 | for(i=0;i<3;i++) yoff1[i]=0; | |
408 | nbox = 0; | |
409 | // PRINT*,'MAXBOX=',MAXBOX | |
410 | for (i = 1; i <= maxbox; ++i) { | |
411 | xx = dbox / 2; | |
412 | for(j=0;j<3;j++) xoff1[j]=0; | |
413 | for (j = 1; j <= maxbox; ++j) { | |
414 | rr = sqrt(xx*xx+yy*yy); | |
415 | if (rr >= hole && rr <= dmax) { | |
416 | // BOX CAN BE FITTED | |
417 | //index[j][i] = 2; | |
418 | //if (rr < rlow) index[j][i] = 1; | |
419 | //else if (rr > rhigh) index[j][i] = 3; | |
420 | xbox[j][i] = xx; | |
421 | ybox[j][i] = yy; | |
422 | ++nbox; | |
423 | //xoff[j][i] = xoff1[index[j][i] - 1]; | |
424 | //yoff[j][i] = yoff1[index[j][i] - 1]; | |
425 | } | |
426 | if (kdet == 1) kk = 1; else kk = 0; | |
427 | for (l = 1; l <= 3; ++l) | |
428 | xoff1[l - 1] += fNumPads[l + kk - 1]; | |
429 | xx += dbox; | |
430 | } | |
431 | ||
432 | if (kdet == 1) kk = 1; else kk=0; | |
433 | ||
434 | for (l = 1; l <= 3; ++l) | |
435 | yoff1[l - 1] += fNumPads[l + kk - 1]; | |
436 | yy += dbox; | |
437 | } | |
438 | } | |
439 | ||
440 | //_____________________________________________________________________________ | |
441 | void AliPMDv1::Coordinates() | |
442 | { | |
443 | // | |
444 | // SUBROUTINE TO COMPUTE THE X- AND Y- COORDINATES OF THE BOXES | |
445 | // WHICH CAN FIT INTO THE CIRCULAR REGION BETWEEN THE GIVEN ANGLES. | |
446 | // INPUT : ZDIST, THMIN, THMAX, PADSIZE (FOR INSIDE and OUTSIDE PMD). | |
447 | // ALL DIMENSIONS IN CM. | |
448 | // -- Author : Y.P. VIYOGI, 10/05/1996. | |
449 | ||
450 | Float_t hole, dmax, dbox; | |
451 | Int_t nhol; | |
452 | Float_t dist; | |
453 | Int_t nbox; | |
454 | Float_t rlow; | |
455 | Int_t i, j; | |
456 | Float_t rhigh, rr, xx, yy, th1, th2; | |
457 | ||
458 | th1 = thmin*kPI/180; | |
459 | th2 = thmax*kPI/180; | |
460 | // ESTIMATES FOR OCTAGON | |
461 | dist = zdist * TMath::Tan(th2); | |
462 | // *** 04.06.97 Fixed Module size of 24 cm, 3 mm boundary. | |
463 | // *** variable pad sizes of 8 mm, 10 mm, 12mm and 15 mm | |
464 | dbox = edge*2 + 24.; | |
465 | maxbox = Int_t(dist / dbox + .5); | |
466 | dmax = maxbox*dbox; | |
467 | // NOW GET THE HOLE SIZE ETC. | |
468 | hole = zdist * TMath::Tan(th1); | |
469 | nhol = Int_t(hole / dbox + .5); | |
470 | hole = nhol * dbox; | |
471 | ||
472 | rlow = zdist * TMath::Tan(thlow*kPI/180); | |
473 | rhigh = zdist * TMath::Tan(thhigh*kPI/180); | |
474 | for (i = 0; i < 40; ++i) { | |
475 | for (j = 0; j < 40; ++j) { | |
476 | pindex[j][i] = 0; | |
477 | xbox[j][i] = 0; | |
478 | ybox[j][i] = 0; | |
479 | } | |
480 | } | |
481 | ||
482 | // NOW START PLACING THE BOXES IN VARIOUS LAYERS, START FROM THE CENTRE | |
483 | yy = dbox / 2; | |
484 | nbox = 0; | |
485 | for (i = 0; i < maxbox; ++i) { | |
486 | xx = dbox / 2; | |
487 | for (j = 0; j < maxbox; ++j) { | |
488 | rr = TMath::Sqrt(xx*xx + yy*yy); | |
489 | if (rr >= hole && rr <= dmax) { // BOX CAN BE FITTED | |
490 | pindex[j][i] = 2; | |
491 | if (rr < rlow) pindex[j][i] = 1; | |
492 | if (rr > rhigh) pindex[j][i] = 3; | |
493 | xbox[j][i] = xx; | |
494 | ybox[j][i] = yy; | |
495 | ++nbox; | |
496 | } | |
497 | xx += dbox; | |
498 | } | |
499 | yy += dbox; | |
500 | } | |
501 | } | |
502 | ||
503 | //_____________________________________________________________________________ | |
504 | void AliPMDv1::CreateGeometry() | |
505 | { | |
506 | // | |
507 | // Create geometry for Photon Multiplicity Detector Version 1 | |
508 | // | |
509 | //Begin_Html | |
510 | /* | |
511 | <img src="gif/AliPMDv1.gif"> | |
512 | */ | |
513 | //End_Html | |
514 | //Begin_Html | |
515 | /* | |
516 | <img src="gif/AliPMDv1Tree.gif"> | |
517 | */ | |
518 | //End_Html | |
519 | CreatePads(); | |
520 | CreateInside(); | |
521 | } | |
522 | ||
523 | //_____________________________________________________________________________ | |
524 | void AliPMDv1::CreateInside() | |
525 | { | |
526 | // | |
527 | // Create inside of Pads | |
528 | // | |
529 | // -- Author : Y.P. VIYOGI, 07/05/1996. | |
530 | // -- Modified: P.V.K.S.Baba(JU), 15-12-97. | |
531 | ||
532 | Float_t sipmd[3] = { 300.,300.,5. }; | |
533 | ||
534 | Int_t i2; | |
535 | ||
536 | Float_t xiqa[4], yiqa[4]; | |
537 | Int_t inum2, inum3, inum4, i, j, k; | |
538 | Float_t siqad[4]; | |
539 | Float_t zd, xd, yd, xp, yp, zp; | |
540 | Int_t idrotm[100]; | |
541 | ||
542 | Int_t *idtmed = gAlice->Idtmed(); | |
543 | ||
544 | // VOLUMES Names : begining with D for all PMD volumes, | |
545 | // The names of SIZE variables begin with S and have more meaningful | |
546 | // characters as shown below. | |
547 | ||
548 | // VOLUME SIZE MEDIUM : REMARKS | |
549 | // ------ ----- ------ : --------------------------- | |
550 | ||
551 | // DPMD SIPMD AIR : INSIDE PMD and its SIZE | |
552 | ||
553 | ||
554 | ||
555 | // *** Define the DPMD Volume and fill with air *** | |
556 | ||
557 | AliMC* pMC = AliMC::GetMC(); | |
558 | ||
559 | pMC->Gsvolu("DPMD", "BOX ", idtmed[698], sipmd, 3); | |
560 | ||
561 | // *** Define DIQU Volume and fill with air | |
562 | siqad[0] = sipmd[0] / 2. - 1.; | |
563 | siqad[1] = sipmd[1] / 2. - 1.; | |
564 | siqad[2] = sipmd[2]; | |
565 | pMC->Gsvolu("DIQU","BOX ", idtmed[698], siqad, 3); | |
566 | pMC->Gsatt("DIQU", "SEEN", 1); | |
567 | ||
568 | ||
569 | // --- Place the modules in INSIDE PMD (DPMD) | |
570 | // --- FIRST CALCULATE THE COORDINATES OF THE MODULES WHICH CAN BE | |
571 | // --- ACCOMODATED. | |
572 | ||
573 | kdet = 1; | |
574 | Coordinates(); | |
575 | ||
576 | //inum = 0; | |
577 | zd = 0.; | |
578 | AliMatrix(idrotm[1], 90., 0., 90., 90., 0., 0.); | |
579 | AliMatrix(idrotm[2], 90., 180., 90., 90., 0., 0.); | |
580 | AliMatrix(idrotm[3], 90., 180., 90., 270., 0., 0.); | |
581 | AliMatrix(idrotm[4], 90., 0., 90., 270., 0., 0.); | |
582 | // **** Filling the DIQU Vol. (One Quadrant) | |
583 | inum2 = 0; | |
584 | inum3 = 0; | |
585 | inum4 = 0; | |
586 | for (i = 0; i < maxbox; ++i) { | |
587 | i2 = maxbox; | |
588 | for (j = 0; j < i2; ++j) { | |
589 | if (xbox[j][i] <= 0 && ybox[j][i] <= 0) continue; | |
590 | xd = xbox[j][i] - siqad[0]; | |
591 | yd = ybox[j][i] - siqad[1]; | |
592 | if (pindex[j][i] == 1) { | |
593 | ++inum2; | |
594 | pMC->Gsposp("DM11", inum2, "DIQU", xd, yd, zd, 0, "ONLY", smod2, 3); | |
595 | } | |
596 | if (pindex[j][i] == 2) { | |
597 | ++inum3; | |
598 | pMC->Gsposp("DM12", inum3, "DIQU", xd, yd, zd, 0, "ONLY", smod3, 3); | |
599 | } | |
600 | if (pindex[j][i] == 3) { | |
601 | ++inum4; | |
602 | pMC->Gsposp("DM13", inum4, "DIQU", xd, yd, zd, 0, "ONLY", smod4, 3); | |
603 | } | |
604 | } | |
605 | } | |
606 | xiqa[0] = siqad[0]; | |
607 | xiqa[1] = -siqad[0]; | |
608 | xiqa[2] = xiqa[1]; | |
609 | xiqa[3] = xiqa[0]; | |
610 | yiqa[0] = siqad[0]; | |
611 | yiqa[1] = yiqa[0]; | |
612 | yiqa[2] = -siqad[0]; | |
613 | yiqa[3] = yiqa[2]; | |
614 | i2 = numqu; | |
615 | for (k = 1; k <= i2; ++k) { | |
616 | pMC->Gsposp("DIQU", k, "DPMD", xiqa[k-1], yiqa[k-1], zd, idrotm[k], "ONLY", siqad, 3); | |
617 | } | |
618 | ||
619 | // --- Place the DPMD in ALICE with front edge 6.0m from vertex --- | |
620 | xp = 0.; | |
621 | yp = 0.; | |
622 | zp = zdist; | |
623 | pMC->Gspos("DPMD", 1, "ALIC", xp, yp, zp, 0, "ONLY"); | |
624 | ||
625 | } | |
626 | ||
627 | //_____________________________________________________________________________ | |
628 | void AliPMDv1::CreatePads() | |
629 | { | |
630 | // | |
631 | // Create the geometry of the pads | |
632 | // *** DEFINITION OF THE GEOMETRY OF THE PMD *** | |
633 | // *** DIFFERENT PADS WITH SIZES 8 MM, 10 MM, 12 MM AND 15 MM SQUARE | |
634 | // -- Author : Y.P. VIYOGI, 04/06/1997. | |
635 | // -- Modified: P.V.K.S.Baba(JU), 13-12-97. | |
636 | ||
637 | AliMC* pMC = AliMC::GetMC(); | |
638 | ||
639 | Int_t npad1, npad2, npad3, npad4; | |
640 | Float_t spad1[3], spad2[3], spad3[3], spad4[3]; | |
641 | Float_t scpv1[3], scpv2[3], scpv3[3], scpv4[3]; | |
642 | Int_t i, j; | |
643 | Float_t sstr1[3], spsw1[3], sstr2[3], spsw2[3], sstr3[3], spsw3[3], | |
644 | sstr4[3], spsw4[3]; | |
645 | Float_t xa, ya, za, xb, yb, zb, xc, sw[3], yc, zc; | |
646 | Float_t sfe[3]; | |
647 | Float_t spb[3], pad1, pad2, pad3, pad4; | |
648 | // VOLUMES Names : begining with D for all PMD volumes, | |
649 | // DMO1 : MODULE TYPE 1 ( 8 MM PADS) | |
650 | // DM11 : MODULE TYPE 2 (10 MM PADS) | |
651 | // DM12 : MODULE TYPE 3 (12 MM PADS) | |
652 | // DM13 : MODULE TYPE 4 (15 MM PADS) | |
653 | ||
654 | // The names of SIZE variables begin with S and have more meaningful | |
655 | // characters as shown below. | |
656 | ||
657 | // VOLUME SIZE MEDIUM : REMARKS | |
658 | // ------ ----- ------ : --------------------------- | |
659 | ||
660 | // DPPB SPB PB : PB Converter and its SIZE | |
661 | // DPFE SFE FE : FE Support Plate and its SIZE | |
662 | ||
663 | // DP11 SPAD2 GAS : PAD TYPE 2 (10 MM) | |
664 | // DP12 SPAD2 GAS : PAD TYPE 2 FOR CPV(10 MM) | |
665 | // DS11 SSTR2 FE : STRIP OF IRON | |
666 | // DW11 SPSW2 G10 : PRESHOWER | |
667 | // DV11 SCPV2 G10 : CPV | |
668 | ||
669 | // DP13 SPAD3 GAS : PAD TYPE 3 (12 MM) | |
670 | // DP14 SPAD3 GAS : PAD TYPE 3 FOR CPV(12 MM) | |
671 | // DS12 SSTR3 FE : STRIP OF IRON | |
672 | // DW12 SPSW3 G10 : PRESHOWER | |
673 | // DV12 SCPV3 G10 : CPV | |
674 | ||
675 | // DP15 SPAD4 GAS : PAD TYPE 4 (15 MM) | |
676 | // DP16 SPAD4 GAS : PAD TYPE 4 FOR CPV(15 MM) | |
677 | // DS13 SSTR4 FE : STRIP OF IRON | |
678 | // DW13 SPSW4 G10 : PRESHOWER | |
679 | // DV13 SCPV4 G10 : CPV | |
680 | ||
681 | // ****************** VOLUME TREE ****************** | |
682 | ||
683 | // DM11 (Module) | |
684 | // | | |
685 | // | | |
686 | // ------------------------------------------------- | |
687 | // | | | | | |
688 | // | | | | | |
689 | // DV11( CPV) DPFE DPPB DW11(Preshower) | |
690 | // | | | |
691 | // | | | |
692 | // DS12(Strip) DS11(Strip) | |
693 | // | | | |
694 | // | | | |
695 | // DP12(Pads) DP11(Pads) | |
696 | ||
697 | // ************************************************************ | |
698 | ||
699 | // --- The above gives the Volume Tree. PAD is a gas cell of size | |
700 | // --- given by PADSIZE in the input cards. STRIP is a collection of | |
701 | //--- PADs in a row. STRIPs are positioned in the PRESHOWER BOX. This is | |
702 | //--- then placed in the MODULE. The PSW and the MODULE have the same size | |
703 | // --- ; Lead converter, Iron support plate are also placed | |
704 | // --- in the MODULE. | |
705 | ||
706 | ||
707 | // DATA PAD1,PAD2,PAD3,PAD4/4*0.8/ | |
708 | // DATA NPAD1,NPAD2,NPAD3,NPAD4/4*30/ | |
709 | ||
710 | Int_t *idtmed = gAlice->Idtmed(); | |
711 | ||
712 | // **** PAD SIZE 8 MM | |
713 | // pmdin = fPar[0]; | |
714 | // pmdout = fPar[1]; | |
715 | thgas = fPar[2]; | |
716 | thcell = fPar[3]; | |
717 | thmin = fIn[0]; | |
718 | thmax = fIn[1]; | |
719 | zdist = fIn[2]; | |
720 | thlow = fIn[3]; | |
721 | thhigh = fIn[4]; | |
722 | // wafer = fGeo[0]; | |
723 | edge = fGeo[1]; | |
724 | numqu = Int_t(fGeo[2]); | |
725 | ||
726 | ||
727 | // *BABA | |
728 | pad1 = fPadSize[0]; | |
729 | pad2 = fPadSize[1]; | |
730 | pad3 = fPadSize[2]; | |
731 | pad4 = fPadSize[3]; | |
732 | npad1 = Int_t(24/fPadSize[0]); | |
733 | npad2 = Int_t(24/fPadSize[1]); | |
734 | npad3 = Int_t(24/fPadSize[2]); | |
735 | npad4 = Int_t(24/fPadSize[3]); | |
736 | // *BABA | |
737 | spad1[0] = (pad1 - thcell) / 2.; | |
738 | spad1[1] = spad1[0]; | |
739 | spad1[2] = thgas / 2; | |
740 | pMC->Gsvolu("DP21", "BOX ", idtmed[604], spad1, 3); | |
741 | pMC->Gsatt("DP21", "SEEN", 1); | |
742 | pMC->Gsvolu("DP22", "BOX ", idtmed[604], spad1, 3); | |
743 | pMC->Gsatt("DP22", "SEEN", 1); | |
744 | ||
745 | sstr1[0] = npad1*pad1/2; | |
746 | sstr1[1] = pad1/2; | |
747 | sstr1[2] = thgas/2; | |
748 | pMC->Gsvolu("DS21", "BOX ", idtmed[605], sstr1, 3); | |
749 | pMC->Gsatt("DS21", "SEEN", 1); | |
750 | pMC->Gsvolu("DS22", "BOX ", idtmed[605], sstr1, 3); | |
751 | pMC->Gsatt("DS22", "SEEN", 1); | |
752 | ||
753 | spsw1[0] = sstr1[0] + edge; | |
754 | spsw1[1] = spsw1[0]; | |
755 | spsw1[2] = (thgas + .4) / 2; | |
756 | // 2 mm G10 Plate cover (NMATE = 808) | |
757 | scpv1[0] = spsw1[0]; | |
758 | scpv1[1] = spsw1[1]; | |
759 | scpv1[2] = spsw1[2]; | |
760 | pMC->Gsvolu("DW21", "BOX ", idtmed[607], spsw1, 3); | |
761 | pMC->Gsatt("DW21", "SEEN", 1); | |
762 | pMC->Gsvolu("DV21", "BOX ", idtmed[607], spsw1, 3); | |
763 | pMC->Gsatt("DV21", "SEEN", 1); | |
764 | ||
765 | // --- place pads in a strip | |
766 | xa = (-npad1 + 1.) * pad1 / 2.; | |
767 | ya = 0.; | |
768 | za = 0.; | |
769 | for (i = 1; i <= npad1; ++i) { | |
770 | pMC->Gsposp("DP21", i, "DS21", xa, ya, za, 0, "ONLY", spad1, 3); | |
771 | pMC->Gsposp("DP22", i, "DS22", xa, ya, za, 0, "ONLY", spad1, 3); | |
772 | xa += pad1; | |
773 | } | |
774 | // --- place strips in the PRESHOWER AND CPV boxes | |
775 | xb = 0.; | |
776 | yb = (-npad1 + 1.) * pad1 / 2.; | |
777 | zb = 0.; | |
778 | for (j = 1; j <= npad1; ++j) { | |
779 | pMC->Gsposp("DS21", j, "DW21", xb, yb, zb, 0, "ONLY", sstr1, 3); | |
780 | pMC->Gsposp("DS22", j, "DV21", xb, yb, zb, 0, "ONLY", sstr1, 3); | |
781 | yb += pad1; | |
782 | } | |
783 | ||
784 | // **** PAD SIZE 10 MM | |
785 | ||
786 | spad2[0] = (pad2 - thcell) / 2.; | |
787 | spad2[1] = spad2[0]; | |
788 | spad2[2] = thgas / 2; | |
789 | pMC->Gsvolu("DP11", "BOX ", idtmed[604], spad2, 3); | |
790 | pMC->Gsatt("DP11", "SEEN", 1); | |
791 | pMC->Gsvolu("DP12", "BOX ", idtmed[604], spad2, 3); | |
792 | pMC->Gsatt("DP12", "SEEN", 1); | |
793 | ||
794 | sstr2[0] = npad2 * pad2 / 2; | |
795 | sstr2[1] = pad2 / 2; | |
796 | sstr2[2] = thgas / 2; | |
797 | pMC->Gsvolu("DS11", "BOX ", idtmed[605], sstr2, 3); | |
798 | pMC->Gsatt("DS11", "SEEN", 1); | |
799 | pMC->Gsvolu("DS12", "BOX ", idtmed[605], sstr2, 3); | |
800 | pMC->Gsatt("DS12", "SEEN", 1); | |
801 | ||
802 | spsw2[0] = sstr2[0] + edge; | |
803 | spsw2[1] = spsw2[0]; | |
804 | spsw2[2] = (thgas + .4) / 2; | |
805 | // 2 mm G10 Plate cover (NMATE = 808) | |
806 | scpv2[0] = spsw2[0]; | |
807 | scpv2[1] = spsw2[1]; | |
808 | scpv2[2] = spsw2[2]; | |
809 | pMC->Gsvolu("DW11","BOX ", idtmed[607], spsw2, 3); | |
810 | pMC->Gsatt("DW11", "SEEN", 1); | |
811 | pMC->Gsvolu("DV11","BOX ", idtmed[607], spsw2, 3); | |
812 | pMC->Gsatt("DV11", "SEEN", 1); | |
813 | ||
814 | // --- place pads in a strip | |
815 | xa = (-npad2 + 1.) * pad2 / 2.; | |
816 | ya = 0.; | |
817 | za = 0.; | |
818 | for (i = 1; i <= npad2; ++i) { | |
819 | pMC->Gsposp("DP11", i, "DS11", xa, ya, za, 0, "ONLY", spad2, 3); | |
820 | pMC->Gsposp("DP12", i, "DS12", xa, ya, za, 0, "ONLY", spad2, 3); | |
821 | xa += pad2; | |
822 | } | |
823 | // --- place strips in the PRESHOWER AND CPV boxes | |
824 | xb = 0.; | |
825 | yb = (-npad2 + 1.) * pad2 / 2.; | |
826 | zb = 0.; | |
827 | for (j = 1; j <= npad2; ++j) { | |
828 | pMC->Gsposp("DS11", j, "DW11", xb, yb, zb, 0, "ONLY", sstr2, 3); | |
829 | pMC->Gsposp("DS12", j, "DV11", xb, yb, zb, 0, "ONLY", sstr2, 3); | |
830 | yb += pad2; | |
831 | } | |
832 | ||
833 | // **** PAD SIZE 12 MM | |
834 | ||
835 | spad3[0] = (pad3 - thcell) / 2.; | |
836 | spad3[1] = spad3[0]; | |
837 | spad3[2] = thgas / 2; | |
838 | pMC->Gsvolu("DP13", "BOX ", idtmed[604], spad3, 3); | |
839 | pMC->Gsatt("DP13", "SEEN", 1); | |
840 | pMC->Gsvolu("DP14", "BOX ", idtmed[604], spad3, 3); | |
841 | pMC->Gsatt("DP14", "SEEN", 1); | |
842 | ||
843 | sstr3[0] = npad3 * pad3 / 2; | |
844 | sstr3[1] = pad3 / 2; | |
845 | sstr3[2] = thgas / 2; | |
846 | pMC->Gsvolu("DS13", "BOX ", idtmed[605], sstr3, 3); | |
847 | pMC->Gsatt("DS13", "SEEN", 1); | |
848 | pMC->Gsvolu("DS14", "BOX ", idtmed[605], sstr3, 3); | |
849 | pMC->Gsatt("DS14", "SEEN", 1); | |
850 | ||
851 | spsw3[0] = sstr3[0] + edge; | |
852 | spsw3[1] = spsw3[0]; | |
853 | spsw3[2] = (thgas + .4) / 2; | |
854 | // 2 mm G10 Plate cover (NMATE = 808) | |
855 | scpv3[0] = spsw3[0]; | |
856 | scpv3[1] = spsw3[1]; | |
857 | scpv3[2] = spsw3[2]; | |
858 | pMC->Gsvolu("DW12","BOX ", idtmed[607], spsw3, 3); | |
859 | pMC->Gsatt("DW12", "SEEN", 1); | |
860 | pMC->Gsvolu("DV12","BOX ", idtmed[607], spsw3, 3); | |
861 | pMC->Gsatt("DV12", "SEEN", 1); | |
862 | ||
863 | // --- place pads in a strip | |
864 | xa = (-npad3 + 1.) * pad3 / 2.; | |
865 | ya = 0.; | |
866 | za = 0.; | |
867 | for (i = 1; i <= npad3; ++i) { | |
868 | pMC->Gsposp("DP13", i, "DS13", xa, ya, za, 0, "ONLY", spad3, 3); | |
869 | pMC->Gsposp("DP14", i, "DS14", xa, ya, za, 0, "ONLY", spad3, 3); | |
870 | xa += pad3; | |
871 | } | |
872 | // --- place strips in the PRESHOWER AND CPV boxes | |
873 | xb = 0.; | |
874 | yb = (-npad3 + 1.) * pad3 / 2.; | |
875 | zb = 0.; | |
876 | for (j = 1; j <= npad3; ++j) { | |
877 | pMC->Gsposp("DS13", j, "DW12", xb, yb, zb, 0, "ONLY", sstr3, 3); | |
878 | pMC->Gsposp("DS14", j, "DV12", xb, yb, zb, 0, "ONLY", sstr3, 3); | |
879 | yb += pad3; | |
880 | } | |
881 | ||
882 | // **** PAD SIZE 15 MM | |
883 | ||
884 | spad4[0] = (pad4 - thcell) / 2.; | |
885 | spad4[1] = spad4[0]; | |
886 | spad4[2] = thgas / 2; | |
887 | pMC->Gsvolu("DP15","BOX ", idtmed[604], spad4, 3); | |
888 | pMC->Gsatt("DP15", "SEEN", 1); | |
889 | pMC->Gsvolu("DP16","BOX ", idtmed[604], spad4, 3); | |
890 | pMC->Gsatt("DP16", "SEEN", 1); | |
891 | ||
892 | sstr4[0] = npad4 * pad4 / 2; | |
893 | sstr4[1] = pad4 / 2; | |
894 | sstr4[2] = thgas / 2; | |
895 | pMC->Gsvolu("DS15","BOX ", idtmed[605], sstr4, 3); | |
896 | pMC->Gsatt("DS15", "SEEN", 1); | |
897 | pMC->Gsvolu("DS16","BOX ", idtmed[605], sstr4, 3); | |
898 | pMC->Gsatt("DS16", "SEEN", 1); | |
899 | ||
900 | spsw4[0] = sstr4[0] + edge; | |
901 | spsw4[1] = spsw4[0]; | |
902 | spsw4[2] = (thgas + .4) / 2; | |
903 | // 2 mm G10 Plate cover (NMATE = 808) | |
904 | scpv4[0] = spsw4[0]; | |
905 | scpv4[1] = spsw4[1]; | |
906 | scpv4[2] = spsw4[2]; | |
907 | pMC->Gsvolu("DW13","BOX ", idtmed[607], spsw4, 3); | |
908 | pMC->Gsatt("DW13", "SEEN", 1); | |
909 | pMC->Gsvolu("DV13","BOX ", idtmed[607], spsw4, 3); | |
910 | pMC->Gsatt("DV13", "SEEN", 1); | |
911 | ||
912 | // --- place pads in a strip | |
913 | xa = (-npad4 + 1.) * pad4 / 2.; | |
914 | ya = 0.; | |
915 | za = 0.; | |
916 | for (i = 1; i <= npad4; ++i) { | |
917 | pMC->Gsposp("DP15", i, "DS15", xa, ya, za, 0, "ONLY", spad4, 3); | |
918 | pMC->Gsposp("DP16", i, "DS16", xa, ya, za, 0, "ONLY", spad4, 3); | |
919 | xa += pad4; | |
920 | } | |
921 | // --- place strips in the PRESHOWER AND CPV boxes | |
922 | xb = 0.; | |
923 | yb = (-npad4 + 1.) * pad4 / 2.; | |
924 | zb = 0.; | |
925 | for (j = 1; j <= npad4; ++j) { | |
926 | pMC->Gsposp("DS15", j, "DW13", xb, yb, zb, 0, "ONLY", sstr4, 3); | |
927 | pMC->Gsposp("DS16", j, "DV13", xb, yb, zb, 0, "ONLY", sstr4, 3); | |
928 | yb += pad4; | |
929 | } | |
930 | ||
931 | ||
932 | // --- DEFINE MODULES, IRON, TUNGSTEN AND LEAD VOLUMES | |
933 | ||
934 | ||
935 | spb[0] = spsw1[0]; | |
936 | spb[1] = spsw1[1]; | |
937 | spb[2] = .75; | |
938 | pMC->Gsvolu("DPPB","BOX ", idtmed[600], spb, 3); | |
939 | pMC->Gsatt("DPPB", "SEEN", 1); | |
940 | ||
941 | sw[0] = spsw1[0]; | |
942 | sw[1] = spsw1[1]; | |
943 | sw[2] = 0.9/2.; | |
944 | pMC->Gsvolu("DPW ","BOX ", idtmed[600], sw, 3); | |
945 | pMC->Gsatt("DPW ", "SEEN", 1); | |
946 | ||
947 | sfe[0] = spsw1[0]; | |
948 | sfe[1] = spsw1[1]; | |
949 | sfe[2] = 0.6/2.; | |
950 | pMC->Gsvolu("DPFE","BOX ", idtmed[605], sfe, 3); | |
951 | pMC->Gsatt("DPFE", "SEEN", 1); | |
952 | ||
953 | smod1[0] = spsw1[0]; | |
954 | smod1[1] = smod1[0]; | |
955 | // SMOD1(3)=SPSW1(3)+SFE(3)+SW (3)+SCPV1(3) | |
956 | smod1[2] = spsw1[2] + sfe[2] + spb[2] + scpv1[2]; | |
957 | pMC->Gsvolu("DM21", "BOX ", idtmed[698], smod1, 3); | |
958 | ||
959 | smod2[0] = spsw2[0]; | |
960 | smod2[1] = smod2[0]; | |
961 | smod2[2] = spsw2[2] + sfe[2] + spb[2] + scpv2[2]; | |
962 | pMC->Gsvolu("DM11", "BOX ", idtmed[698], smod2, 3); | |
963 | ||
964 | smod3[0] = spsw3[0]; | |
965 | smod3[1] = smod3[0]; | |
966 | smod3[2] = spsw3[2] + sfe[2] + spb[2] + scpv3[2]; | |
967 | pMC->Gsvolu("DM12", "BOX ", idtmed[698], smod3, 3); | |
968 | ||
969 | smod4[0] = spsw4[0]; | |
970 | smod4[1] = smod4[0]; | |
971 | smod4[2] = spsw4[2] + sfe[2] + spb[2] + scpv4[2]; | |
972 | pMC->Gsvolu("DM13", "BOX ", idtmed[698], smod4, 3); | |
973 | ||
974 | // **** MODULE TYPE 1 : ALWAYS WITH TUNSGTEN CONVERTER | |
975 | ||
976 | // *** try with PB once 8.6.97 | |
977 | ||
978 | // --- place gas box (as CPV), iron support, lead converter and gas box | |
979 | // --- (preshower) in the module | |
980 | xc = 0.; | |
981 | yc = 0.; | |
982 | // --- First the CPV box | |
983 | zc = -(spsw1[2] + sfe[2] + spb[2] + spsw1[2]) + spsw1[2]; | |
984 | pMC->Gspos("DV21", 1, "DM21", xc, yc, zc, 0, "ONLY"); | |
985 | // --- Then iron support plate | |
986 | zc = zc + sfe[2] + spsw1[2]; | |
987 | pMC->Gspos("DPFE", 1, "DM21", xc, yc, zc, 0, "ONLY"); | |
988 | // --- Then converter plate | |
989 | zc = zc + sfe[2] + spb[2]; | |
990 | pMC->Gspos("DPPB", 1, "DM21", xc, yc, zc, 0, "ONLY"); | |
991 | // --- Lastly the preshower box | |
992 | zc = zc + spb[2] + spsw1[2]; | |
993 | pMC->Gspos("DW21", 1, "DM21", xc, yc, zc, 0, "ONLY"); | |
994 | ||
995 | // **** MODULE TYPE 2 | |
996 | ||
997 | // --- place gas box (as CPV), iron support, lead converter and gas box | |
998 | // --- (preshower) in the module | |
999 | xc = 0.; | |
1000 | yc = 0.; | |
1001 | // --- First the CPV box | |
1002 | zc = -(spsw2[2] + sfe[2] + spb[2] + spsw2[2]) + spsw2[2]; | |
1003 | pMC->Gspos("DV11", 1, "DM11", xc, yc, zc, 0, "ONLY"); | |
1004 | // --- Then iron support plate | |
1005 | zc = zc + sfe[2] + spsw2[2]; | |
1006 | pMC->Gspos("DPFE", 1, "DM11", xc, yc, zc, 0, "ONLY"); | |
1007 | // --- Then lead converter plate | |
1008 | zc = zc + sfe[2] + spb[2]; | |
1009 | pMC->Gspos("DPPB", 1, "DM11", xc, yc, zc, 0, "ONLY"); | |
1010 | // --- Lastly the preshower box | |
1011 | zc = zc + spb[2] + spsw2[2]; | |
1012 | pMC->Gspos("DW11", 1, "DM11", xc, yc, zc, 0, "ONLY"); | |
1013 | ||
1014 | ||
1015 | // **** MODULE TYPE 3 | |
1016 | ||
1017 | // --- place gas box (as CPV), iron support, lead converter and gas box | |
1018 | // --- (preshower) in the module | |
1019 | xc = 0.; | |
1020 | yc = 0.; | |
1021 | // --- First the CPV box | |
1022 | zc = -(spsw3[2] + sfe[2] + spb[2] + spsw3[2]) + spsw3[2]; | |
1023 | pMC->Gspos("DV12", 1, "DM12", xc, yc, zc, 0, "ONLY"); | |
1024 | // --- Then iron support plate | |
1025 | zc = zc + sfe[2] + spsw3[2]; | |
1026 | pMC->Gspos("DPFE", 1, "DM12", xc, yc, zc, 0, "ONLY"); | |
1027 | // --- Then lead converter plate | |
1028 | zc = zc + sfe[2] + spb[2]; | |
1029 | pMC->Gspos("DPPB", 1, "DM12", xc, yc, zc, 0, "ONLY"); | |
1030 | // --- Lastly the preshower box | |
1031 | zc = zc + spb[2] + spsw3[2]; | |
1032 | pMC->Gspos("DW12", 1, "DM12", xc, yc, zc, 0, "ONLY"); | |
1033 | ||
1034 | ||
1035 | // **** MODULE TYPE 4 | |
1036 | ||
1037 | // --- place gas box (as CPV), iron support, lead converter and gas box | |
1038 | // --- (preshower) in the module | |
1039 | xc = 0.; | |
1040 | yc = 0.; | |
1041 | // --- First the CPV box | |
1042 | zc = -(spsw4[2] + sfe[2] + spb[2] + spsw4[2]) + spsw4[2]; | |
1043 | pMC->Gspos("DV13", 1, "DM13", xc, yc, zc, 0, "ONLY"); | |
1044 | // --- Then iron support plate | |
1045 | zc = zc + sfe[2] + spsw4[2]; | |
1046 | pMC->Gspos("DPFE", 1, "DM13", xc, yc, zc, 0, "ONLY"); | |
1047 | // --- Then lead converter plate | |
1048 | zc = zc + sfe[2] + spb[2]; | |
1049 | pMC->Gspos("DPPB", 1, "DM13", xc, yc, zc, 0, "ONLY"); | |
1050 | // --- Lastly the preshower box | |
1051 | zc = zc + spb[2] + spsw4[2]; | |
1052 | pMC->Gspos("DW13", 1, "DM13", xc, yc, zc, 0, "ONLY"); | |
1053 | ||
1054 | } | |
1055 | ||
1056 | //_____________________________________________________________________________ | |
0efa9190 | 1057 | void AliPMDv1::DrawModule() |
fe4da5cc | 1058 | { |
1059 | // | |
1060 | // Draw a shaded view of the Photon Multiplicity Detector | |
1061 | // | |
1062 | ||
1063 | AliMC* pMC = AliMC::GetMC(); | |
1064 | ||
1065 | pMC->Gsatt("*", "seen", -1); | |
1066 | pMC->Gsatt("alic", "seen", 0); | |
1067 | // | |
1068 | // Set the visibility of the components | |
1069 | // | |
1070 | pMC->Gsatt("DP21","seen",0); | |
1071 | pMC->Gsatt("DP22","seen",0); | |
1072 | pMC->Gsatt("DS21","seen",1); | |
1073 | pMC->Gsatt("DS22","seen",1); | |
1074 | pMC->Gsatt("DW21","seen",0); | |
1075 | pMC->Gsatt("DV21","seen",0); | |
1076 | pMC->Gsatt("DP11","seen",0); | |
1077 | pMC->Gsatt("DP12","seen",0); | |
1078 | pMC->Gsatt("DS11","seen",1); | |
1079 | pMC->Gsatt("DS12","seen",1); | |
1080 | pMC->Gsatt("DW11","seen",0); | |
1081 | pMC->Gsatt("DV11","seen",0); | |
1082 | pMC->Gsatt("DP13","seen",0); | |
1083 | pMC->Gsatt("DP14","seen",0); | |
1084 | pMC->Gsatt("DS13","seen",1); | |
1085 | pMC->Gsatt("DS14","seen",1); | |
1086 | pMC->Gsatt("DW12","seen",0); | |
1087 | pMC->Gsatt("DV12","seen",0); | |
1088 | pMC->Gsatt("DP15","seen",0); | |
1089 | pMC->Gsatt("DP16","seen",0); | |
1090 | pMC->Gsatt("DS15","seen",1); | |
1091 | pMC->Gsatt("DS16","seen",1); | |
1092 | pMC->Gsatt("DW13","seen",0); | |
1093 | pMC->Gsatt("DV13","seen",0); | |
1094 | pMC->Gsatt("DPPB","seen",1); | |
1095 | pMC->Gsatt("DPW ","seen",1); | |
1096 | pMC->Gsatt("DPFE","seen",1); | |
1097 | pMC->Gsatt("DM21","seen",1); | |
1098 | pMC->Gsatt("DM11","seen",1); | |
1099 | pMC->Gsatt("DM12","seen",1); | |
1100 | pMC->Gsatt("DM13","seen",1); | |
1101 | pMC->Gsatt("DPMD","seen",0); | |
1102 | pMC->Gsatt("DIQU","seen",0); | |
1103 | // | |
1104 | pMC->Gdopt("hide", "on"); | |
1105 | pMC->Gdopt("shad", "on"); | |
1106 | pMC->Gsatt("*", "fill", 7); | |
1107 | pMC->SetClipBox("."); | |
1108 | pMC->SetClipBox("*", 0, 3000, -3000, 3000, -6000, 6000); | |
1109 | pMC->DefaultRange(); | |
1110 | pMC->Gdraw("alic", 40, 30, 0, 22, 15.5, .04, .04); | |
1111 | pMC->Gdhead(1111, "Photon Multiplicity Detector Version 1"); | |
1112 | pMC->Gdman(17, 5, "MAN"); | |
1113 | pMC->Gdopt("hide", "off"); | |
1114 | } | |
1115 | ||
1116 | //_____________________________________________________________________________ | |
1117 | void AliPMDv1::CreateMaterials() | |
1118 | { | |
1119 | // | |
1120 | // Create materials for the PMD version 1 | |
1121 | // | |
1122 | // ORIGIN : Y. P. VIYOGI | |
1123 | // | |
1124 | ||
1125 | AliMC* pMC = AliMC::GetMC(); | |
1126 | ||
1127 | // --- The Argon- CO2 mixture --- | |
1128 | Float_t ag[2] = { 39.95 }; | |
1129 | Float_t zg[2] = { 18. }; | |
1130 | Float_t wg[2] = { .8,.2 }; | |
1131 | Float_t dar = .001782; // --- Ar density in g/cm3 --- | |
1132 | // --- CO2 --- | |
1133 | Float_t ac[2] = { 12.,16. }; | |
1134 | Float_t zc[2] = { 6.,8. }; | |
1135 | Float_t wc[2] = { 1.,2. }; | |
1136 | Float_t dc = .001977; | |
1137 | Float_t dco = .002; // --- CO2 density in g/cm3 --- | |
1138 | ||
1139 | Float_t absl, radl, a, d, z; | |
1140 | Float_t dg; | |
1141 | Float_t x0ar; | |
1142 | Float_t buf[1]; | |
1143 | Int_t nbuf; | |
1144 | ||
1145 | Int_t *idtmed = gAlice->Idtmed(); | |
1146 | Int_t isxfld = gAlice->Field()->Integ(); | |
1147 | Float_t sxmgmx = gAlice->Field()->Max(); | |
1148 | ||
1149 | // --- Define the various materials for GEANT --- | |
1150 | AliMaterial(1, "Pb $", 207.19, 82., 11.35, .56, 18.5); | |
1151 | x0ar = 19.55 / dar; | |
1152 | AliMaterial(2, "Argon$", 39.95, 18., dar, x0ar, 6.5e4); | |
1153 | AliMixture(3, "CO2 $", ac, zc, dc, -2, wc); | |
1154 | AliMaterial(4, "Al $", 26.98, 13., 2.7, 8.9, 18.5); | |
1155 | AliMaterial(6, "Fe $", 55.85, 26., 7.87, 1.76, 18.5); | |
1156 | AliMaterial(7, "W $", 183.85, 74., 19.3, .35, 10.3); | |
1157 | AliMaterial(8, "G10 $", 20., 10., 1.7, 19.4, 999); | |
1158 | AliMaterial(9, "SILIC$", 28.09, 14., 2.33, 9.36, 45.); | |
1159 | AliMaterial(10, "Be $", 9.01, 4., 1.848, 35.3, 36.7); | |
1160 | AliMaterial(15, "Cu $", 63.54, 29., 8.96, 1.43, 15.); | |
1161 | AliMaterial(16, "C $", 12.01, 6., 2.265, 18.8, 49.9); | |
1162 | ||
1163 | AliMaterial(96, "MYLAR$", 8.73, 4.55, 1.39, 28.7, 62.); | |
1164 | AliMaterial(97, "CONCR$", 20., 10., 2.5, 10.7, 40.); | |
1165 | AliMaterial(98, "Vacum$", 1e-9, 1e-9, 1e-9, 1e16, 1e16); | |
1166 | AliMaterial(99, "Air $", 14.61, 7.3, .0012, 30420., 67500.); | |
1167 | ||
1168 | // define gas-mixtures | |
1169 | ||
1170 | char namate[21]; | |
1171 | pMC->Gfmate((*fIdmate)[3], namate, a, z, d, radl, absl, buf, nbuf); | |
1172 | ag[1] = a; | |
1173 | zg[1] = z; | |
1174 | dg = (dar * 4 + dco) / 5; | |
1175 | AliMixture(5, "ArCO2$", ag, zg, dg, 2, wg); | |
1176 | ||
1177 | // Define tracking media | |
1178 | AliMedium(601, "Pb conv.$", 1, 0, 0, isxfld, sxmgmx, 1., .1, .01, .1); | |
1179 | AliMedium(607, "W conv.$", 7, 0, 0, isxfld, sxmgmx, 1., .1, .01, .1); | |
1180 | AliMedium(608, "G10plate$", 8, 0, 0, isxfld, sxmgmx, 1., .1, .01, .1); | |
1181 | AliMedium(604, "Al $", 4, 0, 0, isxfld, sxmgmx, .1, .1, .01, .1); | |
1182 | AliMedium(606, "Fe $", 6, 0, 0, isxfld, sxmgmx, .1, .1, .01, .1); | |
1183 | AliMedium(605, "ArCO2 $", 5, 1, 0, isxfld, sxmgmx, .1, .1, .1, .1); | |
1184 | AliMedium(609, "SILICON $", 9, 1, 0, isxfld, sxmgmx, .1, .1, .1, .1); | |
1185 | AliMedium(610, "Be $", 10, 0, 0, isxfld, sxmgmx, .1, .1, .01, .1); | |
1186 | AliMedium(698, "Vacuum $", 98, 0, 0, isxfld, sxmgmx, 1., .1, .1, 10); | |
1187 | AliMedium(699, "Air gaps$", 99, 0, 0, isxfld, sxmgmx, 1., .1, .1, .1); | |
1188 | AliMedium(615, "Cu $", 15, 0, 0, isxfld, sxmgmx, .1, .1, .01, .1); | |
1189 | AliMedium(616, "C $", 16, 0, 0, isxfld, sxmgmx, .1, .1, .01, .1); | |
1190 | ||
1191 | // --- Generate explicitly delta rays in the iron, aluminium and lead --- | |
1192 | pMC->Gstpar(idtmed[600], "LOSS", 3.); | |
1193 | pMC->Gstpar(idtmed[600], "DRAY", 1.); | |
1194 | ||
1195 | pMC->Gstpar(idtmed[603], "LOSS", 3.); | |
1196 | pMC->Gstpar(idtmed[603], "DRAY", 1.); | |
1197 | ||
1198 | pMC->Gstpar(idtmed[604], "LOSS", 3.); | |
1199 | pMC->Gstpar(idtmed[604], "DRAY", 1.); | |
1200 | ||
1201 | pMC->Gstpar(idtmed[605], "LOSS", 3.); | |
1202 | pMC->Gstpar(idtmed[605], "DRAY", 1.); | |
1203 | ||
1204 | pMC->Gstpar(idtmed[606], "LOSS", 3.); | |
1205 | pMC->Gstpar(idtmed[606], "DRAY", 1.); | |
1206 | ||
1207 | pMC->Gstpar(idtmed[607], "LOSS", 3.); | |
1208 | pMC->Gstpar(idtmed[607], "DRAY", 1.); | |
1209 | ||
1210 | // --- Energy cut-offs in the Pb and Al to gain time in tracking --- | |
1211 | // --- without affecting the hit patterns --- | |
1212 | pMC->Gstpar(idtmed[600], "CUTGAM", 1e-4); | |
1213 | pMC->Gstpar(idtmed[600], "CUTELE", 1e-4); | |
1214 | pMC->Gstpar(idtmed[600], "CUTNEU", 1e-4); | |
1215 | pMC->Gstpar(idtmed[600], "CUTHAD", 1e-4); | |
1216 | pMC->Gstpar(idtmed[605], "CUTGAM", 1e-4); | |
1217 | pMC->Gstpar(idtmed[605], "CUTELE", 1e-4); | |
1218 | pMC->Gstpar(idtmed[605], "CUTNEU", 1e-4); | |
1219 | pMC->Gstpar(idtmed[605], "CUTHAD", 1e-4); | |
1220 | pMC->Gstpar(idtmed[606], "CUTGAM", 1e-4); | |
1221 | pMC->Gstpar(idtmed[606], "CUTELE", 1e-4); | |
1222 | pMC->Gstpar(idtmed[606], "CUTNEU", 1e-4); | |
1223 | pMC->Gstpar(idtmed[606], "CUTHAD", 1e-4); | |
1224 | pMC->Gstpar(idtmed[603], "CUTGAM", 1e-4); | |
1225 | pMC->Gstpar(idtmed[603], "CUTELE", 1e-4); | |
1226 | pMC->Gstpar(idtmed[603], "CUTNEU", 1e-4); | |
1227 | pMC->Gstpar(idtmed[603], "CUTHAD", 1e-4); | |
1228 | pMC->Gstpar(idtmed[609], "CUTGAM", 1e-4); | |
1229 | pMC->Gstpar(idtmed[609], "CUTELE", 1e-4); | |
1230 | pMC->Gstpar(idtmed[609], "CUTNEU", 1e-4); | |
1231 | pMC->Gstpar(idtmed[609], "CUTHAD", 1e-4); | |
1232 | ||
1233 | // --- Prevent particles stopping in the gas due to energy cut-off --- | |
1234 | pMC->Gstpar(idtmed[604], "CUTGAM", 1e-5); | |
1235 | pMC->Gstpar(idtmed[604], "CUTELE", 1e-5); | |
1236 | pMC->Gstpar(idtmed[604], "CUTNEU", 1e-5); | |
1237 | pMC->Gstpar(idtmed[604], "CUTHAD", 1e-5); | |
1238 | pMC->Gstpar(idtmed[604], "CUTMUO", 1e-5); | |
1239 | } | |
1240 | ||
1241 | //_____________________________________________________________________________ | |
1242 | void AliPMDv1::Init() | |
1243 | { | |
1244 | // | |
1245 | // Initialises PMD detector after it has been built | |
1246 | // | |
1247 | Int_t i; | |
1248 | kdet=1; | |
1249 | // | |
1250 | printf("\n"); | |
1251 | for(i=0;i<35;i++) printf("*"); | |
1252 | printf(" PMD_INIT "); | |
1253 | for(i=0;i<35;i++) printf("*"); | |
1254 | printf("\n"); | |
1255 | printf(" PMD simulation package initialised\n"); | |
1256 | printf(" parameters of pmd\n"); | |
1257 | printf("%6d %10.2f %10.2f %10.2f %10.2f %10.2f\n",kdet,thmin,thmax,zdist,thlow,thhigh); | |
1258 | // | |
1259 | for(i=0;i<80;i++) printf("*"); | |
1260 | printf("\n"); | |
1261 | // | |
1262 | Int_t *idtmed = gAlice->Idtmed(); | |
1263 | fMedSens=idtmed[605-1]; | |
1264 | } | |
1265 | ||
1266 | //_____________________________________________________________________________ | |
1267 | void AliPMDv1::StepManager() | |
1268 | { | |
1269 | // | |
1270 | // Called at each step in the PMD | |
1271 | // | |
1272 | Int_t copy; | |
1273 | Float_t hits[4], destep; | |
1274 | Float_t center[3] = {0,0,0}; | |
1275 | Int_t vol[4]; | |
1276 | ||
1277 | AliMC* pMC=AliMC::GetMC(); | |
1278 | if(pMC->GetMedium() == fMedSens && (destep = pMC->Edep())) { | |
1279 | ||
1280 | // THIS PART MUST BE CHECKED | |
1281 | pMC->CurrentVol(0, copy); | |
1282 | vol[0]=copy; | |
1283 | pMC->CurrentVolOff(1,0,copy); | |
1284 | vol[1]=copy; | |
1285 | pMC->CurrentVolOff(2,0,copy); | |
1286 | vol[2]=copy; | |
1287 | pMC->CurrentVolOff(1,0,copy); | |
1288 | vol[3]=copy; | |
1289 | pMC->Gdtom(center,hits,1); | |
1290 | hits[3] = destep*1e9; //Number in eV | |
1291 | AddHit(gAlice->CurrentTrack(), vol, hits); | |
1292 | } | |
1293 | } | |
1294 | ||
1295 | ClassImp(AliPMDhit) | |
1296 | ||
1297 | //_____________________________________________________________________________ | |
1298 | AliPMDhit::AliPMDhit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits): | |
1299 | AliHit(shunt, track) | |
1300 | { | |
1301 | // | |
1302 | // Add a PMD hit | |
1303 | // | |
1304 | Int_t i; | |
1305 | for (i=0;i<4;i++) fVolume[i] = vol[i]; | |
1306 | fX=hits[0]; | |
1307 | fY=hits[1]; | |
1308 | fZ=hits[2]; | |
1309 | fEnergy=hits[3]; | |
1310 | } |