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