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 // Air of the absorber envelope
176 //
177 // Chemically identical to AIR0$ above. It exists so that the absorber
178 // mother volume AFaM has a material no other volume shares: Geant4-VMC
179 // selects fast-simulation regions by MATERIAL name and adds every volume of
180 // that material to the region, so a volume can only be addressed as a
181 // region of its own if its material is its own. Naming ABSO_AIR_ENVELOPE
182 // therefore means exactly "the front absorber", with all of its daughters
183 // inside it. Cuts and processes are the global defaults, the same ones
184 // ABSO_AIR_C0 gets, so the physics is unchanged.
185 matmgr.Mixture("ABSO", 20, "AIR_ENVELOPE0$", aAir, zAir, dAir, 4, wAir);
186 matmgr.Medium("ABSO", 20, "AIR_ENVELOPE", 20, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil,
187 stmin);
188
189 //
190 // Vacuum
191 matmgr.Mixture("ABSO", 16, "VACUUM0$", aAir, zAir, dAir1, 4, wAir);
192 matmgr.Mixture("ABSO", 36, "VACUUM1$", aAir, zAir, dAir1, 4, wAir);
193 matmgr.Mixture("ABSO", 56, "VACUUM2$", aAir, zAir, dAir1, 4, wAir);
194 matmgr.Medium("ABSO", 16, "VA_C0", 16, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
195 matmgr.Medium("ABSO", 36, "VA_C1", 36, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
196 matmgr.Medium("ABSO", 56, "VA_C2", 56, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
197
198 //
199 // Concrete
200 matmgr.Mixture("ABSO", 17, "CONCRETE0$", aconc, zconc, 2.35, 10, wconc);
201 matmgr.Mixture("ABSO", 37, "CONCRETE1$", aconc, zconc, 2.35, 10, wconc);
202 matmgr.Mixture("ABSO", 57, "CONCRETE2$", aconc, zconc, 2.35, 10, wconc);
203 matmgr.Medium("ABSO", 17, "CC_C0", 17, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
204 matmgr.Medium("ABSO", 37, "CC_C1", 37, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
205 matmgr.Medium("ABSO", 57, "CC_C2", 57, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
206
207 //
208 // Polyethilene CH2
209 matmgr.Mixture("ABSO", 18, "POLYETHYLEN0$", apoly, zpoly, .95, -2, wpoly);
210 matmgr.Mixture("ABSO", 38, "POLYETHYLEN1$", apoly, zpoly, .95, 2, wpoly);
211 matmgr.Mixture("ABSO", 58, "POLYETHYLEN2$", apoly, zpoly, .95, 2, wpoly);
212 matmgr.Medium("ABSO", 18, "CH2_C0", 18, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
213 matmgr.Medium("ABSO", 38, "CH2_C1", 38, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
214 matmgr.Medium("ABSO", 58, "CH2_C2", 58, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
215
216 //
217 // Steel
218 matmgr.Mixture("ABSO", 19, "STAINLESS STEEL0$", asteel, zsteel, 7.88, 4, wsteel);
219 matmgr.Mixture("ABSO", 39, "STAINLESS STEEL1$", asteel, zsteel, 7.88, 4, wsteel);
220 matmgr.Mixture("ABSO", 59, "STAINLESS STEEL2$", asteel, zsteel, 7.88, 4, wsteel);
221 matmgr.Medium("ABSO", 19, "ST_C0", 19, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
222 matmgr.Medium("ABSO", 39, "ST_C1", 39, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
223 matmgr.Medium("ABSO", 59, "ST_C3", 59, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
224}
225
226TGeoPcon* MakeShapeFromTemplate(const TGeoPcon* pcon, Float_t drMin, Float_t drMax)
227{
228
229 //
230 // Returns new shape based on a template changing
231 // the inner radii by drMin and the outer radii by drMax.
232 //
233 Int_t nz = pcon->GetNz();
234 TGeoPcon* cpcon = new TGeoPcon(0., 360., nz);
235 for (Int_t i = 0; i < nz; i++) {
236 cpcon->DefineSection(i, pcon->GetZ(i), pcon->GetRmin(i) + drMin, pcon->GetRmax(i) + drMax);
237 }
238 return cpcon;
239}
240
242{
244
245 //
246 // Build muon shield geometry
247 //
248 //
249
251 Float_t z, z0, dz;
252 //
253 // The top volume
254 //
255 TGeoVolume* barrel = gGeoManager->GetVolume("barrel");
256
257 //
258 // Media
259 //
260 auto kMedNiW = matmgr.getTGeoMedium("ABSO_Ni/W0");
261 auto kMedNiWsh = matmgr.getTGeoMedium("ABSO_Ni/W3");
262 //
263 auto kMedSteel = matmgr.getTGeoMedium("ABSO_ST_C0");
264 auto kMedSteelSh = matmgr.getTGeoMedium("ABSO_ST_C3");
265 //
266 auto kMedAir = matmgr.getTGeoMedium("ABSO_AIR_C0");
267 // Air again, under a name only AFaM uses -- see the comment at its definition.
268 auto kMedAirEnvelope = matmgr.getTGeoMedium("ABSO_AIR_ENVELOPE");
269 //
270 auto kMedPb = matmgr.getTGeoMedium("ABSO_PB_C0");
271 auto kMedPbSh = matmgr.getTGeoMedium("ABSO_PB_C2");
272 //
273 auto kMedConcSh = matmgr.getTGeoMedium("ABSO_CC_C2");
274 //
275 auto kMedCH2Sh = matmgr.getTGeoMedium("ABSO_CH2_C2");
276 //
277 auto kMedC = matmgr.getTGeoMedium("ABSO_C_C0");
278 auto kMedCsh = matmgr.getTGeoMedium("ABSO_C_C2");
279 //
280 auto kMedAlu = matmgr.getTGeoMedium("ABSO_ALU_C0");
281 //
282 auto kMedMg = matmgr.getTGeoMedium("ABSO_MG_C0");
283 //
284 const Float_t kDegRad = TMath::Pi() / 180.;
285
286 //
287 TGeoRotation* rotxz = new TGeoRotation("rotxz", 90., 0., 90., 90., 180., 0.);
289 // //
290 // Front Absorber //
291 // Drawing ALIP2A__0106 //
292 // //
293 // //
295 //
296 // Pos 1 Steel Envelope
297 // Pos 2 End Plate
298 // Pos 3 Flange (wrong arrow in the drawing)
299 // Pos 4 W Plate A
300 // Pos 5 W Plate B
301 // Pos 6 Tungsten Tube Part 1
302 // Pos 7 Tungsten Tube Part 2
303 // Pos 8 Tungsten Tube Part 3
304 // Pos 9 Tungsten Tube Part 4
305 // Pos 10 Tungsten Tail
306 // Pos 11 Graphite Cone
307 // Pos 12 Pb Cone
308 // Pos 13 Concrete Cone
309 // Pos 14 Polyethylene Parts
310 // Pos 15 Steel Plate 25 cm
311 // Pos 16 Steel Plate 31 cm
312 // Pos 17 Magnesium Ring
313 // Pos 18 Composite Ring
314 //
315 //
316 // Mimimum angle of the tracking region
317 const Float_t angle02 = TMath::Tan(2. * kDegRad);
318 // Maximum angle of the tracking region
319 const Float_t angle10 = TMath::Tan(10. * kDegRad);
320 // Opening angle of W rear plug
321 const Float_t angle03 = TMath::Tan(3. * kDegRad);
322 //
323 const Float_t angle05 = TMath::Tan(5. * kDegRad);
324 // Opening angle of the FA snout
325 const Float_t angle24 = TMath::Tan(24. * kDegRad);
326 // Opneing angle of the inner cone
327 const Float_t angle71 = TMath::Tan(0.697 * kDegRad);
328 // Starting position in z
329 const Float_t zFa = 90.0;
330
331 // Pos 1
333 // FA Steel Envelope //
334 // Drawing ALIP2A__0036 //
336 // Thickness of the envelope
337 Float_t dSteelEnvelope = 1.5;
338 // Front cover
339 //
340 // Length
341 Float_t dzSteelEnvelopeFC = 4.00;
342 // Inner Radius
343 Float_t rInSteelEnvelopeFC1 = 35.90 / 2.;
344 Float_t rInSteelEnvelopeFC2 = rInSteelEnvelopeFC1 + dzSteelEnvelopeFC * angle10;
345 // Outer Radius
346 Float_t rOuSteelEnvelopeFC1 = 88.97 / 2.;
347 Float_t rOuSteelEnvelopeFC2 = rOuSteelEnvelopeFC1 + dzSteelEnvelopeFC * angle05;
348 //
349 // 5 deg cone
350 Float_t dzSteelEnvelopeC5 = 168.9;
351 Float_t rInSteelEnvelopeC5 = rOuSteelEnvelopeFC2 - dSteelEnvelope / TMath::Cos(5 * kDegRad);
352 Float_t rOuSteelEnvelopeC5 = rOuSteelEnvelopeFC2;
353 // 10 deg cone
354 Float_t dzSteelEnvelopeC10 = 227.1 - 4.;
355 Float_t rInSteelEnvelopeC10 = 116.22 / 2.;
356 Float_t rOuSteelEnvelopeC10 = rInSteelEnvelopeC10 + dSteelEnvelope / TMath::Cos(10 * kDegRad);
357 // Rear ring
358 Float_t dzSteelEnvelopeR = 4.;
359 Float_t rInSteelEnvelopeR2 = 196.3 / 2.;
360 Float_t rOuSteelEnvelopeR2 = 212.0 / 2.;
361 Float_t rInSteelEnvelopeR1 = rInSteelEnvelopeR2 - dzSteelEnvelopeR * angle10;
362 Float_t rOuSteelEnvelopeR1 = rInSteelEnvelopeR1 + dSteelEnvelope / TMath::Cos(10 * kDegRad);
363 // Front insert
364 Float_t dzSteelEnvelopeFI = 1.;
365 Float_t rInSteelEnvelopeFI = 42.0 / 2.;
366 Float_t rOuSteelEnvelopeFI = 85.0 / 2. + 0.06;
367
368 TGeoPcon* shFaSteelEnvelopeC = new TGeoPcon(0., 360., 7);
369 z = 0.;
370 // Front cover
371 shFaSteelEnvelopeC->DefineSection(0, z, rInSteelEnvelopeFC1, rOuSteelEnvelopeFC1);
372 z += dzSteelEnvelopeFC;
373 shFaSteelEnvelopeC->DefineSection(1, z, rInSteelEnvelopeFC2, rOuSteelEnvelopeFC2);
374 // 5 deg cone
375 shFaSteelEnvelopeC->DefineSection(2, z, rInSteelEnvelopeC5, rOuSteelEnvelopeC5);
376 z += dzSteelEnvelopeC5;
377 shFaSteelEnvelopeC->DefineSection(3, z, rInSteelEnvelopeC10, rOuSteelEnvelopeC10);
378 // 10 deg cone
379 z += dzSteelEnvelopeC10;
380 shFaSteelEnvelopeC->DefineSection(4, z, rInSteelEnvelopeR1, rOuSteelEnvelopeR1);
381 // Rear Ring
382 shFaSteelEnvelopeC->DefineSection(5, z, rInSteelEnvelopeR1, rOuSteelEnvelopeR2);
383 z += dzSteelEnvelopeR;
384 shFaSteelEnvelopeC->DefineSection(6, z, rInSteelEnvelopeR2, rOuSteelEnvelopeR2);
385
386 // Insert
387 shFaSteelEnvelopeC->SetName("steelEnvC");
388 TGeoTube* shFaSteelEnvelopeT = new TGeoTube(rInSteelEnvelopeFI, rOuSteelEnvelopeFI, dzSteelEnvelopeFI);
389 shFaSteelEnvelopeT->SetName("steelEnvT");
390 TGeoCompositeShape* shFaSteelEnvelope = new TGeoCompositeShape("shFaSteelEnvelope", "steelEnvC-steelEnvT");
391
392 TGeoVolume* voFaSteelEnvelope = new TGeoVolume("AFaSteelEnvelope", shFaSteelEnvelope, kMedSteel);
393
394 // Pos 2
396 // FA End Plate //
397 // Drawing ALIP2A__0037 //
399 //
400 //
401 //
402 // Outer dimensions dx, dy, dz
403 Float_t dxEndPlate = 220.0;
404 Float_t dyEndPlate = 220.0;
405 Float_t dzEndPlate = 6.0;
406 // Inner radius
407 Float_t rInEndPlate = 52.5 / 2.;
408 // Insert
409 Float_t rInEndPlateI = 175.3 / 2.;
410 Float_t rOuEndPlateI = 212.2 / 2.;
411 Float_t dzEndPlateI = 2.0;
412
413 TGeoBBox* endPlate1 = new TGeoBBox(dxEndPlate / 2., dyEndPlate / 2., dzEndPlate / 2.);
414 endPlate1->SetName("endPlate1");
415
416 TGeoTube* endPlate2 = new TGeoTube(0., rInEndPlate, (dzEndPlate + 0.1) / 2.);
417 endPlate2->SetName("endPlate2");
418 TGeoTube* endPlate3 = new TGeoTube(rInEndPlateI, rOuEndPlateI, (dzEndPlateI + 0.1) / 2.);
419 endPlate3->SetName("endPlate3");
420
421 TGeoTranslation* tPlate = new TGeoTranslation("tPlate", 0., 0., -dzEndPlateI - 0.05);
422 tPlate->RegisterYourself();
423
424 TGeoCompositeShape* shFaEndPlate = new TGeoCompositeShape("shFaEndPlate", "endPlate1-(endPlate2+endPlate3:tPlate)");
425 TGeoVolume* voFaEndPlate = new TGeoVolume("AFaEndPlate", shFaEndPlate, kMedSteel);
426
427 // Pos 3
429 // FA Flange //
430 // Drawing ALIP2A__0038 //
432 // Width of the Flange
433 Float_t dzFaFlange = 2.;
434 // Outer radius
435 Float_t rOuFaFlange = 41.0 / 2.;
436 // 1st section
437 Float_t dzFaFlange1 = 0.8;
438 Float_t rInFaFlange1 = 33.4 / 2.;
439 // 2nd section
440 Float_t dzFaFlange2 = 1.2;
441 Float_t rInFaFlange2 = 36.4 / 2.;
442
443 TGeoPcon* shFaFlange = new TGeoPcon(0., 360., 4);
444 z = 0;
445 shFaFlange->DefineSection(0, z, rInFaFlange1, rOuFaFlange);
446 z += dzFaFlange1;
447 shFaFlange->DefineSection(1, z, rInFaFlange1, rOuFaFlange);
448 shFaFlange->DefineSection(2, z, rInFaFlange2, rOuFaFlange);
449 z += dzFaFlange2;
450 shFaFlange->DefineSection(3, z, rInFaFlange2, rOuFaFlange);
451
452 TGeoVolume* voFaFlange = new TGeoVolume("AFaFlange", shFaFlange, kMedSteel);
453
454 // Pos 4+5
456 // FA W Plate A+B //
457 // Drawing ALIP2A__0043 //
459 // Front Flange
460 Float_t dzFaWPlateF = 2.00;
461 Float_t rInFaQPlateF = 20.50;
462 Float_t rOuFaQPlateF = 40.05;
463 // 1st Central Part 24 deg
464 Float_t dzFaWPlateC1 = 7.95;
465 Float_t rInFaQPlateC1 = 16.35;
466 Float_t rOuFaQPlateC1 = rOuFaQPlateF + dzFaWPlateF * angle24;
467 // 2nd Central Part 5 deg
468 Float_t dzFaWPlateC2 = 1.05;
469 Float_t rInFaQPlateC2 = rInFaQPlateC1 + dzFaWPlateC1 * angle10;
470 Float_t rOuFaQPlateC2 = rOuFaQPlateC1 + dzFaWPlateC1 * angle24;
471 Float_t rInFaQPlateC3 = 17.94;
472 Float_t rOuFaQPlateC3 = 44.49;
473 // Rear Flange
474 Float_t dzFaWPlateR = 1.00;
475 Float_t rInFaQPlateR = 21.00;
476 Float_t rOuFaQPlateR = 42.55;
477 // Lenth of Plate - Rear Flange
478 Float_t dzFaWPlate = dzFaWPlateF + dzFaWPlateC1 + dzFaWPlateC2;
479
480 TGeoPcon* shFaWPlateA = new TGeoPcon(0., 360., 7);
481 z = 0.;
482 // Front Flange
483 shFaWPlateA->DefineSection(0, z, rInFaQPlateF, rOuFaQPlateF);
484 z += dzFaWPlateF;
485 shFaWPlateA->DefineSection(1, z, rInFaQPlateF, rOuFaQPlateC1);
486 // 24 deg cone
487 shFaWPlateA->DefineSection(2, z, rInFaQPlateC1, rOuFaQPlateC1);
488 z += dzFaWPlateC1;
489 shFaWPlateA->DefineSection(3, z, rInFaQPlateC2, rOuFaQPlateC2);
490 // 5 deg cone
491 z += dzFaWPlateC2;
492 shFaWPlateA->DefineSection(4, z, rInFaQPlateC3, rOuFaQPlateC3);
493 // Rear Flange
494 shFaWPlateA->DefineSection(5, z, rInFaQPlateR, rOuFaQPlateR);
495 z += dzFaWPlateR;
496 shFaWPlateA->DefineSection(6, z, rInFaQPlateR, rOuFaQPlateR);
497
498 TGeoVolume* voFaWPlateA = new TGeoVolume("AFaWPlateA", shFaWPlateA, kMedNiW);
499 // Inner region with higher transport cuts
500 TGeoPcon* shFaWPlateAI = new TGeoPcon(0., 360., 5);
501 z = 3.;
502 shFaWPlateAI->DefineSection(0, z, rInFaQPlateF + z * angle10, rOuFaQPlateC1 + (z - dzFaWPlateF) * angle24);
503 for (Int_t i = 1; i < 5; i++) {
504 Float_t rmin = shFaWPlateA->GetRmin(i + 2);
505 Float_t rmax = shFaWPlateA->GetRmax(i + 2) - 3.;
506 Float_t zpos = shFaWPlateA->GetZ(i + 2);
507 shFaWPlateAI->DefineSection(i, zpos, rmin, rmax);
508 }
509 TGeoVolume* voFaWPlateAI = new TGeoVolume("AFaWPlateAI", shFaWPlateAI, kMedNiWsh);
510 voFaWPlateA->AddNode(voFaWPlateAI, 1, gGeoIdentity);
511
512 //
513 // Inner Tungsten Shield
514 // Part 1 99.8 cm
515 // Part 2 143.5 cm
516 // Part 3 25.0 cm
517 // Part 4 31.0 cm
518 // ====================
519 // 299.3 cm - 0.6 overlap between Part 1 and Part 2
520 // 298.7 cm
521 // Starting position 499.0 - 298.7 = 200.3
522 // Within C cone: 200.3 - 92.0 = 108.3 = end of straight section of the Graphite Cone
523 //
524
525 // Pos 6
527 // FA Tungsten Tube Part 1 //
528 // Drawing ALIP2A__0045 //
530 //
531 // Inner radius
532 Float_t rInFaWTube1C1 = 9.1 / 2.;
533 // Central part
534 Float_t dzFaWTube1C = 98.8;
535 Float_t rOuFaWTube1C1 = 13.8 / 2.;
536 Float_t rOuFaWTube1C2 = 20.7 / 2.;
537 // Rear Flange
538 Float_t dzFaWTube1R = 1.0;
539 Float_t rOuFaWTube1R = 15.0 / 2.;
540 // Total length
541 Float_t dzFaWTube1 = dzFaWTube1C + dzFaWTube1R;
542
543 TGeoPcon* shFaWTube1 = new TGeoPcon(0., 360., 4);
544 z = 0.;
545 // Central Part
546 shFaWTube1->DefineSection(0, z, rInFaWTube1C1, rOuFaWTube1C1);
547 z += dzFaWTube1C;
548 shFaWTube1->DefineSection(1, z, rInFaWTube1C1, rOuFaWTube1C2);
549 // Rear Flange
550 shFaWTube1->DefineSection(2, z, rInFaWTube1C1, rOuFaWTube1R);
551 z += dzFaWTube1R;
552 shFaWTube1->DefineSection(3, z, rInFaWTube1C1, rOuFaWTube1R);
553
554 TGeoVolume* voFaWTube1 = new TGeoVolume("AFaWTube1", shFaWTube1, kMedNiWsh);
555
556 // Pos 7
558 // FA Tungsten Tube Part 2 //
559 // Drawing ALIP2A__0046 //
561 //
562
563 // Central part
564 Float_t dzFaWTube2C = 142.9;
565 Float_t rInFaWTube2C1 = 9.10 / 2.;
566 Float_t rInFaWTube2C2 = 12.58 / 2.;
567 Float_t rOuFaWTube2C1 = 20.70 / 2.;
568 Float_t rOuFaWTube2C2 = 30.72 / 2. - 0.05;
569 // Front Flange
570 Float_t dzFaWTube2F = 0.6;
571 Float_t rInFaWTube2F = 15.4 / 2.;
572 // Total length
573 Float_t dzFaWTube2 = dzFaWTube2C + dzFaWTube2F;
574
575 TGeoPcon* shFaWTube2 = new TGeoPcon(0., 360., 4);
576 z = 0.;
577 // Front Flange
578 shFaWTube2->DefineSection(0, z, rInFaWTube2F, rOuFaWTube2C1);
579 z += dzFaWTube2F;
580 shFaWTube2->DefineSection(1, z, rInFaWTube2F, rOuFaWTube2C1);
581 // Central part
582 shFaWTube2->DefineSection(2, z, rInFaWTube2C1, rOuFaWTube2C1);
583 z += dzFaWTube2C;
584 shFaWTube2->DefineSection(3, z, rInFaWTube2C2, rOuFaWTube2C2);
585
586 TGeoVolume* voFaWTube2 = new TGeoVolume("AFaWTube2", shFaWTube2, kMedNiWsh);
587
588 // Pos 8
590 // FA Tungsten Tube Part 3 //
591 // Drawing ALIP2A__0047 //
593 Float_t dzFaWTube3 = 25.0;
594 Float_t rInFaWTube3C1 = 12.59 / 2.;
595 Float_t rInFaWTube3C2 = 13.23 / 2.;
596 Float_t rOuFaWTube3C1 = 30.60 / 2.;
597 Float_t rOuFaWTube3C2 = 32.35 / 2.;
598 TGeoVolume* voFaWTube3 = new TGeoVolume(
599 "AFaWTube3", new TGeoCone(dzFaWTube3 / 2., rInFaWTube3C1, rOuFaWTube3C1, rInFaWTube3C2, rOuFaWTube3C2), kMedNiWsh);
600
601 // Pos 9
603 // FA Tungsten Tube Part 4 //
604 // Drawing ALIP2A__0048 //
606 Float_t dzFaWTube4 = 31.0;
607 Float_t rInFaWTube4C1 = 13.23 / 2.;
608 Float_t rInFaWTube4C2 = 13.98 / 2.;
609 Float_t rOuFaWTube4C1 = 48.80 / 2.;
610 Float_t rOuFaWTube4C2 = 52.05 / 2.;
611 TGeoVolume* voFaWTube4 = new TGeoVolume(
612 "AFaWTube4", new TGeoCone(dzFaWTube4 / 2., rInFaWTube4C1, rOuFaWTube4C1, rInFaWTube4C2, rOuFaWTube4C2), kMedNiWsh);
613
614 // Pos 10
615 //
616 // This section is partially in Shield
617 Float_t dzFaWTube5 = 6.0;
618 Float_t kAngle0071 = TMath::Tan(0.71 * kDegRad);
619 Float_t rInFaWTube5C1 = rInFaWTube4C2;
620 Float_t rInFaWTube5C2 = rInFaWTube4C2 + dzFaWTube4 * kAngle0071;
621 Float_t rOuFaWTube5C1 = rOuFaWTube4C2;
622 TGeoVolume* voFaWTube5 = new TGeoVolume(
623 "AFaWTube5", new TGeoCone(dzFaWTube5 / 2., rInFaWTube5C1, rOuFaWTube5C1, rInFaWTube5C2, rOuFaWTube5C1), kMedNiWsh);
624
625 //
626 // Pos 11
628 // FA Graphite Cone //
629 // Drawing ALIP2_0002 //
631 //
632 // Total length
633 Float_t dzFaGraphiteCone = 225.0;
634 // Straight section = start of the 2deg inner cone
635 Float_t dzFaGraphiteConeS = 108.3;
636 // Inner radius at the front
637 Float_t rInFaGraphiteCone1 = 4.5;
638 // Outer radius at the front
639 Float_t rOuFaGraphiteCone1 = (zFa + dzFaFlange) * angle10;
640 // Inner radius at start of inner opening cone
641 Float_t rInFaGraphiteCone2 = 7.0;
642 // Outer radius at start of inner opening cone
643 Float_t rOuFaGraphiteCone2 = (zFa + dzFaFlange + dzFaGraphiteConeS) * angle10;
644 // Inner radius the rear
645 Float_t rInFaGraphiteCone3 = 11.0;
646 // Ouer radius at the rear
647 Float_t rOuFaGraphiteCone3 = (zFa + dzFaFlange + dzFaGraphiteCone) * angle10;
648
649 TGeoPcon* shFaGraphiteCone = new TGeoPcon(0., 360., 4);
650
651 z = 0;
652 // Straight section
653 shFaGraphiteCone->DefineSection(0, z, rInFaGraphiteCone1, rOuFaGraphiteCone1);
654 z += dzFaGraphiteConeS;
655 shFaGraphiteCone->DefineSection(1, z, rInFaGraphiteCone1, rOuFaGraphiteCone2);
656 // 2 deg opening cone
657 shFaGraphiteCone->DefineSection(2, z, rInFaGraphiteCone2, rOuFaGraphiteCone2);
658 z = dzFaGraphiteCone;
659 shFaGraphiteCone->DefineSection(3, z, rInFaGraphiteCone3, rOuFaGraphiteCone3);
660
661 TGeoVolume* voFaGraphiteCone = new TGeoVolume("AFaGraphiteCone", shFaGraphiteCone, kMedCsh);
662 //
663 // Outer region with lower transport cuts
664 dz = 50.;
665 TGeoCone* shFaGraphiteConeO = new TGeoCone(dz / 2., rInFaGraphiteCone1, rOuFaGraphiteCone1, rInFaGraphiteCone1,
666 rOuFaGraphiteCone1 + dz * angle10);
667
668 TGeoVolume* voFaGraphiteConeO = new TGeoVolume("AFaGraphiteConeO", shFaGraphiteConeO, kMedC);
669 voFaGraphiteCone->AddNode(voFaGraphiteConeO, 1, new TGeoTranslation(0., 0., dz / 2.));
670
671 // Pos 12
673 // FA Lead Cone //
674 // Drawing ALIP2A__0077 //
676 // 5 deg cone
677 Float_t dzFaPbCone5 = 168.9;
678 Float_t rInFaPbCone5 = 37.35 / 2.;
679 Float_t rOuFaPbCone5 = 85.66 / 2.;
680 // 10 deg cone
681 Float_t dzFaPbCone10 = 25.9;
682 Float_t rInFaPbCone10 = rInFaPbCone5 + dzFaPbCone5 * angle10;
683 Float_t rOuFaPbCone10 = 115.2 / 2.;
684 // end
685 Float_t rInFaPbConeE = 106.05 / 2.;
686 Float_t rOuFaPbConeE = 124.35 / 2.;
687 // Total length
688 Float_t dzFaPbCone = dzFaPbCone5 + dzFaPbCone10;
689
690 TGeoPcon* shFaPbCone = new TGeoPcon(0., 360., 3);
691 z = 0.;
692 // 5 deg cone
693 shFaPbCone->DefineSection(0, z, rInFaPbCone5, rOuFaPbCone5);
694 z += dzFaPbCone5;
695 // 10 deg cone
696 shFaPbCone->DefineSection(1, z, rInFaPbCone10, rOuFaPbCone10);
697 z += dzFaPbCone10;
698 shFaPbCone->DefineSection(2, z, rInFaPbConeE, rOuFaPbConeE);
699
700 TGeoVolume* voFaPbCone = new TGeoVolume("AFaPbCone", shFaPbCone, kMedPb);
701 //
702 // Inner region with higher transport cuts
703 TGeoPcon* shFaPbConeI = MakeShapeFromTemplate(shFaPbCone, 0., -3.);
704 TGeoVolume* voFaPbConeI = new TGeoVolume("AFaPbConeI", shFaPbConeI, kMedPbSh);
705 voFaPbCone->AddNode(voFaPbConeI, 1, gGeoIdentity);
706
707 // Pos 13
709 // FA Concrete Cone //
710 // Drawing ALIP2A__00xx //
712 Float_t dzFaConcreteCone = 126.;
713 Float_t rOuFaConcreteCone1 = rOuFaGraphiteCone3;
714 Float_t rInFaConcreteCone1 = 11.;
715 Float_t rOuFaConcreteCone2 = rOuFaConcreteCone1 + dzFaConcreteCone * angle10;
716 Float_t rInFaConcreteCone2 = rInFaConcreteCone1 + dzFaConcreteCone * angle02;
717
718 TGeoVolume* voFaConcreteCone = new TGeoVolume(
719 "AFaConcreteCone",
720 new TGeoCone(dzFaConcreteCone / 2., rInFaConcreteCone1, rOuFaConcreteCone1, rInFaConcreteCone2, rOuFaConcreteCone2),
721 kMedConcSh);
722
723 // Pos 14
725 // FA Polyethylene Parts //
726 // Drawing ALIP2A__0034 //
728 Float_t dzFaCH2Cone = 201.;
729 Float_t rInFaCH2Cone1 = 106.0 / 2.;
730 Float_t rInFaCH2Cone2 = 176.9 / 2.;
731 Float_t dFaCH2Cone = 7.5 / TMath::Cos(10. * kDegRad);
732
733 TGeoVolume* voFaCH2Cone =
734 new TGeoVolume("AFaCH2Cone", new TGeoCone(dzFaCH2Cone / 2., rInFaCH2Cone1, rInFaCH2Cone1 + dFaCH2Cone, rInFaCH2Cone2, rInFaCH2Cone2 + dFaCH2Cone),
735 kMedCH2Sh);
736
737 // Pos 15
739 // FA Steel Plate 250 mm //
740 // Drawing ALIP2A__00xx //
742 Float_t dzFaSteelCone25 = 25.;
743 Float_t eps = 0.001;
744 Float_t rInFaSteelCone25A = rInFaConcreteCone2;
745 Float_t rOuFaSteelCone25A = rOuFaConcreteCone2;
746 Float_t rInFaSteelCone25B = rInFaSteelCone25A + dzFaSteelCone25 * angle02;
747 Float_t rOuFaSteelCone25B = rOuFaSteelCone25A + dzFaSteelCone25 * angle10;
748
749 TGeoVolume* voFaSteelCone25 = new TGeoVolume(
750 "AFaSteelCone25", new TGeoCone(dzFaSteelCone25 / 2., rInFaSteelCone25A + eps, rOuFaSteelCone25A - eps, rInFaSteelCone25B + eps, rOuFaSteelCone25B - eps),
751 kMedSteelSh);
752
753 // Pos 16
755 // FA Steel Plate 310 mm //
756 // Drawing ALIP2A__00xx //
758 Float_t dzFaSteelCone31 = 31.;
759 Float_t rInFaSteelCone31A = rOuFaWTube4C1;
760 ;
761 Float_t rOuFaSteelCone31A = rOuFaSteelCone25B;
762 Float_t rInFaSteelCone31B = rOuFaWTube4C2;
763 Float_t rOuFaSteelCone31B = rOuFaSteelCone31A + dzFaSteelCone31 * angle10;
764
765 TGeoVolume* voFaSteelCone31 = new TGeoVolume(
766 "AFaSteelCone31", new TGeoCone(dzFaSteelCone31 / 2., rInFaSteelCone31A + eps, rOuFaSteelCone31A - eps, rInFaSteelCone31B + eps, rOuFaSteelCone31B - eps),
767 kMedSteelSh);
768 // Outer Region with higher transport cuts
769 dz = 5.;
770 TGeoVolume* voFaSteelCone31I =
771 new TGeoVolume("AFaSteelCone31I",
772 new TGeoCone(dz / 2., rInFaSteelCone31B - dz * angle03 + eps, rOuFaSteelCone31B - dz * angle10 - eps,
773 rInFaSteelCone31B + eps, rOuFaSteelCone31B - eps),
774 kMedSteel);
775
776 voFaSteelCone31->AddNode(voFaSteelCone31I, 1, new TGeoTranslation(0., 0., dzFaSteelCone31 / 2. - dz / 2.));
777
779 // FA Composite Ring //
780 // Drawing ALIP2A__0126 //
782 // 1st section
783 Float_t dzFaCompRing1 = 0.8;
784 Float_t rInFaCompRing1 = 11.0 / 2.;
785 Float_t rOuFaCompRing1 = 32.4 / 2.;
786 // 2nd section
787 Float_t dzFaCompRing2 = 1.2;
788 Float_t rInFaCompRing2 = 14.0 / 2.;
789 Float_t rOuFaCompRing2 = 35.3 / 2.;
790
791 TGeoPcon* shFaCompRing = new TGeoPcon(0., 360., 4);
792 z = 0.;
793 // 1st section
794 shFaCompRing->DefineSection(0, z, rInFaCompRing1, rOuFaCompRing1);
795 z += dzFaCompRing1;
796 shFaCompRing->DefineSection(1, z, rInFaCompRing1, rOuFaCompRing1);
797 // 2nd section
798 shFaCompRing->DefineSection(2, z, rInFaCompRing2, rOuFaCompRing2);
799 ;
800 z += dzFaCompRing2;
801 shFaCompRing->DefineSection(3, z, rInFaCompRing2, rOuFaCompRing2);
802
803 TGeoVolume* voFaCompRing = new TGeoVolume("AFaCompRing", shFaCompRing, kMedC);
804
806 // FA Magnesium Ring //
807 // Drawing ALIP2A__0127 //
809 //
810 // The inner radii
811 // section 1+3
812 Float_t dzFaMgRingO = 0.7;
813 Float_t rInFaMgRingO = 3.0;
814 // section 2
815 Float_t dzFaMgRingI = 0.6;
816 Float_t rInFaMgRingI = 3.5;
817
818 TGeoPcon* shFaMgRing = new TGeoPcon(0., 360., 8);
819 // 1st section
820 z = 0.;
821 shFaMgRing->DefineSection(0, z, rInFaMgRingO, rInFaCompRing1);
822 z += dzFaMgRingO;
823 shFaMgRing->DefineSection(1, z, rInFaMgRingO, rInFaCompRing1);
824 // 2nd section
825 shFaMgRing->DefineSection(2, z, rInFaMgRingI, rInFaCompRing1);
826 z += dzFaMgRingI / 2.;
827 shFaMgRing->DefineSection(3, z, rInFaMgRingI, rInFaCompRing1);
828 // 3rd section
829 shFaMgRing->DefineSection(4, z, rInFaMgRingI, rInFaCompRing2);
830 z += dzFaMgRingI / 2.;
831 shFaMgRing->DefineSection(5, z, rInFaMgRingI, rInFaCompRing2);
832 // 4th section
833 shFaMgRing->DefineSection(6, z, rInFaMgRingO, rInFaCompRing2);
834 z += dzFaMgRingO;
835 shFaMgRing->DefineSection(7, z, rInFaMgRingO, rInFaCompRing2);
836 TGeoVolume* voFaMgRing = new TGeoVolume("AFaMgRing", shFaMgRing, kMedMg);
837
838 //
839 // Absorber mother volume
840 //
841 //
842 // Length of the absorber without endplate
843 Float_t dzFa = dzFaFlange + dzFaGraphiteCone + dzFaConcreteCone + dzFaSteelCone25 + dzFaSteelCone31;
844 TGeoPcon* shFaM = new TGeoPcon(0., 360., 16);
845 // Front -> Flange (Mg Ring details)
846 z = 0.;
847 shFaM->DefineSection(0, z, rInFaMgRingO, rOuFaQPlateF);
848 z += dzFaMgRingO;
849 dz = dzFaMgRingO;
850 shFaM->DefineSection(1, z, rInFaMgRingO, rOuFaQPlateF + dz * angle24);
851 shFaM->DefineSection(2, z, rInFaMgRingI, rOuFaQPlateF + dz * angle24);
852 z += dzFaMgRingI;
853 dz += dzFaMgRingI;
854 shFaM->DefineSection(3, z, rInFaMgRingI, rOuFaQPlateF + dz * angle24);
855 shFaM->DefineSection(4, z, rInFaMgRingO, rOuFaQPlateF + dz * angle24);
856 z += dzFaMgRingO;
857 dz += dzFaMgRingO;
858 shFaM->DefineSection(5, z, rInFaMgRingO, rOuFaQPlateF + dz * angle24);
859 shFaM->DefineSection(6, z, rInFaGraphiteCone1, rOuFaQPlateF + dz * angle24);
860 // Flange -> W-Plate B
861 z += dzFaWPlateC1;
862 shFaM->DefineSection(7, z, rInFaGraphiteCone1, rOuFaQPlateC2);
863 z += dzFaWPlateC2;
864 Float_t zFaSteelEnvelope = z;
865 shFaM->DefineSection(8, z, rInFaGraphiteCone1, rOuFaQPlateC3);
866 // 5 deg cone -> 10 deg cone
867 z = zFaSteelEnvelope + dzSteelEnvelopeFC + dzSteelEnvelopeC5;
868 shFaM->DefineSection(9, z, rInFaGraphiteCone1, rOuSteelEnvelopeC10);
869 // 10 deg cone up to end of straight section
870 z0 = z;
871 z = dzFaFlange + dzFaGraphiteConeS + dzFaWTube1C;
872 dz = z - z0;
873 shFaM->DefineSection(10, z, rInFaGraphiteCone1, rOuSteelEnvelopeC10 + dz * angle10);
874 // 0.7 deg inner opening cone up to outer rear ring
875 z0 = z;
876 z = dzFa - dzSteelEnvelopeR / 2.;
877 dz = (z - z0);
878 shFaM->DefineSection(11, z, rInFaGraphiteCone1 + dz * angle71, rOuSteelEnvelopeR1);
879 shFaM->DefineSection(12, z, rInFaGraphiteCone1 + dz * angle71, rOuSteelEnvelopeR2);
880 z += dzSteelEnvelopeR / 2.;
881 shFaM->DefineSection(13, z, rInFaWTube4C2, rOuSteelEnvelopeR2);
882 // Recess for end plate
883 dz = dzSteelEnvelopeR / 2;
884 shFaM->DefineSection(14, z, rInFaCH2Cone2 - dz * angle10, rOuSteelEnvelopeR2);
885 z += dzSteelEnvelopeR / 2.;
886 shFaM->DefineSection(15, z, rInFaCH2Cone2, rOuSteelEnvelopeR2);
887 // AFaM is the mother of the whole absorber, and its dedicated medium is what
888 // makes "the absorber" addressable as one fast-simulation region.
889 TGeoVolume* voFaM = new TGeoVolume("AFaM", shFaM, kMedAirEnvelope);
890 voFaM->SetVisibility(0);
891
892 //
893 // Assemble volumes inside acceptance
894 TGeoPcon* shFaAccM = new TGeoPcon(0., 360., 7);
895 for (Int_t i = 0; i < 4; i++) {
896 Float_t zpos = shFaGraphiteCone->GetZ(i);
897 Float_t rmin = shFaGraphiteCone->GetRmin(i);
898 Float_t rmax = shFaGraphiteCone->GetRmax(i);
899 shFaAccM->DefineSection(i, zpos, rmin, rmax);
900 }
901 z = dzFaGraphiteCone + dzFaConcreteCone + dzFaSteelCone25;
902 z0 = z + zFa + dzFaFlange;
903 shFaAccM->DefineSection(4, z, rOuFaWTube3C2, z0 * angle10);
904 shFaAccM->DefineSection(5, z, rOuFaWTube4C1, z0 * angle10);
905 z += dzFaSteelCone31;
906 z0 += dzFaSteelCone31;
907 shFaAccM->DefineSection(6, z, rOuFaWTube4C2, z0 * angle10);
908 TGeoVolume* voFaAccM = new TGeoVolume("AFaAcc", shFaAccM, kMedAir);
909
910 z = 0;
911 voFaAccM->AddNode(voFaGraphiteCone, 1, gGeoIdentity);
912 z += dzFaGraphiteCone;
913 voFaAccM->AddNode(voFaConcreteCone, 1, new TGeoTranslation(0., 0., z + dzFaConcreteCone / 2.));
914 z += dzFaConcreteCone;
915 voFaAccM->AddNode(voFaSteelCone25, 1, new TGeoTranslation(0., 0., z + dzFaSteelCone25 / 2.));
916 z += dzFaSteelCone25;
917 voFaAccM->AddNode(voFaSteelCone31, 1, new TGeoTranslation(0., 0., z + dzFaSteelCone31 / 2.));
918
919 //
920 // Inner shield
921 TGeoVolumeAssembly* voFaInnerShield = new TGeoVolumeAssembly("AFaInnerShield");
922 voFaInnerShield->AddNode(voFaWTube1, 1, gGeoIdentity);
923 z = dzFaWTube1 - 0.6;
924 voFaInnerShield->AddNode(voFaWTube2, 1, new TGeoTranslation(0., 0., z));
925 z += dzFaWTube2;
926 voFaInnerShield->AddNode(voFaWTube3, 1, new TGeoTranslation(0., 0., z + dzFaWTube3 / 2.));
927 z += dzFaWTube3;
928 voFaInnerShield->AddNode(voFaWTube4, 1, new TGeoTranslation(0., 0., z + dzFaWTube4 / 2.));
929 z = dzFaGraphiteConeS + dzFaFlange;
930 voFaM->AddNode(voFaInnerShield, 1, new TGeoTranslation(0., 0., z));
931
932 //
933 // Adding volumes to mother volume
934 //
935 z = 0.;
936 voFaM->AddNode(voFaWPlateA, 1, gGeoIdentity);
937 z += dzFaWPlate;
938 voFaM->AddNode(voFaSteelEnvelope, 1, new TGeoTranslation(0., 0., z));
939 z += dzSteelEnvelopeFC;
940 voFaM->AddNode(voFaPbCone, 1, new TGeoTranslation(0., 0., z));
941 z += (dzFaPbCone + dzFaCH2Cone / 2.);
942 voFaM->AddNode(voFaCH2Cone, 1, new TGeoTranslation(0., 0., z));
943 voFaM->AddNode(voFaFlange, 1, gGeoIdentity);
944 voFaM->AddNode(voFaMgRing, 1, gGeoIdentity);
945 voFaM->AddNode(voFaCompRing, 1, gGeoIdentity);
946 voFaM->AddNode(voFaAccM, 1, new TGeoTranslation(0., 0., dzFaFlange));
947
949 // //
950 // Front Absorber Support Structure FASS //
951 // //
952 // Drawing ALIP2A__0035 //
953 // Drawing ALIP2A__0089 //
954 // Drawing ALIP2A__0090 //
955 // Drawing ALIP2A__0109 //
957 TGeoVolumeAssembly* voFass = new TGeoVolumeAssembly("AFass");
958 const Float_t kFassUBFlangeH = 380.;
959 const Float_t kFassUBFlangeW = 77.;
960
961 const Float_t kFassUMFlangeH = 380.;
962 const Float_t kFassUMFlangeB = 246. - 9.85;
963 const Float_t kFassUMFlangeT = 10.;
964 const Float_t kFassUMFalpha = -TMath::ATan((kFassUMFlangeB - kFassUMFlangeT) / kFassUMFlangeH / 2.) / kDegRad;
965 // Upper back flange
966 // B1
967 // 380 x 77
968 TGeoVolume* voFassUBFlange =
969 new TGeoVolume("AFassUBFlange", new TGeoBBox(kFassUBFlangeW / 2., kFassUBFlangeH / 2., 3. / 2.), kMedSteel);
970 // voFass->AddNode(voFassUBFlange, 1,
971 // new TGeoTranslation(+1.5 + kFassUBFlangeW / 2., 180. + kFassUBFlangeH / 2., kFassUMFlangeB - 1.5));
972 //voFass->AddNode(voFassUBFlange, 2,
973 // new TGeoTranslation(-1.5 - kFassUBFlangeW / 2., 180. + kFassUBFlangeH / 2., kFassUMFlangeB - 1.5));
974
975 // Lower back flange
976 // Upper median flange
977 // Drawing ALIP2A__0090 //
978 // Drawing ALIP2A__0089 //
979 // A2
980
981 TGeoVolume* voFassUMFlange = new TGeoVolume(
982 "AFassUMFlange", new TGeoTrap(kFassUMFlangeH / 2., kFassUMFalpha, 0., 1.5, kFassUMFlangeB / 2., kFassUMFlangeB / 2., 0., 1.5, kFassUMFlangeT / 2., kFassUMFlangeT / 2., 0.),
983 kMedSteel);
984
985 TGeoRotation* rotFass1 = new TGeoRotation("rotFass1", 180., 0., 90., 0., 90., 90.);
986 voFass->AddNode(voFassUMFlange, 1,
987 new TGeoCombiTrans(0., 180. + kFassUMFlangeH / 2.,
988 -(kFassUMFlangeB + kFassUMFlangeT) / 4. + kFassUMFlangeB, rotFass1));
989
990 // Lower median flange
991 // Drawing ALIP2A__0090 //
992 // Drawing ALIP2A__0089 //
993 // A1
994 const Float_t kFassLMFlangeH = 242.;
995 const Float_t kFassLMFlangeB = 246. - 9.85;
996 const Float_t kFassLMFlangeT = 43.;
997 const Float_t kFassLMFalpha = -TMath::ATan((kFassLMFlangeB - kFassLMFlangeT) / kFassLMFlangeH / 2.) / kDegRad;
998 TGeoVolume* voFassLMFlange = new TGeoVolume(
999 "AFassLMFlange", new TGeoTrap(kFassLMFlangeH / 2., kFassLMFalpha, 0., 1.5, kFassLMFlangeB / 2., kFassLMFlangeB / 2., 0., 1.5, kFassLMFlangeT / 2., kFassLMFlangeT / 2., 0.),
1000 kMedSteel);
1001 TGeoRotation* rotFass2 = new TGeoRotation("rotFass2", 180., 0., 90., 0., 90., 270.);
1002 voFass->AddNode(voFassLMFlange, 1,
1003 new TGeoCombiTrans(0., -180. - kFassLMFlangeH / 2.,
1004 -(kFassLMFlangeB + kFassLMFlangeT) / 4. + kFassLMFlangeB, rotFass2));
1005
1006 // Stiffeners
1007 // Support Plate
1008 //
1009 // Central cone
1010 // reduce by 9.85 cm inorder to fit into barrel volume
1011 // (insignificant change of material budget, but helping very much to improve the efficiency)
1012 TGeoPgon* shFassCone = new TGeoPgon("FassCone", 22.5, 360., 8, 4);
1013 shFassCone->DefineSection(0, 0., 0., 180.);
1014 shFassCone->DefineSection(1, 3., 0., 180.);
1015 shFassCone->DefineSection(2, 3., 177., 180.);
1016 shFassCone->DefineSection(3, 246. - 9.85, 177., 180.);
1017
1018 TGeoBBox* shFassWindow = new TGeoBBox(190., 53., 28.);
1019 shFassWindow->SetName("FassWindow");
1020 TGeoTranslation* tFassWindow = new TGeoTranslation("tFassWindow", 0., 0., 78.);
1021 tFassWindow->RegisterYourself();
1022
1023 TGeoTube* shFassApperture = new TGeoTube(0., 104., 3.);
1024 shFassApperture->SetName("FassApperture");
1025
1026 TGeoCompositeShape* shFassCentral =
1027 new TGeoCompositeShape("shFassCentral", "FassCone-(FassWindow:tFassWindow+FassApperture)");
1028
1029 TGeoVolume* voFassCentral = new TGeoVolume("AFassCentral", shFassCentral, kMedSteel);
1030 voFass->AddNode(voFassCentral, 1, gGeoIdentity);
1031
1032 //
1033 // Aluminum ring
1034 //
1035 TGeoVolume* voFassAlRing = new TGeoVolume("AFassAlRing", new TGeoTube(104., 180., 10.), kMedAlu);
1036
1037 //
1038 // Assemble the FA
1039 //
1040 // Inside muon spectrometer acceptance
1041 //
1042 // Composite 2 cm
1043 // Graphite 225 cm
1044 // Concrete 126 cm
1045 // Steel 56 cm
1046 // ===================
1047 // 409 cm
1048 // should be 409 cm
1049
1050 //
1051 // Absorber and Support
1052 TGeoVolumeAssembly* voFA = new TGeoVolumeAssembly("AFA");
1053 voFA->AddNode(voFaM, 1, gGeoIdentity);
1054 voFA->AddNode(voFaEndPlate, 1, new TGeoTranslation(0., 0., dzFa + dzEndPlate / 2.));
1055 voFA->AddNode(voFass, 1, new TGeoTranslation(0., 0., 388.45));
1056 voFA->AddNode(voFassAlRing, 1, new TGeoTranslation(0., 0., 382. - 3.56));
1057 voFA->AddNode(voFaWTube5, 1, new TGeoTranslation(0., 0., 412.));
1058 barrel->AddNode(voFA, 1, new TGeoCombiTrans(0., 30., -90., rotxz));
1059}
1060
1061FairModule* 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:226
static void initFieldTrackingParams(int &mode, float &maxfield)
Definition Detector.cxx:143
static MaterialManager & Instance()
void ConstructGeometry() override
Definition Absorber.cxx:241
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