bb94ce4787eb60440f3a2764e4e5b5ed71e8e9e8
[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.4  2000/04/03 08:13:40  fca
19 Introduce extra scope for non ANSI compliant C++ compilers
20
21 Revision 1.3  2000/01/18 17:49:56  morsch
22 Serious overlap of ABSM with shield corrected
23 Small error in ARPB parameters corrected
24
25 Revision 1.2  2000/01/13 11:23:59  morsch
26 Last layer of Pb outer angle corrected
27
28 Revision 1.1  2000/01/12 15:39:30  morsch
29 Standard version of ABSO
30
31 */
32
33 ///////////////////////////////////////////////////////////////////////////////
34 //                                                                           //
35 //  Muon ABSOrber                                                            //
36 //  This class contains the description of the muon absorber geometry        //
37 //                                                                           //
38 //Begin_Html
39 /*
40 <img src="picts/AliABSOClass.gif">
41 </pre>
42 <br clear=left>
43 <font size=+2 color=red>
44 <p>The responsible person for this module is
45 <a href="mailto:andreas.morsch@cern.ch">Andreas Morsch</a>.
46 </font>
47 <pre>
48 */
49 //End_Html
50 //                                                                           //
51 //                                                                           //
52 ///////////////////////////////////////////////////////////////////////////////
53
54 #include "AliABSOv0.h"
55 #include "AliRun.h"
56 #include "AliConst.h"
57
58 ClassImp(AliABSOv0)
59  
60 //_____________________________________________________________________________
61 AliABSOv0::AliABSOv0()
62 {
63   //
64   // Default constructor
65   //
66 }
67  
68 //_____________________________________________________________________________
69 AliABSOv0::AliABSOv0(const char *name, const char *title)
70        : AliABSO(name,title)
71 {
72   //
73   // Standard constructor
74   //
75   SetMarkerColor(7);
76   SetMarkerStyle(2);
77   SetMarkerSize(0.4);
78 }
79  
80 //_____________________________________________________________________________
81 void AliABSOv0::CreateGeometry()
82 {
83     //
84     // Creation of the geometry of the muon absorber
85     //
86     //Begin_Html
87     /*
88       <img src="picts/AliABSOv0Tree.gif">
89     */
90     //End_Html
91     //Begin_Html
92     /*
93       <img src="picts/AliABSOv0.gif">
94     */
95     //End_Html
96     
97     //
98     //
99     typedef enum {kC=1605, kAl=1608, kFe=1609, kCu=1610, kW=1611, kPb=1612,
100                   kNiCuW=1620, kVacuum=1615, kAir=1614, kConcrete=1616,
101                   kPolyCH2=1617, kSteel=1609, kInsulation=1613};          
102     
103     Int_t *idtmed = fIdtmed->GetArray()-1599;
104     
105     Float_t par[24], cpar[5], cpar0[5], pcpar[12], tpar[3], tpar0[3]; 
106     Float_t dz;
107
108 #include "ABSOSHILConst.h"
109 #include "ABSOConst.h"
110     Float_t dTube=0.1;                     // tube thickness
111     Float_t dInsu=0.5;                     // insulation thickness
112     Float_t dEnve=0.1;                     // protective envelope thickness
113     Float_t dFree=0.5;                     // clearance thickness
114
115
116 // Mother volume and outer shielding: Pb
117   par[0]  = 0.;
118   par[1]  = 360.;
119   par[2]  = 7.;
120     
121   par[3]  = -(zRear-zAbsStart)/2.;
122   par[4]  = rAbs;
123   par[5]  = zAbsStart * TMath::Tan(theta1);
124
125   par[6]  = par[3]+(zNose-zAbsStart);
126   par[7]  = rAbs;
127   par[8]  = zNose * TMath::Tan(theta1);
128
129   par[9]  = par[3]+(zConeTPC-zAbsStart);
130   par[10] = rAbs;
131   par[11] = par[8] + (par[9] - par[6]) * TMath::Tan(theta2);
132
133   par[12]  = par[3]+(zOpen-zAbsStart);
134   par[13] = rAbs;
135   par[14] = par[11] + (par[12] - par[9]) * TMath::Tan(accMax);
136
137   par[15] = par[3]+(zRear-dRear-zAbsStart);
138   par[16] = rAbs   + (par[15] - par[12]) * TMath::Tan(thetaOpen1) ;
139   par[17] = par[14] + (par[15] - par[12]) * TMath::Tan(accMax);
140
141   par[18] = par[3]+(zRear-dRear-zAbsStart);
142   par[19] = (zRear-dRear) * TMath::Tan(accMin);
143   par[20] = par[14] + (par[18] - par[12]) * TMath::Tan(accMax);
144
145   par[21] = -par[3];
146   par[22] =  zRear* TMath::Tan(accMin);
147   par[23] = par[20] + (par[21] - par[18]) * TMath::Tan(accMax);
148   gMC->Gsvolu("ABSS", "PCON", idtmed[kPb], par, 24);
149   { // Begin local scope for i
150       for (Int_t i=4; i<18; i+=3) par[i]  = 0;
151   } // End local scope for i
152   gMC->Gsvolu("ABSM", "PCON", idtmed[kVacuum+40], par, 24);
153   gMC->Gspos("ABSS", 1, "ABSM", 0., 0., 0., 0, "ONLY");
154
155 //
156 // Steel envelope
157 //
158   par[4] = par[5] -dSteel;
159   par[7] = par[8] -dSteel;
160   par[10]= par[11]-dSteel;  
161   par[13]= par[14]-dSteel;  
162   par[16]= par[17]-dSteel;  
163   par[19]= par[20]-dSteel;  
164   par[22]= par[23]-dSteel;  
165   gMC->Gsvolu("ABST", "PCON", idtmed[kSteel], par, 24);
166   gMC->Gspos("ABST", 1, "ABSS", 0., 0., 0., 0, "ONLY");
167 //
168 // Polyethylene shield
169 // 
170   cpar[0] = (zRear - zConeTPC) / 2.;
171   cpar[1] = zConeTPC * TMath::Tan(accMax);
172   cpar[2] = cpar[1] + dPoly;
173   cpar[3] = zRear * TMath::Tan(accMax);
174   cpar[4] = cpar[3] + dPoly;
175   gMC->Gsvolu("APOL", "CONE", idtmed[kPolyCH2+40], cpar, 5);
176   dz = (zRear-zAbsStart)/2.-cpar[0];
177   gMC->Gspos("APOL", 1, "ABSS", 0., 0., dz, 0, "ONLY");
178
179 //
180 // Tungsten nose to protect TPC
181 // 
182   cpar[0] = (zNose - zAbsStart) / 2.;
183   cpar[1] = zAbsStart * TMath::Tan(accMax);
184   cpar[2] = zAbsStart * TMath::Tan(theta1)-dSteel;
185   cpar[3] = zNose * TMath::Tan(accMax);
186   cpar[4] = zNose * TMath::Tan(theta1)-dSteel;
187   gMC->Gsvolu("ANOS", "CONE", idtmed[kW], cpar, 5);
188 //
189   dz = -(zRear-zAbsStart)/2.+cpar[0];
190   gMC->Gspos("ANOS", 1, "ABSS", 0., 0., dz, 0, "ONLY");
191 //
192 // Tungsten inner shield
193 //
194   Float_t zW=zTwoDeg+.1;
195   Float_t dZ = zW+(zRear-dRear-zW)/2.;
196   //
197   pcpar[0]  = 0.;
198   pcpar[1]  = 360.;
199   pcpar[2]  = 3.;
200   pcpar[3]  = zW-dZ;
201   pcpar[4]  = rAbs;
202   pcpar[5]  = zW * TMath::Tan(accMin);
203   pcpar[6]  = zOpen-dZ;
204   pcpar[7]  = rAbs;
205   pcpar[8]  = zOpen * TMath::Tan(accMin);
206   pcpar[9]  = zRear-dRear-dZ;
207   pcpar[10] = rAbs+(zRear-dRear-zOpen) * TMath::Tan(thetaOpen1);
208   pcpar[11] = (zRear-dRear) * TMath::Tan(accMin);
209   
210   gMC->Gsvolu("AWIN", "PCON", idtmed[kNiCuW+40], pcpar, 12);
211   //
212   dz=(zW+zRear-dRear)/2-(zAbsStart+zRear)/2.;
213   gMC->Gspos("AWIN", 1, "ABSS", 0., 0., dz, 0, "ONLY");
214
215   //     Inner tracking region
216   //
217   //     mother volume: Pb
218   //
219   pcpar[0]  = 0.;
220   pcpar[1]  = 360.;
221   pcpar[2]  = 3.;
222   pcpar[3]  = -(zRear-zAbsStart)/2.;
223   pcpar[4]  = rAbs;
224   pcpar[5]  = zAbsStart * TMath::Tan(accMax);
225   pcpar[6]  = pcpar[3]+(zTwoDeg-zAbsStart);
226   pcpar[7]  = rAbs;
227   pcpar[8]  = zTwoDeg * TMath::Tan(accMax);
228   pcpar[9]  = -pcpar[3];
229   pcpar[10] = zRear * TMath::Tan(accMin);
230   pcpar[11] = zRear * TMath::Tan(accMax);
231   gMC->Gsvolu("AITR", "PCON", idtmed[kPb], pcpar, 12);
232   //
233   // special Pb medium for last 5 cm of Pb
234   Float_t zr=zRear-2.-0.001;
235   cpar[0] = 1.0;
236   cpar[1] = zr * TMath::Tan(thetaR);
237   cpar[2] = zr * TMath::Tan(accMax);
238   cpar[3] = cpar[1] + TMath::Tan(thetaR) * 2;
239   cpar[4] = cpar[2] + TMath::Tan(accMax) * 2;
240   gMC->Gsvolu("ARPB", "CONE", idtmed[kPb], cpar, 5);
241   dz=(zRear-zAbsStart)/2.-cpar[0]-0.001;
242   gMC->Gspos("ARPB", 1, "AITR", 0., 0., dz, 0, "ONLY");
243   //
244   //     concrete cone: concrete 
245   //
246   pcpar[9]  = pcpar[3]+(zRear-dRear-zAbsStart);
247   pcpar[10] = (zRear-dRear) * TMath::Tan(accMin);
248   pcpar[11] = (zRear-dRear) * TMath::Tan(accMax);
249   gMC->Gsvolu("ACON", "PCON", idtmed[kConcrete+40], pcpar, 12);
250   gMC->Gspos("ACON", 1, "AITR", 0., 0., 0., 0, "ONLY");
251   //
252   //     carbon cone: carbon
253   //
254   pcpar[9]  = pcpar[3]+(zAbsCc-zAbsStart);
255   pcpar[10]  = zAbsCc * TMath::Tan(accMin);
256   pcpar[11]  = zAbsCc * TMath::Tan(accMax);
257   gMC->Gsvolu("ACAR", "PCON", idtmed[kC+40], pcpar, 12);
258   gMC->Gspos("ACAR", 1, "ACON", 0., 0., 0., 0, "ONLY");
259  //
260  //     carbon cone outer region
261  //
262   cpar[0]  = 10.;
263   cpar[1]  = rAbs;
264   cpar[2]  = zAbsStart* TMath::Tan(accMax);
265   cpar[3]  = rAbs;
266   cpar[4]  = cpar[2]+2. * cpar[0] * TMath::Tan(accMax);
267
268   gMC->Gsvolu("ACAO", "CONE", idtmed[kC], cpar, 5);
269   dz=-(zRear-zAbsStart)/2.+cpar[0];
270   gMC->Gspos("ACAO", 1, "ACAR", 0., 0., dz, 0, "ONLY");
271   //
272   //     inner W shield
273   Float_t epsi=0.;
274   Float_t repsi=1.;
275   
276   zr=zRear-(dRear-epsi);
277   cpar[0] = (dRear-epsi)/2.;
278   cpar[1] = zr * TMath::Tan(accMin);
279   cpar[2] = zr * TMath::Tan(thetaR*repsi);
280   cpar[3] = cpar[1] + TMath::Tan(accMin) * (dRear-epsi);
281   cpar[4] = cpar[2] + TMath::Tan(thetaR*repsi) * (dRear-epsi);
282   gMC->Gsvolu("ARW0", "CONE", idtmed[kNiCuW+40], cpar, 5);
283   dz=(zRear-zAbsStart)/2.-cpar[0];
284   gMC->Gspos("ARW0", 1, "AITR", 0., 0., dz, 0, "ONLY");
285   //
286   // special W medium for last 5 cm of W
287   zr=zRear-5;
288   cpar[0] = 2.5;
289   cpar[1] = zr * TMath::Tan(accMin);
290   cpar[2] = zr * TMath::Tan(thetaR*repsi);
291   cpar[3] = cpar[1] + TMath::Tan(accMin) * 5.;
292   cpar[4] = cpar[2] + TMath::Tan(thetaR*repsi) * 5.;
293   gMC->Gsvolu("ARW1", "CONE", idtmed[kNiCuW+20], cpar, 5);
294   dz=(dRear-epsi)/2.-cpar[0];
295   gMC->Gspos("ARW1", 1, "ARW0", 0., 0., dz, 0, "ONLY");
296   //
297   // PolyEthylene Layers
298   Float_t drMin=TMath::Tan(thetaR) * 5;
299   Float_t drMax=TMath::Tan(accMax) * 5;
300   gMC->Gsvolu("ARPE", "CONE", idtmed[kPolyCH2], cpar, 0);
301   cpar[0]=2.5;
302   { // Begin local scope for i
303       for (Int_t i=0; i<3; i++) {
304           zr=zRear-dRear+5+i*10.;
305           cpar[1] = zr * TMath::Tan(thetaR);
306           cpar[2] = zr * TMath::Tan(accMax);
307           cpar[3] = cpar[1] + drMin;
308           cpar[4] = cpar[2] + drMax;
309           dz=(zRear-zAbsStart)/2.-cpar[0]-5.-(2-i)*10;
310           gMC->Gsposp("ARPE", i+1, "AITR", 0., 0., dz, 0, "ONLY",cpar,5);
311       }
312   } // End local scope for i
313   gMC->Gspos("AITR", 1, "ABSS", 0., 0., 0., 0, "ONLY"); 
314   dz = (zRear-zAbsStart)/2.+zAbsStart;
315   gMC->Gspos("ABSM", 1, "ALIC", 0., 0., dz, 0, "ONLY"); 
316 //
317 //
318 // vacuum system
319 //
320 // pipe and heating jackets
321 //
322 //
323 // cylindrical piece
324   tpar0[2]=(zOpen-zAbsStart)/2;
325   tpar0[0]=rVacu;
326   tpar0[1]=rAbs;
327   gMC->Gsvolu("AV11", "TUBE", idtmed[kSteel+40], tpar0, 3);
328 //
329 // insulation
330
331   tpar[2]=tpar0[2];
332   tpar[0]=rVacu+dTube;
333   tpar[1]=tpar[0]+dInsu;
334   gMC->Gsvolu("AI11", "TUBE", idtmed[kInsulation+40], tpar, 3);
335   gMC->Gspos("AI11", 1, "AV11", 0., 0., 0., 0, "ONLY"); 
336 //
337 // clearance 
338   tpar[0]=tpar[1]+dEnve;
339   tpar[1]=tpar[0]+dFree;
340   gMC->Gsvolu("AP11", "TUBE", idtmed[kAir+40], tpar, 3);
341   gMC->Gspos("AP11", 1, "AV11", 0., 0., 0., 0, "ONLY"); 
342 //
343   dz=-(zRear-zAbsStart)/2.+tpar0[2];
344   gMC->Gspos("AV11", 1, "ABSM", 0., 0., dz, 0, "ONLY"); 
345 //
346 // conical piece
347
348   cpar0[0]=(zRear-dRear-zOpen)/2;
349   cpar0[1]=rVacu-0.05;
350   cpar0[2]=rAbs;
351   Float_t dR=2.*cpar0[0]*TMath::Tan(thetaOpen1);
352   cpar0[3]=cpar0[1]+dR;
353   cpar0[4]=cpar0[2]+dR;
354   gMC->Gsvolu("AV21", "CONE", idtmed[kSteel+40], cpar0, 5);
355   dTube+=0.05;
356
357 //
358 // insulation
359   cpar[0]=cpar0[0];
360   cpar[1]=cpar0[1]+dTube;
361   cpar[2]=cpar0[1]+dTube+dInsu;
362   cpar[3]=cpar0[3]+dTube;
363   cpar[4]=cpar0[3]+dTube+dInsu;
364   gMC->Gsvolu("AI21", "CONE", idtmed[kInsulation+40], cpar, 5);
365   gMC->Gspos("AI21", 1, "AV21", 0., 0., 0., 0, "ONLY"); 
366 //
367 // clearance
368   cpar[1]=cpar0[1]+dTube+dInsu+dEnve;
369   cpar[2]=rAbs;
370   cpar[3]=cpar0[1]+dTube+dInsu+dEnve+dR;
371   cpar[4]=rAbs+dR;
372
373   gMC->Gsvolu("AP21", "CONE", idtmed[kAir+40], cpar, 5);
374   gMC->Gspos("AP21", 1, "AV21", 0., 0., 0., 0, "ONLY"); 
375   
376   dz=(zRear-zAbsStart)/2.-cpar0[0]-dRear;
377   gMC->Gspos("AV21", 1, "ABSM", 0., 0., dz, 0, "ONLY"); 
378 }
379
380 //_____________________________________________________________________________
381
382 void AliABSOv0::Init()
383 {
384   //
385   // Initialisation of the muon absorber after it has been built
386   Int_t i;
387   //
388   printf("\n");
389   for(i=0;i<35;i++) printf("*");
390   printf(" ABSOv0_INIT ");
391   for(i=0;i<35;i++) printf("*");
392   printf("\n");
393   //
394   for(i=0;i<80;i++) printf("*");
395   printf("\n");
396 }
397  
398
399
400
401
402
403
404
405
406