]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STRUCT/AliABSOvF.cxx
Changed definition of TOPDIR
[u/mrichter/AliRoot.git] / STRUCT / AliABSOvF.cxx
CommitLineData
5aba2f60 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$
43ea1292 18Revision 1.3 2001/01/12 13:14:49 morsch
19Store absorber composition information in fMLayers and fZLayers
20Rear: 25 cm Fe + 4*5cm Pb + 3*5cm PolyCH2
21
5aba2f60 22*/
23
24// //
25// //
26///////////////////////////////////////////////////////////////////////////////
27
28#include "AliABSOvF.h"
29#include "AliRun.h"
30#include "AliConst.h"
31#include "AliALIFE.h"
32
33ClassImp(AliABSOvF)
34
35//_____________________________________________________________________________
36AliABSOvF::AliABSOvF()
37{
38 //
39 // Default constructor
40 //
41}
42
43//_____________________________________________________________________________
44AliABSOvF::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//_____________________________________________________________________________
56void 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"
fb25e598 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//
5aba2f60 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);
fb25e598 218 gMC->Gsvolu("AITR", "PCON", idtmed[fMLayers[0][4]], pcpar, 12);
5aba2f60 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;
fb25e598 227 gMC->Gsvolu("ARPB", "CONE", idtmed[fMLayers[0][4]], cpar, 5);
5aba2f60 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);
fb25e598 236 gMC->Gsvolu("ACON", "PCON", idtmed[fMLayers[0][2]+40], pcpar, 12);
5aba2f60 237 gMC->Gspos("ACON", 1, "AITR", 0., 0., 0., 0, "ONLY");
fb25e598 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
5aba2f60 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);
fb25e598 260 gMC->Gsvolu("ACAR", "PCON", idtmed[fMLayers[0][1]+40], pcpar, 12);
5aba2f60 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
fb25e598 271 gMC->Gsvolu("ACAO", "CONE", idtmed[fMLayers[0][1]], cpar, 5);
5aba2f60 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);
fb25e598 285 gMC->Gsvolu("ARW0", "CONE", idtmed[fMLayers[1][4]+40], cpar, 5);
5aba2f60 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.;
fb25e598 296 gMC->Gsvolu("ARW1", "CONE", idtmed[fMLayers[1][4]+20], cpar, 5);
5aba2f60 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;
fb25e598 303 gMC->Gsvolu("ARPE", "CONE", idtmed[fMLayers[0][5]], cpar, 0);
5aba2f60 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,
0cc503f6 378 "NIW", "MF", "$SHH");
5aba2f60 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.,
0cc503f6 439 zOpen, zRear-dRear, pos, "NIW", "MF", "$SHH");
5aba2f60 440
441 flukaGeom->Finish();
442 delete flukaGeom;
443
444//
445// end Fluka
446}
447
448//_____________________________________________________________________________
449
450void 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