Project
Loading...
Searching...
No Matches
Absorber.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12// -------------------------------------------------------------------------
13// ----- main responsible: Sandro Wenzel (sandro.wenzel@cern.ch) -----
14// -------------------------------------------------------------------------
15
18#include <DetectorsPassive/Absorber.h>
19#include <TGeoArb8.h> // for TGeoTrap
20#include <TGeoCompositeShape.h>
21#include <TGeoCone.h>
22#include <TGeoManager.h>
23#include <TGeoMatrix.h>
24#include <TGeoPcon.h>
25#include <TGeoPgon.h>
26#include <TGeoTube.h>
27#include <TGeoVolume.h>
28#ifdef NDEBUG
29#undef NDEBUG
30#endif
31#include <cassert>
32
33using namespace o2::passive;
34
35Absorber::~Absorber() = default;
36
38Absorber::Absorber(const char* name, const char* Title) : PassiveBase(name, Title) {}
39Absorber::Absorber(const Absorber& rhs) = default;
40
41Absorber& Absorber::operator=(const Absorber& rhs)
42{
43 // self assignment
44 if (this == &rhs) {
45 return *this;
46 }
47
48 // base class assignment
49 FairModule::operator=(rhs);
50
51 return *this;
52}
53
55{
57 // Define materials for muon absorber
58 //
59 Int_t isxfld = 2.;
60 Float_t sxmgmx = 10.;
62
63 //
64 // Air
65 //
66 Float_t aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
67 Float_t zAir[4] = {6., 7., 8., 18.};
68 Float_t wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
69 Float_t dAir = 1.20479E-3;
70 Float_t dAir1 = 1.20479E-10;
71 //
72 // Polyethylene
73 //
74 Float_t apoly[2] = {12.01, 1.};
75 Float_t zpoly[2] = {6., 1.};
76 Float_t wpoly[2] = {.33, .67};
77 //
78 // Concrete
79 //
80 Float_t aconc[10] = {1., 12.01, 15.994, 22.99, 24.305, 26.98, 28.086, 39.1, 40.08, 55.85};
81 Float_t zconc[10] = {1., 6., 8., 11., 12., 13., 14., 19., 20., 26.};
82 Float_t wconc[10] = {.01, .001, .529107, .016, .002, .033872, .337021, .013, .044, .014};
83 //
84 // Steel
85 //
86 Float_t asteel[4] = {55.847, 51.9961, 58.6934, 28.0855};
87 Float_t zsteel[4] = {26., 24., 28., 14.};
88 Float_t wsteel[4] = {.715, .18, .1, .005};
89 //
90 // Ni-Cu-W alloy
91 //
92 Float_t aniwcu[3] = {58.6934, 183.84, 63.546};
93 Float_t zniwcu[3] = {28., 74., 29};
94 Float_t wniwcu[3] = {0.015, 0.95, 0.035};
95
96 //
97 // Insulation powder
98 // Si O Ti Al
99 Float_t ains[4] = {28.0855, 15.9994, 47.867, 26.982};
100 Float_t zins[4] = {14., 8., 22., 13.};
101 Float_t wins[4] = {0.3019, 0.4887, 0.1914, 0.018};
102
103 // ****************
104 // Defines tracking media parameters.
105 //
106 Float_t epsil, stmin, tmaxfd, deemax, stemax;
107 epsil = .001; // Tracking precision,
108 stemax = -0.01; // Maximum displacement for multiple scat
109 tmaxfd = -20.; // Maximum angle due to field deflection
110 deemax = -.3; // Maximum fractional energy loss, DLS
111 stmin = -.8;
112 // ***************
113 //
114
115 // Carbon Material and Medium
116 //
117 matmgr.Material("ABSO", 6, "CARBON0$", 12.01, 6., 1.75, 24.4, 49.9);
118 matmgr.Material("ABSO", 26, "CARBON1$", 12.01, 6., 1.75, 24.4, 49.9);
119 matmgr.Material("ABSO", 46, "CARBON2$", 12.01, 6., 1.75, 24.4, 49.9);
120 matmgr.Medium("ABSO", 6, "C_C0", 6, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
121 matmgr.Medium("ABSO", 26, "C_C1", 26, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
122 matmgr.Medium("ABSO", 46, "C_C2", 46, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
123
124 //
125 // Aluminum Material and Medium
126 matmgr.Material("ABSO", 9, "ALUMINIUM0$", 26.98, 13., 2.7, 8.9, 37.2);
127 matmgr.Material("ABSO", 29, "ALUMINIUM1$", 26.98, 13., 2.7, 8.9, 37.2);
128 matmgr.Material("ABSO", 49, "ALUMINIUM2$", 26.98, 13., 2.7, 8.9, 37.2);
129 matmgr.Medium("ABSO", 9, "ALU_C0", 9, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
130 matmgr.Medium("ABSO", 29, "ALU_C1", 29, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
131 matmgr.Medium("ABSO", 49, "ALU_C2", 49, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
132
133 //
134 // Magnesium
135 matmgr.Material("ABSO", 7, "MAGNESIUM$", 24.31, 12., 1.74, 25.3, 46.0);
136 matmgr.Medium("ABSO", 7, "MG_C0", 7, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
137
138 //
139 // Ni-W-Cu
140 matmgr.Mixture("ABSO", 21, "Ni-W-Cu0$", aniwcu, zniwcu, 18.78, 3, wniwcu);
141 matmgr.Mixture("ABSO", 41, "Ni-W-Cu1$", aniwcu, zniwcu, 18.78, 3, wniwcu);
142 matmgr.Mixture("ABSO", 61, "Ni-W-Cu2$", aniwcu, zniwcu, 18.78, 3, wniwcu);
143 matmgr.Medium("ABSO", 21, "Ni/W0", 21, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
144 matmgr.Medium("ABSO", 41, "Ni/W1", 41, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
145 matmgr.Medium("ABSO", 61, "Ni/W3", 61, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
146
147 //
148 // Lead
149 matmgr.Material("ABSO", 13, "LEAD0$", 207.19, 82., 11.35, .56, 18.5);
150 matmgr.Material("ABSO", 33, "LEAD1$", 207.19, 82., 11.35, .56, 18.5);
151 matmgr.Material("ABSO", 53, "LEAD2$", 207.19, 82., 11.35, .56, 18.5);
152 matmgr.Medium("ABSO", 13, "PB_C0", 13, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
153 matmgr.Medium("ABSO", 33, "PB_C1", 33, 0, isxfld, sxmgmx, tmaxfd, -stemax, deemax, epsil, stmin);
154 matmgr.Medium("ABSO", 53, "PB_C2", 53, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
155
156 //
157 // Insulation Powder
158 matmgr.Mixture("ABSO", 14, "INSULATION0$", ains, zins, 0.41, 4, wins);
159 matmgr.Mixture("ABSO", 34, "INSULATION1$", ains, zins, 0.41, 4, wins);
160 matmgr.Mixture("ABSO", 54, "INSULATION2$", ains, zins, 0.41, 4, wins);
161 matmgr.Medium("ABSO", 14, "INS_C0", 14, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
162 matmgr.Medium("ABSO", 34, "INS_C1", 34, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
163 matmgr.Medium("ABSO", 54, "INS_C2", 54, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
164
165 //
166 // Air
167 matmgr.Mixture("ABSO", 15, "AIR0$", aAir, zAir, dAir, 4, wAir);
168 matmgr.Mixture("ABSO", 35, "AIR1$", aAir, zAir, dAir, 4, wAir);
169 matmgr.Mixture("ABSO", 55, "AIR2$", aAir, zAir, dAir, 4, wAir);
170 matmgr.Medium("ABSO", 15, "AIR_C0", 15, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
171 matmgr.Medium("ABSO", 35, "AIR_C1", 35, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
172 matmgr.Medium("ABSO", 55, "AIR_C2", 55, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
173
174 //
175 // Vacuum
176 matmgr.Mixture("ABSO", 16, "VACUUM0$", aAir, zAir, dAir1, 4, wAir);
177 matmgr.Mixture("ABSO", 36, "VACUUM1$", aAir, zAir, dAir1, 4, wAir);
178 matmgr.Mixture("ABSO", 56, "VACUUM2$", aAir, zAir, dAir1, 4, wAir);
179 matmgr.Medium("ABSO", 16, "VA_C0", 16, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
180 matmgr.Medium("ABSO", 36, "VA_C1", 36, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
181 matmgr.Medium("ABSO", 56, "VA_C2", 56, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
182
183 //
184 // Concrete
185 matmgr.Mixture("ABSO", 17, "CONCRETE0$", aconc, zconc, 2.35, 10, wconc);
186 matmgr.Mixture("ABSO", 37, "CONCRETE1$", aconc, zconc, 2.35, 10, wconc);
187 matmgr.Mixture("ABSO", 57, "CONCRETE2$", aconc, zconc, 2.35, 10, wconc);
188 matmgr.Medium("ABSO", 17, "CC_C0", 17, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
189 matmgr.Medium("ABSO", 37, "CC_C1", 37, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
190 matmgr.Medium("ABSO", 57, "CC_C2", 57, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
191
192 //
193 // Polyethilene CH2
194 matmgr.Mixture("ABSO", 18, "POLYETHYLEN0$", apoly, zpoly, .95, -2, wpoly);
195 matmgr.Mixture("ABSO", 38, "POLYETHYLEN1$", apoly, zpoly, .95, 2, wpoly);
196 matmgr.Mixture("ABSO", 58, "POLYETHYLEN2$", apoly, zpoly, .95, 2, wpoly);
197 matmgr.Medium("ABSO", 18, "CH2_C0", 18, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
198 matmgr.Medium("ABSO", 38, "CH2_C1", 38, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
199 matmgr.Medium("ABSO", 58, "CH2_C2", 58, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
200
201 //
202 // Steel
203 matmgr.Mixture("ABSO", 19, "STAINLESS STEEL0$", asteel, zsteel, 7.88, 4, wsteel);
204 matmgr.Mixture("ABSO", 39, "STAINLESS STEEL1$", asteel, zsteel, 7.88, 4, wsteel);
205 matmgr.Mixture("ABSO", 59, "STAINLESS STEEL2$", asteel, zsteel, 7.88, 4, wsteel);
206 matmgr.Medium("ABSO", 19, "ST_C0", 19, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
207 matmgr.Medium("ABSO", 39, "ST_C1", 39, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
208 matmgr.Medium("ABSO", 59, "ST_C3", 59, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
209}
210
211TGeoPcon* MakeShapeFromTemplate(const TGeoPcon* pcon, Float_t drMin, Float_t drMax)
212{
213
214 //
215 // Returns new shape based on a template changing
216 // the inner radii by drMin and the outer radii by drMax.
217 //
218 Int_t nz = pcon->GetNz();
219 TGeoPcon* cpcon = new TGeoPcon(0., 360., nz);
220 for (Int_t i = 0; i < nz; i++) {
221 cpcon->DefineSection(i, pcon->GetZ(i), pcon->GetRmin(i) + drMin, pcon->GetRmax(i) + drMax);
222 }
223 return cpcon;
224}
225
227{
229
230 //
231 // Build muon shield geometry
232 //
233 //
234
236 Float_t z, z0, dz;
237 //
238 // The top volume
239 //
240 TGeoVolume* barrel = gGeoManager->GetVolume("barrel");
241
242 //
243 // Media
244 //
245 auto kMedNiW = matmgr.getTGeoMedium("ABSO_Ni/W0");
246 auto kMedNiWsh = matmgr.getTGeoMedium("ABSO_Ni/W3");
247 //
248 auto kMedSteel = matmgr.getTGeoMedium("ABSO_ST_C0");
249 auto kMedSteelSh = matmgr.getTGeoMedium("ABSO_ST_C3");
250 //
251 auto kMedAir = matmgr.getTGeoMedium("ABSO_AIR_C0");
252 //
253 auto kMedPb = matmgr.getTGeoMedium("ABSO_PB_C0");
254 auto kMedPbSh = matmgr.getTGeoMedium("ABSO_PB_C2");
255 //
256 auto kMedConcSh = matmgr.getTGeoMedium("ABSO_CC_C2");
257 //
258 auto kMedCH2Sh = matmgr.getTGeoMedium("ABSO_CH2_C2");
259 //
260 auto kMedC = matmgr.getTGeoMedium("ABSO_C_C0");
261 auto kMedCsh = matmgr.getTGeoMedium("ABSO_C_C2");
262 //
263 auto kMedAlu = matmgr.getTGeoMedium("ABSO_ALU_C0");
264 //
265 auto kMedMg = matmgr.getTGeoMedium("ABSO_MG_C0");
266 //
267 const Float_t kDegRad = TMath::Pi() / 180.;
268
269 //
270 TGeoRotation* rotxz = new TGeoRotation("rotxz", 90., 0., 90., 90., 180., 0.);
272 // //
273 // Front Absorber //
274 // Drawing ALIP2A__0106 //
275 // //
276 // //
278 //
279 // Pos 1 Steel Envelope
280 // Pos 2 End Plate
281 // Pos 3 Flange (wrong arrow in the drawing)
282 // Pos 4 W Plate A
283 // Pos 5 W Plate B
284 // Pos 6 Tungsten Tube Part 1
285 // Pos 7 Tungsten Tube Part 2
286 // Pos 8 Tungsten Tube Part 3
287 // Pos 9 Tungsten Tube Part 4
288 // Pos 10 Tungsten Tail
289 // Pos 11 Graphite Cone
290 // Pos 12 Pb Cone
291 // Pos 13 Concrete Cone
292 // Pos 14 Polyethylene Parts
293 // Pos 15 Steel Plate 25 cm
294 // Pos 16 Steel Plate 31 cm
295 // Pos 17 Magnesium Ring
296 // Pos 18 Composite Ring
297 //
298 //
299 // Mimimum angle of the tracking region
300 const Float_t angle02 = TMath::Tan(2. * kDegRad);
301 // Maximum angle of the tracking region
302 const Float_t angle10 = TMath::Tan(10. * kDegRad);
303 // Opening angle of W rear plug
304 const Float_t angle03 = TMath::Tan(3. * kDegRad);
305 //
306 const Float_t angle05 = TMath::Tan(5. * kDegRad);
307 // Opening angle of the FA snout
308 const Float_t angle24 = TMath::Tan(24. * kDegRad);
309 // Opneing angle of the inner cone
310 const Float_t angle71 = TMath::Tan(0.697 * kDegRad);
311 // Starting position in z
312 const Float_t zFa = 90.0;
313
314 // Pos 1
316 // FA Steel Envelope //
317 // Drawing ALIP2A__0036 //
319 // Thickness of the envelope
320 Float_t dSteelEnvelope = 1.5;
321 // Front cover
322 //
323 // Length
324 Float_t dzSteelEnvelopeFC = 4.00;
325 // Inner Radius
326 Float_t rInSteelEnvelopeFC1 = 35.90 / 2.;
327 Float_t rInSteelEnvelopeFC2 = rInSteelEnvelopeFC1 + dzSteelEnvelopeFC * angle10;
328 // Outer Radius
329 Float_t rOuSteelEnvelopeFC1 = 88.97 / 2.;
330 Float_t rOuSteelEnvelopeFC2 = rOuSteelEnvelopeFC1 + dzSteelEnvelopeFC * angle05;
331 //
332 // 5 deg cone
333 Float_t dzSteelEnvelopeC5 = 168.9;
334 Float_t rInSteelEnvelopeC5 = rOuSteelEnvelopeFC2 - dSteelEnvelope / TMath::Cos(5 * kDegRad);
335 Float_t rOuSteelEnvelopeC5 = rOuSteelEnvelopeFC2;
336 // 10 deg cone
337 Float_t dzSteelEnvelopeC10 = 227.1 - 4.;
338 Float_t rInSteelEnvelopeC10 = 116.22 / 2.;
339 Float_t rOuSteelEnvelopeC10 = rInSteelEnvelopeC10 + dSteelEnvelope / TMath::Cos(10 * kDegRad);
340 // Rear ring
341 Float_t dzSteelEnvelopeR = 4.;
342 Float_t rInSteelEnvelopeR2 = 196.3 / 2.;
343 Float_t rOuSteelEnvelopeR2 = 212.0 / 2.;
344 Float_t rInSteelEnvelopeR1 = rInSteelEnvelopeR2 - dzSteelEnvelopeR * angle10;
345 Float_t rOuSteelEnvelopeR1 = rInSteelEnvelopeR1 + dSteelEnvelope / TMath::Cos(10 * kDegRad);
346 // Front insert
347 Float_t dzSteelEnvelopeFI = 1.;
348 Float_t rInSteelEnvelopeFI = 42.0 / 2.;
349 Float_t rOuSteelEnvelopeFI = 85.0 / 2. + 0.06;
350
351 TGeoPcon* shFaSteelEnvelopeC = new TGeoPcon(0., 360., 7);
352 z = 0.;
353 // Front cover
354 shFaSteelEnvelopeC->DefineSection(0, z, rInSteelEnvelopeFC1, rOuSteelEnvelopeFC1);
355 z += dzSteelEnvelopeFC;
356 shFaSteelEnvelopeC->DefineSection(1, z, rInSteelEnvelopeFC2, rOuSteelEnvelopeFC2);
357 // 5 deg cone
358 shFaSteelEnvelopeC->DefineSection(2, z, rInSteelEnvelopeC5, rOuSteelEnvelopeC5);
359 z += dzSteelEnvelopeC5;
360 shFaSteelEnvelopeC->DefineSection(3, z, rInSteelEnvelopeC10, rOuSteelEnvelopeC10);
361 // 10 deg cone
362 z += dzSteelEnvelopeC10;
363 shFaSteelEnvelopeC->DefineSection(4, z, rInSteelEnvelopeR1, rOuSteelEnvelopeR1);
364 // Rear Ring
365 shFaSteelEnvelopeC->DefineSection(5, z, rInSteelEnvelopeR1, rOuSteelEnvelopeR2);
366 z += dzSteelEnvelopeR;
367 shFaSteelEnvelopeC->DefineSection(6, z, rInSteelEnvelopeR2, rOuSteelEnvelopeR2);
368
369 // Insert
370 shFaSteelEnvelopeC->SetName("steelEnvC");
371 TGeoTube* shFaSteelEnvelopeT = new TGeoTube(rInSteelEnvelopeFI, rOuSteelEnvelopeFI, dzSteelEnvelopeFI);
372 shFaSteelEnvelopeT->SetName("steelEnvT");
373 TGeoCompositeShape* shFaSteelEnvelope = new TGeoCompositeShape("shFaSteelEnvelope", "steelEnvC-steelEnvT");
374
375 TGeoVolume* voFaSteelEnvelope = new TGeoVolume("AFaSteelEnvelope", shFaSteelEnvelope, kMedSteel);
376
377 // Pos 2
379 // FA End Plate //
380 // Drawing ALIP2A__0037 //
382 //
383 //
384 //
385 // Outer dimensions dx, dy, dz
386 Float_t dxEndPlate = 220.0;
387 Float_t dyEndPlate = 220.0;
388 Float_t dzEndPlate = 6.0;
389 // Inner radius
390 Float_t rInEndPlate = 52.5 / 2.;
391 // Insert
392 Float_t rInEndPlateI = 175.3 / 2.;
393 Float_t rOuEndPlateI = 212.2 / 2.;
394 Float_t dzEndPlateI = 2.0;
395
396 TGeoBBox* endPlate1 = new TGeoBBox(dxEndPlate / 2., dyEndPlate / 2., dzEndPlate / 2.);
397 endPlate1->SetName("endPlate1");
398
399 TGeoTube* endPlate2 = new TGeoTube(0., rInEndPlate, (dzEndPlate + 0.1) / 2.);
400 endPlate2->SetName("endPlate2");
401 TGeoTube* endPlate3 = new TGeoTube(rInEndPlateI, rOuEndPlateI, (dzEndPlateI + 0.1) / 2.);
402 endPlate3->SetName("endPlate3");
403
404 TGeoTranslation* tPlate = new TGeoTranslation("tPlate", 0., 0., -dzEndPlateI - 0.05);
405 tPlate->RegisterYourself();
406
407 TGeoCompositeShape* shFaEndPlate = new TGeoCompositeShape("shFaEndPlate", "endPlate1-(endPlate2+endPlate3:tPlate)");
408 TGeoVolume* voFaEndPlate = new TGeoVolume("AFaEndPlate", shFaEndPlate, kMedSteel);
409
410 // Pos 3
412 // FA Flange //
413 // Drawing ALIP2A__0038 //
415 // Width of the Flange
416 Float_t dzFaFlange = 2.;
417 // Outer radius
418 Float_t rOuFaFlange = 41.0 / 2.;
419 // 1st section
420 Float_t dzFaFlange1 = 0.8;
421 Float_t rInFaFlange1 = 33.4 / 2.;
422 // 2nd section
423 Float_t dzFaFlange2 = 1.2;
424 Float_t rInFaFlange2 = 36.4 / 2.;
425
426 TGeoPcon* shFaFlange = new TGeoPcon(0., 360., 4);
427 z = 0;
428 shFaFlange->DefineSection(0, z, rInFaFlange1, rOuFaFlange);
429 z += dzFaFlange1;
430 shFaFlange->DefineSection(1, z, rInFaFlange1, rOuFaFlange);
431 shFaFlange->DefineSection(2, z, rInFaFlange2, rOuFaFlange);
432 z += dzFaFlange2;
433 shFaFlange->DefineSection(3, z, rInFaFlange2, rOuFaFlange);
434
435 TGeoVolume* voFaFlange = new TGeoVolume("AFaFlange", shFaFlange, kMedSteel);
436
437 // Pos 4+5
439 // FA W Plate A+B //
440 // Drawing ALIP2A__0043 //
442 // Front Flange
443 Float_t dzFaWPlateF = 2.00;
444 Float_t rInFaQPlateF = 20.50;
445 Float_t rOuFaQPlateF = 40.05;
446 // 1st Central Part 24 deg
447 Float_t dzFaWPlateC1 = 7.95;
448 Float_t rInFaQPlateC1 = 16.35;
449 Float_t rOuFaQPlateC1 = rOuFaQPlateF + dzFaWPlateF * angle24;
450 // 2nd Central Part 5 deg
451 Float_t dzFaWPlateC2 = 1.05;
452 Float_t rInFaQPlateC2 = rInFaQPlateC1 + dzFaWPlateC1 * angle10;
453 Float_t rOuFaQPlateC2 = rOuFaQPlateC1 + dzFaWPlateC1 * angle24;
454 Float_t rInFaQPlateC3 = 17.94;
455 Float_t rOuFaQPlateC3 = 44.49;
456 // Rear Flange
457 Float_t dzFaWPlateR = 1.00;
458 Float_t rInFaQPlateR = 21.00;
459 Float_t rOuFaQPlateR = 42.55;
460 // Lenth of Plate - Rear Flange
461 Float_t dzFaWPlate = dzFaWPlateF + dzFaWPlateC1 + dzFaWPlateC2;
462
463 TGeoPcon* shFaWPlateA = new TGeoPcon(0., 360., 7);
464 z = 0.;
465 // Front Flange
466 shFaWPlateA->DefineSection(0, z, rInFaQPlateF, rOuFaQPlateF);
467 z += dzFaWPlateF;
468 shFaWPlateA->DefineSection(1, z, rInFaQPlateF, rOuFaQPlateC1);
469 // 24 deg cone
470 shFaWPlateA->DefineSection(2, z, rInFaQPlateC1, rOuFaQPlateC1);
471 z += dzFaWPlateC1;
472 shFaWPlateA->DefineSection(3, z, rInFaQPlateC2, rOuFaQPlateC2);
473 // 5 deg cone
474 z += dzFaWPlateC2;
475 shFaWPlateA->DefineSection(4, z, rInFaQPlateC3, rOuFaQPlateC3);
476 // Rear Flange
477 shFaWPlateA->DefineSection(5, z, rInFaQPlateR, rOuFaQPlateR);
478 z += dzFaWPlateR;
479 shFaWPlateA->DefineSection(6, z, rInFaQPlateR, rOuFaQPlateR);
480
481 TGeoVolume* voFaWPlateA = new TGeoVolume("AFaWPlateA", shFaWPlateA, kMedNiW);
482 // Inner region with higher transport cuts
483 TGeoPcon* shFaWPlateAI = new TGeoPcon(0., 360., 5);
484 z = 3.;
485 shFaWPlateAI->DefineSection(0, z, rInFaQPlateF + z * angle10, rOuFaQPlateC1 + (z - dzFaWPlateF) * angle24);
486 for (Int_t i = 1; i < 5; i++) {
487 Float_t rmin = shFaWPlateA->GetRmin(i + 2);
488 Float_t rmax = shFaWPlateA->GetRmax(i + 2) - 3.;
489 Float_t zpos = shFaWPlateA->GetZ(i + 2);
490 shFaWPlateAI->DefineSection(i, zpos, rmin, rmax);
491 }
492 TGeoVolume* voFaWPlateAI = new TGeoVolume("AFaWPlateAI", shFaWPlateAI, kMedNiWsh);
493 voFaWPlateA->AddNode(voFaWPlateAI, 1, gGeoIdentity);
494
495 //
496 // Inner Tungsten Shield
497 // Part 1 99.8 cm
498 // Part 2 143.5 cm
499 // Part 3 25.0 cm
500 // Part 4 31.0 cm
501 // ====================
502 // 299.3 cm - 0.6 overlap between Part 1 and Part 2
503 // 298.7 cm
504 // Starting position 499.0 - 298.7 = 200.3
505 // Within C cone: 200.3 - 92.0 = 108.3 = end of straight section of the Graphite Cone
506 //
507
508 // Pos 6
510 // FA Tungsten Tube Part 1 //
511 // Drawing ALIP2A__0045 //
513 //
514 // Inner radius
515 Float_t rInFaWTube1C1 = 9.1 / 2.;
516 // Central part
517 Float_t dzFaWTube1C = 98.8;
518 Float_t rOuFaWTube1C1 = 13.8 / 2.;
519 Float_t rOuFaWTube1C2 = 20.7 / 2.;
520 // Rear Flange
521 Float_t dzFaWTube1R = 1.0;
522 Float_t rOuFaWTube1R = 15.0 / 2.;
523 // Total length
524 Float_t dzFaWTube1 = dzFaWTube1C + dzFaWTube1R;
525
526 TGeoPcon* shFaWTube1 = new TGeoPcon(0., 360., 4);
527 z = 0.;
528 // Central Part
529 shFaWTube1->DefineSection(0, z, rInFaWTube1C1, rOuFaWTube1C1);
530 z += dzFaWTube1C;
531 shFaWTube1->DefineSection(1, z, rInFaWTube1C1, rOuFaWTube1C2);
532 // Rear Flange
533 shFaWTube1->DefineSection(2, z, rInFaWTube1C1, rOuFaWTube1R);
534 z += dzFaWTube1R;
535 shFaWTube1->DefineSection(3, z, rInFaWTube1C1, rOuFaWTube1R);
536
537 TGeoVolume* voFaWTube1 = new TGeoVolume("AFaWTube1", shFaWTube1, kMedNiWsh);
538
539 // Pos 7
541 // FA Tungsten Tube Part 2 //
542 // Drawing ALIP2A__0046 //
544 //
545
546 // Central part
547 Float_t dzFaWTube2C = 142.9;
548 Float_t rInFaWTube2C1 = 9.10 / 2.;
549 Float_t rInFaWTube2C2 = 12.58 / 2.;
550 Float_t rOuFaWTube2C1 = 20.70 / 2.;
551 Float_t rOuFaWTube2C2 = 30.72 / 2. - 0.05;
552 // Front Flange
553 Float_t dzFaWTube2F = 0.6;
554 Float_t rInFaWTube2F = 15.4 / 2.;
555 // Total length
556 Float_t dzFaWTube2 = dzFaWTube2C + dzFaWTube2F;
557
558 TGeoPcon* shFaWTube2 = new TGeoPcon(0., 360., 4);
559 z = 0.;
560 // Front Flange
561 shFaWTube2->DefineSection(0, z, rInFaWTube2F, rOuFaWTube2C1);
562 z += dzFaWTube2F;
563 shFaWTube2->DefineSection(1, z, rInFaWTube2F, rOuFaWTube2C1);
564 // Central part
565 shFaWTube2->DefineSection(2, z, rInFaWTube2C1, rOuFaWTube2C1);
566 z += dzFaWTube2C;
567 shFaWTube2->DefineSection(3, z, rInFaWTube2C2, rOuFaWTube2C2);
568
569 TGeoVolume* voFaWTube2 = new TGeoVolume("AFaWTube2", shFaWTube2, kMedNiWsh);
570
571 // Pos 8
573 // FA Tungsten Tube Part 3 //
574 // Drawing ALIP2A__0047 //
576 Float_t dzFaWTube3 = 25.0;
577 Float_t rInFaWTube3C1 = 12.59 / 2.;
578 Float_t rInFaWTube3C2 = 13.23 / 2.;
579 Float_t rOuFaWTube3C1 = 30.60 / 2.;
580 Float_t rOuFaWTube3C2 = 32.35 / 2.;
581 TGeoVolume* voFaWTube3 = new TGeoVolume(
582 "AFaWTube3", new TGeoCone(dzFaWTube3 / 2., rInFaWTube3C1, rOuFaWTube3C1, rInFaWTube3C2, rOuFaWTube3C2), kMedNiWsh);
583
584 // Pos 9
586 // FA Tungsten Tube Part 4 //
587 // Drawing ALIP2A__0048 //
589 Float_t dzFaWTube4 = 31.0;
590 Float_t rInFaWTube4C1 = 13.23 / 2.;
591 Float_t rInFaWTube4C2 = 13.98 / 2.;
592 Float_t rOuFaWTube4C1 = 48.80 / 2.;
593 Float_t rOuFaWTube4C2 = 52.05 / 2.;
594 TGeoVolume* voFaWTube4 = new TGeoVolume(
595 "AFaWTube4", new TGeoCone(dzFaWTube4 / 2., rInFaWTube4C1, rOuFaWTube4C1, rInFaWTube4C2, rOuFaWTube4C2), kMedNiWsh);
596
597 // Pos 10
598 //
599 // This section is partially in Shield
600 Float_t dzFaWTube5 = 6.0;
601 Float_t kAngle0071 = TMath::Tan(0.71 * kDegRad);
602 Float_t rInFaWTube5C1 = rInFaWTube4C2;
603 Float_t rInFaWTube5C2 = rInFaWTube4C2 + dzFaWTube4 * kAngle0071;
604 Float_t rOuFaWTube5C1 = rOuFaWTube4C2;
605 TGeoVolume* voFaWTube5 = new TGeoVolume(
606 "AFaWTube5", new TGeoCone(dzFaWTube5 / 2., rInFaWTube5C1, rOuFaWTube5C1, rInFaWTube5C2, rOuFaWTube5C1), kMedNiWsh);
607
608 //
609 // Pos 11
611 // FA Graphite Cone //
612 // Drawing ALIP2_0002 //
614 //
615 // Total length
616 Float_t dzFaGraphiteCone = 225.0;
617 // Straight section = start of the 2deg inner cone
618 Float_t dzFaGraphiteConeS = 108.3;
619 // Inner radius at the front
620 Float_t rInFaGraphiteCone1 = 4.5;
621 // Outer radius at the front
622 Float_t rOuFaGraphiteCone1 = (zFa + dzFaFlange) * angle10;
623 // Inner radius at start of inner opening cone
624 Float_t rInFaGraphiteCone2 = 7.0;
625 // Outer radius at start of inner opening cone
626 Float_t rOuFaGraphiteCone2 = (zFa + dzFaFlange + dzFaGraphiteConeS) * angle10;
627 // Inner radius the rear
628 Float_t rInFaGraphiteCone3 = 11.0;
629 // Ouer radius at the rear
630 Float_t rOuFaGraphiteCone3 = (zFa + dzFaFlange + dzFaGraphiteCone) * angle10;
631
632 TGeoPcon* shFaGraphiteCone = new TGeoPcon(0., 360., 4);
633
634 z = 0;
635 // Straight section
636 shFaGraphiteCone->DefineSection(0, z, rInFaGraphiteCone1, rOuFaGraphiteCone1);
637 z += dzFaGraphiteConeS;
638 shFaGraphiteCone->DefineSection(1, z, rInFaGraphiteCone1, rOuFaGraphiteCone2);
639 // 2 deg opening cone
640 shFaGraphiteCone->DefineSection(2, z, rInFaGraphiteCone2, rOuFaGraphiteCone2);
641 z = dzFaGraphiteCone;
642 shFaGraphiteCone->DefineSection(3, z, rInFaGraphiteCone3, rOuFaGraphiteCone3);
643
644 TGeoVolume* voFaGraphiteCone = new TGeoVolume("AFaGraphiteCone", shFaGraphiteCone, kMedCsh);
645 //
646 // Outer region with lower transport cuts
647 dz = 50.;
648 TGeoCone* shFaGraphiteConeO = new TGeoCone(dz / 2., rInFaGraphiteCone1, rOuFaGraphiteCone1, rInFaGraphiteCone1,
649 rOuFaGraphiteCone1 + dz * angle10);
650
651 TGeoVolume* voFaGraphiteConeO = new TGeoVolume("AFaGraphiteConeO", shFaGraphiteConeO, kMedC);
652 voFaGraphiteCone->AddNode(voFaGraphiteConeO, 1, new TGeoTranslation(0., 0., dz / 2.));
653
654 // Pos 12
656 // FA Lead Cone //
657 // Drawing ALIP2A__0077 //
659 // 5 deg cone
660 Float_t dzFaPbCone5 = 168.9;
661 Float_t rInFaPbCone5 = 37.35 / 2.;
662 Float_t rOuFaPbCone5 = 85.66 / 2.;
663 // 10 deg cone
664 Float_t dzFaPbCone10 = 25.9;
665 Float_t rInFaPbCone10 = rInFaPbCone5 + dzFaPbCone5 * angle10;
666 Float_t rOuFaPbCone10 = 115.2 / 2.;
667 // end
668 Float_t rInFaPbConeE = 106.05 / 2.;
669 Float_t rOuFaPbConeE = 124.35 / 2.;
670 // Total length
671 Float_t dzFaPbCone = dzFaPbCone5 + dzFaPbCone10;
672
673 TGeoPcon* shFaPbCone = new TGeoPcon(0., 360., 3);
674 z = 0.;
675 // 5 deg cone
676 shFaPbCone->DefineSection(0, z, rInFaPbCone5, rOuFaPbCone5);
677 z += dzFaPbCone5;
678 // 10 deg cone
679 shFaPbCone->DefineSection(1, z, rInFaPbCone10, rOuFaPbCone10);
680 z += dzFaPbCone10;
681 shFaPbCone->DefineSection(2, z, rInFaPbConeE, rOuFaPbConeE);
682
683 TGeoVolume* voFaPbCone = new TGeoVolume("AFaPbCone", shFaPbCone, kMedPb);
684 //
685 // Inner region with higher transport cuts
686 TGeoPcon* shFaPbConeI = MakeShapeFromTemplate(shFaPbCone, 0., -3.);
687 TGeoVolume* voFaPbConeI = new TGeoVolume("AFaPbConeI", shFaPbConeI, kMedPbSh);
688 voFaPbCone->AddNode(voFaPbConeI, 1, gGeoIdentity);
689
690 // Pos 13
692 // FA Concrete Cone //
693 // Drawing ALIP2A__00xx //
695 Float_t dzFaConcreteCone = 126.;
696 Float_t rOuFaConcreteCone1 = rOuFaGraphiteCone3;
697 Float_t rInFaConcreteCone1 = 11.;
698 Float_t rOuFaConcreteCone2 = rOuFaConcreteCone1 + dzFaConcreteCone * angle10;
699 Float_t rInFaConcreteCone2 = rInFaConcreteCone1 + dzFaConcreteCone * angle02;
700
701 TGeoVolume* voFaConcreteCone = new TGeoVolume(
702 "AFaConcreteCone",
703 new TGeoCone(dzFaConcreteCone / 2., rInFaConcreteCone1, rOuFaConcreteCone1, rInFaConcreteCone2, rOuFaConcreteCone2),
704 kMedConcSh);
705
706 // Pos 14
708 // FA Polyethylene Parts //
709 // Drawing ALIP2A__0034 //
711 Float_t dzFaCH2Cone = 201.;
712 Float_t rInFaCH2Cone1 = 106.0 / 2.;
713 Float_t rInFaCH2Cone2 = 176.9 / 2.;
714 Float_t dFaCH2Cone = 7.5 / TMath::Cos(10. * kDegRad);
715
716 TGeoVolume* voFaCH2Cone =
717 new TGeoVolume("AFaCH2Cone", new TGeoCone(dzFaCH2Cone / 2., rInFaCH2Cone1, rInFaCH2Cone1 + dFaCH2Cone, rInFaCH2Cone2, rInFaCH2Cone2 + dFaCH2Cone),
718 kMedCH2Sh);
719
720 // Pos 15
722 // FA Steel Plate 250 mm //
723 // Drawing ALIP2A__00xx //
725 Float_t dzFaSteelCone25 = 25.;
726 Float_t eps = 0.001;
727 Float_t rInFaSteelCone25A = rInFaConcreteCone2;
728 Float_t rOuFaSteelCone25A = rOuFaConcreteCone2;
729 Float_t rInFaSteelCone25B = rInFaSteelCone25A + dzFaSteelCone25 * angle02;
730 Float_t rOuFaSteelCone25B = rOuFaSteelCone25A + dzFaSteelCone25 * angle10;
731
732 TGeoVolume* voFaSteelCone25 = new TGeoVolume(
733 "AFaSteelCone25", new TGeoCone(dzFaSteelCone25 / 2., rInFaSteelCone25A + eps, rOuFaSteelCone25A - eps, rInFaSteelCone25B + eps, rOuFaSteelCone25B - eps),
734 kMedSteelSh);
735
736 // Pos 16
738 // FA Steel Plate 310 mm //
739 // Drawing ALIP2A__00xx //
741 Float_t dzFaSteelCone31 = 31.;
742 Float_t rInFaSteelCone31A = rOuFaWTube4C1;
743 ;
744 Float_t rOuFaSteelCone31A = rOuFaSteelCone25B;
745 Float_t rInFaSteelCone31B = rOuFaWTube4C2;
746 Float_t rOuFaSteelCone31B = rOuFaSteelCone31A + dzFaSteelCone31 * angle10;
747
748 TGeoVolume* voFaSteelCone31 = new TGeoVolume(
749 "AFaSteelCone31", new TGeoCone(dzFaSteelCone31 / 2., rInFaSteelCone31A + eps, rOuFaSteelCone31A - eps, rInFaSteelCone31B + eps, rOuFaSteelCone31B - eps),
750 kMedSteelSh);
751 // Outer Region with higher transport cuts
752 dz = 5.;
753 TGeoVolume* voFaSteelCone31I =
754 new TGeoVolume("AFaSteelCone31I",
755 new TGeoCone(dz / 2., rInFaSteelCone31B - dz * angle03 + eps, rOuFaSteelCone31B - dz * angle10 - eps,
756 rInFaSteelCone31B + eps, rOuFaSteelCone31B - eps),
757 kMedSteel);
758
759 voFaSteelCone31->AddNode(voFaSteelCone31I, 1, new TGeoTranslation(0., 0., dzFaSteelCone31 / 2. - dz / 2.));
760
762 // FA Composite Ring //
763 // Drawing ALIP2A__0126 //
765 // 1st section
766 Float_t dzFaCompRing1 = 0.8;
767 Float_t rInFaCompRing1 = 11.0 / 2.;
768 Float_t rOuFaCompRing1 = 32.4 / 2.;
769 // 2nd section
770 Float_t dzFaCompRing2 = 1.2;
771 Float_t rInFaCompRing2 = 14.0 / 2.;
772 Float_t rOuFaCompRing2 = 35.3 / 2.;
773
774 TGeoPcon* shFaCompRing = new TGeoPcon(0., 360., 4);
775 z = 0.;
776 // 1st section
777 shFaCompRing->DefineSection(0, z, rInFaCompRing1, rOuFaCompRing1);
778 z += dzFaCompRing1;
779 shFaCompRing->DefineSection(1, z, rInFaCompRing1, rOuFaCompRing1);
780 // 2nd section
781 shFaCompRing->DefineSection(2, z, rInFaCompRing2, rOuFaCompRing2);
782 ;
783 z += dzFaCompRing2;
784 shFaCompRing->DefineSection(3, z, rInFaCompRing2, rOuFaCompRing2);
785
786 TGeoVolume* voFaCompRing = new TGeoVolume("AFaCompRing", shFaCompRing, kMedC);
787
789 // FA Magnesium Ring //
790 // Drawing ALIP2A__0127 //
792 //
793 // The inner radii
794 // section 1+3
795 Float_t dzFaMgRingO = 0.7;
796 Float_t rInFaMgRingO = 3.0;
797 // section 2
798 Float_t dzFaMgRingI = 0.6;
799 Float_t rInFaMgRingI = 3.5;
800
801 TGeoPcon* shFaMgRing = new TGeoPcon(0., 360., 8);
802 // 1st section
803 z = 0.;
804 shFaMgRing->DefineSection(0, z, rInFaMgRingO, rInFaCompRing1);
805 z += dzFaMgRingO;
806 shFaMgRing->DefineSection(1, z, rInFaMgRingO, rInFaCompRing1);
807 // 2nd section
808 shFaMgRing->DefineSection(2, z, rInFaMgRingI, rInFaCompRing1);
809 z += dzFaMgRingI / 2.;
810 shFaMgRing->DefineSection(3, z, rInFaMgRingI, rInFaCompRing1);
811 // 3rd section
812 shFaMgRing->DefineSection(4, z, rInFaMgRingI, rInFaCompRing2);
813 z += dzFaMgRingI / 2.;
814 shFaMgRing->DefineSection(5, z, rInFaMgRingI, rInFaCompRing2);
815 // 4th section
816 shFaMgRing->DefineSection(6, z, rInFaMgRingO, rInFaCompRing2);
817 z += dzFaMgRingO;
818 shFaMgRing->DefineSection(7, z, rInFaMgRingO, rInFaCompRing2);
819 TGeoVolume* voFaMgRing = new TGeoVolume("AFaMgRing", shFaMgRing, kMedMg);
820
821 //
822 // Absorber mother volume
823 //
824 //
825 // Length of the absorber without endplate
826 Float_t dzFa = dzFaFlange + dzFaGraphiteCone + dzFaConcreteCone + dzFaSteelCone25 + dzFaSteelCone31;
827 TGeoPcon* shFaM = new TGeoPcon(0., 360., 16);
828 // Front -> Flange (Mg Ring details)
829 z = 0.;
830 shFaM->DefineSection(0, z, rInFaMgRingO, rOuFaQPlateF);
831 z += dzFaMgRingO;
832 dz = dzFaMgRingO;
833 shFaM->DefineSection(1, z, rInFaMgRingO, rOuFaQPlateF + dz * angle24);
834 shFaM->DefineSection(2, z, rInFaMgRingI, rOuFaQPlateF + dz * angle24);
835 z += dzFaMgRingI;
836 dz += dzFaMgRingI;
837 shFaM->DefineSection(3, z, rInFaMgRingI, rOuFaQPlateF + dz * angle24);
838 shFaM->DefineSection(4, z, rInFaMgRingO, rOuFaQPlateF + dz * angle24);
839 z += dzFaMgRingO;
840 dz += dzFaMgRingO;
841 shFaM->DefineSection(5, z, rInFaMgRingO, rOuFaQPlateF + dz * angle24);
842 shFaM->DefineSection(6, z, rInFaGraphiteCone1, rOuFaQPlateF + dz * angle24);
843 // Flange -> W-Plate B
844 z += dzFaWPlateC1;
845 shFaM->DefineSection(7, z, rInFaGraphiteCone1, rOuFaQPlateC2);
846 z += dzFaWPlateC2;
847 Float_t zFaSteelEnvelope = z;
848 shFaM->DefineSection(8, z, rInFaGraphiteCone1, rOuFaQPlateC3);
849 // 5 deg cone -> 10 deg cone
850 z = zFaSteelEnvelope + dzSteelEnvelopeFC + dzSteelEnvelopeC5;
851 shFaM->DefineSection(9, z, rInFaGraphiteCone1, rOuSteelEnvelopeC10);
852 // 10 deg cone up to end of straight section
853 z0 = z;
854 z = dzFaFlange + dzFaGraphiteConeS + dzFaWTube1C;
855 dz = z - z0;
856 shFaM->DefineSection(10, z, rInFaGraphiteCone1, rOuSteelEnvelopeC10 + dz * angle10);
857 // 0.7 deg inner opening cone up to outer rear ring
858 z0 = z;
859 z = dzFa - dzSteelEnvelopeR / 2.;
860 dz = (z - z0);
861 shFaM->DefineSection(11, z, rInFaGraphiteCone1 + dz * angle71, rOuSteelEnvelopeR1);
862 shFaM->DefineSection(12, z, rInFaGraphiteCone1 + dz * angle71, rOuSteelEnvelopeR2);
863 z += dzSteelEnvelopeR / 2.;
864 shFaM->DefineSection(13, z, rInFaWTube4C2, rOuSteelEnvelopeR2);
865 // Recess for end plate
866 dz = dzSteelEnvelopeR / 2;
867 shFaM->DefineSection(14, z, rInFaCH2Cone2 - dz * angle10, rOuSteelEnvelopeR2);
868 z += dzSteelEnvelopeR / 2.;
869 shFaM->DefineSection(15, z, rInFaCH2Cone2, rOuSteelEnvelopeR2);
870 TGeoVolume* voFaM = new TGeoVolume("AFaM", shFaM, kMedAir);
871 voFaM->SetVisibility(0);
872
873 //
874 // Assemble volumes inside acceptance
875 TGeoPcon* shFaAccM = new TGeoPcon(0., 360., 7);
876 for (Int_t i = 0; i < 4; i++) {
877 Float_t zpos = shFaGraphiteCone->GetZ(i);
878 Float_t rmin = shFaGraphiteCone->GetRmin(i);
879 Float_t rmax = shFaGraphiteCone->GetRmax(i);
880 shFaAccM->DefineSection(i, zpos, rmin, rmax);
881 }
882 z = dzFaGraphiteCone + dzFaConcreteCone + dzFaSteelCone25;
883 z0 = z + zFa + dzFaFlange;
884 shFaAccM->DefineSection(4, z, rOuFaWTube3C2, z0 * angle10);
885 shFaAccM->DefineSection(5, z, rOuFaWTube4C1, z0 * angle10);
886 z += dzFaSteelCone31;
887 z0 += dzFaSteelCone31;
888 shFaAccM->DefineSection(6, z, rOuFaWTube4C2, z0 * angle10);
889 TGeoVolume* voFaAccM = new TGeoVolume("AFaAcc", shFaAccM, kMedAir);
890
891 z = 0;
892 voFaAccM->AddNode(voFaGraphiteCone, 1, gGeoIdentity);
893 z += dzFaGraphiteCone;
894 voFaAccM->AddNode(voFaConcreteCone, 1, new TGeoTranslation(0., 0., z + dzFaConcreteCone / 2.));
895 z += dzFaConcreteCone;
896 voFaAccM->AddNode(voFaSteelCone25, 1, new TGeoTranslation(0., 0., z + dzFaSteelCone25 / 2.));
897 z += dzFaSteelCone25;
898 voFaAccM->AddNode(voFaSteelCone31, 1, new TGeoTranslation(0., 0., z + dzFaSteelCone31 / 2.));
899
900 //
901 // Inner shield
902 TGeoVolumeAssembly* voFaInnerShield = new TGeoVolumeAssembly("AFaInnerShield");
903 voFaInnerShield->AddNode(voFaWTube1, 1, gGeoIdentity);
904 z = dzFaWTube1 - 0.6;
905 voFaInnerShield->AddNode(voFaWTube2, 1, new TGeoTranslation(0., 0., z));
906 z += dzFaWTube2;
907 voFaInnerShield->AddNode(voFaWTube3, 1, new TGeoTranslation(0., 0., z + dzFaWTube3 / 2.));
908 z += dzFaWTube3;
909 voFaInnerShield->AddNode(voFaWTube4, 1, new TGeoTranslation(0., 0., z + dzFaWTube4 / 2.));
910 z = dzFaGraphiteConeS + dzFaFlange;
911 voFaM->AddNode(voFaInnerShield, 1, new TGeoTranslation(0., 0., z));
912
913 //
914 // Adding volumes to mother volume
915 //
916 z = 0.;
917 voFaM->AddNode(voFaWPlateA, 1, gGeoIdentity);
918 z += dzFaWPlate;
919 voFaM->AddNode(voFaSteelEnvelope, 1, new TGeoTranslation(0., 0., z));
920 z += dzSteelEnvelopeFC;
921 voFaM->AddNode(voFaPbCone, 1, new TGeoTranslation(0., 0., z));
922 z += (dzFaPbCone + dzFaCH2Cone / 2.);
923 voFaM->AddNode(voFaCH2Cone, 1, new TGeoTranslation(0., 0., z));
924 voFaM->AddNode(voFaFlange, 1, gGeoIdentity);
925 voFaM->AddNode(voFaMgRing, 1, gGeoIdentity);
926 voFaM->AddNode(voFaCompRing, 1, gGeoIdentity);
927 voFaM->AddNode(voFaAccM, 1, new TGeoTranslation(0., 0., dzFaFlange));
928
930 // //
931 // Front Absorber Support Structure FASS //
932 // //
933 // Drawing ALIP2A__0035 //
934 // Drawing ALIP2A__0089 //
935 // Drawing ALIP2A__0090 //
936 // Drawing ALIP2A__0109 //
938 TGeoVolumeAssembly* voFass = new TGeoVolumeAssembly("AFass");
939 const Float_t kFassUBFlangeH = 380.;
940 const Float_t kFassUBFlangeW = 77.;
941
942 const Float_t kFassUMFlangeH = 380.;
943 const Float_t kFassUMFlangeB = 246. - 9.85;
944 const Float_t kFassUMFlangeT = 10.;
945 const Float_t kFassUMFalpha = -TMath::ATan((kFassUMFlangeB - kFassUMFlangeT) / kFassUMFlangeH / 2.) / kDegRad;
946 // Upper back flange
947 // B1
948 // 380 x 77
949 TGeoVolume* voFassUBFlange =
950 new TGeoVolume("AFassUBFlange", new TGeoBBox(kFassUBFlangeW / 2., kFassUBFlangeH / 2., 3. / 2.), kMedSteel);
951 // voFass->AddNode(voFassUBFlange, 1,
952 // new TGeoTranslation(+1.5 + kFassUBFlangeW / 2., 180. + kFassUBFlangeH / 2., kFassUMFlangeB - 1.5));
953 //voFass->AddNode(voFassUBFlange, 2,
954 // new TGeoTranslation(-1.5 - kFassUBFlangeW / 2., 180. + kFassUBFlangeH / 2., kFassUMFlangeB - 1.5));
955
956 // Lower back flange
957 // Upper median flange
958 // Drawing ALIP2A__0090 //
959 // Drawing ALIP2A__0089 //
960 // A2
961
962 TGeoVolume* voFassUMFlange = new TGeoVolume(
963 "AFassUMFlange", new TGeoTrap(kFassUMFlangeH / 2., kFassUMFalpha, 0., 1.5, kFassUMFlangeB / 2., kFassUMFlangeB / 2., 0., 1.5, kFassUMFlangeT / 2., kFassUMFlangeT / 2., 0.),
964 kMedSteel);
965
966 TGeoRotation* rotFass1 = new TGeoRotation("rotFass1", 180., 0., 90., 0., 90., 90.);
967 voFass->AddNode(voFassUMFlange, 1,
968 new TGeoCombiTrans(0., 180. + kFassUMFlangeH / 2.,
969 -(kFassUMFlangeB + kFassUMFlangeT) / 4. + kFassUMFlangeB, rotFass1));
970
971 // Lower median flange
972 // Drawing ALIP2A__0090 //
973 // Drawing ALIP2A__0089 //
974 // A1
975 const Float_t kFassLMFlangeH = 242.;
976 const Float_t kFassLMFlangeB = 246. - 9.85;
977 const Float_t kFassLMFlangeT = 43.;
978 const Float_t kFassLMFalpha = -TMath::ATan((kFassLMFlangeB - kFassLMFlangeT) / kFassLMFlangeH / 2.) / kDegRad;
979 TGeoVolume* voFassLMFlange = new TGeoVolume(
980 "AFassLMFlange", new TGeoTrap(kFassLMFlangeH / 2., kFassLMFalpha, 0., 1.5, kFassLMFlangeB / 2., kFassLMFlangeB / 2., 0., 1.5, kFassLMFlangeT / 2., kFassLMFlangeT / 2., 0.),
981 kMedSteel);
982 TGeoRotation* rotFass2 = new TGeoRotation("rotFass2", 180., 0., 90., 0., 90., 270.);
983 voFass->AddNode(voFassLMFlange, 1,
984 new TGeoCombiTrans(0., -180. - kFassLMFlangeH / 2.,
985 -(kFassLMFlangeB + kFassLMFlangeT) / 4. + kFassLMFlangeB, rotFass2));
986
987 // Stiffeners
988 // Support Plate
989 //
990 // Central cone
991 // reduce by 9.85 cm inorder to fit into barrel volume
992 // (insignificant change of material budget, but helping very much to improve the efficiency)
993 TGeoPgon* shFassCone = new TGeoPgon("FassCone", 22.5, 360., 8, 4);
994 shFassCone->DefineSection(0, 0., 0., 180.);
995 shFassCone->DefineSection(1, 3., 0., 180.);
996 shFassCone->DefineSection(2, 3., 177., 180.);
997 shFassCone->DefineSection(3, 246. - 9.85, 177., 180.);
998
999 TGeoBBox* shFassWindow = new TGeoBBox(190., 53., 28.);
1000 shFassWindow->SetName("FassWindow");
1001 TGeoTranslation* tFassWindow = new TGeoTranslation("tFassWindow", 0., 0., 78.);
1002 tFassWindow->RegisterYourself();
1003
1004 TGeoTube* shFassApperture = new TGeoTube(0., 104., 3.);
1005 shFassApperture->SetName("FassApperture");
1006
1007 TGeoCompositeShape* shFassCentral =
1008 new TGeoCompositeShape("shFassCentral", "FassCone-(FassWindow:tFassWindow+FassApperture)");
1009
1010 TGeoVolume* voFassCentral = new TGeoVolume("AFassCentral", shFassCentral, kMedSteel);
1011 voFass->AddNode(voFassCentral, 1, gGeoIdentity);
1012
1013 //
1014 // Aluminum ring
1015 //
1016 TGeoVolume* voFassAlRing = new TGeoVolume("AFassAlRing", new TGeoTube(104., 180., 10.), kMedAlu);
1017
1018 //
1019 // Assemble the FA
1020 //
1021 // Inside muon spectrometer acceptance
1022 //
1023 // Composite 2 cm
1024 // Graphite 225 cm
1025 // Concrete 126 cm
1026 // Steel 56 cm
1027 // ===================
1028 // 409 cm
1029 // should be 409 cm
1030
1031 //
1032 // Absorber and Support
1033 TGeoVolumeAssembly* voFA = new TGeoVolumeAssembly("AFA");
1034 voFA->AddNode(voFaM, 1, gGeoIdentity);
1035 voFA->AddNode(voFaEndPlate, 1, new TGeoTranslation(0., 0., dzFa + dzEndPlate / 2.));
1036 voFA->AddNode(voFass, 1, new TGeoTranslation(0., 0., 388.45));
1037 voFA->AddNode(voFassAlRing, 1, new TGeoTranslation(0., 0., 382. - 3.56));
1038 voFA->AddNode(voFaWTube5, 1, new TGeoTranslation(0., 0., 412.));
1039 barrel->AddNode(voFA, 1, new TGeoCombiTrans(0., 30., -90., rotxz));
1040}
1041
1042FairModule* Absorber::CloneModule() const { return new Absorber(*this); }
Definition of the Detector class.
int32_t i
ClassImp(IdPath)
TGeoPcon * MakeShapeFromTemplate(const TGeoPcon *pcon, Float_t drMin, Float_t drMax)
Definition Absorber.cxx:211
static void initFieldTrackingParams(int &mode, float &maxfield)
Definition Detector.cxx:143
static MaterialManager & Instance()
void ConstructGeometry() override
Definition Absorber.cxx:226
FairModule * CloneModule() const override
Clone this object (used in MT mode only)
a common base class for passive modules - implementing generic functions
Definition PassiveBase.h:24
GLuint const GLchar * name
Definition glcorearb.h:781
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843