121 Float_t w1, dh, am, bm, dl, cm, hm, dr, dx, xl;
127 TGeoVolume*
top = gGeoManager->GetVolume(
"cave");
128 TGeoVolumeAssembly* asHall =
new TGeoVolumeAssembly(
"HALL");
132 TGeoRotation* rot000 =
new TGeoRotation(
"rot000", 90., 0., 180., 0., 90., 90.);
133 TGeoRotation* rot001 =
new TGeoRotation(
"rot001", 270., 0., 90., 90., 180., 0.);
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");
157 Float_t oPit = zHall24 - (zPit - rPit);
172 phi = TMath::ACos(
h /
r);
173 xl =
r * TMath::Sin(phi);
175 dh = dr * TMath::Cos(phi);
176 dl = dr * TMath::Sin(phi);
180 auto run = FairRunSim::Instance();
181 auto modules = run->GetListOfModules();
182 bool haveZDC =
false;
183 for (
int i = 0;
i < modules->GetEntries(); ++
i) {
185 if (mod && strcmp(mod->GetName(),
"ZDC") == 0) {
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));
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));
209 TGeoTube* shHUWAT1 =
new TGeoTube(0.,
r, hullen);
210 shHUWAT1->SetName(
"shHUWAT1");
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();
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();
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));
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.)));
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();
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.));
251 Float_t trH1 = (1273.78 - dyFloor) / 2.;
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),
259 TGeoVolume* voHHW12 =
new TGeoVolume(
260 "HHW12",
new TGeoTrap(dzFloor24 / 2., 0., 0., trH1, trBL1, trTL1, trALP1, trH1, trBL1, trTL1, trALP1), kMedCC);
262 dy = yFloor + dyFloor / 2. + trH1;
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));
269 Float_t boDY = (yHall - (yFloor + dyFloor / 2.) - 2. * trH1) / 2.;
270 Float_t dzHall = zHall26 + zHall24;
272 TGeoVolume* voHBW1 =
new TGeoVolume(
"HBW1",
new TGeoBBox(50., boDY, dzHall / 2. - 0.05), kMedCC);
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.));
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.;
288 trALP1 = TMath::ATan((trBL1 - trTL1) / 2. / trH1) *
kRaddeg;
291 dx = cm * TMath::Tan(phid *
kDegrad) + dxFloor / 2. + trBL1 * 1.5 - trTL1 * .5;
293 TGeoVolume* voHHW2 =
new TGeoVolume(
294 "HHW2",
new TGeoTrap(dzL3 / 2. - 0.002, 0., 0., trH1, trBL1, trTL1, trALP1, trH1, trBL1, trTL1, trALP1), kMedCC);
296 r2 = cm + yFloor - dyFloor / 2. + trH1;
298 asHall->AddNode(voHHW2, 1,
new TGeoTranslation(dx, r2, 0.));
299 asHall->AddNode(voHHW2, 2,
new TGeoCombiTrans(-dx, r2, 0., rot001));
302 trBL1 = w1 + cm / 2.;
304 trALP1 = TMath::ATan(.5) *
kRaddeg;
305 dx = 1170. - trBL1 * .5 - trTL1 * .5;
307 TGeoVolume* voHHW3 =
new TGeoVolume(
308 "HHW3",
new TGeoTrap(dzL3 / 2., 0., 0., trH1, trBL1, trTL1, trALP1, trH1, trBL1, trTL1, trALP1), kMedCC);
311 asHall->AddNode(voHHW3, 1,
new TGeoTranslation(dx, r2, 0.));
312 asHall->AddNode(voHHW3, 2,
new TGeoCombiTrans(-dx, r2, 0., rot001));
316 Float_t dx1FloorL3 = rHall + epsBig - 2. * trBL1;
317 Float_t dx2FloorL3 = dx1FloorL3 + TMath::Tan(phim *
kDegrad) * dyFloorL3;
320 new TGeoVolume(
"HHF2",
new TGeoTrd1(dx1FloorL3 - 0.5, dx2FloorL3 - 0.5, dzL3 / 2., dyFloorL3 / 2.), kMedCC);
322 asHall->AddNode(voHHF2, 1,
new TGeoCombiTrans(0., yFloor - dyFloor / 2. + dyFloorL3 / 2. - 0.5, 0., rot000));
326 TGeoTubeSeg* shHHC11 =
new TGeoTubeSeg(rHall, rHall + 100., dzHall / 2., 0., 180.);
327 shHHC11->SetName(
"shHHC11");
329 TGeoTube* shHHC12 =
new TGeoTube(rPit, rPit + 100., 1000.);
330 shHHC12->SetName(
"shHHC12");
332 TGeoTube* shHHC13 =
new TGeoTube(0, rPit - epsSmall, 1000.);
333 shHHC13->SetName(
"shHHC13");
335 TGeoTubeSeg* shHHC14 =
new TGeoTubeSeg(0., rHall, dzHall / 2. + epsBig, 0., 180.);
336 shHHC14->SetName(
"shHHC14");
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);
343 asHall->AddNode(voHHC1, 1,
new TGeoTranslation(0., yHall, -(zHall26 - zHall24) / 2.));
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();
353 TGeoBBox* shHHCPW2 =
new TGeoBBox(rPit + 100., 1206. / 2. + 20., rPit + 100.);
354 shHHCPW2->SetName(
"shHHCPW2");
356 TGeoTube* shHHCPW3 =
new TGeoTube(0., 60., 60.);
357 shHHCPW3->SetName(
"shHHCPW3");
359 TGeoTranslation* trHHCPW2 =
new TGeoTranslation(
"trHHCPW2", 0., 0., -(rPit + 100.) - oPit);
360 trHHCPW2->RegisterYourself();
362 TGeoTranslation* trHHCPW3 =
new TGeoTranslation(
"trHHCPW3", 0., -dy, rPit + 50.);
363 trHHCPW3->RegisterYourself();
365 TGeoCompositeShape* shHHCPW =
366 new TGeoCompositeShape(
"HHCPW",
"shHHCPW1:trHHCPW1-(shHHCPW2:trHHCPW2+shHHCPW3:trHHCPW3)");
367 TGeoVolume* voHHCPW =
new TGeoVolume(
"HHCPW", shHHCPW, kMedCC);
369 asHall->AddNode(voHHCPW, 1,
new TGeoTranslation(0., dy, 2300.));
374 TGeoVolumeAssembly* asFMS =
new TGeoVolumeAssembly(
"asFMS");
379 Float_t ys = yFloor + dyFloor / 2.;
380 TGeoVolume* voFmsMfPil =
new TGeoVolume(
"FmsMfPil",
new TGeoBBox(50., dy, 165.), kMedCC);
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.));
389 TGeoVolume* voFmsMfTb1 =
new TGeoVolume(
"FmsMfTb1",
new TGeoBBox(330., dy, 60.), kMedCC);
390 asFMS->AddNode(voFmsMfTb1, 1,
new TGeoTranslation(0., ys, zFil));
394 TGeoVolume* voFmsMfTb2 =
new TGeoVolume(
"FmsMfTb2",
new TGeoBBox(330., dy, 60.), kMedCC);
395 asFMS->AddNode(voFmsMfTb2, 1,
new TGeoTranslation(0., ys, zFil));
398 ys = yFloor + dyFloor / 2.;
399 dy = (263.54 - 6.2) / 2.;
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.));
411 TGeoVolumeAssembly* asShRb24 =
new TGeoVolumeAssembly(
"ShRb24");
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.));
420 TGeoVolume* voShRb24Ro =
new TGeoVolume(
"ShRb24Ro",
new TGeoBBox(395., 80., 520.), kMedCC);
421 asShRb24->AddNode(voShRb24Ro, 1,
new TGeoTranslation(0., +80. + 140., 0.));
424 TGeoBBox* shShRb24Pl1 =
new TGeoBBox(235., 140., 40.);
425 shShRb24Pl1->SetName(
"ShRb24Pl1");
427 TGeoBBox* shShRb24Pl4 =
new TGeoBBox(15., 20., 40.);
428 shShRb24Pl4->SetName(
"ShRb24Pl4");
430 TGeoBBox* shShRb24Pl41 =
new TGeoBBox(15., 20., 45.);
431 shShRb24Pl41->SetName(
"ShRb24Pl41");
441 TGeoBBox* shShRb24Pl2 =
new TGeoBBox(dxShRb24Pl, dyShRb24Pl, 60.);
442 shShRb24Pl2->SetName(
"ShRb24Pl2");
445 TGeoBBox* shShRb24Pl3 =
new TGeoBBox(20., 60., 60.);
446 shShRb24Pl3->SetName(
"ShRb24Pl3");
448 TGeoTranslation* trPl3 =
new TGeoTranslation(
"trPl3", +235. - 90., 80., 0.);
449 trPl3->RegisterYourself();
451 TGeoTranslation* trPl4 =
new TGeoTranslation(
"trPl4", 0., -6., 0.);
452 trPl4->RegisterYourself();
453 TGeoTranslation* trPl5 =
new TGeoTranslation(
"trPl5", 0., +6., 0.);
454 trPl5->RegisterYourself();
456 TGeoCompositeShape* shRb24Pl =
nullptr;
457 TGeoCompositeShape* shRb24PlSS =
nullptr;
459 shRb24Pl =
new TGeoCompositeShape(
"Rb24Pl",
"ShRb24Pl1-ShRb24Pl2:trPl4-ShRb24Pl3:trPl3");
461 shRb24Pl =
new TGeoCompositeShape(
"Rb24Pl",
"ShRb24Pl1-(ShRb24Pl41:trPl4+ShRb24Pl3:trPl3)");
462 shRb24PlSS =
new TGeoCompositeShape(
"Rb24PlSS",
"ShRb24Pl4-ShRb24Pl2:trPl5");
465 TGeoVolume* voRb24Pl =
new TGeoVolume(
"Rb24Pl", shRb24Pl, kMedCClc);
467 asShRb24->AddNode(voRb24Pl, 1,
new TGeoTranslation(0., 0., 520. - 40.));
469 TGeoVolume* voRb24PlSS =
new TGeoVolume(
"Rb24PlSS", shRb24PlSS, kMedST);
470 asShRb24->AddNode(voRb24PlSS, 1,
new TGeoTranslation(0., -6., 520. - 40.));
477 TGeoVolumeAssembly* asShPx24 =
new TGeoVolumeAssembly(
"ShPx24");
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.));
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.));
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.));
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.));
501 TGeoBBox* shShPx24Pl1 =
new TGeoBBox(155., 140., 40.);
502 shShPx24Pl1->SetName(
"ShPx24Pl1");
512 TGeoBBox* shShPx24Pl2 =
new TGeoBBox(dxPx24Pl2, dyPx24Pl2, 60.);
513 shShPx24Pl2->SetName(
"ShPx24Pl2");
514 TGeoTranslation* trPl2 =
new TGeoTranslation(
"trPl2", -55., 0., 0.);
515 trPl2->RegisterYourself();
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.));
532 TGeoVolume* voRackShield =
new TGeoVolume(
"RackShield",
new TGeoBBox(30., 125., 50.), kMedFe);
533 asHall->AddNode(voRackShield, 1,
new TGeoTranslation(85., -495., 1726.));
536 top->AddNode(asHall, 1, gGeoIdentity);