180de0ceaafe2e7af201dfdbb40e9fcf07539d6a
[u/mrichter/AliRoot.git] / STRUCT / AliABSOv0.cxx
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 /* $Id$ */
17
18 ///////////////////////////////////////////////////////////////////////////////
19 //                                                                           //
20 //  Muon ABSOrber                                                            //
21 //  This class contains the description of the muon absorber geometry        //
22 //                                                                           //
23 //Begin_Html
24 /*
25 <img src="picts/AliABSOClass.gif">
26 </pre>
27 <br clear=left>
28 <font size=+2 color=red>
29 <p>The responsible person for this module is
30 <a href="mailto:andreas.morsch@cern.ch">Andreas Morsch</a>.
31 </font>
32 <pre>
33 */
34 //End_Html
35 //                                                                           //
36 //                                                                           //
37 ///////////////////////////////////////////////////////////////////////////////
38
39 #include <TVirtualMC.h>
40
41 #include "AliABSOv0.h"
42 #include "AliConst.h"
43 #include "AliRun.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     //
86
87     enum {kC=1605, kAl=1608, kFe=1609, kCu=1610, kW=1611, kPb=1612,
88           kNiCuW=1620, kVacuum=1615, kAir=1614, kConcrete=1616,
89           kPolyCH2=1617, kSteel=1609, kInsulation=1613, kPolyCc=1619};    
90     
91     Int_t *idtmed = fIdtmed->GetArray()-1599;
92     
93     Float_t par[24], cpar[5], cpar0[5], pcpar[12], tpar[3], tpar0[3]; 
94     Float_t dz;
95     Int_t idrotm[1699];
96 #include "ABSOSHILConst.h"
97 #include "ABSOConst.h"
98 //
99 // Structure of Tracking Region
100 //
101   Float_t dzFe = 25.;
102
103 // 3 < theta < 9
104     fNLayers[0] = 5; 
105     fMLayers[0][0]  = kAir;              fZLayers[0][0] = kZAbsStart;
106     fMLayers[0][1]  = kC;                fZLayers[0][1] = kZAbsCc;             
107     fMLayers[0][2]  = kConcrete;         fZLayers[0][2] = kZRear - kDRear - dzFe;
108     fMLayers[0][3]  = kSteel;            fZLayers[0][3] = kZRear - kDRear;
109     fMLayers[0][4]  = kSteel;            fZLayers[0][4] = kZRear;
110 // 2 < theta < 3
111     fNLayers[1] = 6; 
112
113     fMLayers[1][0] = kAir          ;      fZLayers[1][0] = fZLayers[0][0] - 10.;
114     fMLayers[1][1] = kAl           ;      fZLayers[1][1] = fZLayers[0][0];
115     fMLayers[1][2] = fMLayers[0][1];      fZLayers[1][2] = fZLayers[0][1];
116     fMLayers[1][3] = fMLayers[0][2];      fZLayers[1][3] = fZLayers[0][2];
117     fMLayers[1][4] = fMLayers[0][3];      fZLayers[1][4] = fZLayers[0][3];
118     fMLayers[1][5] = kNiCuW;              fZLayers[1][5] = fZLayers[0][4];
119 //    
120
121     Float_t dTube = 0.1;                     // tube thickness
122     Float_t dInsu = 0.5;                     // insulation thickness
123     Float_t dEnve = 0.1;                     // protective envelope thickness
124
125
126 // Mother volume and outer shielding: Pb
127   par[0]  = 0.;
128   par[1]  = 360.;
129   par[2]  = 7.;
130     
131   par[21] = (kZRear - kZAbsStart) / 2.;
132   par[22] = kRAbs;
133   par[23] = kZAbsStart * TMath::Tan(kTheta1);
134
135   par[18] = par[21] - (kZNose - kZAbsStart);
136   par[19] = kRAbs;
137   par[20] = kZNose * TMath::Tan(kTheta1);
138
139   par[15] = par[21] - (kZConeTPC - kZAbsStart);
140   par[16] = kRAbs;
141   par[17] = par[20] - (par[15] - par[18]) * TMath::Tan(kTheta2);
142
143   par[12] = par[21]  - (kZOpen - kZAbsStart);
144   par[13] = kRAbs;
145   par[14] = par[17] - (par[12] - par[15]) * TMath::Tan(kAccMax);
146
147   par[9]  = par[21]  - (kZRear - kDRear - kZAbsStart);
148   par[10] = kRAbs   - (par[9] - par[12]) * TMath::Tan(kThetaOpen1) ;
149   par[11] = par[14] - (par[9] - par[12]) * TMath::Tan(kAccMax);
150
151   par[6]  = par[21]  - (kZRear - kDRear - kZAbsStart);
152   par[7]  = (kZRear - kDRear) * TMath::Tan(kAccMin);
153   par[8]  = par[14] - (par[6] - par[12]) * TMath::Tan(kAccMax);
154
155   par[3] =  - par[21];
156   par[4] = kZRear  * TMath::Tan(kAccMin);
157   par[5] = par[8] - (par[3] - par[6]) * TMath::Tan(kAccMax);
158   gMC->Gsvolu("ABSS", "PCON", idtmed[kPb], par, 24);
159
160   for (Int_t i = 22; i > 7; i -= 3) par[i]  = 0;
161
162   gMC->Gsvolu("ABSM", "PCON", idtmed[kVacuum+40], par, 24);
163   gMC->Gspos("ABSS", 1, "ABSM", 0., 0., 0., 0, "ONLY");
164
165 //
166 // Steel envelope
167 //
168   par[4] = par[5]  - kDSteel;
169   par[7] = par[8]  - kDSteel;
170   par[10]= par[11] - kDSteel;  
171   par[13]= par[14] - kDSteel;  
172   par[16]= par[17] - kDSteel;  
173   par[19]= par[20] - kDSteel;  
174   par[22]= par[23] - kDSteel;  
175
176   gMC->Gsvolu("ABST", "PCON", idtmed[kSteel], par, 24);
177   gMC->Gspos("ABST", 1, "ABSS", 0., 0., 0., 0, "ONLY");
178 //
179 // Polyethylene shield
180 // 
181   cpar[0] = (kZRear - kZConeTPC) / 2.;
182   cpar[1] = kZRear * TMath::Tan(kAccMax);
183   cpar[2] = cpar[1] + kDPoly;
184   cpar[3] = kZConeTPC * TMath::Tan(kAccMax);
185   cpar[4] = cpar[3] + kDPoly;
186
187   gMC->Gsvolu("APOL", "CONE", idtmed[kPolyCH2+40], cpar, 5);
188   dz = - (kZRear - kZAbsStart) / 2. + cpar[0];
189   gMC->Gspos("APOL", 1, "ABSS", 0., 0., dz, 0, "ONLY");
190
191 //
192 // Tungsten nose to protect TPC
193 // 
194   cpar[0] = (kZNose - kZAbsStart) / 2.;
195   cpar[1] = kZNose * TMath::Tan(kAccMax);
196   cpar[2] = kZNose * TMath::Tan(kTheta1) - kDSteel;
197   cpar[3] = kZAbsStart * TMath::Tan(kAccMax);
198   cpar[4] = kZAbsStart * TMath::Tan(kTheta1) - kDSteel;
199
200   gMC->Gsvolu("ANOS", "CONE", idtmed[kW], cpar, 5);
201   //
202   dz =  (kZRear - kZAbsStart) / 2. - cpar[0];
203   gMC->Gspos("ANOS", 1, "ABSS", 0., 0., dz, 0, "ONLY");
204   //
205   // Tungsten inner shield
206   //
207   Float_t zW = kZTwoDeg + .1;
208   Float_t dZ = zW + (kZRear - kDRear - zW) / 2.;
209   //
210   pcpar[0]  = 0.;
211   pcpar[1]  = 360.;
212   pcpar[2]  = 3.;
213   pcpar[9]  = - (zW - dZ);
214   pcpar[10] = kRAbs;
215   pcpar[11] = zW * TMath::Tan(kAccMin);
216   pcpar[6]  = - (kZOpen - dZ);
217   pcpar[7]  = kRAbs;
218   pcpar[8]  = kZOpen * TMath::Tan(kAccMin);
219   pcpar[3]  = - (kZRear - kDRear - dZ);
220   pcpar[4]  = kRAbs + (kZRear - kDRear - kZOpen) * TMath::Tan(kThetaOpen1);
221   pcpar[5]  = (kZRear - kDRear) * TMath::Tan(kAccMin);
222   
223   gMC->Gsvolu("AWIN", "PCON", idtmed[kNiCuW+40], pcpar, 12);
224   dz = -(zW + kZRear - kDRear) / 2 + (kZAbsStart + kZRear) / 2.;
225   gMC->Gspos("AWIN", 1, "ABSS", 0., 0., dz, 0, "ONLY");
226 //
227 // First part replaced by Carbon  
228 //
229   cpar[0] = (200.-zW)/2.;
230
231   cpar[1] = kRAbs;
232   cpar[2] = 200. * TMath::Tan(kAccMin);
233   cpar[3] = kRAbs;
234   cpar[4] = pcpar[11];
235
236   gMC->Gsvolu("ACNO", "CONE", idtmed[kC], cpar, 5);
237   dz = - (zW - dZ+cpar[0]);
238   gMC->Gspos("ACNO", 1, "AWIN", 0., 0., dz, 0, "ONLY");
239
240 /*  
241   Float_t zWW = 383.5;
242   cpar[0] = (kZRear-kDRear-zWW)/2.;
243   cpar[1] = kRAbs + (zWW-kZOpen) *  TMath::Tan(kThetaOpen1);
244   cpar[2] =  zWW * TMath::Tan(kAccMin);
245   cpar[3] = pcpar[10];
246   cpar[4] = pcpar[11];
247   gMC->Gsvolu("AWNO", "CONE", idtmed[kCu+40], cpar, 5);
248   dz = zWW-dZ+cpar[0];
249   
250   gMC->Gspos("AWNO", 1, "AWIN", 0., 0., dz, 0, "ONLY");
251 */
252   //
253   //     Inner tracking region
254   //
255   //
256   //
257   pcpar[0]  = 0.;
258   pcpar[1]  = 360.;
259   pcpar[2]  = 3.;
260   pcpar[9]  = (kZRear - kZAbsStart) / 2.;
261   pcpar[10] = kRAbs;
262   pcpar[11] = kZAbsStart * TMath::Tan(kAccMax);
263   pcpar[6]  = pcpar[9] - (kZTwoDeg - kZAbsStart);
264   pcpar[7]  = kRAbs;
265   pcpar[8]  = kZTwoDeg * TMath::Tan(kAccMax);
266   pcpar[3]  = - pcpar[9];
267   pcpar[4]  = kZRear * TMath::Tan(kAccMin);
268   pcpar[5]  = kZRear * TMath::Tan(kAccMax);
269   gMC->Gsvolu("AITR", "PCON", idtmed[fMLayers[0][4]], pcpar, 12);
270   //
271   // special Pb medium for last 5 cm of Pb
272   Float_t zr = kZRear - 2. - 0.001;
273   cpar[0] = 1.0;
274   cpar[3] = zr * TMath::Tan(kThetaR);
275   cpar[4] = zr * TMath::Tan(kAccMax);
276   cpar[1] = cpar[3] + TMath::Tan(kThetaR) * 2;
277   cpar[2] = cpar[4] + TMath::Tan(kAccMax) * 2;
278   
279   gMC->Gsvolu("ARPB", "CONE", idtmed[fMLayers[0][4]], cpar, 5);
280   dz= - (kZRear - kZAbsStart) / 2. + cpar[0] - 0.001;
281   gMC->Gspos("ARPB", 1, "AITR", 0., 0., dz, 0, "ONLY");
282   //
283   //     concrete cone: concrete 
284   //
285   pcpar[3]  = pcpar[9] - (kZRear - kDRear - kZAbsStart);
286   pcpar[4] = (kZRear-kDRear) * TMath::Tan(kAccMin);
287   pcpar[5] = (kZRear-kDRear) * TMath::Tan(kAccMax);
288   gMC->Gsvolu("ACON", "PCON", idtmed[fMLayers[0][2]+40], pcpar, 12);
289   gMC->Gspos("ACON", 1, "AITR", 0., 0., 0., 0, "ONLY");
290 //
291 //    Fe Cone 
292 //
293   zr = kZRear - kDRear - dzFe;
294
295   cpar[0] = dzFe/2.;
296   cpar[3] = zr * TMath::Tan(kAccMin);
297   cpar[4] = zr * TMath::Tan(kAccMax);
298   cpar[1] = cpar[3] + TMath::Tan(kAccMin) * dzFe;
299   cpar[2] = cpar[4] + TMath::Tan(kAccMax) * dzFe;
300
301   gMC->Gsvolu("ACFE", "CONE",idtmed[fMLayers[0][3]], cpar, 5);
302
303   dz = - (kZRear - kZAbsStart) / 2. + kDRear + dzFe / 2.;
304
305   gMC->Gspos("ACFE", 1, "ACON", 0., 0., dz, 0, "ONLY");
306
307   
308   //
309   //
310   //     carbon cone: carbon
311   //
312   pcpar[3]   = pcpar[9] - (kZAbsCc - kZAbsStart);
313   pcpar[4]   = kZAbsCc * TMath::Tan(kAccMin);
314   pcpar[5]   = kZAbsCc * TMath::Tan(kAccMax);
315   gMC->Gsvolu("ACAR", "PCON", idtmed[fMLayers[0][1]+40], pcpar, 12);
316   gMC->Gspos("ACAR", 1, "ACON", 0., 0., 0., 0, "ONLY");
317  //
318  //     carbon cone outer region
319  //
320   cpar[0]  = 10.;
321   cpar[3]  = kRAbs;
322   cpar[4]  = kZAbsStart * TMath::Tan(kAccMax);
323   cpar[1]  = kRAbs;
324   cpar[2]  = cpar[4] + 2. * cpar[0] * TMath::Tan(kAccMax);
325
326   gMC->Gsvolu("ACAO", "CONE", idtmed[fMLayers[0][1]], cpar, 5);
327   dz= (kZRear-kZAbsStart) / 2. - cpar[0];
328   gMC->Gspos("ACAO", 1, "ACAR", 0., 0., dz, 0, "ONLY");
329   //
330   //     inner W shield
331   Float_t epsi  = 0.;
332   Float_t repsi = 1.;
333   
334   zr = kZRear - (kDRear - epsi);
335   cpar[0] = (kDRear - epsi) / 2.;
336   cpar[3] = zr * TMath::Tan(kAccMin);
337   cpar[4] = zr * TMath::Tan(kThetaR * repsi);
338   cpar[1] = cpar[3] + TMath::Tan(kAccMin) * (kDRear - epsi);
339   cpar[2] = cpar[4] + TMath::Tan(kThetaR * repsi) * (kDRear - epsi);
340
341   gMC->Gsvolu("ARW0", "CONE", idtmed[fMLayers[1][4]+40], cpar, 5);
342   dz= - (kZRear - kZAbsStart) / 2. + cpar[0];
343   gMC->Gspos("ARW0", 1, "AITR", 0., 0., dz, 0, "ONLY");
344   //
345   // special W medium for last 5 cm of W
346   zr = kZRear - 5;
347   cpar[0] = 2.5;
348   cpar[3] = zr * TMath::Tan(kAccMin);
349   cpar[4] = zr * TMath::Tan(kThetaR * repsi);
350   cpar[1] = cpar[3] + TMath::Tan(kAccMin) * 5.;
351   cpar[2] = cpar[4] + TMath::Tan(kThetaR*repsi) * 5.;
352
353   gMC->Gsvolu("ARW1", "CONE", idtmed[fMLayers[1][4]+20], cpar, 5);
354   dz = - (kDRear-epsi) / 2. + cpar[0];
355   gMC->Gspos("ARW1", 1, "ARW0", 0., 0., dz, 0, "ONLY");
356   //
357   // Cu
358   Float_t drMin = TMath::Tan(kThetaR) * 5;
359   Float_t drMax = TMath::Tan(kAccMax) * 5;
360   gMC->Gsvolu("ARPE", "CONE", idtmed[fMLayers[0][4]], cpar, 0);
361   cpar[0] = 2.5;
362
363   for (Int_t i = 0; i < 3; i++) {
364       zr = kZRear - kDRear + 5 + i * 10.;
365       cpar[3] = zr * TMath::Tan(kThetaR);
366       cpar[4] = zr * TMath::Tan(kAccMax);
367       cpar[1] = cpar[3] + drMin;
368       cpar[2] = cpar[4] + drMax;
369       dz = - (kZRear - kZAbsStart) / 2. + cpar[0] + 5. + (2 - i)*10;
370       gMC->Gsposp("ARPE", i+1, "AITR", 0., 0., dz, 0, "ONLY",cpar,5);
371   }
372
373   gMC->Gspos("AITR", 1, "ABSS", 0., 0., 0., 0, "ONLY"); 
374   dz = - (kZRear - kZAbsStart) / 2. - kZAbsStart;
375   gMC->Gspos("ABSM", 1, "ALIC", 0., 0., dz, 0, "ONLY"); 
376 //
377 //
378 // vacuum system
379 //
380 // pipe and heating jackets
381 //
382 //
383 // cylindrical piece
384   tpar0[2] = (kZOpen-kZAbsStart)/2;
385   tpar0[0] = kRVacu;
386   tpar0[1] = kRVacu + dTube + dInsu + dEnve;
387   gMC->Gsvolu("AV11", "TUBE", idtmed[kSteel+40], tpar0, 3);
388 //
389 // insulation
390
391   tpar[2] = tpar0[2];
392   tpar[0] = kRVacu  + dTube;
393   tpar[1] = tpar[0] + dInsu;
394   gMC->Gsvolu("AI11", "TUBE", idtmed[kInsulation+40], tpar, 3);
395   gMC->Gspos("AI11", 1, "AV11", 0., 0., 0., 0, "ONLY"); 
396 //
397   dz = (kZRear - kZAbsStart) / 2. - tpar0[2];
398   gMC->Gspos("AV11", 1, "ABSM", 0., 0., dz, 0, "ONLY"); 
399 //
400 // conical piece
401
402   cpar0[0] = (kZRear - kDRear - kZOpen) / 2.;
403   cpar0[3] = kRVacu - 0.05;
404   cpar0[4] = kRVacu + dTube + dInsu + dEnve;
405   Float_t dR = 2. * cpar0[0] * TMath::Tan(kThetaOpen1);
406   cpar0[1]=cpar0[3] + dR;
407   cpar0[2]=cpar0[4] + dR;
408   gMC->Gsvolu("AV21", "CONE", idtmed[kSteel+40], cpar0, 5);
409   dTube += 0.05;
410
411 //
412 // insulation
413   cpar[0] = cpar0[0];
414   cpar[1] = cpar0[1] + dTube;
415   cpar[2] = cpar0[1] + dTube + dInsu;
416   cpar[3] = cpar0[3] + dTube;
417   cpar[4] = cpar0[3] + dTube + dInsu;
418
419   gMC->Gsvolu("AI21", "CONE", idtmed[kInsulation+40], cpar, 5);
420   gMC->Gspos("AI21", 1, "AV21", 0., 0., 0., 0, "ONLY"); 
421   
422   dz = - (kZRear - kZAbsStart) / 2. + cpar0[0] + kDRear;
423   gMC->Gspos("AV21", 1, "ABSM", 0., 0., dz, 0, "ONLY"); 
424 //
425 // Support cone 
426
427   par[0]  =  22.5;
428   par[1]  = 360.0;
429   par[2]  =   8.0;
430   par[3]  =   4.0;
431     
432   par[4]  = - kZRear;
433   par[5]  = 100.;
434   par[6]  = 180.;
435   
436   par[7]  = - kZRear - 20.;
437   par[8]  = 100.;
438   par[9]  = 180.;
439
440   par[10] = - kZRear - 20.;
441   par[11] = 178.;
442   par[12] = 180.;
443
444   par[13] = - 600.;
445   par[14] = 178.;
446   par[15] = 180.;
447   
448
449   gMC->Gsvolu("ASSS", "PGON", idtmed[kAl], par, 16);
450   gMC->Gspos("ASSS", 1, "ALIC", 0., 0., 0., 0, "ONLY");
451
452   Float_t trap[11];
453   trap[ 0] = (530. - 170.) / 2.;
454   trap[ 2] = 0.;
455   trap[ 3] = 2.; 
456   trap[ 4] = (600. - (kZRear + 2.)) / 2.;;
457   trap[ 5] = trap[4];
458   trap[ 6] = 0.;
459   trap[ 7] = 2.;
460   trap[ 8] = 5.;
461   trap[ 9] = 5.;
462   trap[10] = 0.;
463   trap[ 1] = -TMath::ATan((trap[4] - trap[8]) / 2. / trap[0]) * 180. / TMath::Pi();
464   AliMatrix(idrotm[1600], 180., 0., 90., 0., 90., 90.);
465   AliMatrix(idrotm[1601], 180., 0., 90., 0., 90., 270.);
466   gMC->Gsvolu("ASST", "TRAP", idtmed[kSteel], trap, 11);
467   dz = (600.+kZRear+2.)/2.+(trap[4]-trap[8])/2.;
468   Float_t dy =  170.+trap[0];
469   
470 //  gMC->Gspos("ASST", 1, "ALIC", 0.,  dy, - dz, idrotm[1600], "ONLY");
471 //  gMC->Gspos("ASST", 2, "ALIC", 0., -dy, - dz, idrotm[1601], "ONLY");
472 }
473
474 //_____________________________________________________________________________
475
476 void AliABSOv0::Init()
477 {
478   //
479   // Initialisation of the muon absorber after it has been built
480   Int_t i;
481   //
482   if(fDebug) {
483     printf("\n%s: ",ClassName());
484     for(i=0;i<35;i++) printf("*");
485     printf(" ABSOv0_INIT ");
486     for(i=0;i<35;i++) printf("*");
487     printf("\n%s: ",ClassName());
488     //
489     for(i=0;i<80;i++) printf("*");
490     printf("\n");
491   }
492 }
493  
494
495
496
497
498
499
500
501
502