236 Double_t dX, Double_t dY, Double_t dX2, Double_t dY2, Double_t dZ,
237 Double_t middleGap,Double_t middleGap2,
238 Double_t HmainSideMag, Double_t HmainSideMag2,
239 Double_t gap,Double_t gap2, Double_t Z, Bool_t NotMagnet,
242 Double_t coil_gap,coil_gap2;
243 Int_t color[4] = {45,31,30,38};
251 gap = std::ceil(std::max(100. / dY, gap));
252 gap2 = std::ceil(std::max(100. / dY2, gap2));
256 coil_gap = std::max(20., gap);
257 coil_gap2 = std::max(20., gap2);
258 gap = std::max(2., gap);
259 gap2 = std::max(2., gap2);
262 Double_t anti_overlap = (
fDesign == 5) ? 0.0 : 0.1;
267 std::array<Double_t, 16> cornersMainL = {
268 middleGap, -(dY + dX - anti_overlap),
269 middleGap, dY + dX - anti_overlap,
270 dX + middleGap, dY - anti_overlap,
271 dX + middleGap, -(dY - anti_overlap),
272 middleGap2, -(dY2 + dX2 - anti_overlap),
273 middleGap2, dY2 + dX2 - anti_overlap,
274 dX2 + middleGap2, dY2 - anti_overlap,
275 dX2 + middleGap2, -(dY2 - anti_overlap)
278 std::array<Double_t, 16> cornersTL = {middleGap + dX,
282 2 * dX + middleGap + coil_gap,
284 dX + middleGap + coil_gap,
290 2 * dX2 + middleGap2 + coil_gap2,
292 dX2 + middleGap2 + coil_gap2,
295 std::array<Double_t, 16> cornersMainSideL =
297 std::array<Double_t, 16>{
298 dX + middleGap + gap, -HmainSideMag,
299 dX + middleGap + gap, HmainSideMag,
300 2 * dX + middleGap + gap, HmainSideMag,
301 2 * dX + middleGap + gap, -HmainSideMag,
302 dX2 + middleGap2 + gap2, -HmainSideMag2,
303 dX2 + middleGap2 + gap2, HmainSideMag2,
304 2 * dX2 + middleGap2 + gap2, HmainSideMag2,
305 2 * dX2 + middleGap2 + gap2, -HmainSideMag2
307 std::array<Double_t, 16>{
308 dX + middleGap + gap, -(dY - anti_overlap),
309 dX + middleGap + gap, dY - anti_overlap,
310 2 * dX + middleGap + gap, dY + dX - anti_overlap,
311 2 * dX + middleGap + gap, -(dY + dX - anti_overlap),
312 dX2 + middleGap2 + gap2, -(dY2 - anti_overlap),
313 dX2 + middleGap2 + gap2, dY2 - anti_overlap,
314 2 * dX2 + middleGap2 + gap2, dY2 + dX2 - anti_overlap,
315 2 * dX2 + middleGap2 + gap2, -(dY2 + dX2 - anti_overlap)
318 std::array<Double_t, 16> cornersMainR, cornersCLBA,
319 cornersMainSideR, cornersCLTA, cornersCRBA,
320 cornersCRTA, cornersTR, cornersBL, cornersBR;
323 cornersCLBA = {dX + middleGap + gap,
325 2 * dX + middleGap + gap,
327 2 * dX + middleGap + coil_gap,
328 -(dY + dX - anti_overlap),
329 dX + middleGap + coil_gap,
330 -(dY - anti_overlap),
331 dX2 + middleGap2 + gap2,
333 2 * dX2 + middleGap2 + gap2,
335 2 * dX2 + middleGap2 + coil_gap2,
336 -(dY2 + dX2 - anti_overlap),
337 dX2 + middleGap2 + coil_gap2,
338 -(dY2 - anti_overlap)};
342 for (
int i = 0; i < 16; ++i) {
343 cornersMainR[i] = -cornersMainL[i];
344 cornersMainSideR[i] = -cornersMainSideL[i];
345 cornersCRTA[i] = -cornersCLBA[i];
346 cornersBR[i] = -cornersTL[i];
349 for (
int i = 0, j = 4; i < 8; ++i) {
351 cornersCLTA[2 * j] = cornersCLBA[2 * i];
352 cornersCLTA[2 * j + 1] = -cornersCLBA[2 * i + 1];
353 cornersTR[2 * j] = -cornersTL[2 * i];
354 cornersTR[2 * j + 1] = cornersTL[2 * i + 1];
356 for (
int i = 0; i < 16; ++i) {
357 cornersCRBA[i] = -cornersCLTA[i];
358 cornersBL[i] = -cornersTR[i];
361 TString str1L =
"_MiddleMagL";
362 TString str1R =
"_MiddleMagR";
363 TString str2 =
"_MagRetL";
364 TString str3 =
"_MagRetR";
365 TString str4 =
"_MagCLB";
366 TString str5 =
"_MagCLT";
367 TString str6 =
"_MagCRT";
368 TString str7 =
"_MagCRB";
369 TString str8 =
"_MagTopLeft";
370 TString str9 =
"_MagTopRight";
371 TString str10 =
"_MagBotLeft";
372 TString str11 =
"_MagBotRight";
374 switch (fieldDirection){
377 CreateArb8(magnetName + str1L, medium, dZ, cornersMainL, color[0], fields[0], tShield, 0, 0, Z, stepGeo);
378 CreateArb8(magnetName + str1R, medium, dZ, cornersMainR, color[0], fields[0], tShield, 0, 0, Z, stepGeo);
379 CreateArb8(magnetName + str2, medium, dZ, cornersMainSideL, color[1], fields[1], tShield, 0, 0, Z, stepGeo);
380 CreateArb8(magnetName + str3, medium, dZ, cornersMainSideR, color[1], fields[1], tShield, 0, 0, Z, stepGeo);
382 CreateArb8(magnetName + str4, medium, dZ, cornersCLBA, color[1], fields[1], tShield, 0, 0, Z, stepGeo);
383 CreateArb8(magnetName + str5, medium, dZ, cornersCLTA, color[1], fields[1], tShield, 0, 0, Z, stepGeo);
384 CreateArb8(magnetName + str6, medium, dZ, cornersCRTA, color[1], fields[1], tShield, 0, 0, Z, stepGeo);
385 CreateArb8(magnetName + str7, medium, dZ, cornersCRBA, color[1], fields[1], tShield, 0, 0, Z, stepGeo);
387 CreateArb8(magnetName + str8, medium, dZ, cornersTL, color[3], fields[3], tShield, 0, 0, Z, stepGeo);
388 CreateArb8(magnetName + str9, medium, dZ, cornersTR, color[2], fields[2], tShield, 0, 0, Z, stepGeo);
389 CreateArb8(magnetName + str10, medium, dZ, cornersBL, color[2], fields[2], tShield, 0, 0, Z, stepGeo);
390 CreateArb8(magnetName + str11, medium, dZ, cornersBR, color[3], fields[3], tShield, 0, 0, Z, stepGeo);
393 CreateArb8(magnetName + str1L, medium, dZ, cornersMainL, color[1], fields[1], tShield, 0, 0, Z, stepGeo);
394 CreateArb8(magnetName + str1R, medium, dZ, cornersMainR, color[1], fields[1], tShield, 0, 0, Z, stepGeo);
395 CreateArb8(magnetName + str2, medium, dZ, cornersMainSideL, color[0], fields[0], tShield, 0, 0, Z, stepGeo);
396 CreateArb8(magnetName + str3, medium, dZ, cornersMainSideR, color[0], fields[0], tShield, 0, 0, Z, stepGeo);
398 CreateArb8(magnetName + str4, medium, dZ, cornersCLBA, color[0], fields[0], tShield, 0, 0, Z, stepGeo);
399 CreateArb8(magnetName + str5, medium, dZ, cornersCLTA, color[0], fields[0], tShield, 0, 0, Z, stepGeo);
400 CreateArb8(magnetName + str6, medium, dZ, cornersCRTA, color[0], fields[0], tShield, 0, 0, Z, stepGeo);
401 CreateArb8(magnetName + str7, medium, dZ, cornersCRBA, color[0], fields[0], tShield, 0, 0, Z, stepGeo);
403 CreateArb8(magnetName + str8, medium, dZ, cornersTL, color[2], fields[2], tShield, 0, 0, Z, stepGeo);
404 CreateArb8(magnetName + str9, medium, dZ, cornersTR, color[3], fields[3], tShield, 0, 0, Z, stepGeo);
405 CreateArb8(magnetName + str10, medium, dZ, cornersBL, color[3], fields[3], tShield, 0, 0, Z, stepGeo);
406 CreateArb8(magnetName + str11, medium, dZ, cornersBR, color[2], fields[2], tShield, 0, 0, Z, stepGeo);
412 std::vector<FieldDirection> &fieldDirection,
413 std::vector<Double_t> &dXIn, std::vector<Double_t> &dYIn,
414 std::vector<Double_t> &dXOut, std::vector<Double_t> &dYOut,
415 std::vector<Double_t> &dZ, std::vector<Double_t> &midGapIn,
416 std::vector<Double_t> &midGapOut,
417 std::vector<Double_t> &HmainSideMagIn,
418 std::vector<Double_t> &HmainSideMagOut,
419 std::vector<Double_t> &gapIn, std::vector<Double_t> &gapOut,
420 std::vector<Double_t> &Z) {
422 const Int_t nMagnets = (
fDesign >= 7) ? 9 : 8;
423 magnetName.reserve(nMagnets);
424 fieldDirection.reserve(nMagnets);
426 {&dXIn, &dXOut, &dYIn, &dYOut, &dZ, &midGapIn, &midGapOut,
427 &HmainSideMagIn, &HmainSideMagOut, &gapIn, &gapOut, &Z}) {
428 i->reserve(nMagnets);
431 Double_t zgap = (
fDesign > 6) ? 10 : 0;
435 magnetName = {
"MagnAbsorb1",
"MagnAbsorb2",
"Magn1",
"Magn2",
"Magn3",
436 "Magn4",
"Magn5",
"Magn6",
"Magn7"};
444 auto f = TFile::Open(
fGeofile,
"read");
445 TVectorT<Double_t> params;
446 params.Read(
"params");
448 const int offset = 7;
455 gapOut[0] = 0.1 *
mm;
461 gapOut[1] = 0.02 *
m;
463 for (Int_t i = 2; i < nMagnets - 1; ++i) {
464 dXIn[i] = params[offset + i * 6 + 1];
465 dXOut[i] = params[offset + i * 6 + 2];
466 dYIn[i] = params[offset + i * 6 + 3];
467 dYOut[i] = params[offset + i * 6 + 4];
468 gapIn[i] = params[offset + i * 6 + 5];
469 gapOut[i] = params[offset + i * 6 + 6];
472 dZ[0] =
dZ1 - zgap / 2;
474 dZ[1] =
dZ2 - zgap / 2;
475 Z[1] = Z[0] + dZ[0] + dZ[1] + zgap;
476 dZ[2] =
dZ3 - zgap / 2;
477 Z[2] = Z[1] + dZ[1] + dZ[2] + 2 * zgap;
478 dZ[3] =
dZ4 - zgap / 2;
479 Z[3] = Z[2] + dZ[2] + dZ[3] + zgap;
480 dZ[4] =
dZ5 - zgap / 2;
481 Z[4] = Z[3] + dZ[3] + dZ[4] + zgap;
482 dZ[5] =
dZ6 - zgap / 2;
483 Z[5] = Z[4] + dZ[4] + dZ[5] + zgap;
484 dZ[6] =
dZ7 - zgap / 2;
485 Z[6] = Z[5] + dZ[5] + dZ[6] + zgap;
486 dZ[7] =
dZ8 - zgap / 2;
487 Z[7] = Z[6] + dZ[6] + dZ[7] + zgap;
493 gapIn[8] = gapOut[7];
494 gapOut[8] = gapIn[8];
496 Z[8] = Z[7] + dZ[7] + dZ[8];
498 for (
int i = 0; i < nMagnets; ++i) {
501 HmainSideMagIn[i] = dYIn[i] / 2;
502 HmainSideMagOut[i] = dYOut[i] / 2;
506 magnetName = {
"MagnAbsorb1",
"MagnAbsorb2",
"Magn1",
"Magn2",
"Magn3",
507 "Magn4",
"Magn5",
"Magn6",
"Magn7"
521 gapOut[0] = 0.1 *
mm;
522 dZ[0] =
dZ1 - zgap / 2;
530 gapOut[1] = 0.02 *
m;
531 dZ[1] =
dZ2 - zgap / 2;
532 Z[1] = Z[0] + dZ[0] + dZ[1] + zgap;
539 gapOut[2] = 0.07 *
m;
540 dZ[2] =
dZ3 - zgap / 2;
541 Z[2] = Z[1] + dZ[1] + dZ[2] + 2 * zgap;
548 gapOut[3] = 0.09 *
m;
549 dZ[3] =
dZ4 - zgap / 2;
550 Z[3] = Z[2] + dZ[2] + dZ[3] + zgap;
557 gapOut[4] = 0.11 *
m;
558 dZ[4] =
dZ5 - zgap / 2;
559 Z[4] = Z[3] + dZ[3] + dZ[4] + zgap;
566 gapOut[5] = 0.08 *
m;
567 dZ[5] =
dZ6 - zgap / 2;
568 Z[5] = Z[4] + dZ[4] + dZ[5] + zgap;
575 gapOut[6] = 0.13 *
m;
576 dZ[6] =
dZ7 - zgap / 2;
577 Z[6] = Z[5] + dZ[5] + dZ[6] + zgap;
584 gapOut[7] = 0.26 *
m;
585 dZ[7] =
dZ8 - zgap / 2;
586 Z[7] = Z[6] + dZ[6] + dZ[7] + zgap;
592 gapIn[8] = gapOut[7];
593 gapOut[8] = gapIn[8];
595 Z[8] = Z[7] + dZ[7] + dZ[8];
597 for (
int i = 0; i < nMagnets; ++i) {
600 HmainSideMagIn[i] = dYIn[i] / 2;
601 HmainSideMagOut[i] = dYOut[i] / 2;
605 magnetName = {
"MagnAbsorb1",
"MagnAbsorb2",
"Magn1",
"Magn2",
"Magn3",
606 "Magn4",
"Magn5",
"Magn6",
"Magn7"};
609 dXIn[0] = 0.4*
m; dYIn[0] = 1.5*
m;
610 dXOut[0] = 0.40*
m; dYOut[0]= 1.5*
m;
611 gapIn[0] = 0.02 *
m; gapOut[0] = 0.02 *
m;
615 dXIn[1] = 0.8*
m; dYIn[1] = 1.5*
m;
616 dXOut[1] = 0.8*
m; dYOut[1]= 1.5*
m;
617 gapIn[1] = 0.02*
m; gapOut[1] = 0.02*
m;
618 dZ[1] =
dZ2-zgap/2; Z[1] = Z[0] + dZ[0] + dZ[1]+zgap;
621 dXIn[2] = 0.87*
m; dYIn[2] = 0.35*
m;
622 dXOut[2] = 0.65*
m; dYOut[2]= 1.21*
m;
623 gapIn[2] = 0.11 *
m; gapOut[2] = 0.065 *
m;
624 dZ[2] =
dZ3-zgap/2; Z[2] = Z[1] + dZ[1] + dZ[2] + zgap;
627 dXIn[3] = 0.65*
m; dYIn[3] = 1.21*
m;
628 dXOut[3] = 0.43*
m; dYOut[3]= 2.07*
m;
629 gapIn[3] = 0.065 *
m; gapOut[3] = 0.02 *
m;
630 dZ[3] =
dZ4-zgap/2; Z[3] = Z[2] + dZ[2] + dZ[3]+zgap;
633 dXIn[4] = 0.06*
m; dYIn[4] = 0.32*
m;
634 dXOut[4] = 0.33*
m; dYOut[4]= 0.13*
m;
635 gapIn[4] = 0.7*
m; gapOut[4] = 0.11*
m;
636 dZ[4] =
dZ5-zgap/2; Z[4] = Z[3] + dZ[3] + dZ[4]+zgap;
639 dXIn[5] = 0.05*
m; dYIn[5] = 1.12*
m;
640 dXOut[5] =0.16*
m; dYOut[5]= 0.05*
m;
641 gapIn[5] = 0.04*
m; gapOut[5] = 0.02*
m;
642 dZ[5] =
dZ6-zgap/2; Z[5] = Z[4] + dZ[4] + dZ[5]+zgap;
645 dXIn[6] = 0.15*
m; dYIn[6] = 2.35*
m;
646 dXOut[6] = 0.34*
m; dYOut[6]= 0.32*
m;
647 gapIn[6] = 0.05*
m; gapOut[6] = 0.08*
m;
648 dZ[6] =
dZ7-zgap/2; Z[6] = Z[5] + dZ[5] + dZ[6]+zgap;
650 Double_t clip_width = 0.1*
m;
652 dXIn[7] = 0.31*
m; dYIn[7] = 1.86*
m;
653 dXOut[7] = 0.9*
m - clip_width; dYOut[7]= 3.1*
m;
655 (
dZ8-zgap/2) * (1 - (dXOut[7] - dXIn[7]) / (dXOut[7] + clip_width - dXIn[7]));
656 gapIn[7] = 0.02*
m; gapOut[7] = 0.55*
m;
657 dZ[7] =
dZ8 - clip_len - zgap / 2; Z[7] = Z[6] + dZ[6] + dZ[7] + zgap;
660 dXIn[8] = dXOut[7]; dYIn[8] = dYOut[7];
661 dXOut[8] = dXOut[7]; dYOut[8]= dYOut[7];
662 gapIn[8] = 0.55*
m; gapOut[8] = 0.55*
m;
663 dZ[8] = clip_len; Z[8] = Z[7] + dZ[7] + dZ[8];
665 for (
int i = 0; i < nMagnets; ++i) {
668 HmainSideMagIn[i] = dYIn[i] / 2;
669 HmainSideMagOut[i] = dYOut[i] / 2;
674 magnetName = {
"1",
"2",
"3",
"4",
"5",
"6",
"7"};
677 dXIn[0] = 0.7*
m; dYIn[0] = 1.*
m;
678 dXOut[0] = 0.7*
m; dYOut[0]= 0.8158*
m;
679 midGapIn[0] = 0; midGapOut[0] = 0;
680 HmainSideMagIn[0] = dYIn[0]; HmainSideMagOut[0] = dYOut[0];
681 gapIn[0] = 20; gapOut[0] = 20;
685 dXIn[1] = 0.36*
m; dYIn[1] = 0.8158*
m;
686 dXOut[1] = 0.19*
m; dYOut[1]= 0.499*
m;
687 midGapIn[1] = 0; midGapOut[1] = 0;
688 HmainSideMagIn[1] = dYIn[1]/2; HmainSideMagOut[1] = dYOut[1]/2;
689 gapIn[1] = 88; gapOut[1] = 122;
690 dZ[1] =
dZ2-zgap/2; Z[1] = Z[0] + dZ[0] + dZ[1]+zgap;
693 dXIn[2] = 0.075*
m; dYIn[2] = 0.499*
m;
694 dXOut[2] = 0.25*
m; dYOut[2]= 1.10162*
m;
695 midGapIn[2] = 0; midGapOut[2] = 0;
696 HmainSideMagIn[2] = dYIn[2]/2; HmainSideMagOut[2] = dYOut[2]/2;
697 gapIn[2] = 0; gapOut[2] = 0;
698 dZ[2] =
dZ3-zgap/2; Z[2] = Z[1] + dZ[1] + dZ[2]+zgap;
701 dXIn[3] = 0.25*
m; dYIn[3] = 1.10262*
m;
702 dXOut[3] = 0.3*
m; dYOut[3]= 1.82697*
m;
703 midGapIn[3] = 0; midGapOut[3] = 0;
704 HmainSideMagIn[3] = dXIn[3]; HmainSideMagOut[3] = dXOut[3];
705 gapIn[3] = 0; gapOut[3] = 25;
706 dZ[3] =
dZ4-zgap/2; Z[3] = Z[2] + dZ[2] + dZ[3]+zgap;
709 dXIn[4] = 0.3*
m; dYIn[4] = 1.82697*
m;
710 dXOut[4] = 0.4*
m; dYOut[4]= 2.55131*
m;
711 midGapIn[4] = 5; midGapOut[4] = 25;
712 HmainSideMagIn[4] = dXIn[4]; HmainSideMagOut[4] = dXOut[4];
713 gapIn[4] = 20; gapOut[4] = 20;
714 dZ[4] =
dZ6-zgap/2; Z[4] = Z[3] + dZ[3] + dZ[4]+zgap;
717 dXIn[5] = 0.4*
m; dYIn[5] = 2.55131*
m;
718 dXOut[5] =0.4*
m; dYOut[5]= 3.27566*
m;
719 midGapIn[5] = 25; midGapOut[5] = 65;
720 HmainSideMagIn[5] = dXIn[5]; HmainSideMagOut[5] = dXOut[5];
721 gapIn[5] = 20; gapOut[5] = 20;
722 dZ[5] =
dZ7-zgap/2; Z[5] = Z[4] + dZ[4] + dZ[5]+zgap;
725 dXIn[6] = 0.4*
m; dYIn[6] = 3.27566*
m;
726 dXOut[6] = 0.75*
m; dYOut[6]= 4*
m;
727 midGapIn[6] = 65; midGapOut[6] = 75;
728 HmainSideMagIn[6] = dXIn[6]; HmainSideMagOut[6] = dXOut[6];
729 gapIn[6] = 20; gapOut[6] = 20;
730 dZ[6] =
dZ8-zgap/2; Z[6] = Z[5] + dZ[5] + dZ[6]+zgap;
736 TGeoVolume *top=gGeoManager->GetTopVolume();
737 TGeoVolume *tShield =
new TGeoVolumeAssembly(
"MuonShieldArea");
739 TGeoMedium *steel =gGeoManager->GetMedium(
"steel");
741 TGeoMedium *iron =gGeoManager->GetMedium(
"iron");
743 TGeoMedium *concrete =gGeoManager->GetMedium(
"Concrete");
747 TGeoUniformMagField *magFieldIron =
new TGeoUniformMagField(0.,ironField,0.);
748 TGeoUniformMagField *RetField =
new TGeoUniformMagField(0.,-ironField,0.);
749 TGeoUniformMagField *ConRField =
new TGeoUniformMagField(-ironField,0.,0.);
750 TGeoUniformMagField *ConLField =
new TGeoUniformMagField(ironField,0.,0.);
751 TGeoUniformMagField *fields[4] = {magFieldIron,RetField,ConRField,ConLField};
753 std::vector<TString> magnetName;
754 std::vector<FieldDirection> fieldDirection;
755 std::vector<Double_t> dXIn, dYIn, dXOut, dYOut, dZf, midGapIn, midGapOut,
756 HmainSideMagIn, HmainSideMagOut, gapIn, gapOut, Z;
757 const Int_t nMagnets =
Initialize(magnetName, fieldDirection, dXIn, dYIn, dXOut, dYOut, dZf,
758 midGapIn, midGapOut, HmainSideMagIn, HmainSideMagOut, gapIn,
765 dA/6.,dA/6.,dA/6.,dA/6.,
dZ0/3.,0,0,dA/12.,dA/12.,0,0,
zEndOfAbsorb - 5.*
dZ0/3.,0,
false);
767 dA/2.,dA/2.,dA/2.,dA/2.,
dZ0*2./3.,0,0,dA/4.,dA/4.,0,0,
zEndOfAbsorb - 2.*
dZ0/3.,0,
false);
768 TGeoBBox* fullAbsorber =
new TGeoBBox(
"fullAbsorber", dA, dA,
dZ0/3.);
769 TGeoBBox* cutOut =
new TGeoBBox(
"cutout", dA/3.+20*
cm, dA/3.+20*
cm,
dZ0/3.+0.1*
mm);
770 TGeoSubtraction *subtraction =
new TGeoSubtraction(
"fullAbsorber",
"cutout");
771 TGeoCompositeShape *Tc =
new TGeoCompositeShape(
"passiveAbsorberStopSubtr", subtraction);
772 TGeoVolume* passivAbsorber =
new TGeoVolume(
"passiveAbsorberStop-1",Tc, iron);
773 tShield->AddNode(passivAbsorber, 1,
new TGeoTranslation(0,0,
zEndOfAbsorb - 5.*
dZ0/3.));
775 float mField = 1.6 *
tesla;
776 TGeoUniformMagField *fieldsAbsorber[4] = {
777 new TGeoUniformMagField(0., mField, 0.),
778 new TGeoUniformMagField(0., -mField, 0.),
779 new TGeoUniformMagField(-mField, 0., 0.),
780 new TGeoUniformMagField(mField, 0., 0.)
783 for (Int_t nM = (
fDesign == 7) ? 0 : 1; nM < 2; nM++) {
784 CreateMagnet(magnetName[nM], iron, tShield, fieldsAbsorber,
785 fieldDirection[nM], dXIn[nM], dYIn[nM], dXOut[nM],
786 dYOut[nM], dZf[nM], midGapIn[nM], midGapOut[nM],
787 HmainSideMagIn[nM], HmainSideMagOut[nM], gapIn[nM],
788 gapOut[nM], Z[nM],
true,
false);
791 std::vector<TGeoTranslation*> mag_trans;
794 auto mag1 =
new TGeoTranslation(
"mag1", 0, 0, -
dZ2);
795 mag1->RegisterYourself();
796 mag_trans.push_back(mag1);
798 auto mag2 =
new TGeoTranslation(
"mag2", 0, 0, +
dZ1);
799 mag2->RegisterYourself();
800 mag_trans.push_back(mag2);
803 Double_t absorber_offset = zgap;
804 Double_t absorber_half_length = (dZf[0] + dZf[1]) + zgap / 2.;
805 auto abs =
new TGeoBBox(
"absorber", 3.95 *
m, 3.4 *
m, absorber_half_length);
806 const std::vector<TString> absorber_magnets =
807 (
fDesign == 7) ? std::vector<TString>{
"MagnAbsorb1",
"MagnAbsorb2"} : std::vector<TString>{
"MagnAbsorb2"};
808 const std::vector<TString> magnet_components =
fDesign == 7 ? std::vector<TString>{
809 "_MiddleMagL",
"_MiddleMagR",
"_MagRetL",
"_MagRetR",
810 "_MagCLB",
"_MagCLT",
"_MagCRT",
"_MagCRB",
811 "_MagTopLeft",
"_MagTopRight",
"_MagBotLeft",
"_MagBotRight",
812 }: std::vector<TString>{
813 "_MiddleMagL",
"_MiddleMagR",
"_MagRetL",
"_MagRetR",
814 "_MagTopLeft",
"_MagTopRight",
"_MagBotLeft",
"_MagBotRight",
816 TString absorber_magnet_components;
817 for (
auto &&magnet_component : magnet_components) {
819 absorber_magnet_components +=
820 (
"-" + absorber_magnets[0] + magnet_component +
":" +
821 mag_trans[0]->GetName());
823 absorber_magnet_components +=
824 (
"-" + absorber_magnets[1] + magnet_component +
":" +
825 mag_trans[1]->GetName());
828 TGeoCompositeShape *absorberShape =
new TGeoCompositeShape(
829 "Absorber",
"absorber" + absorber_magnet_components);
832 TGeoVolume *absorber =
new TGeoVolume(
"AbsorberVol", absorberShape, iron);
833 absorber->SetLineColor(42);
834 tShield->AddNode(absorber, 1,
new TGeoTranslation(0, 0,
zEndOfAbsorb + absorber_half_length + absorber_offset));
837 auto coatBox =
new TGeoBBox(
"coat", 10 *
m - 1 *
mm, 10 *
m - 1 *
mm, absorber_half_length);
838 auto coatShape =
new TGeoCompositeShape(
"CoatShape",
"coat-absorber");
839 auto coat =
new TGeoVolume(
"CoatVol", coatShape, concrete);
840 tShield->AddNode(coat, 1,
new TGeoTranslation(0, 0,
zEndOfAbsorb + absorber_half_length + absorber_offset ));
841 TGeoVolume *coatWall = gGeoManager->MakeBox(
"CoatWall",concrete,10 *
m - 1 *
mm, 10 *
m - 1 *
mm, 7 *
cm - 1 *
mm);
842 coatWall->SetLineColor(kRed);
843 tShield->AddNode(coatWall, 1,
new TGeoTranslation(0, 0,
zEndOfAbsorb + 2*absorber_half_length + absorber_offset+7 *
cm));
846 std::array<double, 9> fieldScale = {{1., 1., 1., 1., 1., 1., 1., 1., 1.}};
849 Double_t lengthSum = 0.;
850 for (
int i = 2; i < 9; ++i)
861 catch(
const std::out_of_range& e)
863 Fatal(
"ShipMuonShield",
"Exception out of range for --coMuonShield occurred \n");
866 for (Int_t nM = 2; nM <= (nMagnets - 1); nM++) {
867 Double_t ironField_s =
fField * fieldScale[nM] *
tesla;
868 TGeoUniformMagField *magFieldIron_s =
new TGeoUniformMagField(0.,ironField_s,0.);
869 TGeoUniformMagField *RetField_s =
new TGeoUniformMagField(0.,-ironField_s,0.);
870 TGeoUniformMagField *ConRField_s =
new TGeoUniformMagField(-ironField_s,0.,0.);
871 TGeoUniformMagField *ConLField_s =
new TGeoUniformMagField(ironField_s,0.,0.);
872 TGeoUniformMagField *fields_s[4] = {magFieldIron_s,RetField_s,ConRField_s,ConLField_s};
873 CreateMagnet(magnetName[nM], iron, tShield, fields_s, fieldDirection[nM],
874 dXIn[nM], dYIn[nM], dXOut[nM], dYOut[nM], dZf[nM],
875 midGapIn[nM], midGapOut[nM], HmainSideMagIn[nM],
876 HmainSideMagOut[nM], gapIn[nM], gapOut[nM], Z[nM], nM==8,
fStepGeo);
879 Double_t dymax = std::max(dYIn[nM] + dXIn[nM], dYOut[nM] + dXOut[nM]);
880 Double_t dymin = std::min(dYIn[nM] + dXIn[nM], dYOut[nM] + dXOut[nM]);
882 (dYIn[nM] + dXIn[nM] - dYOut[nM] - dXOut[nM]) / (2 * dZf[nM]);
883 Double_t w1 = 2 * dXIn[nM] + std::max(20., gapIn[nM]);
884 Double_t w2 = 2 * dXOut[nM] + std::max(20., gapOut[nM]);
885 Double_t anti_overlap = 0.1;
886 Double_t h1 = 0.5 * (dYIn[nM] + dXIn[nM] + anti_overlap - 10 *
m +
fFloor);
887 Double_t h2 = 0.5 * (dYOut[nM] + dXOut[nM] + anti_overlap - 10 *
m +
fFloor);
888 Double_t length = std::min(0.5 *
m, std::abs(dZf[nM]/2. - 5 *
cm));
889 std::array<Double_t, 16> verticesIn = {
894 -w1, -h1 + slope * 2. * length,
895 +w1, -h1 + slope * 2. * length,
899 std::array<Double_t, 16> verticesOut = {
900 -w2, -h2 - slope * 2. * length,
901 +w2, -h2 - slope * 2. * length,
913 TGeoVolume *pillar1 =
914 gGeoManager->MakeArb8(TString::Format(
"pillar_%d", 2 * nM - 1),
915 steel, length, verticesIn.data());
916 TGeoVolume *pillar2 =
917 gGeoManager->MakeArb8(TString::Format(
"pillar_%d", 2 * nM), steel,
918 length, verticesOut.data());
919 pillar1->SetLineColor(kGreen-5);
920 pillar2->SetLineColor(kGreen-5);
921 tShield->AddNode(pillar1, 1,
new TGeoTranslation(
922 0, -0.5 * (dYIn[nM] + dXIn[nM] + 10 *
m -
fFloor),
923 Z[nM] - dZf[nM] + length));
924 tShield->AddNode(pillar2, 1,
new TGeoTranslation(
925 0, -0.5 * (dYOut[nM] + dXOut[nM] + 10 *
m -
fFloor),
926 Z[nM] + dZf[nM] - length));
934 for (Int_t nM = 0; nM < (nMagnets - 1); nM++) {
935 CreateMagnet(magnetName[nM],iron,tShield,fields,fieldDirection[nM],
936 dXIn[nM],dYIn[nM],dXOut[nM],dYOut[nM],dZf[nM],
937 midGapIn[nM],midGapOut[nM],HmainSideMagIn[nM],HmainSideMagOut[nM],
938 gapIn[nM],gapOut[nM],Z[nM],0,
fStepGeo);
941 Double_t dX1 = dXIn[0];
942 Double_t dY = dYIn[0];
945 top->AddNode(tShield, 1);
950 TGeoBBox *box1 =
new TGeoBBox(
"box1", 10*
m,10*
m,dZ);
951 TGeoBBox *box2 =
new TGeoBBox(
"box2", 15*
m,15*
m,dZ);
952 TGeoCompositeShape *compRockS =
new TGeoCompositeShape(
"compRockS",
"box2-box1");
953 TGeoVolume *rockS =
new TGeoVolume(
"rockS", compRockS, concrete);
954 rockS->SetLineColor(11);
955 rockS->SetTransparency(50);
956 top->AddNode(rockS, 1,
new TGeoTranslation(0, 0, ZT ));
959 TGeoBBox *box3 =
new TGeoBBox(
"box3", 15*
m, 15*
m,dZD/2.);
960 TGeoBBox *box4 =
new TGeoBBox(
"box4", 10*
m, 10*
m,dZD/2.);
964 TGeoBBox *box5 =
new TGeoBBox(
"shield_floor", 10 *
m,
fFloor / 2.,
966 TGeoVolume *floor =
new TGeoVolume(
"floorM", box5, concrete);
967 floor->SetLineColor(11);
968 top->AddNode(floor, 1,
new TGeoTranslation(0, -10 *
m +
fFloor / 2.,
972 TGeoCompositeShape *compRockD =
973 new TGeoCompositeShape(
"compRockD",
"(box3-box4)");
974 TGeoVolume *rockD =
new TGeoVolume(
"rockD", compRockD, concrete);
975 rockD->SetLineColor(11);
976 rockD->SetTransparency(50);
977 top->AddNode(rockD, 1,
new TGeoTranslation(0, 0,
zEndOfAbsorb + 2*dZ + dZD/2.));
980 Fatal(
"ShipMuonShield",
"Design %i does not match implemented designs",
fDesign);