35816cf8ea6650bb3dae0110c5d2bc31a3bc1a78
[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 /*
17 $Log$
18 Revision 1.10  2001/10/25 08:50:57  morsch
19 New beamshield geometry with increased tolerances and insulation thickness.
20
21 Revision 1.9  2001/05/16 14:57:22  alibrary
22 New files for folders and Stack
23
24 Revision 1.8  2001/01/12 13:16:09  morsch
25 Store absorber composition information in fMLayers and fZLayers
26 Rear 25 cm Fe + 35 cm Cu
27
28 Revision 1.7  2000/10/02 21:28:15  fca
29 Removal of useless dependecies via forward declarations
30
31 Revision 1.6  2000/06/15 09:40:31  morsch
32 Obsolete typedef keyword removed
33
34 Revision 1.5  2000/06/12 19:39:01  morsch
35 New structure of beam pipe and heating jacket.
36
37 Revision 1.4  2000/04/03 08:13:40  fca
38 Introduce extra scope for non ANSI compliant C++ compilers
39
40 Revision 1.3  2000/01/18 17:49:56  morsch
41 Serious overlap of ABSM with shield corrected
42 Small error in ARPB parameters corrected
43
44 Revision 1.2  2000/01/13 11:23:59  morsch
45 Last layer of Pb outer angle corrected
46
47 Revision 1.1  2000/01/12 15:39:30  morsch
48 Standard version of ABSO
49
50 */
51
52 ///////////////////////////////////////////////////////////////////////////////
53 //                                                                           //
54 //  Muon ABSOrber                                                            //
55 //  This class contains the description of the muon absorber geometry        //
56 //                                                                           //
57 //Begin_Html
58 /*
59 <img src="picts/AliABSOClass.gif">
60 </pre>
61 <br clear=left>
62 <font size=+2 color=red>
63 <p>The responsible person for this module is
64 <a href="mailto:andreas.morsch@cern.ch">Andreas Morsch</a>.
65 </font>
66 <pre>
67 */
68 //End_Html
69 //                                                                           //
70 //                                                                           //
71 ///////////////////////////////////////////////////////////////////////////////
72
73 #include "AliABSOv0.h"
74 #include "AliRun.h"
75 #include "AliMC.h"
76 #include "AliConst.h"
77
78 ClassImp(AliABSOv0)
79  
80 //_____________________________________________________________________________
81 AliABSOv0::AliABSOv0()
82 {
83   //
84   // Default constructor
85   //
86 }
87  
88 //_____________________________________________________________________________
89 AliABSOv0::AliABSOv0(const char *name, const char *title)
90        : AliABSO(name,title)
91 {
92   //
93   // Standard constructor
94   //
95   SetMarkerColor(7);
96   SetMarkerStyle(2);
97   SetMarkerSize(0.4);
98 }
99  
100 //_____________________________________________________________________________
101 void AliABSOv0::CreateGeometry()
102 {
103     //
104     // Creation of the geometry of the muon absorber
105     //
106     //Begin_Html
107     /*
108       <img src="picts/AliABSOv0Tree.gif">
109     */
110     //End_Html
111     //Begin_Html
112     /*
113       <img src="picts/AliABSOv0.gif">
114     */
115     //End_Html
116     
117     //
118     //
119
120     enum {kC=1605, kAl=1608, kFe=1609, kCu=1610, kW=1611, kPb=1612,
121           kNiCuW=1620, kVacuum=1615, kAir=1614, kConcrete=1616,
122           kPolyCH2=1617, kSteel=1609, kInsulation=1613, kPolyCc=1619};    
123     
124     Int_t *idtmed = fIdtmed->GetArray()-1599;
125     
126     Float_t par[24], cpar[5], cpar0[5], pcpar[12], tpar[3], tpar0[3]; 
127     Float_t dz;
128     Int_t idrotm[1699];
129 #include "ABSOSHILConst.h"
130 #include "ABSOConst.h"
131 //
132 // Structure of Tracking Region
133 //
134   Float_t dzFe = 25.;
135
136 // 3 < theta < 9
137     fNLayers[0] = 5; 
138     fMLayers[0][0]  = kAir;              fZLayers[0][0] = zAbsStart;
139     fMLayers[0][1]  = kC;                fZLayers[0][1] = zAbsCc;             
140     fMLayers[0][2]  = kConcrete;         fZLayers[0][2] = zRear-dRear-dzFe;
141     fMLayers[0][3]  = kSteel;            fZLayers[0][3] = zRear-dRear;
142     fMLayers[0][4]  = kCu;               fZLayers[0][4] = zRear;
143 // 2 < theta < 3
144     fNLayers[1] = 5; 
145     fMLayers[1][0] = fMLayers[0][0];      fZLayers[1][0] = fZLayers[0][0];
146     fMLayers[1][1] = fMLayers[0][1];      fZLayers[1][1] = fZLayers[0][1];
147     fMLayers[1][2] = fMLayers[0][2];      fZLayers[1][2] = fZLayers[0][2];
148     fMLayers[1][3] = fMLayers[0][3];      fZLayers[1][3] = fZLayers[0][3];
149     fMLayers[1][4] = kNiCuW;              fZLayers[1][4] = fZLayers[0][4];
150 //    
151
152     Float_t dTube=0.1;                     // tube thickness
153     Float_t dInsu=0.5;                     // insulation thickness
154     Float_t dEnve=0.1;                     // protective envelope thickness
155     Float_t dFree=0.5;                     // clearance thickness
156
157
158 // Mother volume and outer shielding: Pb
159   par[0]  = 0.;
160   par[1]  = 360.;
161   par[2]  = 7.;
162     
163   par[3]  = -(zRear-zAbsStart)/2.;
164   par[4]  = rAbs;
165   par[5]  = zAbsStart * TMath::Tan(theta1);
166
167   par[6]  = par[3]+(zNose-zAbsStart);
168   par[7]  = rAbs;
169   par[8]  = zNose * TMath::Tan(theta1);
170
171   par[9]  = par[3]+(zConeTPC-zAbsStart);
172   par[10] = rAbs;
173   par[11] = par[8] + (par[9] - par[6]) * TMath::Tan(theta2);
174
175   par[12]  = par[3]+(zOpen-zAbsStart);
176   par[13] = rAbs;
177   par[14] = par[11] + (par[12] - par[9]) * TMath::Tan(accMax);
178
179   par[15] = par[3]+(zRear-dRear-zAbsStart);
180   par[16] = rAbs   + (par[15] - par[12]) * TMath::Tan(thetaOpen1) ;
181   par[17] = par[14] + (par[15] - par[12]) * TMath::Tan(accMax);
182
183   par[18] = par[3]+(zRear-dRear-zAbsStart);
184   par[19] = (zRear-dRear) * TMath::Tan(accMin);
185   par[20] = par[14] + (par[18] - par[12]) * TMath::Tan(accMax);
186
187   par[21] = -par[3];
188   par[22] =  zRear* TMath::Tan(accMin);
189   par[23] = par[20] + (par[21] - par[18]) * TMath::Tan(accMax);
190   gMC->Gsvolu("ABSS", "PCON", idtmed[kPb], par, 24);
191   { // Begin local scope for i
192       for (Int_t i=4; i<18; i+=3) par[i]  = 0;
193   } // End local scope for i
194   gMC->Gsvolu("ABSM", "PCON", idtmed[kVacuum+40], par, 24);
195   gMC->Gspos("ABSS", 1, "ABSM", 0., 0., 0., 0, "ONLY");
196
197 //
198 // Steel envelope
199 //
200   par[4] = par[5] -dSteel;
201   par[7] = par[8] -dSteel;
202   par[10]= par[11]-dSteel;  
203   par[13]= par[14]-dSteel;  
204   par[16]= par[17]-dSteel;  
205   par[19]= par[20]-dSteel;  
206   par[22]= par[23]-dSteel;  
207   gMC->Gsvolu("ABST", "PCON", idtmed[kSteel], par, 24);
208   gMC->Gspos("ABST", 1, "ABSS", 0., 0., 0., 0, "ONLY");
209 //
210 // Polyethylene shield
211 // 
212   cpar[0] = (zRear - zConeTPC) / 2.;
213   cpar[1] = zConeTPC * TMath::Tan(accMax);
214   cpar[2] = cpar[1] + dPoly;
215   cpar[3] = zRear * TMath::Tan(accMax);
216   cpar[4] = cpar[3] + dPoly;
217   gMC->Gsvolu("APOL", "CONE", idtmed[kPolyCH2+40], cpar, 5);
218   dz = (zRear-zAbsStart)/2.-cpar[0];
219   gMC->Gspos("APOL", 1, "ABSS", 0., 0., dz, 0, "ONLY");
220
221 //
222 // Tungsten nose to protect TPC
223 // 
224   cpar[0] = (zNose - zAbsStart) / 2.;
225   cpar[1] = zAbsStart * TMath::Tan(accMax);
226   cpar[2] = zAbsStart * TMath::Tan(theta1)-dSteel;
227   cpar[3] = zNose * TMath::Tan(accMax);
228   cpar[4] = zNose * TMath::Tan(theta1)-dSteel;
229   gMC->Gsvolu("ANOS", "CONE", idtmed[kW], cpar, 5);
230 //
231   dz = -(zRear-zAbsStart)/2.+cpar[0];
232   gMC->Gspos("ANOS", 1, "ABSS", 0., 0., dz, 0, "ONLY");
233 //
234 // Tungsten inner shield
235 //
236   Float_t zW = zTwoDeg+.1;
237   Float_t dZ = zW+(zRear-dRear-zW)/2.;
238   //
239   pcpar[0]  = 0.;
240   pcpar[1]  = 360.;
241   pcpar[2]  = 3.;
242   pcpar[3]  = zW-dZ;
243   pcpar[4]  = rAbs;
244   pcpar[5]  = zW * TMath::Tan(accMin);
245   pcpar[6]  = zOpen-dZ;
246   pcpar[7]  = rAbs;
247   pcpar[8]  = zOpen * TMath::Tan(accMin);
248   pcpar[9]  = zRear-dRear-dZ;
249   pcpar[10] = rAbs+(zRear-dRear-zOpen) * TMath::Tan(thetaOpen1);
250   pcpar[11] = (zRear-dRear) * TMath::Tan(accMin);
251   
252   gMC->Gsvolu("AWIN", "PCON", idtmed[kNiCuW+40], pcpar, 12);
253   //
254   dz=(zW+zRear-dRear)/2-(zAbsStart+zRear)/2.;
255   gMC->Gspos("AWIN", 1, "ABSS", 0., 0., dz, 0, "ONLY");
256   cpar[0] = (200.-zW)/2.;
257   cpar[1] = rAbs;
258   cpar[2] = pcpar[5];
259   cpar[3] = rAbs;
260   cpar[4] = 200. * TMath::Tan(accMin);
261   gMC->Gsvolu("ACNO", "CONE", idtmed[kC], cpar, 5);
262   dz = zW-dZ+cpar[0];
263   
264   gMC->Gspos("ACNO", 1, "AWIN", 0., 0., dz, 0, "ONLY");
265   //     Inner tracking region
266   //
267   //     mother volume: Cu
268   //
269   pcpar[0]  = 0.;
270   pcpar[1]  = 360.;
271   pcpar[2]  = 3.;
272   pcpar[3]  = -(zRear-zAbsStart)/2.;
273   pcpar[4]  = rAbs;
274   pcpar[5]  = zAbsStart * TMath::Tan(accMax);
275   pcpar[6]  = pcpar[3]+(zTwoDeg-zAbsStart);
276   pcpar[7]  = rAbs;
277   pcpar[8]  = zTwoDeg * TMath::Tan(accMax);
278   pcpar[9]  = -pcpar[3];
279   pcpar[10] = zRear * TMath::Tan(accMin);
280   pcpar[11] = zRear * TMath::Tan(accMax);
281   gMC->Gsvolu("AITR", "PCON", idtmed[fMLayers[0][4]], pcpar, 12);
282   //
283   // special Pb medium for last 5 cm of Pb
284   Float_t zr=zRear-2.-0.001;
285   cpar[0] = 1.0;
286   cpar[1] = zr * TMath::Tan(thetaR);
287   cpar[2] = zr * TMath::Tan(accMax);
288   cpar[3] = cpar[1] + TMath::Tan(thetaR) * 2;
289   cpar[4] = cpar[2] + TMath::Tan(accMax) * 2;
290   gMC->Gsvolu("ARPB", "CONE", idtmed[fMLayers[0][4]], cpar, 5);
291   dz=(zRear-zAbsStart)/2.-cpar[0]-0.001;
292   gMC->Gspos("ARPB", 1, "AITR", 0., 0., dz, 0, "ONLY");
293   //
294   //     concrete cone: concrete 
295   //
296   pcpar[9]  = pcpar[3]+(zRear-dRear-zAbsStart);
297   pcpar[10] = (zRear-dRear) * TMath::Tan(accMin);
298   pcpar[11] = (zRear-dRear) * TMath::Tan(accMax);
299   gMC->Gsvolu("ACON", "PCON", idtmed[fMLayers[0][2]+40], pcpar, 12);
300   gMC->Gspos("ACON", 1, "AITR", 0., 0., 0., 0, "ONLY");
301 //
302 //    Fe Cone 
303 //
304   zr = zRear-dRear-dzFe;
305   cpar[0]  = dzFe/2.;
306   cpar[1] = zr * TMath::Tan(accMin);
307   cpar[2] = zr * TMath::Tan(accMax);
308   cpar[3] = cpar[1] + TMath::Tan(accMin) * dzFe;
309   cpar[4] = cpar[2] + TMath::Tan(accMax) * dzFe;
310   gMC->Gsvolu("ACFE", "CONE",idtmed[fMLayers[0][3]], cpar, 5);
311
312   dz = (zRear-zAbsStart)/2.-dRear-dzFe/2.;
313
314   gMC->Gspos("ACFE", 1, "ACON", 0., 0., dz, 0, "ONLY");
315
316   
317   //
318   //
319   //     carbon cone: carbon
320   //
321   pcpar[9]  = pcpar[3]+(zAbsCc-zAbsStart);
322   pcpar[10]  = zAbsCc * TMath::Tan(accMin);
323   pcpar[11]  = zAbsCc * TMath::Tan(accMax);
324   gMC->Gsvolu("ACAR", "PCON", idtmed[fMLayers[0][1]+40], pcpar, 12);
325   gMC->Gspos("ACAR", 1, "ACON", 0., 0., 0., 0, "ONLY");
326  //
327  //     carbon cone outer region
328  //
329   cpar[0]  = 10.;
330   cpar[1]  = rAbs;
331   cpar[2]  = zAbsStart* TMath::Tan(accMax);
332   cpar[3]  = rAbs;
333   cpar[4]  = cpar[2]+2. * cpar[0] * TMath::Tan(accMax);
334
335   gMC->Gsvolu("ACAO", "CONE", idtmed[fMLayers[0][1]], cpar, 5);
336   dz=-(zRear-zAbsStart)/2.+cpar[0];
337   gMC->Gspos("ACAO", 1, "ACAR", 0., 0., dz, 0, "ONLY");
338   //
339   //     inner W shield
340   Float_t epsi=0.;
341   Float_t repsi=1.;
342   
343   zr=zRear-(dRear-epsi);
344   cpar[0] = (dRear-epsi)/2.;
345   cpar[1] = zr * TMath::Tan(accMin);
346   cpar[2] = zr * TMath::Tan(thetaR*repsi);
347   cpar[3] = cpar[1] + TMath::Tan(accMin) * (dRear-epsi);
348   cpar[4] = cpar[2] + TMath::Tan(thetaR*repsi) * (dRear-epsi);
349   gMC->Gsvolu("ARW0", "CONE", idtmed[fMLayers[1][4]+40], cpar, 5);
350   dz=(zRear-zAbsStart)/2.-cpar[0];
351   gMC->Gspos("ARW0", 1, "AITR", 0., 0., dz, 0, "ONLY");
352   //
353   // special W medium for last 5 cm of W
354   zr=zRear-5;
355   cpar[0] = 2.5;
356   cpar[1] = zr * TMath::Tan(accMin);
357   cpar[2] = zr * TMath::Tan(thetaR*repsi);
358   cpar[3] = cpar[1] + TMath::Tan(accMin) * 5.;
359   cpar[4] = cpar[2] + TMath::Tan(thetaR*repsi) * 5.;
360   gMC->Gsvolu("ARW1", "CONE", idtmed[fMLayers[1][4]+20], cpar, 5);
361   dz=(dRear-epsi)/2.-cpar[0];
362   gMC->Gspos("ARW1", 1, "ARW0", 0., 0., dz, 0, "ONLY");
363   //
364   // Cu
365   Float_t drMin=TMath::Tan(thetaR) * 5;
366   Float_t drMax=TMath::Tan(accMax) * 5;
367   gMC->Gsvolu("ARPE", "CONE", idtmed[fMLayers[0][4]], cpar, 0);
368   cpar[0]=2.5;
369   { // Begin local scope for i
370       for (Int_t i=0; i<3; i++) {
371           zr=zRear-dRear+5+i*10.;
372           cpar[1] = zr * TMath::Tan(thetaR);
373           cpar[2] = zr * TMath::Tan(accMax);
374           cpar[3] = cpar[1] + drMin;
375           cpar[4] = cpar[2] + drMax;
376           dz=(zRear-zAbsStart)/2.-cpar[0]-5.-(2-i)*10;
377           gMC->Gsposp("ARPE", i+1, "AITR", 0., 0., dz, 0, "ONLY",cpar,5);
378       }
379   } // End local scope for i
380   gMC->Gspos("AITR", 1, "ABSS", 0., 0., 0., 0, "ONLY"); 
381   dz = (zRear-zAbsStart)/2.+zAbsStart;
382   gMC->Gspos("ABSM", 1, "ALIC", 0., 0., dz, 0, "ONLY"); 
383 //
384 //
385 // vacuum system
386 //
387 // pipe and heating jackets
388 //
389 //
390 // cylindrical piece
391   tpar0[2]=(zOpen-zAbsStart)/2;
392   tpar0[0]=rVacu;
393   tpar0[1]=rVacu+dTube+dInsu+dEnve;
394   gMC->Gsvolu("AV11", "TUBE", idtmed[kSteel+40], tpar0, 3);
395 //
396 // insulation
397
398   tpar[2]=tpar0[2];
399   tpar[0]=rVacu+dTube;
400   tpar[1]=tpar[0]+dInsu;
401   gMC->Gsvolu("AI11", "TUBE", idtmed[kInsulation+40], tpar, 3);
402   gMC->Gspos("AI11", 1, "AV11", 0., 0., 0., 0, "ONLY"); 
403 //
404   dz=-(zRear-zAbsStart)/2.+tpar0[2];
405   gMC->Gspos("AV11", 1, "ABSM", 0., 0., dz, 0, "ONLY"); 
406 //
407 // conical piece
408
409   cpar0[0]=(zRear-dRear-zOpen)/2;
410   cpar0[1]= rVacu-0.05;
411   cpar0[2]= rVacu+dTube+dInsu+dEnve;
412   Float_t dR=2.*cpar0[0]*TMath::Tan(thetaOpen1);
413   cpar0[3]=cpar0[1]+dR;
414   cpar0[4]=cpar0[2]+dR;
415   gMC->Gsvolu("AV21", "CONE", idtmed[kSteel+40], cpar0, 5);
416   dTube+=0.05;
417
418 //
419 // insulation
420   cpar[0]=cpar0[0];
421   cpar[1]=cpar0[1]+dTube;
422   cpar[2]=cpar0[1]+dTube+dInsu;
423   cpar[3]=cpar0[3]+dTube;
424   cpar[4]=cpar0[3]+dTube+dInsu;
425   gMC->Gsvolu("AI21", "CONE", idtmed[kInsulation+40], cpar, 5);
426   gMC->Gspos("AI21", 1, "AV21", 0., 0., 0., 0, "ONLY"); 
427   
428   dz=(zRear-zAbsStart)/2.-cpar0[0]-dRear;
429   gMC->Gspos("AV21", 1, "ABSM", 0., 0., dz, 0, "ONLY"); 
430 //
431 // Support cone 
432
433   par[0]  =  22.5;
434   par[1]  = 360.0;
435   par[2]  =   8.0;
436   par[3]  =   4.0;
437     
438   par[4]  = zRear;
439   par[5]  = 100.;
440   par[6]  = 170.;
441   
442   par[7]  = zRear+2.;
443   par[8]  = 100.;
444   par[9]  = 170.;
445
446   par[10] = zRear+2.;
447   par[11] = 168.;
448   par[12] = 170.;
449
450   par[13] = 600.;
451   par[14] = 168.;
452   par[15] = 170.;
453   
454
455   gMC->Gsvolu("ASSS", "PGON", idtmed[kSteel], par, 16);
456   gMC->Gspos("ASSS", 1, "ALIC", 0., 0., 0., 0, "ONLY");
457
458   Float_t trap[11];
459   trap[ 0] = (530.-170.)/2.;
460   trap[ 2] = 0.;
461   trap[ 3] = 2.; 
462   trap[ 4] = (600.-(zRear+2.))/2.;;
463   trap[ 5] = trap[4];
464   trap[ 6] = 0.;
465   trap[ 7] = 2.;
466   trap[ 8] = 5.;
467   trap[ 9] = 5.;
468   trap[10] = 0.;
469   trap[ 1] = -TMath::ATan((trap[4]-trap[8])/2./trap[0])*180./TMath::Pi();
470   AliMatrix(idrotm[1600], 180., 0., 90., 0., 90., 90.);
471   AliMatrix(idrotm[1601], 180., 0., 90., 0., 90., 270.);
472   gMC->Gsvolu("ASST", "TRAP", idtmed[kSteel], trap, 11);
473   dz = (600.+zRear+2.)/2.+(trap[4]-trap[8])/2.;
474   Float_t dy =  170.+trap[0];
475   
476   gMC->Gspos("ASST", 1, "ALIC", 0.,  dy, dz, idrotm[1600], "ONLY");
477   gMC->Gspos("ASST", 2, "ALIC", 0., -dy, dz, idrotm[1601], "ONLY");
478 }
479
480 //_____________________________________________________________________________
481
482 void AliABSOv0::Init()
483 {
484   //
485   // Initialisation of the muon absorber after it has been built
486   Int_t i;
487   //
488   if(fDebug) {
489     printf("\n%s: ",ClassName());
490     for(i=0;i<35;i++) printf("*");
491     printf(" ABSOv0_INIT ");
492     for(i=0;i<35;i++) printf("*");
493     printf("\n%s: ",ClassName());
494     //
495     for(i=0;i<80;i++) printf("*");
496     printf("\n");
497   }
498 }
499  
500
501
502
503
504
505
506
507
508