85 G4double containerLength,
91 G4double horizontalWidth = recipe->horizontalWidth;
92 G4double angleIn = recipe->angleIn;
93 G4double angleOut = recipe->angleOut;
114 G4double massShift = 0.5 * beamPipeAxisSeparation;
116 G4double collarBoxHalfWidth = 22*CLHEP::mm;
121 G4double innerCoilInnerRadiusF = 24.601*CLHEP::mm;
122 G4double innerCoilOuterRadius = 42*CLHEP::mm;
125 G4double outerCoilOuterRadius = 60*CLHEP::mm;
128 G4double collarOuterRadius = 101.18*CLHEP::mm;
129 G4double yokeOuterRadius = 570.0*0.5*CLHEP::mm;
134 G4double poleInnerFullAngle = 33./180.*2;
135 G4double poleOuterFullAngle = 100./180.*2;
136 G4double coilInnerFullAngle = CLHEP::pi - poleInnerFullAngle - 1e-3;
137 G4double coilOuterFullAngle = CLHEP::pi - poleOuterFullAngle - 1e-3;
141 G4bool buildInnerCoil =
true;
142 G4bool buildOuterCoil =
true;
143 G4bool buildCollar =
true;
144 if (innerCoilInnerRadius > innerCoilOuterRadius)
145 {buildInnerCoil =
false;}
146 if ((innerCoilInnerRadius > outerCoilInnerRadius) && (innerCoilInnerRadius < outerCoilOuterRadius))
147 {outerCoilInnerRadius = containerInnerRadius +
lengthSafety;}
148 if (innerCoilInnerRadius > outerCoilOuterRadius)
149 {buildOuterCoil =
false;}
152 if ((innerCoilInnerRadius > collarInnerRadius) && (innerCoilInnerRadius < (massShift - collarBoxHalfWidth)))
153 {collarInnerRadius = containerInnerRadius +
lengthSafety;}
154 if (innerCoilInnerRadius > (massShift - collarBoxHalfWidth))
155 {buildCollar =
false;}
156 if (innerCoilInnerRadius > collarOuterRadius)
158 throw BDSException(__METHOD_NAME__,
"error in component \"" + name +
"\"\n" +
159 "this beam pipe is too big to use with the LHC dipole geometry\n" +
160 "Please consider using a different magnet geometry for this particular magnet");
163 G4ThreeVector dipolePosition;
166 dipolePosition = G4ThreeVector(massShift,0.,0.);
167 beamPipeAxisSeparation *= -1;
169 G4cout << __METHOD_NAME__ <<
"dipole to the left" << G4endl;
174 dipolePosition = G4ThreeVector(-massShift,0.,0.);
177 G4cout << __METHOD_NAME__ <<
"dipole to the right" << G4endl;
182 G4double angle = angleIn + angleOut;
185 inputFaceNormal = faces.first;
186 outputFaceNormal = faces.second;
189 G4double centralHalfLength = length*0.5 - orientation*0.5*beamPipeAxisSeparation*tan(fabs(angle*0.5));
191 G4double centralContainerLength = containerLength - orientation*beamPipeAxisSeparation*tan(fabs(angle*0.5));
193 G4double secondBPHalfLength = length*0.5 - orientation*beamPipeAxisSeparation*tan(fabs(angle*0.5));
196 G4cout << __METHOD_NAME__ <<
"all calculated parameters: " << G4endl;
197 G4cout <<
"container inner radius: " << containerInnerRadius << G4endl;
198 G4cout <<
"inner coil inner radius: " << innerCoilInnerRadius << G4endl;
199 G4cout <<
"inner coil outer radius: " << innerCoilOuterRadius << G4endl;
200 G4cout <<
"outer coil inner radius: " << outerCoilInnerRadius << G4endl;
201 G4cout <<
"outer coil outer radius: " << outerCoilOuterRadius << G4endl;
202 G4cout <<
"collar inner radius: " << collarInnerRadius << G4endl;
203 G4cout <<
"collar outer radius: " << collarOuterRadius << G4endl;
204 G4cout <<
"yoke outer radius: " << yokeOuterRadius << G4endl;
207 G4VSolid* containerSolidOuter = BDS::AppropriateTubs(name +
"_container_solid_outer",
216 allSolids.insert(containerSolidOuter);
217 G4VSolid* containerSolidInner;
223 containerSolidInner =
new G4Tubs(name +
"_container_solid_inner",
225 containerInnerRadius,
229 allSolids.insert(containerSolidInner);
233 containerSolid =
new G4SubtractionSolid(name +
"_outer_container_solid",
245 magnetContainerLV =
new G4LogicalVolume(magnetContainerSolid,
247 name +
"_container_lv");
249 containerLV =
new G4LogicalVolume(containerSolid,
251 name +
"_outer_container_lv");
254 G4VSolid* coil1Inner =
nullptr;
255 G4VSolid* coil1Outer =
nullptr;
256 G4VSolid* coil2Inner =
nullptr;
257 G4VSolid* coil2Outer =
nullptr;
258 G4VSolid* coil3Inner =
nullptr;
259 G4VSolid* coil3Outer =
nullptr;
260 G4VSolid* coil4Inner =
nullptr;
261 G4VSolid* coil4Outer =
nullptr;
262 G4LogicalVolume* coil1InnerLV =
nullptr;
263 G4LogicalVolume* coil1OuterLV =
nullptr;
264 G4LogicalVolume* coil2InnerLV =
nullptr;
265 G4LogicalVolume* coil2OuterLV =
nullptr;
266 G4LogicalVolume* coil3InnerLV =
nullptr;
267 G4LogicalVolume* coil3OuterLV =
nullptr;
268 G4LogicalVolume* coil4InnerLV =
nullptr;
269 G4LogicalVolume* coil4OuterLV =
nullptr;
270 G4PVPlacement* coil1InnerPV =
nullptr;
271 G4PVPlacement* coil1OuterPV =
nullptr;
272 G4PVPlacement* coil2InnerPV =
nullptr;
273 G4PVPlacement* coil2OuterPV =
nullptr;
274 G4PVPlacement* coil3InnerPV =
nullptr;
275 G4PVPlacement* coil3OuterPV =
nullptr;
276 G4PVPlacement* coil4InnerPV =
nullptr;
277 G4PVPlacement* coil4OuterPV =
nullptr;
283 G4VisAttributes* coilVisAtt =
new G4VisAttributes(*
BDSColours::Instance()->GetColour(
"LHCcoil"));
285 allVisAttributes.insert(coilVisAtt);
286 G4VSolid* collar1PoleTopInnerSolid =
nullptr;
287 G4VSolid* collar1PoleBottomInnerSolid =
nullptr;
288 G4VSolid* collar1PoleTopOuterSolid =
nullptr;
289 G4VSolid* collar1PoleBottomOuterSolid =
nullptr;
290 G4LogicalVolume* collar1PoleTopInnerLV =
nullptr;
291 G4LogicalVolume* collar1PoleBottomInnerLV =
nullptr;
292 G4LogicalVolume* collar1PoleTopOuterLV =
nullptr;
293 G4LogicalVolume* collar1PoleBottomOuterLV =
nullptr;
294 G4PVPlacement* collar1PoleTopInnerPV =
nullptr;
295 G4PVPlacement* collar1PoleBottomInnerPV =
nullptr;
296 G4PVPlacement* collar1PoleTopOuterPV =
nullptr;
297 G4PVPlacement* collar1PoleBottomOuterPV =
nullptr;
298 G4VSolid* collar2PoleTopInnerSolid =
nullptr;
299 G4VSolid* collar2PoleBottomInnerSolid =
nullptr;
300 G4VSolid* collar2PoleTopOuterSolid =
nullptr;
301 G4VSolid* collar2PoleBottomOuterSolid =
nullptr;
302 G4LogicalVolume* collar2PoleTopInnerLV =
nullptr;
303 G4LogicalVolume* collar2PoleBottomInnerLV =
nullptr;
304 G4LogicalVolume* collar2PoleTopOuterLV =
nullptr;
305 G4LogicalVolume* collar2PoleBottomOuterLV =
nullptr;
306 G4PVPlacement* collar2PoleTopInnerPV =
nullptr;
307 G4PVPlacement* collar2PoleBottomInnerPV =
nullptr;
308 G4PVPlacement* collar2PoleTopOuterPV =
nullptr;
309 G4PVPlacement* collar2PoleBottomOuterPV =
nullptr;
310 G4LogicalVolume* collarsLV =
nullptr;
311 G4PVPlacement* collarsPV =
nullptr;
312 G4LogicalVolume* secondBPLV =
nullptr;
313 G4PVPlacement* secondBPPV =
nullptr;
317 G4VisAttributes* collarVisAtt =
new G4VisAttributes(*
BDSColours::Instance()->GetColour(
"LHCcollar"));
319 allVisAttributes.insert(collarVisAtt);
324 coil1Inner = BDS::AppropriateTubs(name+
"_coil1_inner_solid",
328 -coilInnerFullAngle*0.5,
333 coil2Inner = BDS::AppropriateTubs(name+
"_coil2_inner_solid",
337 CLHEP::pi-coilInnerFullAngle*0.5,
342 coil1InnerLV =
new G4LogicalVolume(coil1Inner,
344 name+
"_coil1_Inner_lv");
345 coil2InnerLV =
new G4LogicalVolume(coil2Inner,
347 name+
"_coil2_Inner_lv");
348 coil1InnerLV->SetVisAttributes(coilVisAtt);
349 coil2InnerLV->SetVisAttributes(coilVisAtt);
351 coil1InnerPV =
new G4PVPlacement(
nullptr,
354 name+
"_coil1_inner_pv",
359 coil2InnerPV =
new G4PVPlacement(
nullptr,
362 name+
"_coil2_inner_pv",
368 allSolids.insert(coil1Inner);
369 allSolids.insert(coil2Inner);
370 allLogicalVolumes.insert(coil1InnerLV);
371 allLogicalVolumes.insert(coil2InnerLV);
372 allPhysicalVolumes.insert(coil1InnerPV);
373 allPhysicalVolumes.insert(coil2InnerPV);
375 collar1PoleTopInnerSolid = BDS::AppropriateTubs(name+
"_collar1_pole_inner_top",
379 CLHEP::pi*0.5-poleInnerFullAngle*0.5,
384 collar1PoleBottomInnerSolid = BDS::AppropriateTubs(name+
"_collar1_pole_inner_bottom",
388 CLHEP::pi*1.5-poleInnerFullAngle*0.5,
393 collar1PoleTopInnerLV =
new G4LogicalVolume(collar1PoleTopInnerSolid,
394 stainlesssteel_316LN_2K,
395 name+
"_collar1_pole_top_inner_lv");
396 collar1PoleBottomInnerLV =
new G4LogicalVolume(collar1PoleBottomInnerSolid,
397 stainlesssteel_316LN_2K,
398 name+
"_collar1_pole_bottom_inner_lv");
400 collar1PoleTopInnerLV->SetVisAttributes(collarVisAtt);
401 collar1PoleBottomInnerLV->SetVisAttributes(collarVisAtt);
403 collar1PoleTopInnerPV =
new G4PVPlacement(
nullptr,
405 collar1PoleTopInnerLV,
406 name+
"_collar1_pole_top_inner_pv",
411 collar1PoleBottomInnerPV =
new G4PVPlacement(
nullptr,
413 collar1PoleBottomInnerLV,
414 name+
"_collar1_pole_top_inner_pv",
420 allSolids.insert(collar1PoleTopInnerSolid);
421 allSolids.insert(collar1PoleBottomInnerSolid);
422 allLogicalVolumes.insert(collar1PoleTopInnerLV);
423 allLogicalVolumes.insert(collar1PoleBottomInnerLV);
424 allPhysicalVolumes.insert(collar1PoleTopInnerPV);
425 allPhysicalVolumes.insert(collar1PoleBottomInnerPV);
430 coil1Outer = BDS::AppropriateTubs(name+
"_coil1_outer_solid",
431 outerCoilInnerRadius,
432 outerCoilOuterRadius,
434 -coilOuterFullAngle*0.5,
439 coil2Outer = BDS::AppropriateTubs(name+
"_coil2_outer_solid",
440 outerCoilInnerRadius,
441 outerCoilOuterRadius,
443 CLHEP::pi-coilOuterFullAngle*0.5,
448 coil1OuterLV =
new G4LogicalVolume(coil1Outer,
450 name+
"_coil1_Inner_lv");
451 coil2OuterLV =
new G4LogicalVolume(coil2Outer,
453 name+
"_coil2_Inner_lv");
454 coil1OuterLV->SetVisAttributes(coilVisAtt);
455 coil2OuterLV->SetVisAttributes(coilVisAtt);
457 coil1OuterPV =
new G4PVPlacement(
nullptr,
460 name+
"_coil1_outer_pv",
465 coil2OuterPV =
new G4PVPlacement(
nullptr,
468 name+
"_coil2_outer_pv",
474 allSolids.insert(coil1Outer);
475 allSolids.insert(coil2Outer);
476 allLogicalVolumes.insert(coil1OuterLV);
477 allLogicalVolumes.insert(coil2OuterLV);
478 allPhysicalVolumes.insert(coil1OuterPV);
479 allPhysicalVolumes.insert(coil2OuterPV);
481 collar1PoleTopOuterSolid = BDS::AppropriateTubs(name+
"_collar1_pole_outer_top",
482 outerCoilInnerRadius,
483 outerCoilOuterRadius,
485 CLHEP::pi*0.5-poleOuterFullAngle*0.5,
490 collar1PoleBottomOuterSolid = BDS::AppropriateTubs(name+
"_collar1_pole_outer_bottom",
491 outerCoilInnerRadius,
492 outerCoilOuterRadius,
494 CLHEP::pi*1.5-poleOuterFullAngle*0.5,
500 collar1PoleTopOuterLV =
new G4LogicalVolume(collar1PoleTopOuterSolid,
501 stainlesssteel_316LN_2K,
502 name+
"_collar1_pole_top_outer_lv");
503 collar1PoleBottomOuterLV =
new G4LogicalVolume(collar1PoleBottomOuterSolid,
504 stainlesssteel_316LN_2K,
505 name+
"_collar1_pole_bottom_outer_lv");
507 collar1PoleTopOuterLV->SetVisAttributes(collarVisAtt);
508 collar1PoleBottomOuterLV->SetVisAttributes(collarVisAtt);
510 collar1PoleTopOuterPV =
new G4PVPlacement(
nullptr,
512 collar1PoleTopOuterLV,
513 name+
"_collar1_pole_top_inner_pv",
518 collar1PoleBottomOuterPV =
new G4PVPlacement(
nullptr,
520 collar1PoleBottomOuterLV,
521 name+
"_collar1_pole_top_inner_pv",
527 allSolids.insert(collar1PoleTopOuterSolid);
528 allSolids.insert(collar1PoleBottomOuterSolid);
529 allLogicalVolumes.insert(collar1PoleTopOuterLV);
530 allLogicalVolumes.insert(collar1PoleBottomOuterLV);
531 allPhysicalVolumes.insert(collar1PoleTopOuterPV);
532 allPhysicalVolumes.insert(collar1PoleBottomOuterPV);
536 coil3Inner = BDS::AppropriateTubs(name+
"_coil3_inner_solid",
537 innerCoilInnerRadiusF,
538 innerCoilOuterRadius,
540 -coilInnerFullAngle*0.5,
545 coil3Outer = BDS::AppropriateTubs(name+
"_coil3_outer_solid",
546 outerCoilInnerRadiusF,
547 outerCoilOuterRadius,
549 -coilOuterFullAngle*0.5,
554 coil4Inner = BDS::AppropriateTubs(name+
"_coil4_inner_solid",
555 innerCoilInnerRadiusF,
556 innerCoilOuterRadius,
558 CLHEP::pi-coilInnerFullAngle*0.5,
563 coil4Outer = BDS::AppropriateTubs(name+
"_coil4_outer_solid",
564 outerCoilInnerRadiusF,
565 outerCoilOuterRadius,
567 CLHEP::pi-coilOuterFullAngle*0.5,
573 coil3InnerLV =
new G4LogicalVolume(coil3Inner,
575 name+
"_coil3_Inner_lv");
576 coil3OuterLV =
new G4LogicalVolume(coil3Outer,
578 name+
"_coil3_Inner_lv");
579 coil4InnerLV =
new G4LogicalVolume(coil4Inner,
581 name+
"_coil4_Inner_lv");
582 coil4OuterLV =
new G4LogicalVolume(coil4Outer,
584 name+
"_coil4_Inner_lv");
586 coil3InnerLV->SetVisAttributes(coilVisAtt);
587 coil3OuterLV->SetVisAttributes(coilVisAtt);
588 coil4InnerLV->SetVisAttributes(coilVisAtt);
589 coil4OuterLV->SetVisAttributes(coilVisAtt);
591 allSolids.insert(coil3Inner);
592 allSolids.insert(coil3Outer);
593 allSolids.insert(coil4Inner);
594 allSolids.insert(coil4Outer);
595 allLogicalVolumes.insert(coil3InnerLV);
596 allLogicalVolumes.insert(coil3OuterLV);
597 allLogicalVolumes.insert(coil4InnerLV);
598 allLogicalVolumes.insert(coil4OuterLV);
602 coil3InnerPV =
new G4PVPlacement(
nullptr,
605 name+
"_coil3_inner_pv",
610 coil3OuterPV =
new G4PVPlacement(
nullptr,
613 name+
"_coil3_outer_pv",
618 coil4InnerPV =
new G4PVPlacement(
nullptr,
621 name+
"_coil4_inner_pv",
626 coil4OuterPV =
new G4PVPlacement(
nullptr,
629 name+
"_coil4_outer_pv",
634 allPhysicalVolumes.insert(coil3InnerPV);
635 allPhysicalVolumes.insert(coil3OuterPV);
636 allPhysicalVolumes.insert(coil4InnerPV);
637 allPhysicalVolumes.insert(coil4OuterPV);
641 collar2PoleTopInnerSolid = BDS::AppropriateTubs(name+
"_collar2_pole_inner_top",
642 innerCoilInnerRadiusF,
643 innerCoilOuterRadius,
645 CLHEP::pi*0.5-poleInnerFullAngle*0.5,
650 collar2PoleTopOuterSolid = BDS::AppropriateTubs(name+
"_collar2_pole_outer_top",
651 outerCoilInnerRadiusF,
652 outerCoilOuterRadius,
654 CLHEP::pi*0.5-poleOuterFullAngle*0.5,
659 collar2PoleBottomInnerSolid = BDS::AppropriateTubs(name+
"_collar2_pole_inner_bottom",
660 innerCoilInnerRadiusF,
661 innerCoilOuterRadius,
663 CLHEP::pi*1.5-poleInnerFullAngle*0.5,
668 collar2PoleBottomOuterSolid = BDS::AppropriateTubs(name+
"_collar2_pole_outer_bottom",
669 outerCoilInnerRadiusF,
670 outerCoilOuterRadius,
672 CLHEP::pi*1.5-poleOuterFullAngle*0.5,
679 collar2PoleTopInnerLV =
new G4LogicalVolume(collar2PoleTopInnerSolid,
680 stainlesssteel_316LN_2K,
681 name+
"_collar2_pole_top_inner_lv");
682 collar2PoleTopOuterLV =
new G4LogicalVolume(collar2PoleTopOuterSolid,
683 stainlesssteel_316LN_2K,
684 name+
"_collar2_pole_top_outer_lv");
685 collar2PoleBottomInnerLV =
new G4LogicalVolume(collar2PoleBottomInnerSolid,
686 stainlesssteel_316LN_2K,
687 name+
"_collar2_pole_bottom_inner_lv");
688 collar2PoleBottomOuterLV =
new G4LogicalVolume(collar2PoleBottomOuterSolid,
689 stainlesssteel_316LN_2K,
690 name+
"_collar2_pole_bottom_outer_lv");
693 collar2PoleTopInnerLV->SetVisAttributes(collarVisAtt);
694 collar2PoleTopOuterLV->SetVisAttributes(collarVisAtt);
695 collar2PoleBottomInnerLV->SetVisAttributes(collarVisAtt);
696 collar2PoleBottomOuterLV->SetVisAttributes(collarVisAtt);
698 allSolids.insert(collar2PoleTopInnerSolid);
699 allSolids.insert(collar2PoleTopOuterSolid);
700 allSolids.insert(collar2PoleBottomInnerSolid);
701 allSolids.insert(collar2PoleBottomOuterSolid);
702 allLogicalVolumes.insert(collar2PoleTopInnerLV);
703 allLogicalVolumes.insert(collar2PoleTopOuterLV);
704 allLogicalVolumes.insert(collar2PoleBottomInnerLV);
705 allLogicalVolumes.insert(collar2PoleBottomOuterLV);
708 collar2PoleTopInnerPV =
new G4PVPlacement(
nullptr,
710 collar2PoleTopInnerLV,
711 name+
"_collar2_pole_top_inner_pv",
716 collar2PoleTopOuterPV =
new G4PVPlacement(
nullptr,
718 collar2PoleTopOuterLV,
719 name+
"_collar2_pole_top_inner_pv",
724 collar2PoleBottomInnerPV =
new G4PVPlacement(
nullptr,
726 collar2PoleBottomInnerLV,
727 name+
"_collar2_pole_top_inner_pv",
732 collar2PoleBottomOuterPV =
new G4PVPlacement(
nullptr,
734 collar2PoleBottomOuterLV,
735 name+
"_collar2_pole_top_inner_pv",
741 allPhysicalVolumes.insert(collar2PoleTopInnerPV);
742 allPhysicalVolumes.insert(collar2PoleTopOuterPV);
743 allPhysicalVolumes.insert(collar2PoleBottomInnerPV);
744 allPhysicalVolumes.insert(collar2PoleBottomOuterPV);
747 G4VSolid* collarAnnulus2 = BDS::AppropriateTubs(name+
"_collar2_annulus_solid",
757 allSolids.insert(collarAnnulus2);
759 G4VSolid* collars = collarAnnulus2;
765 G4VSolid* collarAnnulus1 = BDS::AppropriateTubs(name+
"_collar1_annulus_solid",
775 collars =
new G4UnionSolid(name +
"_collars_solid",
780 allSolids.insert(collarAnnulus1);
781 allSolids.insert(collars);
812 G4VSolid* collarTotal = collars;
814 collarsLV =
new G4LogicalVolume(collarTotal,
815 stainlesssteel_316LN_2K,
819 collarsLV->SetVisAttributes(collarVisAtt);
821 allLogicalVolumes.insert(collarsLV);
823 collarsPV =
new G4PVPlacement(
nullptr,
831 allPhysicalVolumes.insert(collarsPV);
834 G4VSolid* yokeCylinder = BDS::AppropriateTubs(name+
"_yoke_cylinder_solid",
845 G4VSolid* yokeSubtractionCylinder =
new G4Tubs(name +
"_yoke_subtraction_cyl_solid",
852 G4VSolid* yokeSubtractionSolid =
new G4UnionSolid(name +
"_yoke_subtraction_solid",
853 yokeSubtractionCylinder,
854 yokeSubtractionCylinder,
858 yokeSolid =
new G4SubtractionSolid(name+
"_yoke_solid",
860 yokeSubtractionSolid,
863 allSolids.insert(yokeSubtractionCylinder);
864 allSolids.insert(yokeSubtractionSolid);
867 stainlesssteel_304L_2K,
871 G4Colour* yokeColour;
874 case YokeColour::dipole:
876 case YokeColour::kicker:
877 {yokeColour = recipe->colour;
break;}
881 G4VisAttributes* yokeVis =
new G4VisAttributes(*yokeColour);
883 allVisAttributes.insert(yokeVis);
884 yokeLV->SetVisAttributes(yokeVis);
886 allLogicalVolumes.insert(yokeLV);
889 yokePV =
new G4PVPlacement(
nullptr,
890 G4ThreeVector(0,0,0),
897 allPhysicalVolumes.insert(yokePV);
915 stainlesssteel_316LN_2K);
930 stainlesssteel_316LN_2K);
934 secondBPPV =
new G4PVPlacement(
nullptr,
937 name +
"_second_beampipe_pv",
942 allPhysicalVolumes.insert(secondBPPV);
949 for (
auto lv : allLogicalVolumes)
956 G4double containerRadius = yokeOuterRadius;
959 -containerRadius,containerRadius,
960 -length*0.5,length*0.5);
998 G4double containerLength,
1001 G4double horizontalWidth = recipe->horizontalWidth;
1011 G4double massShift = 0.5 * beamPipeAxisSeparation;
1013 G4double collarBoxHalfWidth = 22*CLHEP::mm;
1018 G4double coilInnerRadiusF = 24.601*CLHEP::mm;
1019 G4double coilOuterRadius = 60*CLHEP::mm;
1022 G4double collarOuterRadius = 101.18*CLHEP::mm;
1023 G4double yokeOuterRadius = 570.0*0.5*CLHEP::mm;
1028 G4double poleFullAngle = CLHEP::pi/6.;
1029 G4double coilFullAngle = CLHEP::pi/2. - poleFullAngle - 1e-3;
1030 G4double coilHalfAngle = coilFullAngle*0.5;
1031 G4double coilStartAngle = -coilHalfAngle;
1032 G4double poleStartAngle = coilHalfAngle;
1033 G4RotationMatrix* coil2rm =
new G4RotationMatrix();
1034 G4RotationMatrix* coil3rm =
new G4RotationMatrix();
1035 G4RotationMatrix* coil4rm =
new G4RotationMatrix();
1036 coil2rm->rotateZ(CLHEP::pi/2.0);
1037 coil3rm->rotateZ(CLHEP::pi);
1038 coil4rm->rotateZ(CLHEP::pi*1.5);
1039 allRotationMatrices.insert(coil2rm);
1040 allRotationMatrices.insert(coil3rm);
1041 allRotationMatrices.insert(coil4rm);
1045 G4bool buildCoil =
true;
1046 G4bool buildCollar =
true;
1047 if (coilInnerRadius > coilOuterRadius)
1048 {buildCoil =
false;}
1051 if ((coilInnerRadius > collarInnerRadius) && (coilInnerRadius < (massShift - collarBoxHalfWidth)))
1052 {collarInnerRadius = containerInnerRadius +
lengthSafety;}
1053 if (coilInnerRadius > (massShift - collarBoxHalfWidth))
1054 {buildCollar =
false;}
1055 G4bool buildAtAll = containerInnerRadius > (beamPipeAxisSeparation - collarOuterRadius - 1*CLHEP::mm);
1056 if ((coilInnerRadius > collarOuterRadius) || buildAtAll)
1058 throw BDSException(__METHOD_NAME__,
"error in component \"" + name +
"\"\n" +
1059 "this beam pipe is too big to use with the LHC dipole geometry\n" +
1060 "Please consider using a different magnet geometry for this particular magnet");
1063 G4ThreeVector dipolePosition;
1066 dipolePosition = G4ThreeVector(massShift,0.,0.);
1067 beamPipeAxisSeparation *= -1;
1069 G4cout << __METHOD_NAME__ <<
"dipole to the left" << G4endl;
1074 dipolePosition = G4ThreeVector(-massShift,0.,0.);
1077 G4cout << __METHOD_NAME__ <<
"dipole to the right" << G4endl;
1086 G4VSolid* containerSolidOuter =
new G4Tubs(name +
"_contiainer_solid_outer",
1093 G4VSolid* containerSolidInner =
new G4Tubs(name +
"_contiainer_solid_inner",
1095 containerInnerRadius,
1099 allSolids.insert(containerSolidOuter);
1100 allSolids.insert(containerSolidInner);
1101 containerSolid =
new G4SubtractionSolid(name +
"_container_solid",
1102 containerSolidOuter,
1103 containerSolidInner,
1110 G4VSolid* containerSolidOuter =
new G4Tubs(name +
"_contiainer_solid_outer",
1116 allSolids.insert(containerSolidOuter);
1117 containerSolid =
new G4SubtractionSolid(name +
"_container_solid",
1118 containerSolidOuter,
1131 magnetContainerLV =
new G4LogicalVolume(magnetContainerSolid,
1133 name +
"_container_lv");
1134 containerLV =
new G4LogicalVolume(containerSolid,
1136 name +
"_container_lv");
1141 G4VSolid* coil1 =
nullptr;
1142 G4VSolid* coil2 =
nullptr;
1143 G4LogicalVolume* coil1LV =
nullptr;
1144 G4LogicalVolume* coil2LV =
nullptr;
1145 G4VPhysicalVolume* coil1PV =
nullptr;
1146 G4VPhysicalVolume* coil2PV =
nullptr;
1147 G4VPhysicalVolume* coil3PV =
nullptr;
1148 G4VPhysicalVolume* coil4PV =
nullptr;
1149 G4VPhysicalVolume* coil5PV =
nullptr;
1150 G4VPhysicalVolume* coil6PV =
nullptr;
1151 G4VPhysicalVolume* coil7PV =
nullptr;
1152 G4VPhysicalVolume* coil8PV =
nullptr;
1155 G4VSolid* pole1 =
nullptr;
1156 G4VSolid* pole2 =
nullptr;
1157 G4LogicalVolume* pole1LV =
nullptr;
1158 G4LogicalVolume* pole2LV =
nullptr;
1159 G4VPhysicalVolume* pole1PV =
nullptr;
1160 G4VPhysicalVolume* pole2PV =
nullptr;
1161 G4VPhysicalVolume* pole3PV =
nullptr;
1162 G4VPhysicalVolume* pole4PV =
nullptr;
1163 G4VPhysicalVolume* pole5PV =
nullptr;
1164 G4VPhysicalVolume* pole6PV =
nullptr;
1165 G4VPhysicalVolume* pole7PV =
nullptr;
1166 G4VPhysicalVolume* pole8PV =
nullptr;
1169 G4VSolid* collar =
nullptr;
1170 G4VSolid* collars =
nullptr;
1171 G4LogicalVolume* collarsLV =
nullptr;
1178 G4VisAttributes* coilVisAtt =
new G4VisAttributes(*
BDSColours::Instance()->GetColour(
"LHCcoil"));
1180 G4VisAttributes* collarVisAtt =
new G4VisAttributes(*
BDSColours::Instance()->GetColour(
"LHCcollar"));
1182 allVisAttributes.insert(coilVisAtt);
1183 allVisAttributes.insert(collarVisAtt);
1188 coil1 =
new G4Tubs(name+
"_coil1_solid",
1195 coil1LV =
new G4LogicalVolume(coil1,
1198 coil1LV->SetVisAttributes(coilVisAtt);
1199 allSolids.insert(coil1);
1200 allLogicalVolumes.insert(coil1LV);
1203 pole1 =
new G4Tubs(name+
"_pole1_solid",
1209 pole1LV =
new G4LogicalVolume(pole1,
1210 stainlesssteel_316LN_2K,
1212 pole1LV->SetVisAttributes(collarVisAtt);
1213 allSolids.insert(pole1);
1214 allLogicalVolumes.insert(pole1LV);
1217 coil1PV =
new G4PVPlacement(
nullptr,
1225 coil2PV =
new G4PVPlacement(coil2rm,
1233 coil3PV =
new G4PVPlacement(coil3rm,
1241 coil4PV =
new G4PVPlacement(coil4rm,
1249 allPhysicalVolumes.insert(coil1PV);
1250 allPhysicalVolumes.insert(coil2PV);
1251 allPhysicalVolumes.insert(coil3PV);
1252 allPhysicalVolumes.insert(coil4PV);
1255 pole1PV =
new G4PVPlacement(
nullptr,
1263 pole2PV =
new G4PVPlacement(coil2rm,
1271 pole3PV =
new G4PVPlacement(coil3rm,
1279 pole4PV =
new G4PVPlacement(coil4rm,
1287 allPhysicalVolumes.insert(pole1PV);
1288 allPhysicalVolumes.insert(pole2PV);
1289 allPhysicalVolumes.insert(pole3PV);
1290 allPhysicalVolumes.insert(pole4PV);
1294 coil2 =
new G4Tubs(name+
"_coil2_solid",
1300 coil2LV =
new G4LogicalVolume(coil2,
1303 coil2LV->SetVisAttributes(coilVisAtt);
1304 allSolids.insert(coil2);
1305 allLogicalVolumes.insert(coil2LV);
1308 pole2 =
new G4Tubs(name+
"_pole2_solid",
1314 pole2LV =
new G4LogicalVolume(pole2,
1315 stainlesssteel_316LN_2K,
1317 pole2LV->SetVisAttributes(collarVisAtt);
1318 allSolids.insert(pole2);
1319 allLogicalVolumes.insert(pole2LV);
1322 coil5PV =
new G4PVPlacement(
nullptr,
1330 coil6PV =
new G4PVPlacement(coil2rm,
1338 coil7PV =
new G4PVPlacement(coil3rm,
1346 coil8PV =
new G4PVPlacement(coil4rm,
1354 allPhysicalVolumes.insert(coil5PV);
1355 allPhysicalVolumes.insert(coil6PV);
1356 allPhysicalVolumes.insert(coil7PV);
1357 allPhysicalVolumes.insert(coil8PV);
1360 pole5PV =
new G4PVPlacement(
nullptr,
1368 pole6PV =
new G4PVPlacement(coil2rm,
1376 pole7PV =
new G4PVPlacement(coil3rm,
1384 pole8PV =
new G4PVPlacement(coil4rm,
1393 allPhysicalVolumes.insert(pole5PV);
1394 allPhysicalVolumes.insert(pole6PV);
1395 allPhysicalVolumes.insert(pole7PV);
1396 allPhysicalVolumes.insert(pole8PV);
1400 collar =
new G4Tubs(name+
"_collar_solid",
1406 allSolids.insert(collar);
1410 if (collarInnerRadius == collarInnerRadiusF)
1413 collars =
new G4UnionSolid(name +
"_collars_solid",
1421 G4VSolid* collar2 =
new G4Tubs(name+
"_collar2_solid",
1427 allSolids.insert(collar2);
1428 collars =
new G4UnionSolid(name +
"_collars_solid",
1434 allSolids.insert(collars);
1437 collarsLV =
new G4LogicalVolume(collars,
1438 stainlesssteel_316LN_2K,
1439 name+
"_collars_lv");
1440 collarsLV->SetVisAttributes(collarVisAtt);
1441 allLogicalVolumes.insert(collarsLV);
1443 G4PVPlacement* collarPV =
new G4PVPlacement(
nullptr,
1451 allPhysicalVolumes.insert(collarPV);
1455 G4VSolid* collarSubtractionCylinder =
new G4Tubs(name+
"_collar_subtraction_solid",
1462 G4VSolid* collarSubtractionCylinders =
new G4UnionSolid(name +
"_collar_subtraction_cylinders",
1463 collarSubtractionCylinder,
1464 collarSubtractionCylinder,
1469 G4VSolid* yokeCylinder =
new G4Tubs(name+
"_yoke_cylinder_solid",
1474 CLHEP::twopi * CLHEP::rad);
1476 yokeSolid =
new G4SubtractionSolid(name+
"_yoke_solid",
1478 collarSubtractionCylinders,
1481 allSolids.insert(collarSubtractionCylinder);
1482 allSolids.insert(collarSubtractionCylinders);
1483 allSolids.insert(yokeCylinder);
1485 stainlesssteel_304L_2K,
1489 G4VisAttributes* LHCred =
new G4VisAttributes(*
BDSColours::Instance()->GetColour(
"LHCyokered"));
1491 allVisAttributes.insert(LHCred);
1492 yokeLV->SetVisAttributes(LHCred);
1494 allLogicalVolumes.insert(yokeLV);
1497 yokePV =
new G4PVPlacement(
nullptr,
1498 G4ThreeVector(0,0,0),
1505 allPhysicalVolumes.insert(yokePV);
1520 stainlesssteel_316LN_2K);
1523 G4PVPlacement* secondBPPV =
new G4PVPlacement(
nullptr,
1526 name +
"_second_beampipe_pv",
1531 allPhysicalVolumes.insert(secondBPPV);
1538 for (
auto lv : allLogicalVolumes)
1545 G4double containerRadius = yokeOuterRadius;
1548 -containerRadius,containerRadius,
1549 -length*0.5,length*0.5);