]>
Commit | Line | Data |
---|---|---|
fe4da5cc | 1 | /////////////////////////////////////////////////////////////////////////////// |
2 | // // | |
3 | // Transition Radiation Detector version 2 -- detailed simulation // | |
4 | // // | |
5 | //Begin_Html | |
6 | /* | |
7 | <img src="gif/AliTRDv2Class.gif"> | |
8 | */ | |
9 | //End_Html | |
10 | // // | |
11 | // // | |
12 | /////////////////////////////////////////////////////////////////////////////// | |
13 | ||
14 | #include <TMath.h> | |
fe4da5cc | 15 | #include <TVector.h> |
fe4da5cc | 16 | |
fe4da5cc | 17 | #include "AliTRDv2.h" |
18 | #include "AliRun.h" | |
fe4da5cc | 19 | #include "AliMC.h" |
d3f347ff | 20 | #include "AliConst.h" |
fe4da5cc | 21 | |
22 | ClassImp(AliTRDv2) | |
23 | ||
24 | //_____________________________________________________________________________ | |
25 | AliTRDv2::AliTRDv2(const char *name, const char *title) | |
26 | :AliTRD(name, title) | |
27 | { | |
28 | // | |
29 | // Standard constructor for Transition Radiation Detector version 2 | |
30 | // | |
d3f347ff | 31 | for (Int_t icham = 0; icham < ncham; ++icham) { |
32 | fIdSensI[icham] = 0; | |
33 | fIdSensN[icham] = 0; | |
34 | fIdSensO[icham] = 0; | |
35 | } | |
36 | fDeltaE = NULL; | |
37 | ||
fe4da5cc | 38 | SetBufferSize(128000); |
39 | } | |
d3f347ff | 40 | |
41 | AliTRDv2::~AliTRDv2() | |
42 | { | |
43 | if (fDeltaE) delete fDeltaE; | |
44 | } | |
fe4da5cc | 45 | |
46 | //_____________________________________________________________________________ | |
47 | void AliTRDv2::CreateGeometry() | |
48 | { | |
49 | // | |
50 | // Create geometry for the Transition Radiation Detector version 2 | |
51 | // This version covers the full azimuth. | |
d3f347ff | 52 | // --- Author : Christoph Blume (GSI) 20/5/99 |
53 | // | |
54 | // --- Volume names : | |
55 | // TRD --> Mother TRD volume (Al) | |
56 | // UTRS --> Sectors of the sub-detector (Al) | |
57 | // UTRI --> Inner part of the detector frame (Air) | |
58 | // The chambers | |
59 | // UCI1-6 --> The frame of the inner chambers (C) | |
60 | // UCN1-6 --> The frame of the neighbouring chambers (C) | |
61 | // UCO1-6 --> The frame of the outer chambers (C) | |
62 | // UII1-6 --> The inner part of the inner chambers (Air) | |
63 | // UIN1-6 --> The inner part of the neighbouring chambers (Air) | |
64 | // UIO1-6 --> The inner part of the outer chambers (Air) | |
65 | // The layers inside a chamber | |
66 | // UT0I(N,O) --> Radiator seal (G10) | |
67 | // UT1I(N,O) --> Radiator (CO2) | |
68 | // UT2I(N,O) --> Polyethylene of radiator (PE) | |
69 | // UT3I(N,O) --> Entrance window (Mylar) | |
70 | // UXI(N,O)1-6 --> Gas volume (sensitive) (Xe/Isobutane) | |
71 | // UT5I(N,O) --> Pad plane (Cu) | |
72 | // UT6I(N,O) --> Support structure (G10) | |
73 | // UT7I(N,O) --> FEE + signal lines (Cu) | |
74 | // UT8I(N,O) --> Polyethylene of cooling device (PE) | |
75 | // UT9I(N,O) --> Cooling water (Water) | |
fe4da5cc | 76 | // |
77 | //Begin_Html | |
78 | /* | |
79 | <img src="gif/AliTRDv2.gif"> | |
80 | */ | |
81 | //End_Html | |
82 | //Begin_Html | |
83 | /* | |
84 | <img src="gif/AliTRDv2Tree.gif"> | |
85 | */ | |
86 | //End_Html | |
d3f347ff | 87 | |
88 | Float_t xpos, ypos, zpos; | |
89 | Int_t idmat[2]; | |
fe4da5cc | 90 | |
d3f347ff | 91 | const Int_t nparmo = 10; |
92 | const Int_t nparfr = 4; | |
93 | const Int_t nparch = 3; | |
94 | const Int_t nparic = 4; | |
95 | const Int_t nparnc = 4; | |
96 | const Int_t nparoc = 11; | |
fe4da5cc | 97 | |
d3f347ff | 98 | Float_t par_mo[nparmo]; |
99 | Float_t par_fr[nparfr]; | |
100 | Float_t par_ch[nparch]; | |
101 | Float_t par_ic[nparic]; | |
102 | Float_t par_nc[nparnc]; | |
103 | Float_t par_oc[nparoc]; | |
fe4da5cc | 104 | |
b060c36f | 105 | Int_t icham; |
106 | ||
fe4da5cc | 107 | Int_t *idtmed = gAlice->Idtmed(); |
108 | ||
d3f347ff | 109 | AliMC* pMC = AliMC::GetMC(); |
110 | ||
111 | ////////////////////////////////////////////////////////////////////////// | |
fe4da5cc | 112 | // Definition of Volumes |
d3f347ff | 113 | ////////////////////////////////////////////////////////////////////////// |
fe4da5cc | 114 | |
d3f347ff | 115 | // Definition of the mother volume for the TRD (Al) |
116 | par_mo[0] = 0.; | |
fe4da5cc | 117 | par_mo[1] = 360.; |
118 | par_mo[2] = nsect; | |
119 | par_mo[3] = 2.; | |
120 | par_mo[4] = -zmax1; | |
121 | par_mo[5] = rmin; | |
122 | par_mo[6] = rmax; | |
d3f347ff | 123 | par_mo[7] = zmax1; |
fe4da5cc | 124 | par_mo[8] = rmin; |
125 | par_mo[9] = rmax; | |
d3f347ff | 126 | pMC->Gsvolu("TRD ", "PGON", idtmed[1301-1], par_mo, nparmo); |
fe4da5cc | 127 | pMC->Gsdvn("UTRS", "TRD ", nsect, 2); |
d3f347ff | 128 | |
129 | // The minimal width of a sector in rphi-direction | |
130 | Float_t widmi = rmin * TMath::Sin(kPI/nsect); | |
131 | // The maximal width of a sector in rphi-direction | |
132 | Float_t widma = rmax * TMath::Sin(kPI/nsect); | |
133 | // The total thickness of the spaceframe (Al + Air) | |
134 | Float_t frame = widmi - (widpl1 / 2); | |
135 | ||
136 | // Definition of the inner part of the detector frame (Air) | |
137 | par_fr[0] = widmi - alframe / 2.; | |
138 | par_fr[1] = widma - alframe / 2.; | |
139 | par_fr[2] = zmax1; | |
140 | par_fr[3] = (rmax - rmin) / 2; | |
141 | pMC->Gsvolu("UTRI", "TRD1", idtmed[1302-1], par_fr, nparfr); | |
142 | ||
143 | // Some parameter for the chambers | |
144 | Float_t lendifc = (zmax1 - zmax2) / nmodul; | |
145 | Float_t heightc = (rmax - rmin ) / nmodul; | |
146 | Float_t widdifc = (widma - widmi) / nmodul; | |
147 | ||
148 | // Definition of the chambers | |
149 | Char_t ctagc[5], ctagi[5]; | |
b060c36f | 150 | for (icham = 1; icham <= ncham; ++icham) { |
d3f347ff | 151 | |
152 | // Carbon frame of the inner chambers (C) | |
153 | par_ch[0] = widmi + (icham-1) * widdifc - frame; | |
154 | par_ch[1] = zleni / 2.; | |
155 | par_ch[2] = heightc / 2.; | |
fe4da5cc | 156 | sprintf(ctagc,"UCI%1d",icham); |
d3f347ff | 157 | pMC->Gsvolu(ctagc, "BOX ", idtmed[1307-1], par_ch, nparch); |
158 | // Inner part of the inner chambers (Air) | |
fe4da5cc | 159 | par_ch[0] -= ccframe; |
160 | par_ch[1] -= ccframe; | |
d3f347ff | 161 | sprintf(ctagc,"UII%1d",icham); |
162 | pMC->Gsvolu(ctagc, "BOX ", idtmed[1302-1], par_ch, nparch); | |
163 | ||
164 | // Carbon frame of the neighbouring chambers (C) | |
165 | par_ch[0] = widmi + (icham-1) * widdifc - frame; | |
166 | par_ch[1] = zlenn / 2.; | |
167 | par_ch[2] = heightc / 2.; | |
168 | sprintf(ctagc,"UCN%1d",icham); | |
169 | pMC->Gsvolu(ctagc, "BOX ", idtmed[1307-1], par_ch, nparch); | |
170 | // Inner part of the neighbouring chambers (Air) | |
171 | par_ch[0] -= ccframe; | |
172 | par_ch[1] -= ccframe; | |
173 | sprintf(ctagc,"UIN%1d",icham); | |
174 | pMC->Gsvolu(ctagc, "BOX ", idtmed[1302-1], par_ch, nparch); | |
175 | ||
176 | // Carbon frame of the outer chambers (C) | |
177 | par_ch[0] = widmi + (icham-1) * widdifc - frame; | |
178 | par_ch[1] = (icham - 6) * lendifc / 2. + zleno / 2.; | |
fe4da5cc | 179 | par_ch[2] = heightc / 2.; |
180 | sprintf(ctagc,"UCO%1d",icham); | |
d3f347ff | 181 | pMC->Gsvolu(ctagc, "BOX ", idtmed[1307-1], par_ch, nparch); |
182 | // Inner part of the outer chambers (Air) | |
fe4da5cc | 183 | par_ch[0] -= ccframe; |
184 | par_ch[1] -= ccframe; | |
d3f347ff | 185 | sprintf(ctagc,"UIO%1d",icham); |
186 | pMC->Gsvolu(ctagc, "BOX ", idtmed[1302-1], par_ch, nparch); | |
187 | ||
fe4da5cc | 188 | } |
d3f347ff | 189 | |
190 | // Definition of the layers in each inner chamber | |
fe4da5cc | 191 | par_ic[0] = -1.; |
192 | par_ic[1] = -1.; | |
d3f347ff | 193 | // G10 layer (radiator layer) |
194 | par_ic[2] = sethick / 2; | |
195 | pMC->Gsvolu("UT0I", "BOX ", idtmed[1313-1], par_ic, nparic); | |
196 | // CO2 layer (radiator) | |
197 | par_ic[2] = rathick / 2; | |
198 | pMC->Gsvolu("UT1I", "BOX ", idtmed[1312-1], par_ic, nparic); | |
199 | // PE layer (radiator) | |
200 | par_ic[2] = pethick / 2; | |
201 | pMC->Gsvolu("UT2I", "BOX ", idtmed[1303-1], par_ic, nparic); | |
202 | // Mylar layer (entrance window + HV cathode) | |
203 | par_ic[2] = mythick / 2; | |
204 | pMC->Gsvolu("UT3I", "BOX ", idtmed[1308-1], par_ic, nparic); | |
205 | // Xe/Isobutane layer (gasvolume) | |
206 | par_ic[2] = xethick / 2.; | |
b060c36f | 207 | for (icham = 1; icham <= 6; ++icham) { |
d3f347ff | 208 | sprintf(ctagc,"UXI%1d",icham); |
209 | pMC->Gsvolu(ctagc, "BOX ", idtmed[1309-1], par_ic, nparic); | |
fe4da5cc | 210 | } |
d3f347ff | 211 | // Cu layer (pad plane) |
212 | par_ic[2] = cuthick / 2; | |
213 | pMC->Gsvolu("UT5I", "BOX ", idtmed[1305-1], par_ic, nparic); | |
214 | // G10 layer (support structure) | |
215 | par_ic[2] = suthick / 2; | |
216 | pMC->Gsvolu("UT6I", "BOX ", idtmed[1313-1], par_ic, nparic); | |
217 | // Cu layer (FEE + signal lines) | |
218 | par_ic[2] = fethick / 2; | |
219 | pMC->Gsvolu("UT7I", "BOX ", idtmed[1305-1], par_ic, nparic); | |
220 | // PE layer (cooling devices) | |
221 | par_ic[2] = cothick / 2; | |
222 | pMC->Gsvolu("UT8I", "BOX ", idtmed[1303-1], par_ic, nparic); | |
223 | // Water layer (cooling) | |
224 | par_ic[2] = wathick / 2; | |
225 | pMC->Gsvolu("UT9I", "BOX ", idtmed[1314-1], par_ic, nparic); | |
226 | ||
227 | // Definition of the layers in each neighbouring chamber | |
228 | par_nc[0] = -1.; | |
229 | par_nc[1] = -1.; | |
230 | // G10 layer (radiator layer) | |
231 | par_nc[2] = sethick / 2; | |
232 | pMC->Gsvolu("UT0N", "BOX ", idtmed[1313-1], par_nc, nparnc); | |
233 | // CO2 layer (radiator) | |
234 | par_nc[2] = rathick / 2; | |
235 | pMC->Gsvolu("UT1N", "BOX ", idtmed[1312-1], par_nc, nparnc); | |
236 | // PE layer (radiator) | |
237 | par_nc[2] = pethick / 2; | |
238 | pMC->Gsvolu("UT2N", "BOX ", idtmed[1303-1], par_nc, nparnc); | |
239 | // Mylar layer (entrance window + HV cathode) | |
240 | par_nc[2] = mythick / 2; | |
241 | pMC->Gsvolu("UT3N", "BOX ", idtmed[1308-1], par_nc, nparnc); | |
242 | // Xe/Isobutane layer (gasvolume) | |
243 | par_nc[2] = xethick / 2.; | |
b060c36f | 244 | for (icham = 1; icham <= 6; ++icham) { |
d3f347ff | 245 | sprintf(ctagc,"UXN%1d",icham); |
246 | pMC->Gsvolu(ctagc, "BOX ", idtmed[1309-1], par_nc, nparnc); | |
247 | } | |
248 | // Cu layer (pad plane) | |
249 | par_nc[2] = cuthick / 2; | |
250 | pMC->Gsvolu("UT5N", "BOX ", idtmed[1305-1], par_nc, nparnc); | |
251 | // G10 layer (support structure) | |
252 | par_nc[2] = suthick / 2; | |
253 | pMC->Gsvolu("UT6N", "BOX ", idtmed[1313-1], par_nc, nparnc); | |
254 | // Cu layer (FEE + signal lines) | |
255 | par_nc[2] = fethick / 2; | |
256 | pMC->Gsvolu("UT7N", "BOX ", idtmed[1305-1], par_nc, nparnc); | |
257 | // PE layer (cooling devices) | |
258 | par_nc[2] = cothick / 2; | |
259 | pMC->Gsvolu("UT8N", "BOX ", idtmed[1303-1], par_nc, nparnc); | |
260 | // Water layer (cooling) | |
261 | par_nc[2] = wathick / 2; | |
262 | pMC->Gsvolu("UT9N", "BOX ", idtmed[1314-1], par_nc, nparnc); | |
263 | ||
264 | // Definition of the layers in each outer chamber | |
fe4da5cc | 265 | par_oc[0] = -1.; |
266 | par_oc[1] = -1.; | |
d3f347ff | 267 | // G10 layer (radiator layer) |
268 | par_oc[2] = sethick / 2; | |
269 | pMC->Gsvolu("UT0O", "BOX ", idtmed[1313-1], par_oc, nparoc); | |
270 | // CO2 layer (radiator) | |
271 | par_oc[2] = rathick / 2; | |
272 | pMC->Gsvolu("UT1O", "BOX ", idtmed[1312-1], par_oc, nparoc); | |
273 | // PE layer (radiator) | |
274 | par_oc[2] = pethick / 2; | |
275 | pMC->Gsvolu("UT2O", "BOX ", idtmed[1303-1], par_oc, nparoc); | |
276 | // Mylar layer (entrance window + HV cathode) | |
277 | par_oc[2] = mythick / 2; | |
278 | pMC->Gsvolu("UT3O", "BOX ", idtmed[1308-1], par_oc, nparoc); | |
279 | // Xe/Isobutane layer (gasvolume) | |
280 | par_oc[2] = xethick / 2.; | |
b060c36f | 281 | for (icham = 1; icham <= 6; ++icham) { |
d3f347ff | 282 | sprintf(ctagc,"UXO%1d",icham); |
283 | pMC->Gsvolu(ctagc, "BOX ", idtmed[1309-1], par_oc, nparoc); | |
fe4da5cc | 284 | } |
d3f347ff | 285 | // Cu layer (pad plane) |
286 | par_oc[2] = cuthick / 2; | |
287 | pMC->Gsvolu("UT5O", "BOX ", idtmed[1305-1], par_oc, nparoc); | |
288 | // G10 layer (support structure) | |
289 | par_oc[2] = suthick / 2; | |
290 | pMC->Gsvolu("UT6O", "BOX ", idtmed[1313-1], par_oc, nparoc); | |
291 | // Cu layer (FEE + signal lines) | |
292 | par_oc[2] = fethick / 2; | |
293 | pMC->Gsvolu("UT7O", "BOX ", idtmed[1305-1], par_oc, nparoc); | |
294 | // PE layer (cooling devices) | |
295 | par_oc[2] = cothick / 2; | |
296 | pMC->Gsvolu("UT8O", "BOX ", idtmed[1303-1], par_oc, nparoc); | |
297 | // Water layer (cooling) | |
298 | par_oc[2] = wathick / 2; | |
299 | pMC->Gsvolu("UT9O", "BOX ", idtmed[1314-1], par_oc, nparoc); | |
300 | ||
301 | ////////////////////////////////////////////////////////////////////////// | |
302 | // Positioning of Volumes | |
303 | ////////////////////////////////////////////////////////////////////////// | |
304 | ||
305 | // The rotation matrices | |
306 | AliMatrix(idmat[0], 90., 90., 180., 0., 90., 0.); | |
307 | AliMatrix(idmat[1], 90., 90., 0., 0., 90., 0.); | |
308 | ||
309 | // Position of the layers in a chamber | |
310 | pMC->Gspos("UT2I", 1, "UT1I", 0., 0., pezpos, 0, "ONLY"); | |
311 | pMC->Gspos("UT2N", 1, "UT1N", 0., 0., pezpos, 0, "ONLY"); | |
312 | pMC->Gspos("UT2O", 1, "UT1O", 0., 0., pezpos, 0, "ONLY"); | |
b060c36f | 313 | for (icham = 1; icham <= ncham; ++icham) { |
d3f347ff | 314 | // The inner chambers |
fe4da5cc | 315 | sprintf(ctagi,"UII%1d",icham); |
d3f347ff | 316 | sprintf(ctagc,"UXI%1d",icham); |
317 | pMC->Gspos("UT9I", icham, ctagi, 0., 0., wazpos, 0, "ONLY"); | |
318 | pMC->Gspos("UT8I", icham, ctagi, 0., 0., cozpos, 0, "ONLY"); | |
319 | pMC->Gspos("UT7I", icham, ctagi, 0., 0., fezpos, 0, "ONLY"); | |
320 | pMC->Gspos("UT6I", icham, ctagi, 0., 0., suzpos, 0, "ONLY"); | |
fe4da5cc | 321 | pMC->Gspos("UT5I", icham, ctagi, 0., 0., cuzpos, 0, "ONLY"); |
d3f347ff | 322 | pMC->Gspos(ctagc , 1, ctagi, 0., 0., xezpos, 0, "ONLY"); |
fe4da5cc | 323 | pMC->Gspos("UT3I", icham, ctagi, 0., 0., myzpos, 0, "ONLY"); |
324 | pMC->Gspos("UT1I", icham, ctagi, 0., 0., razpos, 0, "ONLY"); | |
d3f347ff | 325 | pMC->Gspos("UT0I", icham, ctagi, 0., 0., sezpos, 0, "ONLY"); |
326 | // The neighbouring chambers | |
327 | sprintf(ctagi,"UIN%1d",icham); | |
328 | sprintf(ctagc,"UXN%1d",icham); | |
329 | pMC->Gspos("UT9N", icham, ctagi, 0., 0., wazpos, 0, "ONLY"); | |
330 | pMC->Gspos("UT8N", icham, ctagi, 0., 0., cozpos, 0, "ONLY"); | |
331 | pMC->Gspos("UT7N", icham, ctagi, 0., 0., fezpos, 0, "ONLY"); | |
332 | pMC->Gspos("UT6N", icham, ctagi, 0., 0., suzpos, 0, "ONLY"); | |
333 | pMC->Gspos("UT5N", icham, ctagi, 0., 0., cuzpos, 0, "ONLY"); | |
334 | pMC->Gspos(ctagc , 1, ctagi, 0., 0., xezpos, 0, "ONLY"); | |
335 | pMC->Gspos("UT3N", icham, ctagi, 0., 0., myzpos, 0, "ONLY"); | |
336 | pMC->Gspos("UT1N", icham, ctagi, 0., 0., razpos, 0, "ONLY"); | |
337 | pMC->Gspos("UT0N", icham, ctagi, 0., 0., sezpos, 0, "ONLY"); | |
338 | // The outer chambers | |
339 | sprintf(ctagi,"UIO%1d",icham); | |
340 | sprintf(ctagc,"UXO%1d",icham); | |
341 | pMC->Gspos("UT9O", icham, ctagi, 0., 0., wazpos, 0, "ONLY"); | |
342 | pMC->Gspos("UT8O", icham, ctagi, 0., 0., cozpos, 0, "ONLY"); | |
343 | pMC->Gspos("UT7O", icham, ctagi, 0., 0., fezpos, 0, "ONLY"); | |
344 | pMC->Gspos("UT6O", icham, ctagi, 0., 0., suzpos, 0, "ONLY"); | |
fe4da5cc | 345 | pMC->Gspos("UT5O", icham, ctagi, 0., 0., cuzpos, 0, "ONLY"); |
d3f347ff | 346 | pMC->Gspos(ctagc , 1, ctagi, 0., 0., xezpos, 0, "ONLY"); |
fe4da5cc | 347 | pMC->Gspos("UT3O", icham, ctagi, 0., 0., myzpos, 0, "ONLY"); |
348 | pMC->Gspos("UT1O", icham, ctagi, 0., 0., razpos, 0, "ONLY"); | |
d3f347ff | 349 | pMC->Gspos("UT0O", icham, ctagi, 0., 0., sezpos, 0, "ONLY"); |
fe4da5cc | 350 | } |
d3f347ff | 351 | |
352 | // Position of the inner part of the chambers in the carbon-frames | |
b060c36f | 353 | for (icham = 1; icham <= ncham; ++icham) { |
d3f347ff | 354 | xpos = 0.; |
355 | ypos = 0.; | |
356 | zpos = 0.; | |
357 | // The inner chambers | |
fe4da5cc | 358 | sprintf(ctagi,"UII%1d",icham); |
359 | sprintf(ctagc,"UCI%1d",icham); | |
d3f347ff | 360 | pMC->Gspos(ctagi, 1, ctagc, xpos, ypos, zpos, 0, "ONLY"); |
361 | // The neighbouring chambers | |
362 | sprintf(ctagi,"UIN%1d",icham); | |
363 | sprintf(ctagc,"UCN%1d",icham); | |
364 | pMC->Gspos(ctagi, 1, ctagc, xpos, ypos, zpos, 0, "ONLY"); | |
365 | // The outer chambers | |
fe4da5cc | 366 | sprintf(ctagi,"UIO%1d",icham); |
367 | sprintf(ctagc,"UCO%1d",icham); | |
d3f347ff | 368 | pMC->Gspos(ctagi, 1, ctagc, xpos, ypos, zpos, 0, "ONLY"); |
fe4da5cc | 369 | } |
d3f347ff | 370 | |
371 | // Position of the chambers in the full TRD-setup | |
b060c36f | 372 | for (icham = 1; icham <= ncham; ++icham) { |
d3f347ff | 373 | // The inner chambers |
fe4da5cc | 374 | xpos = 0.; |
375 | ypos = 0.; | |
d3f347ff | 376 | zpos = (icham-0.5) * heightc - (rmax - rmin) / 2; |
fe4da5cc | 377 | sprintf(ctagc,"UCI%1d",icham); |
d3f347ff | 378 | pMC->Gspos(ctagc, 1, "UTRI", xpos, ypos, zpos, 0, "ONLY"); |
379 | // The neighbouring chambers | |
fe4da5cc | 380 | xpos = 0.; |
d3f347ff | 381 | ypos = (zleni + zlenn) / 2.; |
382 | zpos = (icham-0.5) * heightc - (rmax - rmin) / 2; | |
383 | sprintf(ctagc,"UCN%1d",icham); | |
384 | pMC->Gspos(ctagc, 1, "UTRI", xpos, ypos, zpos, 0, "ONLY"); | |
385 | ypos = -ypos; | |
386 | sprintf(ctagc,"UCN%1d",icham); | |
387 | pMC->Gspos(ctagc, 2, "UTRI", xpos, ypos, zpos, 0, "ONLY"); | |
388 | // The outer chambers | |
389 | xpos = 0.; | |
390 | ypos = (zleni / 2. + zlenn + zmax2 + (icham-1) * lendifc) / 2.; | |
391 | zpos = (icham-0.5) * heightc - (rmax-rmin)/2; | |
392 | sprintf(ctagc,"UCO%1d",icham); | |
393 | pMC->Gspos(ctagc, 1, "UTRI", xpos, ypos, zpos, 0, "ONLY"); | |
394 | ypos = -ypos; | |
fe4da5cc | 395 | sprintf(ctagc,"UCO%1d",icham); |
d3f347ff | 396 | pMC->Gspos(ctagc, 2, "UTRI", xpos, ypos, zpos, 0, "ONLY"); |
fe4da5cc | 397 | } |
d3f347ff | 398 | |
399 | // Position of the inner part of the detector frame | |
400 | xpos = (rmax + rmin) / 2; | |
401 | ypos = 0.; | |
fe4da5cc | 402 | zpos = 0.; |
d3f347ff | 403 | pMC->Gspos("UTRI", 1, "UTRS", xpos, ypos, zpos, idmat[0], "ONLY"); |
404 | ||
405 | // Position of the TRD mother volume in the ALICE experiment | |
406 | xpos = 0.; | |
fe4da5cc | 407 | ypos = 0.; |
d3f347ff | 408 | zpos = 0.; |
409 | pMC->Gspos("TRD ", 1, "ALIC", xpos, ypos, zpos, 0, "ONLY"); | |
410 | ||
fe4da5cc | 411 | } |
412 | ||
413 | //_____________________________________________________________________________ | |
05e51f55 | 414 | void AliTRDv2::DrawModule() |
fe4da5cc | 415 | { |
416 | // | |
417 | // Draw a shaded view of the Transition Radiation Detector version 1 | |
418 | // | |
419 | ||
420 | AliMC* pMC = AliMC::GetMC(); | |
421 | ||
422 | // Set everything unseen | |
423 | pMC->Gsatt("*", "seen", -1); | |
d3f347ff | 424 | |
fe4da5cc | 425 | // Set ALIC mother transparent |
426 | pMC->Gsatt("ALIC","SEEN",0); | |
d3f347ff | 427 | |
fe4da5cc | 428 | // Set the volumes visible |
d3f347ff | 429 | pMC->Gsatt("TRD ","SEEN",0); |
fe4da5cc | 430 | pMC->Gsatt("UTRS","SEEN",0); |
d3f347ff | 431 | pMC->Gsatt("UTRI","SEEN",0); |
432 | Char_t ctag[5]; | |
433 | for (Int_t icham = 0; icham < ncham; ++icham) { | |
434 | sprintf(ctag,"UCI%1d",icham+1); | |
435 | pMC->Gsatt(ctag,"SEEN",0); | |
436 | sprintf(ctag,"UCN%1d",icham+1); | |
437 | pMC->Gsatt(ctag,"SEEN",0); | |
438 | sprintf(ctag,"UCO%1d",icham+1); | |
439 | pMC->Gsatt(ctag,"SEEN",0); | |
440 | sprintf(ctag,"UII%1d",icham+1); | |
441 | pMC->Gsatt(ctag,"SEEN",0); | |
442 | sprintf(ctag,"UIN%1d",icham+1); | |
443 | pMC->Gsatt(ctag,"SEEN",0); | |
444 | sprintf(ctag,"UIO%1d",icham+1); | |
445 | pMC->Gsatt(ctag,"SEEN",0); | |
446 | sprintf(ctag,"UXI%1d",icham+1); | |
447 | pMC->Gsatt(ctag,"SEEN",1); | |
448 | sprintf(ctag,"UXN%1d",icham+1); | |
449 | pMC->Gsatt(ctag,"SEEN",1); | |
450 | sprintf(ctag,"UXO%1d",icham+1); | |
451 | pMC->Gsatt(ctag,"SEEN",1); | |
452 | } | |
fe4da5cc | 453 | pMC->Gsatt("UT1I","SEEN",1); |
d3f347ff | 454 | pMC->Gsatt("UT1N","SEEN",1); |
fe4da5cc | 455 | pMC->Gsatt("UT1O","SEEN",1); |
d3f347ff | 456 | |
fe4da5cc | 457 | pMC->Gdopt("hide", "on"); |
458 | pMC->Gdopt("shad", "on"); | |
459 | pMC->Gsatt("*", "fill", 7); | |
460 | pMC->SetClipBox("."); | |
461 | pMC->SetClipBox("*", 0, 2000, -2000, 2000, -2000, 2000); | |
462 | pMC->DefaultRange(); | |
463 | pMC->Gdraw("alic", 40, 30, 0, 12, 9.4, .021, .021); | |
464 | pMC->Gdhead(1111, "Transition Radiation Detector Version 2"); | |
465 | pMC->Gdman(18, 4, "MAN"); | |
466 | pMC->Gdopt("hide", "off"); | |
467 | } | |
468 | ||
469 | //_____________________________________________________________________________ | |
470 | void AliTRDv2::CreateMaterials() | |
471 | { | |
472 | // | |
473 | // Create materials for the Transition Radiation Detector version 2 | |
474 | // | |
fe4da5cc | 475 | AliTRD::CreateMaterials(); |
476 | } | |
477 | ||
478 | //_____________________________________________________________________________ | |
479 | void AliTRDv2::Init() | |
480 | { | |
481 | // | |
482 | // Initialise Transition Radiation Detector after geometry has been built | |
483 | // | |
d3f347ff | 484 | |
485 | // First ionization potential (eV) for the gas mixture (90% Xe + 10% CO2) | |
486 | const Float_t kPoti = 12.1; | |
487 | // Maximum energy (50 keV); | |
488 | const Float_t kEend = 50000.0; | |
489 | ||
fe4da5cc | 490 | AliTRD::Init(); |
d3f347ff | 491 | |
fe4da5cc | 492 | AliMC* pMC = AliMC::GetMC(); |
d3f347ff | 493 | |
494 | // Get the sensitive volumes | |
495 | Char_t ctag[5]; | |
496 | for (Int_t icham = 0; icham < ncham; ++icham) { | |
497 | sprintf(ctag,"UXI%1d",icham+1); | |
498 | fIdSensI[icham] = pMC->VolId(ctag); | |
499 | sprintf(ctag,"UXN%1d",icham+1); | |
500 | fIdSensN[icham] = pMC->VolId(ctag); | |
501 | sprintf(ctag,"UXO%1d",icham+1); | |
502 | fIdSensO[icham] = pMC->VolId(ctag); | |
503 | } | |
504 | ||
505 | Float_t Poti = TMath::Log(kPoti); | |
506 | Float_t Eend = TMath::Log(kEend); | |
507 | ||
508 | // Ermilova distribution for the delta-ray spectrum | |
509 | fDeltaE = new TF1("deltae",Ermilova,Poti,Eend,0); | |
510 | ||
fe4da5cc | 511 | } |
512 | ||
513 | //_____________________________________________________________________________ | |
514 | void AliTRDv2::StepManager() | |
515 | { | |
516 | // | |
517 | // Called at every step in the Transition Radiation Detector version 2 | |
518 | // | |
d3f347ff | 519 | |
520 | Int_t idSens, icSens, id; | |
fe4da5cc | 521 | Int_t iPla, iCha, iSec; |
522 | Int_t iOut; | |
523 | Int_t vol[3]; | |
524 | Int_t iPid; | |
d3f347ff | 525 | |
526 | const Double_t kBig = 1.0E+12; | |
527 | ||
528 | Float_t hits[4]; | |
529 | Float_t mom[4]; | |
fe4da5cc | 530 | Float_t random[1]; |
531 | Float_t charge; | |
fe4da5cc | 532 | Float_t aMass; |
d3f347ff | 533 | |
534 | Double_t pTot; | |
535 | Double_t qTot; | |
536 | Double_t eDelta; | |
537 | Double_t betaGamma, pp; | |
538 | ||
fe4da5cc | 539 | TClonesArray &lhits = *fHits; |
d3f347ff | 540 | |
fe4da5cc | 541 | AliMC* pMC = AliMC::GetMC(); |
d3f347ff | 542 | |
fe4da5cc | 543 | // Ionization energy |
d3f347ff | 544 | const Float_t kWion = 22.04; |
fe4da5cc | 545 | // Maximum energy for e+ e- g for the step-size calculation |
d3f347ff | 546 | const Float_t kPTotMax = 0.002; |
fe4da5cc | 547 | // Plateau value of the energy-loss for electron in xenon |
548 | // taken from: Allison + Comb, Ann. Rev. Nucl. Sci. (1980), 30, 253 | |
d3f347ff | 549 | //const Double_t kPlateau = 1.70; |
550 | // the averaged value (26/3/99) | |
551 | const Float_t kPlateau = 1.55; | |
fe4da5cc | 552 | // dN1/dx|min for the gas mixture (90% Xe + 10% CO2) |
d3f347ff | 553 | const Float_t kPrim = 48.0; |
554 | // First ionization potential (eV) for the gas mixture (90% Xe + 10% CO2) | |
555 | const Float_t kPoti = 12.1; | |
556 | ||
fe4da5cc | 557 | // Set the maximum step size to a very large number for all |
558 | // neutral particles and those outside the driftvolume | |
559 | pMC->SetMaxStep(kBig); | |
d3f347ff | 560 | |
fe4da5cc | 561 | // Use only charged tracks |
562 | if (( pMC->TrackCharge() ) && | |
563 | (!pMC->TrackStop() ) && | |
564 | (!pMC->TrackDisappear())) { | |
d3f347ff | 565 | |
fe4da5cc | 566 | // Find the sensitive volume |
567 | idSens = pMC->CurrentVol(0,icSens); | |
568 | iPla = 0; | |
569 | iOut = 0; | |
d3f347ff | 570 | for (Int_t icham = 0; icham < ncham; ++icham) { |
571 | if (idSens == fIdSensI[icham]) { | |
572 | iOut = 0; | |
573 | iPla = icham + 1; | |
574 | } | |
575 | if (idSens == fIdSensN[icham]) { | |
576 | iOut = 1; | |
577 | iPla = icham + 1; | |
578 | } | |
579 | if (idSens == fIdSensO[icham]) { | |
580 | iOut = 2; | |
581 | iPla = icham + 1; | |
582 | } | |
583 | } | |
584 | ||
fe4da5cc | 585 | // Inside a sensitive volume? |
586 | if (iPla) { | |
d3f347ff | 587 | |
588 | // Calculate the energy of the delta-electrons | |
589 | eDelta = TMath::Exp(fDeltaE->GetRandom()) - kPoti; | |
590 | eDelta = TMath::Max(eDelta,0.0); | |
591 | ||
592 | // The number of secondary electrons created | |
593 | qTot = (Double_t) ((Int_t) (eDelta / kWion) + 1); | |
594 | ||
fe4da5cc | 595 | // The sector number |
d3f347ff | 596 | id = pMC->CurrentVolOff(4,0,iSec); |
597 | ||
fe4da5cc | 598 | // The chamber number |
d3f347ff | 599 | // 1: outer left |
600 | // 2: neighbouring left | |
601 | // 3: inner | |
602 | // 4: neighbouring right | |
603 | // 5: outer right | |
604 | id = pMC->CurrentVolOff(2,0,iCha); | |
605 | if (iCha == 1) | |
606 | iCha = 3 + iOut; | |
607 | else | |
608 | iCha = 3 - iOut; | |
609 | ||
fe4da5cc | 610 | vol[0] = iSec; |
611 | vol[1] = iCha; | |
612 | vol[2] = iPla; | |
613 | ||
d3f347ff | 614 | // Check on selected volumes |
615 | Int_t addthishit = 1; | |
616 | if (fSensSelect) { | |
617 | if ((fSensPlane) && (vol[2] != fSensPlane )) addthishit = 0; | |
618 | if ((fSensChamber) && (vol[1] != fSensChamber)) addthishit = 0; | |
619 | if ((fSensSector) && (vol[0] != fSensSector )) addthishit = 0; | |
620 | } | |
621 | ||
622 | if (addthishit) { | |
623 | ||
624 | // Add this hit | |
625 | pMC->TrackPosition(hits); | |
626 | hits[3] = qTot; | |
627 | new(lhits[fNhits++]) AliTRDhit(fIshunt,gAlice->CurrentTrack(),vol,hits); | |
628 | ||
629 | // The energy loss according to Bethe Bloch | |
630 | pMC->TrackMomentum(mom); | |
631 | pTot = mom[3]; | |
632 | iPid = pMC->TrackPid(); | |
633 | if ( (iPid > 3) || | |
634 | ((iPid <= 3) && (pTot < kPTotMax))) { | |
635 | aMass = pMC->TrackMass(); | |
636 | betaGamma = pTot / aMass; | |
637 | pp = kPrim * BetheBloch(betaGamma); | |
638 | // Take charge > 1 into account | |
639 | charge = pMC->TrackCharge(); | |
640 | if (TMath::Abs(charge) > 1) pp = pp * charge*charge; | |
641 | } | |
642 | // Electrons above 20 Mev/c are at the plateau | |
643 | else { | |
644 | pp = kPrim * kPlateau; | |
645 | } | |
fe4da5cc | 646 | |
d3f347ff | 647 | // Calculate the maximum step size for the next tracking step |
648 | if (pp > 0) { | |
649 | do | |
650 | pMC->Rndm(random,1); | |
651 | while ((random[0] == 1.) || (random[0] == 0.)); | |
652 | pMC->SetMaxStep( - TMath::Log(random[0]) / pp); | |
653 | } | |
654 | ||
fe4da5cc | 655 | } |
fe4da5cc | 656 | else { |
d3f347ff | 657 | // set step size to maximal value |
658 | pMC->SetMaxStep(kBig); | |
fe4da5cc | 659 | } |
d3f347ff | 660 | |
fe4da5cc | 661 | } |
d3f347ff | 662 | |
663 | } | |
664 | ||
665 | } | |
666 | ||
667 | //_____________________________________________________________________________ | |
668 | Double_t AliTRDv2::BetheBloch(Double_t bg) | |
669 | { | |
670 | // | |
671 | // Parametrization of the Bethe-Bloch-curve | |
672 | // The parametrization is the same as for the TPC and is taken from Lehrhaus. | |
673 | // | |
674 | ||
675 | // The parameters have been adjusted to Xe-data found in: | |
676 | // Allison & Cobb, Ann. Rev. Nucl. Sci. (1980), 30, 253 | |
677 | //const Double_t kP1 = 0.76176E-1; | |
678 | //const Double_t kP2 = 10.632; | |
679 | //const Double_t kP3 = 3.17983E-6; | |
680 | //const Double_t kP4 = 1.8631; | |
681 | //const Double_t kP5 = 1.9479; | |
682 | ||
683 | // This parameters have been adjusted to averaged values from GEANT | |
684 | const Double_t kP1 = 7.17960e-02; | |
685 | const Double_t kP2 = 8.54196; | |
686 | const Double_t kP3 = 1.38065e-06; | |
687 | const Double_t kP4 = 5.30972; | |
688 | const Double_t kP5 = 2.83798; | |
689 | ||
690 | if (bg > 0) { | |
691 | Double_t yy = bg / TMath::Sqrt(1. + bg*bg); | |
692 | Double_t aa = TMath::Power(yy,kP4); | |
693 | Double_t bb = TMath::Power((1./bg),kP5); | |
694 | bb = TMath::Log(kP3 + bb); | |
695 | return ((kP2 - aa - bb)*kP1 / aa); | |
fe4da5cc | 696 | } |
d3f347ff | 697 | else |
698 | return 0; | |
699 | ||
700 | } | |
701 | ||
702 | //_____________________________________________________________________________ | |
6fe53707 | 703 | Double_t Ermilova(Double_t *x, Double_t *) |
d3f347ff | 704 | { |
705 | // | |
706 | // Calculates the delta-ray energy distribution according to Ermilova | |
707 | // Logarithmic scale ! | |
708 | // | |
709 | ||
710 | Double_t energy; | |
711 | Double_t dpos; | |
712 | Double_t dnde; | |
713 | ||
714 | Int_t pos1, pos2; | |
715 | ||
716 | const Int_t nV = 31; | |
717 | ||
718 | Float_t vxe[nV] = { 2.3026, 2.9957, 3.4012, 3.6889, 3.9120 | |
719 | , 4.0943, 4.2485, 4.3820, 4.4998, 4.6052 | |
720 | , 4.7005, 5.0752, 5.2983, 5.7038, 5.9915 | |
721 | , 6.2146, 6.5221, 6.9078, 7.3132, 7.6009 | |
722 | , 8.0064, 8.5172, 8.6995, 8.9872, 9.2103 | |
723 | , 9.4727, 9.9035,10.3735,10.5966,10.8198 | |
724 | ,11.5129 }; | |
725 | ||
726 | Float_t vye[nV] = { 80.0 , 31.0 , 23.3 , 21.1 , 21.0 | |
727 | , 20.9 , 20.8 , 20.0 , 16.0 , 11.0 | |
728 | , 8.0 , 6.0 , 5.2 , 4.6 , 4.0 | |
729 | , 3.5 , 3.0 , 1.4 , 0.67 , 0.44 | |
730 | , 0.3 , 0.18 , 0.12 , 0.08 , 0.056 | |
731 | , 0.04 , 0.023, 0.015, 0.011, 0.01 | |
732 | , 0.004 }; | |
733 | ||
734 | energy = x[0]; | |
735 | ||
736 | // Find the position | |
737 | pos1 = pos2 = 0; | |
738 | dpos = 0; | |
739 | do { | |
740 | dpos = energy - vxe[pos2++]; | |
741 | } | |
742 | while (dpos > 0); | |
743 | pos2--; | |
744 | if (pos2 > nV) pos2 = nV; | |
745 | pos1 = pos2 - 1; | |
746 | ||
747 | // Differentiate between the sampling points | |
748 | dnde = (vye[pos1] - vye[pos2]) / (vxe[pos2] - vxe[pos1]); | |
749 | ||
750 | return dnde; | |
751 | ||
fe4da5cc | 752 | } |