Project
Loading...
Searching...
No Matches
Hall.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
15#include <FairRunSim.h>
16#include <TGeoArb8.h> // for TGeoTrap
17#include <TGeoCompositeShape.h>
18#include <TGeoManager.h>
19#include <TGeoMatrix.h>
20#include <TGeoTrd1.h>
21#include <TGeoTube.h>
22#include <TGeoVolume.h>
23#include <initializer_list>
25using namespace o2::passive;
26
27Hall::~Hall() = default;
28
29Hall::Hall() : PassiveBase("HALL", "") {}
30Hall::Hall(const char* name, const char* Title) : PassiveBase(name, Title) {}
31Hall::Hall(const Hall& rhs) = default;
32
33Hall& Hall::operator=(const Hall& rhs)
34{
35 // self assignment
36 if (this == &rhs) {
37 return *this;
38 }
39
40 // base class assignment
41 PassiveBase::operator=(rhs);
42
43 return *this;
44}
45
46namespace
47{
48constexpr double kDegrad = TMath::DegToRad();
49constexpr double kRaddeg = TMath::RadToDeg();
50} // namespace
51
52void Hall::createMaterials()
53{
55
56 //
57 // Create materials for the experimental hall
58 //
59 Int_t isxfld = 2.;
60 Float_t sxmgmx = 10.;
62 isxfld = 0;
63
64 Float_t aconc[10] = {1., 12.01, 15.994, 22.99, 24.305, 26.98, 28.086, 39.1, 40.08, 55.85};
65 Float_t zconc[10] = {1., 6., 8., 11., 12., 13., 14., 19., 20., 26.};
66 Float_t wconc[10] = {.01, .001, .529107, .016, .002, .033872, .337021, .013, .044, .014};
67
68 Float_t aAir[4] = {12.0107, 14.0067, 15.9994, 39.948};
69 Float_t zAir[4] = {6., 7., 8., 18.};
70 Float_t wAir[4] = {0.000124, 0.755267, 0.231781, 0.012827};
71 Float_t dAir = 1.20479E-3;
72
73 // Steel
74 Float_t asteel[4] = {55.847, 51.9961, 58.6934, 28.0855};
75 Float_t zsteel[4] = {26., 24., 28., 14.};
76 Float_t wsteel[4] = {.715, .18, .1, .005};
77
78 // ****************
79 // Defines tracking media parameters.
80 // Les valeurs sont commentees pour laisser le defaut
81 // a GEANT (version 3-21, page CONS200), f.m.
82 Float_t epsil, stmin, deemax, tmaxfd, stemax;
83 epsil = .001; // Tracking precision,
84 stemax = -1.; // Maximum displacement for multiple scat
85 tmaxfd = -20.; // Maximum angle due to field deflection
86 deemax = -.3; // Maximum fractional energy loss, DLS
87 stmin = -.8;
88 // ***************
89
90 // only media needed for geometry are created
91
92 // Stainless Steel
93 matmgr.Mixture("HALL", kSTST_C2, "STAINLESS STEEL3", asteel, zsteel, 7.88, 4, wsteel);
94 matmgr.Medium("HALL", kSTST_C2, "STST_C2", kSTST_C2, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
95
96 // Air
97 matmgr.Mixture("HALL", kAIR_C2, "AIR2", aAir, zAir, dAir, 4, wAir);
98 matmgr.Medium("HALL", kAIR_C2, "AIR_C2", kAIR_C2, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
99
100 // Concrete
101 matmgr.Mixture("HALL", kCC_C2, "CONCRETE2", aconc, zconc, 2.35, 10, wconc);
102 matmgr.Medium("HALL", kCC_C2, "CC_C2", kCC_C2, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
103
104 matmgr.Mixture("HALL", kCC_C0, "CONCRETE0", aconc, zconc, 2.35, 10, wconc);
105 matmgr.Medium("HALL", kCC_C0, "CC_C0", kCC_C0, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
106 // Iron
107 matmgr.Material("HALL", kFE_C2, "IRON", 55.85, 26., 7.87, 1.76, 17.1);
108 matmgr.Medium("HALL", kFE_C2, "FE_C2", kFE_C2, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
109}
110
111
113{
114 createMaterials();
115
116 //
117 // Create the geometry of the exprimental hall
118 //
119 Float_t r2, dy;
120 Float_t phid, phim, h, r;
121 Float_t w1, dh, am, bm, dl, cm, hm, dr, dx, xl;
122 Float_t hullen;
123 Float_t phi;
124
125 // The top volume
126 //
127 TGeoVolume* top = gGeoManager->GetVolume("cave");
128 TGeoVolumeAssembly* asHall = new TGeoVolumeAssembly("HALL");
129
130 // Rotations
131 // rotation by 90 deg in the y-z plane
132 TGeoRotation* rot000 = new TGeoRotation("rot000", 90., 0., 180., 0., 90., 90.);
133 TGeoRotation* rot001 = new TGeoRotation("rot001", 270., 0., 90., 90., 180., 0.);
134
135 // Media
137 TGeoMedium* kMedCC = matmgr.getTGeoMedium("HALL_CC_C2");
138 TGeoMedium* kMedCClc = matmgr.getTGeoMedium("HALL_CC_C0");
139 TGeoMedium* kMedST = matmgr.getTGeoMedium("HALL_STST_C2");
140 TGeoMedium* kMedAir = matmgr.getTGeoMedium("HALL_AIR_C2");
141 TGeoMedium* kMedFe = matmgr.getTGeoMedium("HALL_FE_C2");
142
143 // Floor thickness
144 Float_t dyFloor = 190.;
145 // Floor width
146 Float_t dxFloor = 1400.;
147 // Floor level
148 Float_t yFloor = -801.;
149 // Pit centre
150 Float_t zPit = 2300.;
151 // Pit radius
152 Float_t rPit = 1140.;
153 // Hall end
154 Float_t zHall24 = 1700.;
155 Float_t zHall26 = 1900.;
156 // Overlap between hall and pit radius
157 Float_t oPit = zHall24 - (zPit - rPit);
158 // Length of the L3 floor
159 Float_t dzL3 = 1700.;
160 // Start of hall roof in y
161 Float_t yHall = 500.;
162 // Radius of the hall roof
163 Float_t rHall = 1070.;
164 //
165 Float_t epsBig = 100.;
166 Float_t epsSmall = 1.;
167
168 //
169 // RB24/26 Tunnel Floor
170 r = 220.;
171 h = 140.;
172 phi = TMath::ACos(h / r);
173 xl = r * TMath::Sin(phi);
174 dr = 1600.;
175 dh = dr * TMath::Cos(phi);
176 dl = dr * TMath::Sin(phi);
177
178 // TODO: we need a faster way to query the modules
179 // from FairRunSim
180 auto run = FairRunSim::Instance();
181 auto modules = run->GetListOfModules();
182 bool haveZDC = false;
183 for (int i = 0; i < modules->GetEntries(); ++i) {
184 auto mod = (FairModule*)modules->At(i);
185 if (mod && strcmp(mod->GetName(), "ZDC") == 0) {
186 haveZDC = true;
187 }
188 }
189 if (!haveZDC) {
190 // No ZDC
191 hullen = 370.;
192 } else {
193 // ZDC is present
194 hullen = 6520.;
195 }
196
197 TGeoVolume* voHUFL = new TGeoVolume("HUFL", new TGeoTrd1(xl + dl, xl, hullen, dh / 2.), kMedCC);
198 r2 = hullen + zHall26;
199 asHall->AddNode(voHUFL, 1, new TGeoCombiTrans(70., -100. - dh / 2., -r2 - 0.755, rot000));
200
201 //
202 // RB24/26 wall
203 phid = phi * kRaddeg;
204 TGeoVolume* voHUWA =
205 new TGeoVolume("HUWA", new TGeoTubeSeg(r, r + dr, hullen, phid - 90. + 0.002, 270. - phid - 0.002), kMedCC);
206 asHall->AddNode(voHUWA, 1, new TGeoTranslation(70., 40., -zHall26 - hullen + 0.002));
207 //
208 // Air inside tunnel
209 TGeoTube* shHUWAT1 = new TGeoTube(0., r, hullen);
210 shHUWAT1->SetName("shHUWAT1");
211 //
212 // Space for ZDC
213 TGeoBBox* shHUWAT2 = new TGeoBBox(70., 110., hullen + 20.);
214 shHUWAT2->SetName("shHUWAT2");
215 TGeoTranslation* tHUWAT2 = new TGeoTranslation("tHUWAT2", -70., -30., 0.);
216 tHUWAT2->RegisterYourself();
217
218 TGeoBBox* shHUWAT3 = new TGeoBBox(270., 110., hullen + 20.);
219 shHUWAT3->SetName("shHUWAT3");
220 TGeoTranslation* tHUWAT3 = new TGeoTranslation("tHUWAT3", 0., -110. - 140., 0.);
221 tHUWAT3->RegisterYourself();
222
223 TGeoCompositeShape* shHUWAT = new TGeoCompositeShape("HUWAT", "(shHUWAT1-shHUWAT2:tHUWAT2)-shHUWAT3:tHUWAT3");
224 TGeoVolume* voHUWAT = new TGeoVolume("HUWAT", shHUWAT, kMedAir);
225 asHall->AddNode(voHUWAT, 1, new TGeoTranslation(70., 40., -zHall26 - hullen - 0.755));
226
227 //
228 // Hall floor
229 // RB26 side
230 phid = 16.197;
231 Float_t dzFloor26 = zHall26 - dzL3 / 2.;
232 TGeoBBox* shHHF1 = new TGeoBBox(dxFloor / 2. + 470., dyFloor / 2., dzFloor26 / 2. - 0.002);
233 shHHF1->SetName("shHHF1");
234 TGeoVolume* voHHF1 = new TGeoVolume("HHF1", shHHF1, kMedCC);
235 asHall->AddNode(voHHF1, 2, new TGeoTranslation(0., yFloor, -(dzL3 / 2. + dzFloor26 / 2.)));
236 // RB24 side
237 Float_t dzFloor24 = zHall24 - dzL3 / 2.;
238 TGeoBBox* shHHF41 = new TGeoBBox(dxFloor / 2. + 470., dyFloor / 2., dzFloor24 / 2.);
239 shHHF41->SetName("shHHF41");
240 TGeoTube* shHHF42 = new TGeoTube(0., rPit + epsBig, dyFloor / 2.);
241 shHHF42->SetName("shHHF42");
242 TGeoCombiTrans* trHHF42 = new TGeoCombiTrans("trHHF42", 0., 0., dzFloor24 / 2. + rPit - oPit, rot000);
243 trHHF42->RegisterYourself();
244
245 TGeoCompositeShape* shHHF4 = new TGeoCompositeShape("HHF4", "shHHF41+shHHF42:trHHF42");
246 TGeoVolume* voHHF4 = new TGeoVolume("HHF4", shHHF4, kMedCC);
247 asHall->AddNode(voHHF4, 1, new TGeoTranslation(0., yFloor, dzL3 / 2. + dzFloor24 / 2.));
248
249 //
250 // Hall side walls
251 Float_t trH1 = (1273.78 - dyFloor) / 2.;
252 Float_t trBL1 = 207.3;
253 Float_t trTL1 = 50.;
254 Float_t trALP1 = TMath::ATan((trBL1 - trTL1) / 2. / trH1) * kRaddeg;
255 dx = 1.5 * trBL1 - 0.5 * trTL1 + dxFloor / 2. + dyFloor * TMath::Tan(phid * kDegrad);
256 TGeoVolume* voHHW11 = new TGeoVolume(
257 "HHW11", new TGeoTrap(dzFloor26 / 2. - 0.002, 0., 0., trH1, trBL1, trTL1, trALP1, trH1, trBL1, trTL1, trALP1),
258 kMedCC);
259 TGeoVolume* voHHW12 = new TGeoVolume(
260 "HHW12", new TGeoTrap(dzFloor24 / 2., 0., 0., trH1, trBL1, trTL1, trALP1, trH1, trBL1, trTL1, trALP1), kMedCC);
261
262 dy = yFloor + dyFloor / 2. + trH1;
263
264 asHall->AddNode(voHHW12, 1, new TGeoTranslation(dx, dy, (dzL3 / 2. + dzFloor24 / 2.)));
265 asHall->AddNode(voHHW12, 2, new TGeoCombiTrans(-dx, dy, (dzL3 / 2. + dzFloor24 / 2.), rot001));
266 asHall->AddNode(voHHW11, 1, new TGeoTranslation(dx, dy, -(dzL3 / 2. + dzFloor26 / 2.)));
267 asHall->AddNode(voHHW11, 2, new TGeoCombiTrans(-dx, dy, -(dzL3 / 2. + dzFloor26 / 2.), rot001));
268
269 Float_t boDY = (yHall - (yFloor + dyFloor / 2.) - 2. * trH1) / 2.;
270 Float_t dzHall = zHall26 + zHall24;
271
272 TGeoVolume* voHBW1 = new TGeoVolume("HBW1", new TGeoBBox(50., boDY, dzHall / 2. - 0.05), kMedCC);
273
274 asHall->AddNode(voHBW1, 1, new TGeoTranslation(1120., yHall - boDY, (zHall24 - zHall26) / 2.));
275 asHall->AddNode(voHBW1, 2, new TGeoTranslation(-1120., yHall - boDY, (zHall24 - zHall26) / 2.));
276
277 //
278 // Slanted wall close to L3 magnet
279 //
280 phim = 45.;
281 hm = 790.;
282 am = hm * TMath::Tan(phim / 2. * kDegrad);
283 bm = (hm + 76.) / hm * am;
284 cm = bm * 2. / TMath::Sqrt(2.);
285 trH1 = (1273.78 - cm) / 2. - 0.002;
286 trBL1 = 235. - cm * TMath::Tan(phid * kDegrad) / 2.;
287 trTL1 = 50.;
288 trALP1 = TMath::ATan((trBL1 - trTL1) / 2. / trH1) * kRaddeg;
289
290 w1 = trBL1;
291 dx = cm * TMath::Tan(phid * kDegrad) + dxFloor / 2. + trBL1 * 1.5 - trTL1 * .5;
292
293 TGeoVolume* voHHW2 = new TGeoVolume(
294 "HHW2", new TGeoTrap(dzL3 / 2. - 0.002, 0., 0., trH1, trBL1, trTL1, trALP1, trH1, trBL1, trTL1, trALP1), kMedCC);
295
296 r2 = cm + yFloor - dyFloor / 2. + trH1;
297
298 asHall->AddNode(voHHW2, 1, new TGeoTranslation(dx, r2, 0.));
299 asHall->AddNode(voHHW2, 2, new TGeoCombiTrans(-dx, r2, 0., rot001));
300
301 trH1 = cm / 2.;
302 trBL1 = w1 + cm / 2.;
303 trTL1 = w1;
304 trALP1 = TMath::ATan(.5) * kRaddeg;
305 dx = 1170. - trBL1 * .5 - trTL1 * .5;
306
307 TGeoVolume* voHHW3 = new TGeoVolume(
308 "HHW3", new TGeoTrap(dzL3 / 2., 0., 0., trH1, trBL1, trTL1, trALP1, trH1, trBL1, trTL1, trALP1), kMedCC);
309
310 r2 = trH1 - 896.;
311 asHall->AddNode(voHHW3, 1, new TGeoTranslation(dx, r2, 0.));
312 asHall->AddNode(voHHW3, 2, new TGeoCombiTrans(-dx, r2, 0., rot001));
313 //
314 // Floor L3
315 Float_t dyFloorL3 = 76.;
316 Float_t dx1FloorL3 = rHall + epsBig - 2. * trBL1;
317 Float_t dx2FloorL3 = dx1FloorL3 + TMath::Tan(phim * kDegrad) * dyFloorL3;
318
319 TGeoVolume* voHHF2 =
320 new TGeoVolume("HHF2", new TGeoTrd1(dx1FloorL3 - 0.5, dx2FloorL3 - 0.5, dzL3 / 2., dyFloorL3 / 2.), kMedCC);
321
322 asHall->AddNode(voHHF2, 1, new TGeoCombiTrans(0., yFloor - dyFloor / 2. + dyFloorL3 / 2. - 0.5, 0., rot000));
323 //
324 // Tunnel roof and pit
325 // Roof
326 TGeoTubeSeg* shHHC11 = new TGeoTubeSeg(rHall, rHall + 100., dzHall / 2., 0., 180.);
327 shHHC11->SetName("shHHC11");
328 // Pit
329 TGeoTube* shHHC12 = new TGeoTube(rPit, rPit + 100., 1000.);
330 shHHC12->SetName("shHHC12");
331 // Pit inside
332 TGeoTube* shHHC13 = new TGeoTube(0, rPit - epsSmall, 1000.);
333 shHHC13->SetName("shHHC13");
334 // Roof inside
335 TGeoTubeSeg* shHHC14 = new TGeoTubeSeg(0., rHall, dzHall / 2. + epsBig, 0., 180.);
336 shHHC14->SetName("shHHC14");
337
338 TGeoCombiTrans* trHHC = new TGeoCombiTrans("trHHC", 0., 1000., dzHall / 2. + rPit - oPit, rot000);
339 trHHC->RegisterYourself();
340 TGeoCompositeShape* shHHC1 = new TGeoCompositeShape("HHC1", "shHHC11+shHHC12:trHHC-(shHHC14+shHHC13:trHHC)");
341 TGeoVolume* voHHC1 = new TGeoVolume("HHC1", shHHC1, kMedCC);
342
343 asHall->AddNode(voHHC1, 1, new TGeoTranslation(0., yHall, -(zHall26 - zHall24) / 2.));
344
345 //
346 // Pit wall ground level
347 dy = yFloor + 1206. / 2. + dyFloor / 2.;
348 TGeoTube* shHHCPW1 = new TGeoTube(rPit, rPit + 100., 1206. / 2.);
349 shHHCPW1->SetName("shHHCPW1");
350 TGeoCombiTrans* trHHCPW1 = new TGeoCombiTrans("trHHCPW1", 0., 0., 0., rot000);
351 trHHCPW1->RegisterYourself();
352
353 TGeoBBox* shHHCPW2 = new TGeoBBox(rPit + 100., 1206. / 2. + 20., rPit + 100.);
354 shHHCPW2->SetName("shHHCPW2");
355
356 TGeoTube* shHHCPW3 = new TGeoTube(0., 60., 60.);
357 shHHCPW3->SetName("shHHCPW3");
358
359 TGeoTranslation* trHHCPW2 = new TGeoTranslation("trHHCPW2", 0., 0., -(rPit + 100.) - oPit);
360 trHHCPW2->RegisterYourself();
361
362 TGeoTranslation* trHHCPW3 = new TGeoTranslation("trHHCPW3", 0., -dy, rPit + 50.);
363 trHHCPW3->RegisterYourself();
364
365 TGeoCompositeShape* shHHCPW =
366 new TGeoCompositeShape("HHCPW", "shHHCPW1:trHHCPW1-(shHHCPW2:trHHCPW2+shHHCPW3:trHHCPW3)");
367 TGeoVolume* voHHCPW = new TGeoVolume("HHCPW", shHHCPW, kMedCC);
368
369 asHall->AddNode(voHHCPW, 1, new TGeoTranslation(0., dy, 2300.));
370 //
371 // Foundations of the Muon Spectrometer
372 // Drawing ALIP2A_0110
373 //
374 TGeoVolumeAssembly* asFMS = new TGeoVolumeAssembly("asFMS");
375 Float_t zFil = -1465.86 - 60.;
376 // Muon Filter Foundation
377 // Pillars
378 dy = 263.54 / 2.;
379 Float_t ys = yFloor + dyFloor / 2.;
380 TGeoVolume* voFmsMfPil = new TGeoVolume("FmsMfPil", new TGeoBBox(50., dy, 165.), kMedCC);
381 ys += dy;
382 asFMS->AddNode(voFmsMfPil, 1, new TGeoTranslation(-330. + 50., ys, zFil + 165. - 90.));
383 asFMS->AddNode(voFmsMfPil, 2, new TGeoTranslation(330. - 50., ys, zFil + 165 - 90.));
384 //
385 // Transverse bars
386 ys += dy;
387 dy = 91.32 / 2.;
388 ys += dy;
389 TGeoVolume* voFmsMfTb1 = new TGeoVolume("FmsMfTb1", new TGeoBBox(330., dy, 60.), kMedCC);
390 asFMS->AddNode(voFmsMfTb1, 1, new TGeoTranslation(0., ys, zFil));
391 ys += dy;
392 dy = 41.14 / 2.;
393 ys += dy;
394 TGeoVolume* voFmsMfTb2 = new TGeoVolume("FmsMfTb2", new TGeoBBox(330., dy, 60.), kMedCC);
395 asFMS->AddNode(voFmsMfTb2, 1, new TGeoTranslation(0., ys, zFil));
396 //
397 // Dipole foundation
398 ys = yFloor + dyFloor / 2.;
399 dy = (263.54 - 6.2) / 2.;
400 ys += dy;
401 TGeoVolume* voFmsDf1 = new TGeoVolume("FmsDf1", new TGeoBBox(370., dy, 448.0 / 2.), kMedCC);
402 asFMS->AddNode(voFmsDf1, 1, new TGeoTranslation(0., ys, zFil + 240. + 224.));
403 TGeoVolume* voFmsDf2 = new TGeoVolume("FmsDf2", new TGeoBBox(370., (263.54 + 110.) / 2., 112.0 / 2.), kMedCC);
404 asFMS->AddNode(voFmsDf2, 1, new TGeoTranslation(0., ys - 110. / 2., zFil + 688. + 56.));
405
406 //
407 // Shielding in front of L3 magnet in PX24 and UX25
408 // Drawing ALIP2I__0016
409 //
410
411 TGeoVolumeAssembly* asShRb24 = new TGeoVolumeAssembly("ShRb24");
412 //
413 // Side walls
414 // start 7450 from IP
415 TGeoVolume* voShRb24Sw = new TGeoVolume("ShRb24Sw", new TGeoBBox(80., 420., 520.), kMedCC);
416 asShRb24->AddNode(voShRb24Sw, 1, new TGeoTranslation(+315, -420. + 140., 0.));
417 asShRb24->AddNode(voShRb24Sw, 2, new TGeoTranslation(-315, -420. + 140., 0.));
418 //
419 // Roof
420 TGeoVolume* voShRb24Ro = new TGeoVolume("ShRb24Ro", new TGeoBBox(395., 80., 520.), kMedCC);
421 asShRb24->AddNode(voShRb24Ro, 1, new TGeoTranslation(0., +80. + 140., 0.));
422 //
423 // Concrete Plug
424 TGeoBBox* shShRb24Pl1 = new TGeoBBox(235., 140., 40.);
425 shShRb24Pl1->SetName("ShRb24Pl1");
426 // Steel Plug
427 TGeoBBox* shShRb24Pl4 = new TGeoBBox(15., 20., 40.);
428 shShRb24Pl4->SetName("ShRb24Pl4");
429
430 TGeoBBox* shShRb24Pl41 = new TGeoBBox(15., 20., 45.);
431 shShRb24Pl41->SetName("ShRb24Pl41");
432
433 //
434 // Opening for beam pipe
435 Float_t dxShRb24Pl = 14.5;
436 Float_t dyShRb24Pl = 20.0;
437 if (mNewShield24) {
438 dxShRb24Pl = 6.;
439 dyShRb24Pl = 6.;
440 }
441 TGeoBBox* shShRb24Pl2 = new TGeoBBox(dxShRb24Pl, dyShRb24Pl, 60.);
442 shShRb24Pl2->SetName("ShRb24Pl2");
443 //
444 // Opening for tubes
445 TGeoBBox* shShRb24Pl3 = new TGeoBBox(20., 60., 60.);
446 shShRb24Pl3->SetName("ShRb24Pl3");
447
448 TGeoTranslation* trPl3 = new TGeoTranslation("trPl3", +235. - 90., 80., 0.);
449 trPl3->RegisterYourself();
450
451 TGeoTranslation* trPl4 = new TGeoTranslation("trPl4", 0., -6., 0.);
452 trPl4->RegisterYourself();
453 TGeoTranslation* trPl5 = new TGeoTranslation("trPl5", 0., +6., 0.);
454 trPl5->RegisterYourself();
455
456 TGeoCompositeShape* shRb24Pl = nullptr;
457 TGeoCompositeShape* shRb24PlSS = nullptr;
458 if (mNewShield24) {
459 shRb24Pl = new TGeoCompositeShape("Rb24Pl", "ShRb24Pl1-ShRb24Pl2:trPl4-ShRb24Pl3:trPl3");
460 } else {
461 shRb24Pl = new TGeoCompositeShape("Rb24Pl", "ShRb24Pl1-(ShRb24Pl41:trPl4+ShRb24Pl3:trPl3)");
462 shRb24PlSS = new TGeoCompositeShape("Rb24PlSS", "ShRb24Pl4-ShRb24Pl2:trPl5");
463 }
464
465 TGeoVolume* voRb24Pl = new TGeoVolume("Rb24Pl", shRb24Pl, kMedCClc);
466
467 asShRb24->AddNode(voRb24Pl, 1, new TGeoTranslation(0., 0., 520. - 40.));
468 if (mNewShield24) {
469 TGeoVolume* voRb24PlSS = new TGeoVolume("Rb24PlSS", shRb24PlSS, kMedST);
470 asShRb24->AddNode(voRb24PlSS, 1, new TGeoTranslation(0., -6., 520. - 40.));
471 }
472
473 //
474 // Concrete platform and shielding PX24
475 // Drawing LHCJUX 250014
476 //
477 TGeoVolumeAssembly* asShPx24 = new TGeoVolumeAssembly("ShPx24");
478 // Platform
479 TGeoVolume* voShPx24Pl = new TGeoVolume("ShPx24Pl", new TGeoBBox(1613.5 / 2., 120. / 2., 1205. / 2.), kMedCC);
480 asShPx24->AddNode(voShPx24Pl, 1, new TGeoTranslation(55., -140. - 60., 0.));
481 // Pillars
482 TGeoVolume* voShPx24Pi = new TGeoVolume("ShPx24Pi", new TGeoBBox(160. / 2., 440. / 2., 40 / 2.), kMedCC);
483 asShPx24->AddNode(voShPx24Pi, 1, new TGeoTranslation(-180. - 80., -220. - 260., 1205. / 2. - 20.));
484 asShPx24->AddNode(voShPx24Pi, 2, new TGeoTranslation(+290. + 80., -220. - 260., 1205. / 2. - 20.));
485 asShPx24->AddNode(voShPx24Pi, 3, new TGeoTranslation(-180. - 80., -220. - 260., -1205. / 2. + 20. + 120.));
486 asShPx24->AddNode(voShPx24Pi, 4, new TGeoTranslation(+290. + 80., -220. - 260., -1205. / 2. + 20. + 120.));
487 asShPx24->AddNode(voShPx24Pi, 5, new TGeoTranslation(-180. - 80., -220. - 260., -1205. / 2. - 20. + 480.));
488 asShPx24->AddNode(voShPx24Pi, 6, new TGeoTranslation(+290. + 80., -220. - 260., -1205. / 2. - 20. + 480.));
489 asShPx24->AddNode(voShPx24Pi, 7, new TGeoTranslation(-180. - 80., -220. - 260., -1205. / 2. - 20. + 800.));
490 asShPx24->AddNode(voShPx24Pi, 8, new TGeoTranslation(+290. + 80., -220. - 260., -1205. / 2. - 20. + 800.));
491 // Side Walls
492 TGeoVolume* voShPx24Sw = new TGeoVolume("ShPx24Sw", new TGeoBBox(160. / 2., 280. / 2., 1205. / 2.), kMedCC);
493 asShPx24->AddNode(voShPx24Sw, 1, new TGeoTranslation(-180, 0., 0.));
494 asShPx24->AddNode(voShPx24Sw, 2, new TGeoTranslation(+290, 0., 0.));
495 // Roof
496 TGeoVolume* voShPx24Ro = new TGeoVolume("ShPx24Ro", new TGeoBBox(630. / 2., 160. / 2., 1205. / 2.), kMedCC);
497 asShPx24->AddNode(voShPx24Ro, 1, new TGeoTranslation(55., 80. + 140., 0.));
498 asHall->AddNode(asShRb24, 1, new TGeoTranslation(0., 0., +745. + 520.));
499 asHall->AddNode(asShPx24, 1, new TGeoTranslation(0., 0., +745. + 1040. + 1205. / 2.));
500 // Stainless Steel Plug 80 cm thick
501 TGeoBBox* shShPx24Pl1 = new TGeoBBox(155., 140., 40.);
502 shShPx24Pl1->SetName("ShPx24Pl1");
503 // Opening for beam pipe
504 Float_t dxPx24Pl2 = 9.5;
505 Float_t dyPx24Pl2 = 14.0;
506 // Option for new shielding closer to the beam pipe
507 if (mNewShield24) {
508 dxPx24Pl2 = 6.;
509 dyPx24Pl2 = 6.;
510 }
511 //
512 TGeoBBox* shShPx24Pl2 = new TGeoBBox(dxPx24Pl2, dyPx24Pl2, 60.);
513 shShPx24Pl2->SetName("ShPx24Pl2");
514 TGeoTranslation* trPl2 = new TGeoTranslation("trPl2", -55., 0., 0.);
515 trPl2->RegisterYourself();
516
517 TGeoCompositeShape* shPx24Pl = new TGeoCompositeShape("Px24Pl", "ShPx24Pl1-ShPx24Pl2:trPl2");
518 TGeoVolume* voPx24Pl = new TGeoVolume("Px24Pl", shPx24Pl, kMedST);
519 asShPx24->AddNode(voPx24Pl, 1, new TGeoTranslation(55., 0., -1205. / 2. + 40.));
520 asHall->AddNode(asFMS, 1, new TGeoTranslation(0., 0., 0.));
521
522 //
523 // Scoring plane for beam background simulations
524 //
525
526 // TGeoVolume* voRB24Scoring = new TGeoVolume("RB24Scoring", new TGeoTube(4.3, 300., 1.), kMedAir);
527 // asHall->AddNode(voRB24Scoring, 1, new TGeoTranslation(0., 0., 735.));
528 //
529 // Extra shielding in front of racks
530 //
531 if (mRackShield) {
532 TGeoVolume* voRackShield = new TGeoVolume("RackShield", new TGeoBBox(30., 125., 50.), kMedFe);
533 asHall->AddNode(voRackShield, 1, new TGeoTranslation(85., -495., 1726.));
534 }
535 //
536 top->AddNode(asHall, 1, gGeoIdentity);
537}
538
539FairModule* Hall::CloneModule() const { return new Hall(*this); }
Definition of the Detector class.
#define kDegrad
#define kRaddeg
int32_t i
ClassImp(IdPath)
Class for time synchronization of RawReader instances.
static void initFieldTrackingParams(int &mode, float &maxfield)
Definition Detector.cxx:143
static MaterialManager & Instance()
~Hall() override
void ConstructGeometry() override
Definition Hall.cxx:112
FairModule * CloneModule() const override
Clone this object (used in MT mode only)
Definition Hall.cxx:539
a common base class for passive modules - implementing generic functions
Definition PassiveBase.h:24
GLdouble GLdouble GLdouble GLdouble top
Definition glcorearb.h:4077
GLuint const GLchar * name
Definition glcorearb.h:781
GLboolean r
Definition glcorearb.h:1233