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