]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STRUCT/AliABSOvF.cxx
User stepping methods added (E. Futo)
[u/mrichter/AliRoot.git] / STRUCT / AliABSOvF.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.3  2001/01/12 13:14:49  morsch
19 Store absorber composition information in fMLayers and fZLayers
20 Rear: 25 cm Fe + 4*5cm Pb + 3*5cm PolyCH2
21
22 */
23
24 //                                                                           //
25 //                                                                           //
26 ///////////////////////////////////////////////////////////////////////////////
27
28 #include "AliABSOvF.h"
29 #include "AliRun.h"
30 #include "AliConst.h"
31 #include "AliALIFE.h"
32
33 ClassImp(AliABSOvF)
34  
35 //_____________________________________________________________________________
36 AliABSOvF::AliABSOvF()
37 {
38   //
39   // Default constructor
40   //
41 }
42  
43 //_____________________________________________________________________________
44 AliABSOvF::AliABSOvF(const char *name, const char *title)
45        : AliABSO(name,title)
46 {
47   //
48   // Standard constructor
49   //
50   SetMarkerColor(7);
51   SetMarkerStyle(2);
52   SetMarkerSize(0.4);
53 }
54  
55 //_____________________________________________________________________________
56 void AliABSOvF::CreateGeometry()
57 {
58 // Create the absorber geometry 
59 // The inner part of the absorber (shield) is written also in ALIFE format
60 //
61     enum {kC=1605, kAl=1608, kFe=1609, kCu=1610, kW=1611, kPb=1612,
62                   kNiCuW=1620, kVacuum=1615, kAir=1614, kConcrete=1616,
63                   kPolyCH2=1617, kSteel=1609, kInsulation=1613, kPolyCc=1619};    
64     
65     Int_t *idtmed = fIdtmed->GetArray()-1599;
66     
67     Float_t par[24], cpar[5], cpar0[5], pcpar[12], tpar[3], tpar0[3]; 
68     Float_t dz;
69
70     AliALIFE* flukaGeom = new AliALIFE("frontshield.alife", "abso_vol.inp");
71
72 #include "ABSOSHILConst.h"
73 #include "ABSOConst.h"
74     Float_t dzFe = 11.;
75 //
76 // 3 < theta < 9
77     fNLayers[0] = 11; 
78     fMLayers[0][ 0] = kAir;              fZLayers[0][ 0] = zAbsStart;
79     fMLayers[0][ 1] = kC;                fZLayers[0][ 1] = zAbsCc;             
80     fMLayers[0][ 2] = kConcrete;         fZLayers[0][ 2] = zRear-dRear-dzFe;
81     fMLayers[0][ 3] = kFe;               fZLayers[0][ 3] = zRear-dRear;
82     fMLayers[0][ 4] = kPb;               fZLayers[0][ 4] = fZLayers[0][3] + 5.;
83     fMLayers[0][ 5] = kPolyCH2;          fZLayers[0][ 5] = fZLayers[0][4] + 5.;
84     fMLayers[0][ 6] = kPb;               fZLayers[0][ 6] = fZLayers[0][5] + 5.;
85     fMLayers[0][ 7] = kPolyCH2;          fZLayers[0][ 7] = fZLayers[0][6] + 5.;
86     fMLayers[0][ 8] = kPb;               fZLayers[0][ 8] = fZLayers[0][7] + 5.;
87     fMLayers[0][ 9] = kPolyCH2;          fZLayers[0][ 9] = fZLayers[0][8] + 5.;
88     fMLayers[0][10] = kPb;               fZLayers[0][10] = zRear;
89 // 2 < theta < 3
90     fNLayers[1] = 5; 
91     fMLayers[1][0] = fMLayers[0][0];      fZLayers[1][0] = fZLayers[0][0];
92     fMLayers[1][1] = fMLayers[0][1];      fZLayers[1][1] = fZLayers[0][1];
93     fMLayers[1][2] = fMLayers[0][2];      fZLayers[1][2] = fZLayers[0][2];
94     fMLayers[1][3] = fMLayers[0][3];      fZLayers[1][3] = fZLayers[0][3];
95     fMLayers[1][4] = kNiCuW;              fZLayers[1][4] = zRear;
96 //
97     Float_t dTube=0.1;                     // tube thickness
98     Float_t dInsu=0.5;                     // insulation thickness
99     Float_t dEnve=0.1;                     // protective envelope thickness
100     Float_t dFree=0.5;                     // clearance thickness
101
102
103 // Mother volume and outer shielding: Pb
104   par[0]  = 0.;
105   par[1]  = 360.;
106   par[2]  = 7.;
107     
108   par[3]  = -(zRear-zAbsStart)/2.;
109   par[4]  = rAbs;
110   par[5]  = zAbsStart * TMath::Tan(theta1);
111
112   par[6]  = par[3]+(zNose-zAbsStart);
113   par[7]  = rAbs;
114   par[8]  = zNose * TMath::Tan(theta1);
115
116   par[9]  = par[3]+(zConeTPC-zAbsStart);
117   par[10] = rAbs;
118   par[11] = par[8] + (par[9] - par[6]) * TMath::Tan(theta2);
119
120   par[12]  = par[3]+(zOpen-zAbsStart);
121   par[13] = rAbs;
122   par[14] = par[11] + (par[12] - par[9]) * TMath::Tan(accMax);
123
124   par[15] = par[3]+(zRear-dRear-zAbsStart);
125   par[16] = rAbs   + (par[15] - par[12]) * TMath::Tan(thetaOpen1) ;
126   par[17] = par[14] + (par[15] - par[12]) * TMath::Tan(accMax);
127
128   par[18] = par[3]+(zRear-dRear-zAbsStart);
129   par[19] = (zRear-dRear) * TMath::Tan(accMin);
130   par[20] = par[14] + (par[18] - par[12]) * TMath::Tan(accMax);
131
132   par[21] = -par[3];
133   par[22] =  zRear* TMath::Tan(accMin);
134   par[23] = par[20] + (par[21] - par[18]) * TMath::Tan(accMax);
135   gMC->Gsvolu("ABSS", "PCON", idtmed[kPb], par, 24);
136   { // Begin local scope for i
137       for (Int_t i=4; i<18; i+=3) par[i]  = 0;
138   } // End local scope for i
139   gMC->Gsvolu("ABSM", "PCON", idtmed[kVacuum+40], par, 24);
140   gMC->Gspos("ABSS", 1, "ABSM", 0., 0., 0., 0, "ONLY");
141
142 //
143 // Steel envelope
144 //
145   par[4] = par[5] -dSteel;
146   par[7] = par[8] -dSteel;
147   par[10]= par[11]-dSteel;  
148   par[13]= par[14]-dSteel;  
149   par[16]= par[17]-dSteel;  
150   par[19]= par[20]-dSteel;  
151   par[22]= par[23]-dSteel;  
152   gMC->Gsvolu("ABST", "PCON", idtmed[kSteel], par, 24);
153   gMC->Gspos("ABST", 1, "ABSS", 0., 0., 0., 0, "ONLY");
154 //
155 // Polyethylene shield
156 // 
157   cpar[0] = (zRear - zConeTPC) / 2.;
158   cpar[1] = zConeTPC * TMath::Tan(accMax);
159   cpar[2] = cpar[1] + dPoly;
160   cpar[3] = zRear * TMath::Tan(accMax);
161   cpar[4] = cpar[3] + dPoly;
162   gMC->Gsvolu("APOL", "CONE", idtmed[kPolyCH2+40], cpar, 5);
163   dz = (zRear-zAbsStart)/2.-cpar[0];
164   gMC->Gspos("APOL", 1, "ABSS", 0., 0., dz, 0, "ONLY");
165
166 //
167 // Tungsten nose to protect TPC
168 // 
169   cpar[0] = (zNose - zAbsStart) / 2.;
170   cpar[1] = zAbsStart * TMath::Tan(accMax);
171   cpar[2] = zAbsStart * TMath::Tan(theta1)-dSteel;
172   cpar[3] = zNose * TMath::Tan(accMax);
173   cpar[4] = zNose * TMath::Tan(theta1)-dSteel;
174   gMC->Gsvolu("ANOS", "CONE", idtmed[kW], cpar, 5);
175 //
176   dz = -(zRear-zAbsStart)/2.+cpar[0];
177   gMC->Gspos("ANOS", 1, "ABSS", 0., 0., dz, 0, "ONLY");
178 //
179 // Tungsten inner shield
180 //
181   Float_t zW=zTwoDeg+.1;
182   Float_t dZ = zW+(zRear-dRear-zW)/2.;
183   //
184   pcpar[0]  = 0.;
185   pcpar[1]  = 360.;
186   pcpar[2]  = 3.;
187   pcpar[3]  = zW-dZ;
188   pcpar[4]  = rAbs;
189   pcpar[5]  = zW * TMath::Tan(accMin);
190   pcpar[6]  = zOpen-dZ;
191   pcpar[7]  = rAbs;
192   pcpar[8]  = zOpen * TMath::Tan(accMin);
193   pcpar[9]  = zRear-dRear-dZ;
194   pcpar[10] = rAbs+(zRear-dRear-zOpen) * TMath::Tan(thetaOpen1);
195   pcpar[11] = (zRear-dRear) * TMath::Tan(accMin);
196   
197   gMC->Gsvolu("AWIN", "PCON", idtmed[kNiCuW+40], pcpar, 12);
198   //
199   dz=(zW+zRear-dRear)/2-(zAbsStart+zRear)/2.;
200   gMC->Gspos("AWIN", 1, "ABSS", 0., 0., dz, 0, "ONLY");
201
202   //     Inner tracking region
203   //
204   //     mother volume: Pb
205   //
206   pcpar[0]  = 0.;
207   pcpar[1]  = 360.;
208   pcpar[2]  = 3.;
209   pcpar[3]  = -(zRear-zAbsStart)/2.;
210   pcpar[4]  = rAbs;
211   pcpar[5]  = zAbsStart * TMath::Tan(accMax);
212   pcpar[6]  = pcpar[3]+(zTwoDeg-zAbsStart);
213   pcpar[7]  = rAbs;
214   pcpar[8]  = zTwoDeg * TMath::Tan(accMax);
215   pcpar[9]  = -pcpar[3];
216   pcpar[10] = zRear * TMath::Tan(accMin);
217   pcpar[11] = zRear * TMath::Tan(accMax);
218   gMC->Gsvolu("AITR", "PCON", idtmed[fMLayers[0][4]], pcpar, 12);
219   //
220   // special Pb medium for last 5 cm of Pb
221   Float_t zr=zRear-2.-0.001;
222   cpar[0] = 1.0;
223   cpar[1] = zr * TMath::Tan(thetaR);
224   cpar[2] = zr * TMath::Tan(accMax);
225   cpar[3] = cpar[1] + TMath::Tan(thetaR) * 2;
226   cpar[4] = cpar[2] + TMath::Tan(accMax) * 2;
227   gMC->Gsvolu("ARPB", "CONE", idtmed[fMLayers[0][4]], cpar, 5);
228   dz=(zRear-zAbsStart)/2.-cpar[0]-0.001;
229   gMC->Gspos("ARPB", 1, "AITR", 0., 0., dz, 0, "ONLY");
230   //
231   //     concrete cone: concrete 
232   //
233   pcpar[9]  = pcpar[3]+(zRear-dRear-zAbsStart);
234   pcpar[10] = (zRear-dRear) * TMath::Tan(accMin);
235   pcpar[11] = (zRear-dRear) * TMath::Tan(accMax);
236   gMC->Gsvolu("ACON", "PCON", idtmed[fMLayers[0][2]+40], pcpar, 12);
237   gMC->Gspos("ACON", 1, "AITR", 0., 0., 0., 0, "ONLY");
238 //
239 //    Fe Cone 
240 //
241   zr = zRear-dRear-dzFe-1.;
242   cpar[0]  = dzFe/2.;
243   cpar[1] = zr * TMath::Tan(accMin);
244   cpar[2] = zr * TMath::Tan(accMax);
245   cpar[3] = cpar[1] + TMath::Tan(thetaR) * dzFe;
246   cpar[4] = cpar[2] + TMath::Tan(accMax) * dzFe;
247   gMC->Gsvolu("ACFE", "CONE",idtmed[fMLayers[0][3]], cpar, 5);
248
249   dz = (zRear-zAbsStart)/2.-dRear-dzFe/2.-1.;
250   
251   gMC->Gspos("ACFE", 1, "ACON", 0., 0., dz, 0, "ONLY");
252
253
254   //
255   //     carbon cone: carbon
256   //
257   pcpar[9]  = pcpar[3]+(zAbsCc-zAbsStart);
258   pcpar[10]  = zAbsCc * TMath::Tan(accMin);
259   pcpar[11]  = zAbsCc * TMath::Tan(accMax);
260   gMC->Gsvolu("ACAR", "PCON", idtmed[fMLayers[0][1]+40], pcpar, 12);
261   gMC->Gspos("ACAR", 1, "ACON", 0., 0., 0., 0, "ONLY");
262  //
263  //     carbon cone outer region
264  //
265   cpar[0]  = 10.;
266   cpar[1]  = rAbs;
267   cpar[2]  = zAbsStart* TMath::Tan(accMax);
268   cpar[3]  = rAbs;
269   cpar[4]  = cpar[2]+2. * cpar[0] * TMath::Tan(accMax);
270
271   gMC->Gsvolu("ACAO", "CONE", idtmed[fMLayers[0][1]], cpar, 5);
272   dz=-(zRear-zAbsStart)/2.+cpar[0];
273   gMC->Gspos("ACAO", 1, "ACAR", 0., 0., dz, 0, "ONLY");
274   //
275   //     inner W shield
276   Float_t epsi=0.;
277   Float_t repsi=1.;
278   
279   zr=zRear-(dRear-epsi);
280   cpar[0] = (dRear-epsi)/2.;
281   cpar[1] = zr * TMath::Tan(accMin);
282   cpar[2] = zr * TMath::Tan(thetaR*repsi);
283   cpar[3] = cpar[1] + TMath::Tan(accMin) * (dRear-epsi);
284   cpar[4] = cpar[2] + TMath::Tan(thetaR*repsi) * (dRear-epsi);
285   gMC->Gsvolu("ARW0", "CONE", idtmed[fMLayers[1][4]+40], cpar, 5);
286   dz=(zRear-zAbsStart)/2.-cpar[0];
287   gMC->Gspos("ARW0", 1, "AITR", 0., 0., dz, 0, "ONLY");
288   //
289   // special W medium for last 5 cm of W
290   zr=zRear-5;
291   cpar[0] = 2.5;
292   cpar[1] = zr * TMath::Tan(accMin);
293   cpar[2] = zr * TMath::Tan(thetaR*repsi);
294   cpar[3] = cpar[1] + TMath::Tan(accMin) * 5.;
295   cpar[4] = cpar[2] + TMath::Tan(thetaR*repsi) * 5.;
296   gMC->Gsvolu("ARW1", "CONE", idtmed[fMLayers[1][4]+20], cpar, 5);
297   dz=(dRear-epsi)/2.-cpar[0];
298   gMC->Gspos("ARW1", 1, "ARW0", 0., 0., dz, 0, "ONLY");
299   //
300   // PolyEthylene Layers
301   Float_t drMin=TMath::Tan(thetaR) * 5;
302   Float_t drMax=TMath::Tan(accMax) * 5;
303   gMC->Gsvolu("ARPE", "CONE", idtmed[fMLayers[0][5]], cpar, 0);
304   cpar[0]=2.5;
305   { // Begin local scope for i
306       for (Int_t i=0; i<3; i++) {
307           zr=zRear-dRear+5+i*10.;
308           cpar[1] = zr * TMath::Tan(thetaR);
309           cpar[2] = zr * TMath::Tan(accMax);
310           cpar[3] = cpar[1] + drMin;
311           cpar[4] = cpar[2] + drMax;
312           dz=(zRear-zAbsStart)/2.-cpar[0]-5.-(2-i)*10;
313           gMC->Gsposp("ARPE", i+1, "AITR", 0., 0., dz, 0, "ONLY",cpar,5);
314       }
315   } // End local scope for i
316   gMC->Gspos("AITR", 1, "ABSS", 0., 0., 0., 0, "ONLY"); 
317   dz = (zRear-zAbsStart)/2.+zAbsStart;
318   gMC->Gspos("ABSM", 1, "ALIC", 0., 0., dz, 0, "ONLY"); 
319 //
320 //
321 // vacuum system
322 //
323 // pipe and heating jackets
324 //
325 //
326 // cylindrical piece
327   tpar0[2]=(zOpen-zAbsStart)/2;
328   tpar0[0]=rVacu;
329   tpar0[1]=rAbs;
330   gMC->Gsvolu("AV11", "TUBE", idtmed[kSteel+40], tpar0, 3);
331 //
332 // insulation
333
334   tpar[2]=tpar0[2];
335   tpar[0]=rVacu+dTube;
336   tpar[1]=tpar[0]+dInsu;
337   gMC->Gsvolu("AI11", "TUBE", idtmed[kInsulation+40], tpar, 3);
338   gMC->Gspos("AI11", 1, "AV11", 0., 0., 0., 0, "ONLY"); 
339 //
340 // clearance 
341   tpar[0]=tpar[1]+dEnve;
342   tpar[1]=tpar[0]+dFree;
343   gMC->Gsvolu("AP11", "TUBE", idtmed[kAir+40], tpar, 3);
344   gMC->Gspos("AP11", 1, "AV11", 0., 0., 0., 0, "ONLY"); 
345 //
346   dz=-(zRear-zAbsStart)/2.+tpar0[2];
347   gMC->Gspos("AV11", 1, "ABSM", 0., 0., dz, 0, "ONLY"); 
348
349 //
350 // begin Fluka
351 // Float_t zTwoDeg1=zTwoDeg-0.9/TMath::Tan(accMin);
352   Float_t pos[3]={0.,0.,0.};
353   Float_t r[8];
354   r[0]=0.;
355   r[1]=rVacu;
356   r[2]=r[1]+0.1;
357   r[3]=r[2]+0.5;  
358   r[4]=r[3]+0.1;
359   r[5]=r[4]+0.5;
360
361   char* materialsA[7] 
362       = {"VACUUM", "STEEL", "PIPEINSU", "STEEL", "AIR", "AIR"};
363   char* fieldsA[7] 
364       = {"MF", "MF", "MF", "MF", "MF", "MF"};
365   char* cutsA[7] 
366       = {"$SHH", "$SHH", "$SHH", "$SHH", "$SHH", "$SHH"};
367   char* materialsB[7] 
368       = {"VACUUM", "STEEL", "PIPEINSU", "STEEL", "AIR", "CARBON"};
369   char* fieldsB[7] 
370       = {"MF", "MF", "MF", "MF", "MF", "MF"};
371   char* cutsB[7] 
372       = {"$SHH", "$SHH", "$SHH", "$SHH", "$SHH", "$SHS"};
373
374   flukaGeom->Comment("Front Absorber Cylyndrical Section");
375   flukaGeom->SetDefaultVolume("*ACR02","*ACR02" );
376   flukaGeom->OnionCylinder(r, 6 , zAbsStart, zOpen, pos, materialsB, fieldsB, cutsB);
377   flukaGeom->Cone(rAbs, rAbs, -rAbs, -rAbs, zTwoDeg, zOpen, pos, 
378               "NIW", "MF", "$SHH");  
379 //
380 // end Fluka
381
382 //
383 // conical piece
384
385   cpar0[0]=(zRear-dRear-zOpen)/2;
386   cpar0[1]=rVacu-0.05;
387   cpar0[2]=rAbs;
388   Float_t dR=2.*cpar0[0]*TMath::Tan(thetaOpen1);
389   cpar0[3]=cpar0[1]+dR;
390   cpar0[4]=cpar0[2]+dR;
391   gMC->Gsvolu("AV21", "CONE", idtmed[kSteel+40], cpar0, 5);
392   dTube+=0.05;
393
394 //
395 // insulation
396   cpar[0]=cpar0[0];
397   cpar[1]=cpar0[1]+dTube;
398   cpar[2]=cpar0[1]+dTube+dInsu;
399   cpar[3]=cpar0[3]+dTube;
400   cpar[4]=cpar0[3]+dTube+dInsu;
401   gMC->Gsvolu("AI21", "CONE", idtmed[kInsulation+40], cpar, 5);
402   gMC->Gspos("AI21", 1, "AV21", 0., 0., 0., 0, "ONLY"); 
403 //
404 // clearance
405   cpar[1]=cpar0[1]+dTube+dInsu+dEnve;
406   cpar[2]=rAbs;
407   cpar[3]=cpar0[1]+dTube+dInsu+dEnve+dR;
408   cpar[4]=rAbs+dR;
409
410   gMC->Gsvolu("AP21", "CONE", idtmed[kAir+40], cpar, 5);
411   gMC->Gspos("AP21", 1, "AV21", 0., 0., 0., 0, "ONLY"); 
412   
413   dz=(zRear-zAbsStart)/2.-cpar0[0]-dRear;
414   gMC->Gspos("AV21", 1, "ABSM", 0., 0., dz, 0, "ONLY"); 
415 //
416 // begin Fluka
417 //
418   Float_t r1[7], r2[7];
419   r1[0]=0.;
420   r2[0]=0.;
421   r1[1]=rVacu-0.05;
422   r2[1]=cpar0[3];
423
424   r1[2]=r1[1]+0.15;
425   r1[3]=r1[2]+0.5;  
426   r1[4]=r1[3]+0.1;
427   r1[5]=r1[4]+0.5;
428   r1[6]=cpar0[2];
429
430   r2[2]=r2[1]+0.15;
431   r2[3]=r2[2]+0.5;  
432   r2[4]=r2[3]+0.1;
433   r2[5]=r2[4]+0.5;
434   r2[6]=cpar0[4];
435
436   flukaGeom->Comment("Front Absorber Conical Section");
437   flukaGeom->OnionCone(r1, r2,  7 , zOpen, zRear-dRear, pos, materialsA, fieldsA, cutsA);
438   flukaGeom->Cone(r1[6], r2[6], -1., -1., 
439               zOpen, zRear-dRear, pos, "NIW", "MF", "$SHH"); 
440
441   flukaGeom->Finish();
442   delete flukaGeom;
443   
444 //
445 // end Fluka
446 }
447
448 //_____________________________________________________________________________
449
450 void AliABSOvF::Init()
451 {
452   //
453   // Initialisation of the muon absorber after it has been built
454   Int_t i;
455   //
456   printf("\n");
457   for(i=0;i<35;i++) printf("*");
458   printf(" ABSOvF_INIT ");
459   for(i=0;i<35;i++) printf("*");
460   printf("\n");
461   //
462   for(i=0;i<80;i++) printf("*");
463   printf("\n");
464 }
465  
466
467
468
469
470
471
472
473
474