43d014f0 |
1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * |
3 | * * |
4 | * Author: The ALICE Off-line Project. * |
5 | * Contributors are mentioned in the code where appropriate. * |
6 | * * |
7 | * Permission to use, copy, modify and distribute this software and its * |
8 | * documentation strictly for non-commercial purposes is hereby granted * |
9 | * without fee, provided that the above copyright notice appears in all * |
10 | * copies and that both the copyright notice and this permission notice * |
11 | * appear in the supporting documentation. The authors make no claims * |
12 | * about the suitability of this software for any purpose. It is * |
13 | * provided "as is" without express or implied warranty. * |
14 | **************************************************************************/ |
15 | |
16 | /* |
17 | $Log$ |
18 | */ |
19 | |
20 | /////////////////////////////////////////////////////////////////////////////// |
21 | // // |
22 | // Muon ABSOrber // |
23 | // This class contains the description of the muon absorber geometry // |
24 | // // |
25 | //Begin_Html |
26 | /* |
27 | <img src="picts/AliABSOClass.gif"> |
28 | </pre> |
29 | <br clear=left> |
30 | <font size=+2 color=red> |
31 | <p>The responsible person for this module is |
32 | <a href="mailto:andreas.morsch@cern.ch">Andreas Morsch</a>. |
33 | </font> |
34 | <pre> |
35 | */ |
36 | //End_Html |
37 | // // |
38 | // // |
39 | /////////////////////////////////////////////////////////////////////////////// |
40 | |
41 | #include "AliABSOv0.h" |
42 | #include "AliRun.h" |
43 | #include "AliConst.h" |
44 | |
45 | ClassImp(AliABSOv0) |
46 | |
47 | //_____________________________________________________________________________ |
48 | AliABSOv0::AliABSOv0() |
49 | { |
50 | // |
51 | // Default constructor |
52 | // |
53 | } |
54 | |
55 | //_____________________________________________________________________________ |
56 | AliABSOv0::AliABSOv0(const char *name, const char *title) |
57 | : AliABSO(name,title) |
58 | { |
59 | // |
60 | // Standard constructor |
61 | // |
62 | SetMarkerColor(7); |
63 | SetMarkerStyle(2); |
64 | SetMarkerSize(0.4); |
65 | } |
66 | |
67 | //_____________________________________________________________________________ |
68 | void AliABSOv0::CreateGeometry() |
69 | { |
70 | // |
71 | // Creation of the geometry of the muon absorber |
72 | // |
73 | //Begin_Html |
74 | /* |
75 | <img src="picts/AliABSOv0Tree.gif"> |
76 | */ |
77 | //End_Html |
78 | //Begin_Html |
79 | /* |
80 | <img src="picts/AliABSOv0.gif"> |
81 | */ |
82 | //End_Html |
83 | |
84 | |
85 | Int_t *idtmed = fIdtmed->GetArray()-1599; |
86 | |
87 | Float_t par[24], cpar[5], cpar0[5], pcpar[12], tpar[3], tpar0[3]; |
88 | Float_t dz; |
89 | #include "ShieldConst.h" |
90 | // Mother volume and outer shielding: Pb |
91 | |
92 | par[0] = 0.; |
93 | par[1] = 360.; |
94 | par[2] = 7.; |
95 | |
96 | par[3] = -(abs_l-abs_d)/2.; |
97 | par[4] = r_abs; |
98 | par[5] = abs_d * TMath::Tan(theta1); |
99 | |
100 | par[6] = par[3]+(z_nose-abs_d); |
101 | par[7] = r_abs; |
102 | par[8] = z_nose * TMath::Tan(theta1); |
103 | |
104 | par[9] = par[3]+(z_cone-abs_d); |
105 | par[10] = r_abs; |
106 | par[11] = par[8] + (par[9] - par[6]) * TMath::Tan(theta2); |
107 | |
108 | par[12] = par[3]+(abs_c-abs_d); |
109 | par[13] = r_abs; |
110 | par[14] = par[11] + (par[12] - par[9]) * TMath::Tan(acc_max); |
111 | |
112 | par[15] = par[3]+(abs_l-d_rear-abs_d); |
113 | par[16] = r_abs + (par[15] - par[12]) * TMath::Tan(theta_open1) ; |
114 | par[17] = par[14] + (par[15] - par[12]) * TMath::Tan(acc_max); |
115 | |
116 | par[18] = par[3]+(abs_l-d_rear-abs_d); |
117 | par[19] = (abs_l-d_rear) * TMath::Tan(acc_min); |
118 | par[20] = par[14] + (par[15] - par[12]) * TMath::Tan(acc_max); |
119 | |
120 | par[21] = -par[3]; |
121 | par[22] = abs_l* TMath::Tan(acc_min); |
122 | par[23] = par[20] + (par[21] - par[18]) * TMath::Tan(acc_max); |
123 | gMC->Gsvolu("ABSS", "PCON", idtmed[1612], par, 24); |
124 | for (Int_t i=4; i<24; i+=3) par[i] = 0; |
125 | gMC->Gsvolu("ABSM", "PCON", idtmed[1655], par, 24); |
126 | gMC->Gspos("ABSS", 1, "ABSM", 0., 0., 0., 0, "ONLY"); |
127 | |
128 | // |
129 | // Steel envelope |
130 | // |
131 | par[4] = par[5] -d_steel; |
132 | par[7] = par[8] -d_steel; |
133 | par[10]= par[11]-d_steel; |
134 | par[13]= par[14]-d_steel; |
135 | par[16]= par[17]-d_steel; |
136 | par[19]= par[20]-d_steel; |
137 | par[22]= par[23]-d_steel; |
138 | gMC->Gsvolu("ABST", "PCON", idtmed[1618], par, 24); |
139 | gMC->Gspos("ABST", 1, "ABSS", 0., 0., 0., 0, "ONLY"); |
140 | // |
141 | // Polyethylene shield |
142 | // |
143 | cpar[0] = (abs_l - z_cone) / 2.; |
144 | cpar[1] = z_cone * TMath::Tan(acc_max); |
145 | cpar[2] = cpar[1] + d_poly; |
146 | cpar[3] = abs_l * TMath::Tan(acc_max); |
147 | cpar[4] = cpar[3] + d_poly; |
148 | gMC->Gsvolu("APOL", "CONE", idtmed[1657], cpar, 5); |
149 | dz = (abs_l-abs_d)/2.-cpar[0]; |
150 | gMC->Gspos("APOL", 1, "ABSS", 0., 0., dz, 0, "ONLY"); |
151 | |
152 | // |
153 | // Tungsten nose to protect TPC |
154 | // |
155 | cpar[0] = (z_nose - abs_d) / 2.; |
156 | cpar[1] = abs_d * TMath::Tan(acc_max); |
157 | cpar[2] = abs_d * TMath::Tan(theta1)-d_steel; |
158 | cpar[3] = z_nose * TMath::Tan(acc_max); |
159 | cpar[4] = z_nose * TMath::Tan(theta1)-d_steel; |
160 | gMC->Gsvolu("ANOS", "CONE", idtmed[1611], cpar, 5); |
161 | // |
162 | dz = -(abs_l-abs_d)/2.+cpar[0]; |
163 | gMC->Gspos("ANOS", 1, "ABSS", 0., 0., dz, 0, "ONLY"); |
164 | // |
165 | // Tungsten inner shield |
166 | // |
167 | cpar[0] = (abs_l-d_rear - abs_c)/ 2.; |
168 | cpar[1] = r_abs; |
169 | cpar[2] = abs_c * TMath::Tan(acc_min); |
170 | cpar[3] = r_abs + 2. * cpar[0] * TMath::Tan(theta_open1); |
171 | cpar[4] = (abs_l-d_rear) * TMath::Tan(acc_min); |
172 | gMC->Gsvolu("AWIN", "CONE", idtmed[1651], cpar, 5); |
173 | // |
174 | dz = (abs_l-abs_d)/2.-cpar[0]-d_rear; |
175 | gMC->Gspos("AWIN", 1, "ABSS", 0., 0., dz, 0, "ONLY"); |
176 | |
177 | // Inner tracking region |
178 | // |
179 | // mother volume: Pb |
180 | // |
181 | pcpar[0] = 0.; |
182 | pcpar[1] = 360.; |
183 | pcpar[2] = 3.; |
184 | pcpar[3] = -(abs_l-abs_d)/2.; |
185 | pcpar[4] = r_abs; |
186 | pcpar[5] = abs_d * TMath::Tan(acc_max); |
187 | pcpar[6] = pcpar[3]+(z_2deg-abs_d); |
188 | pcpar[7] = r_abs; |
189 | pcpar[8] = z_2deg * TMath::Tan(acc_max); |
190 | pcpar[9] = -par[3]; |
191 | pcpar[10] = abs_l * TMath::Tan(acc_min); |
192 | pcpar[11] = abs_l * TMath::Tan(acc_max); |
193 | gMC->Gsvolu("AITR", "PCON", idtmed[1612], pcpar, 12); |
194 | // |
195 | // special Pb medium for last 5 cm of Pb |
196 | zr=abs_l-5; |
197 | cpar[0] = 2.5; |
198 | cpar[1] = zr * TMath::Tan(theta_r); |
199 | cpar[2] = zr * TMath::Tan(acc_max); |
200 | cpar[3] = cpar[1] + TMath::Tan(acc_min) * 5; |
201 | cpar[4] = cpar[2] + TMath::Tan(theta_r) * 5; |
202 | gMC->Gsvolu("ARPB", "CONE", idtmed[1632], cpar, 5); |
203 | dz=(abs_l-abs_d)/2.-cpar[0]; |
204 | gMC->Gspos("ARPB", 1, "AITR", 0., 0., dz, 0, "ONLY"); |
205 | |
206 | // |
207 | // concrete cone: concrete |
208 | // |
209 | pcpar[9] = par[3]+(abs_l-d_rear-abs_d); |
210 | pcpar[10] = (abs_l-d_rear) * TMath::Tan(acc_min); |
211 | pcpar[11] = (abs_l-d_rear) * TMath::Tan(acc_max); |
212 | gMC->Gsvolu("ACON", "PCON", idtmed[1616], pcpar, 12); |
213 | gMC->Gspos("ACON", 1, "AITR", 0., 0., 0., 0, "ONLY"); |
214 | // |
215 | // carbon cone: carbon |
216 | // |
217 | pcpar[9] = pcpar[3]+(abs_cc-abs_d); |
218 | pcpar[10] = abs_cc * TMath::Tan(acc_min); |
219 | pcpar[11] = abs_cc * TMath::Tan(acc_max); |
220 | gMC->Gsvolu("ACAR", "PCON", idtmed[1605], pcpar, 12); |
221 | gMC->Gspos("ACAR", 1, "ACON", 0., 0., 0., 0, "ONLY"); |
222 | // |
223 | // inner W shield |
224 | zr=abs_l-d_rear; |
225 | cpar[0] = d_rear/2.; |
226 | cpar[1] = zr * TMath::Tan(acc_min); |
227 | cpar[2] = zr * TMath::Tan(theta_r); |
228 | cpar[3] = cpar[1] + TMath::Tan(acc_min) * 35; |
229 | cpar[4] = cpar[2] + TMath::Tan(theta_r) * 35; |
230 | gMC->Gsvolu("ARW0", "CONE", idtmed[1611], cpar, 5); |
231 | dz=(abs_l-abs_d)/2.-cpar[0]; |
232 | gMC->Gspos("ARW0", 1, "AITR", 0., 0., dz, 0, "ONLY"); |
233 | // |
234 | // special W medium for last 5 cm of W |
235 | zr=abs_l-5; |
236 | cpar[0] = 2.5; |
237 | cpar[1] = zr * TMath::Tan(acc_min); |
238 | cpar[2] = zr * TMath::Tan(theta_r); |
239 | cpar[3] = cpar[1] + TMath::Tan(acc_min) * 5.; |
240 | cpar[4] = cpar[2] + TMath::Tan(theta_r) * 5.; |
241 | gMC->Gsvolu("ARW1", "CONE", idtmed[1631], cpar, 5); |
242 | dz=d_rear/2.-cpar[0]; |
243 | gMC->Gspos("ARW1", 1, "ARW0", 0., 0., dz, 0, "ONLY"); |
244 | // |
245 | // PolyEthylene Layers |
246 | Float_t dr_min=TMath::Tan(theta_r) * 5; |
247 | Float_t dr_max=TMath::Tan(acc_max) * 5; |
248 | gMC->Gsvolu("ARPE", "CONE", idtmed[1617], cpar, 0); |
249 | cpar[0]=2.5; |
250 | for (Int_t i=0; i<3; i++) { |
251 | zr=abs_l-d_rear+5+i*10.; |
252 | cpar[1] = zr * TMath::Tan(theta_r); |
253 | cpar[2] = zr * TMath::Tan(acc_max); |
254 | cpar[3] = cpar[1] + dr_min; |
255 | cpar[4] = cpar[2] + dr_max; |
256 | dz=(abs_l-abs_d)/2.-cpar[0]-5.-(2-i)*10; |
257 | gMC->Gsposp("ARPE", i+1, "AITR", 0., 0., dz, 0, "ONLY",cpar,5); |
258 | } |
259 | gMC->Gspos("AITR", 1, "ABSS", 0., 0., 0., 0, "ONLY"); |
260 | dz = (abs_l-abs_d)/2.+abs_d; |
261 | gMC->Gspos("ABSM", 1, "ALIC", 0., 0., dz, 0, "ONLY"); |
262 | // |
263 | // |
264 | // vacuum system |
265 | // |
266 | // pipe and heating jackets |
267 | // |
268 | // |
269 | // cylindrical piece |
270 | tpar0[2]=(abs_c-abs_d)/2; |
271 | tpar0[0]=r_vacu; |
272 | tpar0[1]=r_abs; |
273 | gMC->Gsvolu("AV11", "TUBE", idtmed[1658], tpar0, 3); |
274 | // |
275 | // insulation |
276 | tpar[2]=tpar0[2]; |
277 | tpar[0]=tpar0[0]+d_tube; |
278 | tpar[1]=tpar0[0]+d_tube+d_insu; |
279 | gMC->Gsvolu("AI11", "TUBE", idtmed[1653], tpar, 3); |
280 | gMC->Gspos("AI11", 1, "AV11", 0., 0., 0., 0, "ONLY"); |
281 | // |
282 | // clearance |
283 | tpar[0]=tpar0[1]-d_prot-d_free; |
284 | tpar[1]=tpar0[1]-d_prot; |
285 | gMC->Gsvolu("AP11", "TUBE", idtmed[1655], tpar, 3); |
286 | gMC->Gspos("AP11", 1, "AV11", 0., 0., 0., 0, "ONLY"); |
287 | |
288 | dz=-(abs_l-abs_d)/2.+tpar0[2]; |
289 | gMC->Gspos("AV11", 1, "ABSM", 0., 0., dz, 0, "ONLY"); |
290 | |
291 | // |
292 | // conical piece |
293 | cpar0[0]=(abs_l-d_rear-abs_c)/2; |
294 | cpar0[1]=r_vacu; |
295 | cpar0[2]=r_abs; |
296 | cpar0[3]=cpar0[1]+2.*cpar0[0]*TMath::Tan(theta_open1); |
297 | cpar0[4]=cpar0[2]+2.*cpar0[0]*TMath::Tan(theta_open1); |
298 | gMC->Gsvolu("AV21", "CONE", idtmed[1658], cpar0, 5); |
299 | // |
300 | // insulation |
301 | cpar[0]=cpar0[0]; |
302 | cpar[1]=cpar0[1]+d_tube; |
303 | cpar[2]=cpar0[1]+d_tube+d_insu; |
304 | cpar[3]=cpar0[3]+d_tube; |
305 | cpar[4]=cpar0[3]+d_tube+d_insu; |
306 | gMC->Gsvolu("AI21", "CONE", idtmed[1653], cpar, 5); |
307 | gMC->Gspos("AI21", 1, "AV21", 0., 0., 0., 0, "ONLY"); |
308 | // |
309 | // clearance |
310 | cpar[1]=cpar0[2]-d_prot-d_free; |
311 | cpar[2]=cpar0[2]-d_prot; |
312 | cpar[3]=cpar0[4]-d_prot-d_free; |
313 | cpar[4]=cpar0[4]-d_prot; |
314 | gMC->Gsvolu("AP21", "CONE", idtmed[1655], cpar, 5); |
315 | gMC->Gspos("AP21", 1, "AV21", 0., 0., 0., 0, "ONLY"); |
316 | |
317 | dz=(abs_l-abs_d)/2.-cpar0[0]-d_rear; |
318 | gMC->Gspos("AV21", 1, "ABSM", 0., 0., dz, 0, "ONLY"); |
319 | |
320 | } |
321 | |
322 | //_____________________________________________________________________________ |
323 | |
324 | void AliABSOv0::Init() |
325 | { |
326 | // |
327 | // Initialisation of the muon absorber after it has been built |
328 | Int_t i; |
329 | // |
330 | printf("\n"); |
331 | for(i=0;i<35;i++) printf("*"); |
332 | printf(" ABSOv0_INIT "); |
333 | for(i=0;i<35;i++) printf("*"); |
334 | printf("\n"); |
335 | // |
336 | for(i=0;i<80;i++) printf("*"); |
337 | printf("\n"); |
338 | } |
339 | |
340 | |
341 | |
342 | |
343 | |
344 | |
345 | |
346 | |
347 | |
348 | |