1 #include "DD4hep/DetFactoryHelper.h" 2 #include "DD4hep/Printout.h" 9 #include "Math/AxisAngle.h" 10 #include "CLHEP/Geometry/Point3D.h" 11 #include "CLHEP/Geometry/Vector3D.h" 12 #include "CLHEP/Geometry/Transform3D.h" 25 using Pt3D = HepGeom::Point3D<double>;
26 using Vec3 = CLHEP::Hep3Vector;
27 using Rota = CLHEP::HepRotation;
28 using Ro3D = HepGeom::Rotate3D;
29 using Tl3D = HepGeom::Translate3D;
30 using Tf3D = HepGeom::Transform3D;
31 using RoX3D = HepGeom::RotateX3D;
32 using RoZ3D = HepGeom::RotateZ3D;
63 unsigned int nPerHalf;
128 unsigned int nCryTypes;
129 unsigned int nCryPerAlvEta;
193 struct InnerLayerVolume {
215 double pTMLengthHalf;
216 double pTMHeightHalf;
223 double fanOutWidthHalf;
224 double fanOutLengthHalf;
225 double fanOutHeightHalf;
231 double diffLengthHalf;
235 double bndlLengthHalf;
239 double fEMLengthHalf;
240 double fEMHeightHalf;
245 struct AlveolarWedge {
255 unsigned int nFawPerSupm;
306 double edgeSlotHeight;
307 double edgeSlotWidth;
371 struct BackCoolTank {
380 string backBracketName;
381 double backBracketHeight;
382 string backBracketMat;
388 unsigned int mbCoolTubeNum;
426 double envHeightHalf;
427 double envLengthHalf;
432 double blkLengthHalf;
447 const Rotation3D& myrot(
cms::DDNamespace& ns,
const string& nam,
const CLHEP::HepRotation&
r) {
448 ns.
addRotation(nam, Rotation3D(
r.xx(),
r.xy(),
r.xz(),
r.yx(),
r.yy(),
r.yz(),
r.zx(),
r.zy(),
r.zz()));
461 nam,
t.dz(),
t.theta(),
t.phi(),
t.h1(),
t.bl1(),
t.tl1(),
t.alp1(),
t.h2(),
t.bl2(),
t.tl2(),
t.alp2());
464 string_view mynamespace(string_view
input) {
466 auto trim_pos =
v.find(
':');
467 if (trim_pos !=
v.npos)
468 v.remove_suffix(
v.size() - (trim_pos + 1));
479 string myns{mynamespace(
args.parentName()).
data(), mynamespace(
args.parentName()).
size()};
484 bar.name = myns +
args.str(
"BarName");
485 bar.mat =
args.str(
"BarMat");
486 bar.vecZPts =
args.vecDble(
"BarZPts");
487 bar.vecRMin =
args.vecDble(
"BarRMin");
488 bar.vecRMax =
args.vecDble(
"BarRMax");
489 bar.vecTran =
args.vecDble(
"BarTran");
490 bar.vecRota =
args.vecDble(
"BarRota");
491 bar.vecRota2 =
args.vecDble(
"BarRota2");
492 bar.vecRota3 =
args.vecDble(
"BarRota3");
493 bar.phiLo =
args.dble(
"BarPhiLo");
494 bar.phiHi =
args.dble(
"BarPhiHi");
495 bar.here =
args.dble(
"BarHere");
500 spm.mat =
args.str(
"SpmMat");
501 spm.vecZPts =
args.vecDble(
"SpmZPts");
502 spm.vecRMin =
args.vecDble(
"SpmRMin");
503 spm.vecRMax =
args.vecDble(
"SpmRMax");
504 spm.vecTran =
args.vecDble(
"SpmTran");
505 spm.vecRota =
args.vecDble(
"SpmRota");
506 spm.vecBTran =
args.vecDble(
"SpmBTran");
507 spm.vecBRota =
args.vecDble(
"SpmBRota");
508 spm.nPerHalf =
args.integer(
"SpmNPerHalf");
509 spm.lowPhi =
args.dble(
"SpmLowPhi");
510 spm.delPhi =
args.dble(
"SpmDelPhi");
511 spm.phiOff =
args.dble(
"SpmPhiOff");
512 spm.vecHere =
args.vecDble(
"SpmHere");
514 spm.cutThick =
args.dble(
"SpmCutThick");
515 spm.cutShow =
args.value<
int>(
"SpmCutShow");
516 spm.vecCutTM =
args.vecDble(
"SpmCutTM");
517 spm.vecCutTP =
args.vecDble(
"SpmCutTP");
518 spm.cutRM =
args.dble(
"SpmCutRM");
519 spm.cutRP =
args.dble(
"SpmCutRP");
520 spm.expThick =
args.dble(
"SpmExpThick");
521 spm.expWide =
args.dble(
"SpmExpWide");
522 spm.expYOff =
args.dble(
"SpmExpYOff");
523 spm.sideName = myns +
args.str(
"SpmSideName");
524 spm.sideMat =
args.str(
"SpmSideMat");
525 spm.sideHigh =
args.dble(
"SpmSideHigh");
526 spm.sideThick =
args.dble(
"SpmSideThick");
527 spm.sideYOffM =
args.dble(
"SpmSideYOffM");
528 spm.sideYOffP =
args.dble(
"SpmSideYOffP");
531 cry.nomCryDimAF =
args.dble(
"NomCryDimAF");
532 cry.nomCryDimLZ =
args.dble(
"NomCryDimLZ");
533 cry.vecNomCryDimBF =
args.vecDble(
"NomCryDimBF");
534 cry.vecNomCryDimCF =
args.vecDble(
"NomCryDimCF");
535 cry.vecNomCryDimAR =
args.vecDble(
"NomCryDimAR");
536 cry.vecNomCryDimBR =
args.vecDble(
"NomCryDimBR");
537 cry.vecNomCryDimCR =
args.vecDble(
"NomCryDimCR");
539 cry.underAF =
args.dble(
"UnderAF");
540 cry.underLZ =
args.dble(
"UnderLZ");
541 cry.underBF =
args.dble(
"UnderBF");
542 cry.underCF =
args.dble(
"UnderCF");
543 cry.underAR =
args.dble(
"UnderAR");
544 cry.underBR =
args.dble(
"UnderBR");
545 cry.underCR =
args.dble(
"UnderCR");
548 alv.wallThAlv =
args.dble(
"WallThAlv");
549 alv.wrapThAlv =
args.dble(
"WrapThAlv");
550 alv.clrThAlv =
args.dble(
"ClrThAlv");
551 alv.vecGapAlvEta =
args.vecDble(
"GapAlvEta");
553 alv.wallFrAlv =
args.dble(
"WallFrAlv");
554 alv.wrapFrAlv =
args.dble(
"WrapFrAlv");
555 alv.clrFrAlv =
args.dble(
"ClrFrAlv");
557 alv.wallReAlv =
args.dble(
"WallReAlv");
558 alv.wrapReAlv =
args.dble(
"WrapReAlv");
559 alv.clrReAlv =
args.dble(
"ClrReAlv");
561 alv.nCryTypes =
args.integer(
"NCryTypes");
562 alv.nCryPerAlvEta =
args.integer(
"NCryPerAlvEta");
569 cry.mat =
args.str(
"CryMat");
570 cry.clrMat =
args.str(
"ClrMat");
571 cry.wrapMat =
args.str(
"WrapMat");
572 cry.wallMat =
args.str(
"WallMat");
576 cap.here =
args.dble(
"CapHere");
578 cap.xSizeHalf = 0.5 *
args.dble(
"CapXSize");
579 cap.ySizeHalf = 0.5 *
args.dble(
"CapYSize");
580 cap.thickHalf = 0.5 *
args.dble(
"CapThick");
584 cer.mat =
args.str(
"CerMat");
585 cer.xSizeHalf = 0.5 *
args.dble(
"CerXSize");
586 cer.ySizeHalf = 0.5 *
args.dble(
"CerYSize");
587 cer.thickHalf = 0.5 *
args.dble(
"CerThick");
591 bSi.mat =
args.str(
"BSiMat");
592 bSi.xSizeHalf = 0.5 *
args.dble(
"BSiXSize");
593 bSi.ySizeHalf = 0.5 *
args.dble(
"BSiYSize");
594 bSi.thickHalf = 0.5 *
args.dble(
"BSiThick");
598 apd.mat =
args.str(
"APDMat");
599 apd.side =
args.dble(
"APDSide");
600 apd.thick =
args.dble(
"APDThick");
601 apd.z =
args.dble(
"APDZ");
602 apd.x1 =
args.dble(
"APDX1");
603 apd.x2 =
args.dble(
"APDX2");
606 apd.atjMat =
args.str(
"ATJMat");
607 apd.atjThickHalf = 0.5 *
args.dble(
"ATJThick");
610 apd.sglMat =
args.str(
"SGLMat");
611 apd.sglThick =
args.dble(
"SGLThick");
614 apd.aglMat =
args.str(
"AGLMat");
615 apd.aglThick =
args.dble(
"AGLThick");
618 apd.andMat =
args.str(
"ANDMat");
619 apd.andThick =
args.dble(
"ANDThick");
622 web.here =
args.dble(
"WebHere");
625 web.plMat =
args.str(
"WebPlMat");
626 web.clrMat =
args.str(
"WebClrMat");
627 web.vecWebPlTh =
args.vecDble(
"WebPlTh");
628 web.vecWebClrTh =
args.vecDble(
"WebClrTh");
629 web.vecWebLength =
args.vecDble(
"WebLength");
631 InnerLayerVolume ily;
632 ily.here =
args.dble(
"IlyHere");
633 ily.name = myns +
args.str(
"IlyName");
634 ily.phiLow =
args.dble(
"IlyPhiLow");
635 ily.delPhi =
args.dble(
"IlyDelPhi");
636 ily.vecIlyMat =
args.vecStr(
"IlyMat");
637 ily.vecIlyThick =
args.vecDble(
"IlyThick");
639 ily.pipeName = myns +
args.str(
"IlyPipeName");
640 ily.pipeHere =
args.dble(
"IlyPipeHere");
641 ily.pipeMat =
args.str(
"IlyPipeMat");
642 ily.pipeODHalf = 0.5 *
args.dble(
"IlyPipeOD");
643 ily.pipeID =
args.dble(
"IlyPipeID");
644 ily.vecIlyPipeLengthHalf =
args.vecDble(
"IlyPipeLength");
646 ily.vecIlyPipeLengthHalf.end(),
647 ily.vecIlyPipeLengthHalf.begin(),
648 [](
double length) ->
double {
return 0.5 * length; });
650 ily.vecIlyPipeType =
args.vecDble(
"IlyPipeType");
651 ily.vecIlyPipePhi =
args.vecDble(
"IlyPipePhi");
652 ily.vecIlyPipeZ =
args.vecDble(
"IlyPipeZ");
654 ily.pTMName = myns +
args.str(
"IlyPTMName");
655 ily.pTMHere =
args.dble(
"IlyPTMHere");
656 ily.pTMMat =
args.str(
"IlyPTMMat");
657 ily.pTMWidthHalf = 0.5 *
args.dble(
"IlyPTMWidth");
658 ily.pTMLengthHalf = 0.5 *
args.dble(
"IlyPTMLength");
659 ily.pTMHeightHalf = 0.5 *
args.dble(
"IlyPTMHeight");
660 ily.vecIlyPTMZ =
args.vecDble(
"IlyPTMZ");
661 ily.vecIlyPTMPhi =
args.vecDble(
"IlyPTMPhi");
663 ily.fanOutName = myns +
args.str(
"IlyFanOutName");
664 ily.fanOutHere =
args.dble(
"IlyFanOutHere");
665 ily.fanOutMat =
args.str(
"IlyFanOutMat");
666 ily.fanOutWidthHalf = 0.5 *
args.dble(
"IlyFanOutWidth");
667 ily.fanOutLengthHalf = 0.5 *
args.dble(
"IlyFanOutLength");
668 ily.fanOutHeightHalf = 0.5 *
args.dble(
"IlyFanOutHeight");
669 ily.vecIlyFanOutZ =
args.vecDble(
"IlyFanOutZ");
670 ily.vecIlyFanOutPhi =
args.vecDble(
"IlyFanOutPhi");
671 ily.diffName = myns +
args.str(
"IlyDiffName");
672 ily.diffMat =
args.str(
"IlyDiffMat");
673 ily.diffOff =
args.dble(
"IlyDiffOff");
674 ily.diffLengthHalf = 0.5 *
args.dble(
"IlyDiffLength");
675 ily.bndlName = myns +
args.str(
"IlyBndlName");
676 ily.bndlMat =
args.str(
"IlyBndlMat");
677 ily.bndlOff =
args.dble(
"IlyBndlOff");
678 ily.bndlLengthHalf = 0.5 *
args.dble(
"IlyBndlLength");
679 ily.fEMName = myns +
args.str(
"IlyFEMName");
680 ily.fEMMat =
args.str(
"IlyFEMMat");
681 ily.fEMWidthHalf = 0.5 *
args.dble(
"IlyFEMWidth");
682 ily.fEMLengthHalf = 0.5 *
args.dble(
"IlyFEMLength");
683 ily.fEMHeightHalf = 0.5 *
args.dble(
"IlyFEMHeight");
684 ily.vecIlyFEMZ =
args.vecDble(
"IlyFEMZ");
685 ily.vecIlyFEMPhi =
args.vecDble(
"IlyFEMPhi");
687 AlveolarWedge alvWedge;
688 alvWedge.hawRName = myns +
args.str(
"HawRName");
689 alvWedge.fawName = myns +
args.str(
"FawName");
690 alvWedge.fawHere =
args.dble(
"FawHere");
691 alvWedge.hawRHBIG =
args.dble(
"HawRHBIG");
692 alvWedge.hawRhsml =
args.dble(
"HawRhsml");
693 alvWedge.hawRCutY =
args.dble(
"HawRCutY");
694 alvWedge.hawRCutZ =
args.dble(
"HawRCutZ");
695 alvWedge.hawRCutDelY =
args.dble(
"HawRCutDelY");
696 alvWedge.hawYOffCry =
args.dble(
"HawYOffCry");
698 alvWedge.nFawPerSupm =
args.integer(
"NFawPerSupm");
699 alvWedge.fawPhiOff =
args.dble(
"FawPhiOff");
700 alvWedge.fawDelPhi =
args.dble(
"FawDelPhi");
701 alvWedge.fawPhiRot =
args.dble(
"FawPhiRot");
702 alvWedge.fawRadOff =
args.dble(
"FawRadOff");
706 grid.name = myns +
args.str(
"GridName");
708 grid.thick =
args.dble(
"GridThick");
711 back.here =
args.dble(
"BackHere");
712 back.xOff =
args.dble(
"BackXOff");
713 back.yOff =
args.dble(
"BackYOff");
714 back.sideName = myns +
args.str(
"BackSideName");
715 back.sideHere =
args.dble(
"BackSideHere");
716 back.sideLength =
args.dble(
"BackSideLength");
717 back.sideHeight =
args.dble(
"BackSideHeight");
718 back.sideWidth =
args.dble(
"BackSideWidth");
719 back.sideYOff1 =
args.dble(
"BackSideYOff1");
720 back.sideYOff2 =
args.dble(
"BackSideYOff2");
721 back.sideAngle =
args.dble(
"BackSideAngle");
722 back.sideMat =
args.str(
"BackSideMat");
723 back.plateName = myns +
args.str(
"BackPlateName");
724 back.plateHere =
args.dble(
"BackPlateHere");
725 back.plateLength =
args.dble(
"BackPlateLength");
726 back.plateThick =
args.dble(
"BackPlateThick");
727 back.plateWidth =
args.dble(
"BackPlateWidth");
728 back.plateMat =
args.str(
"BackPlateMat");
729 back.plate2Name = myns +
args.str(
"BackPlate2Name");
730 back.plate2Thick =
args.dble(
"BackPlate2Thick");
731 back.plate2Mat =
args.str(
"BackPlate2Mat");
734 grille.name = myns +
args.str(
"GrilleName");
735 grille.here =
args.dble(
"GrilleHere");
736 grille.thick =
args.dble(
"GrilleThick");
737 grille.width =
args.dble(
"GrilleWidth");
738 grille.zSpace =
args.dble(
"GrilleZSpace");
739 grille.mat =
args.str(
"GrilleMat");
740 grille.vecHeight =
args.vecDble(
"GrilleHeight");
741 grille.vecZOff =
args.vecDble(
"GrilleZOff");
743 grille.edgeSlotName = myns +
args.str(
"GrEdgeSlotName");
744 grille.edgeSlotMat =
args.str(
"GrEdgeSlotMat");
745 grille.edgeSlotHere =
args.dble(
"GrEdgeSlotHere");
746 grille.edgeSlotHeight =
args.dble(
"GrEdgeSlotHeight");
747 grille.edgeSlotWidth =
args.dble(
"GrEdgeSlotWidth");
748 grille.midSlotName = myns +
args.str(
"GrMidSlotName");
749 grille.midSlotMat =
args.str(
"GrMidSlotMat");
750 grille.midSlotHere =
args.dble(
"GrMidSlotHere");
751 grille.midSlotWidth =
args.dble(
"GrMidSlotWidth");
752 grille.midSlotXOff =
args.dble(
"GrMidSlotXOff");
753 grille.vecMidSlotHeight =
args.vecDble(
"GrMidSlotHeight");
756 backPipe.here =
args.dble(
"BackPipeHere");
757 backPipe.name = myns +
args.str(
"BackPipeName");
758 backPipe.vecDiam =
args.vecDble(
"BackPipeDiam");
759 backPipe.vecThick =
args.vecDble(
"BackPipeThick");
760 backPipe.mat =
args.str(
"BackPipeMat");
761 backPipe.waterMat =
args.str(
"BackPipeWaterMat");
763 BackCooling backCool;
764 backCool.here =
args.dble(
"BackCoolHere");
765 backCool.vecName =
args.vecStr(
"BackCoolName");
767 backCool.vecName.end(),
768 backCool.vecName.begin(),
770 backCool.barHere =
args.dble(
"BackCoolBarHere");
771 backCool.barWidth =
args.dble(
"BackCoolBarWidth");
772 backCool.barHeight =
args.dble(
"BackCoolBarHeight");
773 backCool.mat =
args.str(
"BackCoolMat");
774 backCool.barName = myns +
args.str(
"BackCoolBarName");
775 backCool.barThick =
args.dble(
"BackCoolBarThick");
776 backCool.barMat =
args.str(
"BackCoolBarMat");
777 backCool.barSSName = myns +
args.str(
"BackCoolBarSSName");
778 backCool.barSSThick =
args.dble(
"BackCoolBarSSThick");
779 backCool.barSSMat =
args.str(
"BackCoolBarSSMat");
780 backCool.barWaName = myns +
args.str(
"BackCoolBarWaName");
781 backCool.barWaThick =
args.dble(
"BackCoolBarWaThick");
782 backCool.barWaMat =
args.str(
"BackCoolBarWaMat");
783 backCool.vFEHere =
args.dble(
"BackCoolVFEHere");
784 backCool.vFEName = myns +
args.str(
"BackCoolVFEName");
785 backCool.vFEMat =
args.str(
"BackCoolVFEMat");
786 backCool.backVFEName =
args.str(
"BackVFEName");
787 backCool.backVFEMat =
args.str(
"BackVFEMat");
788 backCool.vecBackVFELyrThick =
args.vecDble(
"BackVFELyrThick");
789 backCool.vecBackVFELyrName =
args.vecStr(
"BackVFELyrName");
791 backCool.vecBackVFELyrName.end(),
792 backCool.vecBackVFELyrName.begin(),
794 backCool.vecBackVFELyrMat =
args.vecStr(
"BackVFELyrMat");
795 backCool.vecBackCoolNSec =
args.vecDble(
"BackCoolNSec");
796 backCool.vecBackCoolSecSep =
args.vecDble(
"BackCoolSecSep");
797 backCool.vecBackCoolNPerSec =
args.vecDble(
"BackCoolNPerSec");
800 backMisc.here =
args.dble(
"BackMiscHere");
801 backMisc.vecThick =
args.vecDble(
"BackMiscThick");
802 backMisc.vecName =
args.vecStr(
"BackMiscName");
804 backMisc.vecName.end(),
805 backMisc.vecName.begin(),
807 backMisc.vecMat =
args.vecStr(
"BackMiscMat");
808 backMisc.backCBStdSep =
args.dble(
"BackCBStdSep");
810 PatchPanel patchPanel;
811 patchPanel.here =
args.dble(
"PatchPanelHere");
812 patchPanel.vecThick =
args.vecDble(
"PatchPanelThick");
813 patchPanel.vecNames =
args.vecStr(
"PatchPanelNames");
815 patchPanel.vecNames.end(),
816 patchPanel.vecNames.begin(),
819 patchPanel.vecMat =
args.vecStr(
"PatchPanelMat");
820 patchPanel.name = myns +
args.str(
"PatchPanelName");
822 BackCoolTank backCoolTank;
823 backCoolTank.here =
args.dble(
"BackCoolTankHere");
824 backCoolTank.name = myns +
args.str(
"BackCoolTankName");
825 backCoolTank.width =
args.dble(
"BackCoolTankWidth");
826 backCoolTank.thick =
args.dble(
"BackCoolTankThick");
827 backCoolTank.mat =
args.str(
"BackCoolTankMat");
828 backCoolTank.waName = myns +
args.str(
"BackCoolTankWaName");
829 backCoolTank.waWidth =
args.dble(
"BackCoolTankWaWidth");
830 backCoolTank.waMat =
args.str(
"BackCoolTankWaMat");
831 backCoolTank.backBracketName = myns +
args.str(
"BackBracketName");
832 backCoolTank.backBracketHeight =
args.dble(
"BackBracketHeight");
833 backCoolTank.backBracketMat =
args.str(
"BackBracketMat");
835 DryAirTube dryAirTube;
836 dryAirTube.here =
args.dble(
"DryAirTubeHere");
837 dryAirTube.name =
args.str(
"DryAirTubeName");
838 dryAirTube.mbCoolTubeNum =
args.integer(
"MBCoolTubeNum");
839 dryAirTube.innDiam =
args.dble(
"DryAirTubeInnDiam");
840 dryAirTube.outDiam =
args.dble(
"DryAirTubeOutDiam");
841 dryAirTube.mat =
args.str(
"DryAirTubeMat");
843 MBCoolTube mbCoolTube;
844 mbCoolTube.here =
args.dble(
"MBCoolTubeHere");
845 mbCoolTube.name = myns +
args.str(
"MBCoolTubeName");
846 mbCoolTube.innDiam =
args.dble(
"MBCoolTubeInnDiam");
847 mbCoolTube.outDiam =
args.dble(
"MBCoolTubeOutDiam");
848 mbCoolTube.mat =
args.str(
"MBCoolTubeMat");
851 mbManif.here =
args.dble(
"MBManifHere");
852 mbManif.name = myns +
args.str(
"MBManifName");
853 mbManif.innDiam =
args.dble(
"MBManifInnDiam");
854 mbManif.outDiam =
args.dble(
"MBManifOutDiam");
855 mbManif.mat =
args.str(
"MBManifMat");
858 mbLyr.here =
args.dble(
"MBLyrHere");
859 mbLyr.vecMBLyrThick =
args.vecDble(
"MBLyrThick");
860 mbLyr.vecMBLyrName =
args.vecStr(
"MBLyrName");
862 mbLyr.vecMBLyrName.end(),
863 mbLyr.vecMBLyrName.begin(),
865 mbLyr.vecMBLyrMat =
args.vecStr(
"MBLyrMat");
868 pincer.rodHere =
args.dble(
"PincerRodHere");
869 pincer.rodName = myns +
args.str(
"PincerRodName");
870 pincer.rodMat =
args.str(
"PincerRodMat");
871 pincer.vecRodAzimuth =
args.vecDble(
"PincerRodAzimuth");
872 pincer.envName = myns +
args.str(
"PincerEnvName");
873 pincer.envMat =
args.str(
"PincerEnvMat");
874 pincer.envWidthHalf = 0.5 *
args.dble(
"PincerEnvWidth");
875 pincer.envHeightHalf = 0.5 *
args.dble(
"PincerEnvHeight");
876 pincer.envLengthHalf = 0.5 *
args.dble(
"PincerEnvLength");
877 pincer.vecEnvZOff =
args.vecDble(
"PincerEnvZOff");
878 pincer.blkName = myns +
args.str(
"PincerBlkName");
879 pincer.blkMat =
args.str(
"PincerBlkMat");
880 pincer.blkLengthHalf = 0.5 *
args.dble(
"PincerBlkLength");
881 pincer.shim1Name = myns +
args.str(
"PincerShim1Name");
882 pincer.shimHeight =
args.dble(
"PincerShimHeight");
883 pincer.shim2Name = myns +
args.str(
"PincerShim2Name");
884 pincer.shimMat =
args.str(
"PincerShimMat");
885 pincer.shim1Width =
args.dble(
"PincerShim1Width");
886 pincer.shim2Width =
args.dble(
"PincerShim2Width");
887 pincer.cutName = myns +
args.str(
"PincerCutName");
888 pincer.cutMat =
args.str(
"PincerCutMat");
889 pincer.cutWidth =
args.dble(
"PincerCutWidth");
890 pincer.cutHeight =
args.dble(
"PincerCutHeight");
894 const unsigned int copyOne(1);
895 const unsigned int copyTwo(2);
897 Solid barSolid = Polycone(bar.name, bar.phiLo, (bar.phiHi - bar.phiLo), bar.vecRMin, bar.vecRMax, bar.vecZPts);
900 <<
convertRadToDeg(bar.phiHi) <<
" with " << bar.vecZPts.size() <<
" points";
901 for (
unsigned int k = 0;
k < bar.vecZPts.size(); ++
k)
905 Position tran(bar.vecTran[0], bar.vecTran[1], bar.vecTran[2]);
908 Rota(
Vec3(bar.vecRota3[0], bar.vecRota3[1], bar.vecRota3[2]), bar.vecRota3[3]) *
909 Rota(
Vec3(bar.vecRota2[0], bar.vecRota2[1], bar.vecRota2[2]), bar.vecRota2[3]) *
910 Rota(
Vec3(bar.vecRota[0], bar.vecRota[1], bar.vecRota[2]), bar.vecRota[3]));
912 parentVolume.placeVolume(barVolume, copyOne, Transform3D(
rotation, tran));
914 edm::LogVerbatim(
"EBGeomX") << barVolume.name() <<
":" << copyOne <<
" positioned in " << parentVolume.name()
922 const string spmcut1ddname((0 != spm.cutShow) ? spm.name : (spm.name +
"CUT1"));
926 <<
convertRadToDeg(spm.lowPhi + spm.delPhi) <<
" with " << spm.vecZPts.size()
928 for (
unsigned int k = 0;
k < spm.vecZPts.size(); ++
k)
933 const unsigned int indx(0.5 * spm.vecRMax.size());
936 array<double, 3> cutBoxParms{{1.05 * (spm.vecRMax[indx] - spm.vecRMin[indx]) * 0.5,
938 fabs(spm.vecZPts.back() - spm.vecZPts.front()) * 0.5 + 1.0 * dd4hep::mm}};
941 array<double, 3> sideParms{{0.5 * spm.sideHigh, 0.5 * spm.sideThick, 0.5 * fabs(spm.vecZPts[1] - spm.vecZPts[0])}};
942 Solid sideSolid = Box(spm.sideName, sideParms[0], sideParms[1], sideParms[2]);
951 for (
unsigned int icopy(1); icopy <= 2; ++icopy) {
952 const std::vector<double>& tvec(1 == icopy ? spm.vecCutTM : spm.vecCutTP);
953 double rang(1 == icopy ? spm.cutRM : spm.cutRP);
955 const Position tr(tvec[0], tvec[1], tvec[2]);
957 const double ang(1 == icopy ? spm.lowPhi : spm.lowPhi + spm.delPhi);
960 0.5 * (spm.vecRMax[indx] + spm.vecRMin[indx]), 0, 0.5 * (spm.vecZPts.front() + spm.vecZPts.back()));
962 const Tl3D trSide(tvec[0],
963 tvec[1] + (1 == icopy ? 1. : -1.) * (cutBoxParms[1] + sideParms[1]) +
964 (1 == icopy ? spm.sideYOffM : spm.sideYOffP),
966 const RoZ3D roSide(rang);
967 const Tf3D sideRot(
RoZ3D(1 == icopy ? spm.lowPhi : spm.lowPhi + spm.delPhi) *
968 Tl3D(spm.vecRMin.front() + sideParms[0], 0, spm.vecZPts.front() + sideParms[2]) * trSide *
971 Rotation3D sideddrot(myrot(ns, spm.sideName +
std::to_string(icopy), sideRot.getRotation()));
972 const Position sideddtra(sideRot.getTranslation());
973 1 == icopy ? sideddtra1 = sideddtra : sideddtra2 = sideddtra;
980 edm::LogVerbatim(
"EBGeomX") << sideLog.name() <<
":1 positioned in " << spm.name <<
" at (" 992 const double dphi(360._deg / (1. * spm.nPerHalf));
993 for (
unsigned int iphi(0);
iphi < 2 * spm.nPerHalf; ++
iphi) {
994 const double phi(
iphi * dphi + spm.phiOff);
1000 Ro3D(spm.vecBRota[3],
Vec3(spm.vecBRota[0], spm.vecBRota[1], spm.vecBRota[2])) *
1001 Tl3D(
Vec3(spm.vecBTran[0], spm.vecBTran[1], spm.vecBTran[2])));
1006 const unsigned int offr(4 *
iphi);
1007 const unsigned int offt(3 *
iphi);
1009 const Ro3D r1(spm.vecRota[offr + 3],
Vec3(spm.vecRota[offr + 0], spm.vecRota[offr + 1], spm.vecRota[offr + 2]));
1011 const Tf3D rotaExtra(
r1 *
Tl3D(
Vec3(spm.vecTran[offt + 0], spm.vecTran[offt + 1], spm.vecTran[offt + 2])));
1013 const Tf3D both(rotaExtra * rotaBase);
1017 if (spm.vecHere[
iphi] != 0) {
1019 Position myTran(
both.getTranslation().x(),
both.getTranslation().y(),
both.getTranslation().z());
1020 barVolume.placeVolume(ns.
assembly(spm.name),
iphi + 1, Transform3D(rota, myTran));
1025 <<
") with rotation";
1032 const double ilyLengthHalf(0.5 * (spm.vecZPts[1] - spm.vecZPts[0]));
1033 double ilyRMin(spm.vecRMin[0]);
1035 for (
unsigned int ilyx(0); ilyx != ily.vecIlyThick.size(); ++ilyx) {
1036 ilyThick += ily.vecIlyThick[ilyx];
1038 Solid ilySolid = Tube(ily.name,
1043 ily.phiLow + ily.delPhi);
1050 ns.
assembly(spm.name).placeVolume(ilyLog, copyOne,
Position(0, 0, ilyLengthHalf));
1052 edm::LogVerbatim(
"EBGeomX") << ilyLog.name() <<
":" << copyOne <<
" positioned in " << ns.
assembly(spm.name).name()
1053 <<
" at (0,0," <<
cms::convert2mm(ilyLengthHalf) <<
") with no rotation";
1056 if (0 != ily.pipeHere) {
1057 for (
unsigned int iPipeType(0); iPipeType != ily.vecIlyPipeLengthHalf.size(); ++iPipeType) {
1058 string pName(ily.pipeName +
"_" +
std::to_string(iPipeType + 1));
1060 Solid ilyPipeSolid = Tube(pName,
1063 ily.vecIlyPipeLengthHalf[iPipeType],
1070 ilyPipeLog[iPipeType] =
Volume(pName, ilyPipeSolid, ns.
material(ily.pipeMat));
1072 string pWaName(ily.pipeName +
"Wa_" +
std::to_string(iPipeType + 1));
1073 Solid ilyPipeWaSolid = Tube(pWaName,
1076 ily.vecIlyPipeLengthHalf[iPipeType],
1084 ilyPipeLog[iPipeType].placeVolume(ilyPipeWaLog, copyOne);
1086 edm::LogVerbatim(
"EBGeomX") << ilyPipeWaLog.name() <<
":" << copyOne <<
" positioned in " 1087 << ilyPipeLog[iPipeType].name() <<
" at (0,0,0) with no rotation";
1092 Solid ilyPTMSolid = Box(ily.pTMName, ily.pTMHeightHalf, ily.pTMWidthHalf, ily.pTMLengthHalf);
1099 Solid ilyFanOutSolid = Box(ily.fanOutName, ily.fanOutHeightHalf, ily.fanOutWidthHalf, ily.fanOutLengthHalf);
1106 Solid ilyFEMSolid = Box(ily.fEMName, ily.fEMHeightHalf, ily.fEMWidthHalf, ily.fEMLengthHalf);
1113 Solid ilyDiffSolid = Box(ily.diffName, ily.fanOutHeightHalf, ily.fanOutWidthHalf, ily.diffLengthHalf);
1120 Solid ilyBndlSolid = Box(ily.bndlName, ily.fanOutHeightHalf, ily.fanOutWidthHalf, ily.bndlLengthHalf);
1127 ilyFanOutLog.placeVolume(
1128 ilyDiffLog, copyOne,
Position(0, 0, -ily.fanOutLengthHalf + ily.diffLengthHalf + ily.diffOff));
1130 edm::LogVerbatim(
"EBGeomX") << ilyDiffLog.name() <<
":" << copyOne <<
" positioned in " << ilyFanOutLog.name()
1132 <<
cms::convert2mm(-ily.fanOutLengthHalf + ily.diffLengthHalf + ily.diffOff)
1133 <<
") with no rotation";
1135 ilyFanOutLog.placeVolume(
1136 ilyBndlLog, copyOne,
Position(0, 0, -ily.fanOutLengthHalf + ily.bndlLengthHalf + ily.bndlOff));
1138 edm::LogVerbatim(
"EBGeomX") << ilyBndlLog.name() <<
":" << copyOne <<
" positioned in " << ilyFanOutLog.name()
1140 <<
cms::convert2mm(-ily.fanOutLengthHalf + ily.bndlLengthHalf + ily.bndlOff)
1141 <<
") with no rotation";
1145 for (
unsigned int iily(0); iily != ily.vecIlyThick.size(); ++iily) {
1146 const double ilyRMax(ilyRMin + ily.vecIlyThick[iily]);
1148 Solid xilySolid = Tube(xilyName, ilyRMin, ilyRMax, ilyLengthHalf, ily.phiLow, ily.phiLow + ily.delPhi);
1155 if (0 != ily.here) {
1156 ilyLog.placeVolume(xilyLog, copyOne);
1158 edm::LogVerbatim(
"EBGeomX") << xilyLog.name() <<
":" << copyOne <<
" positioned in " << ilyLog.name()
1159 <<
" at (0,0,0) with no rotation";
1161 unsigned int copyNum[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1163 if (10 * dd4hep::mm < ily.vecIlyThick[iily] && ily.vecIlyThick.size() != (iily + 1) && 0 != ily.pipeHere) {
1164 if (0 != ily.pTMHere) {
1165 unsigned int ptmCopy(0);
1166 for (
unsigned int ilyPTM(0); ilyPTM != ily.vecIlyPTMZ.size(); ++ilyPTM) {
1167 const double radius(ilyRMax - 1 * dd4hep::mm - ily.pTMHeightHalf);
1168 const double phi(ily.vecIlyPTMPhi[ilyPTM]);
1172 xilyLog.placeVolume(
1175 Transform3D(RotationZ(phi),
Position(
xx,
yy, ily.vecIlyPTMZ[ilyPTM] - ilyLengthHalf)));
1178 << ilyPTMLog.name() <<
":" << ptmCopy <<
" positioned in " << xilyLog.name() <<
" at (" 1180 <<
cms::convert2mm(ily.vecIlyPTMZ[ilyPTM] - ilyLengthHalf) <<
") with rotation";
1184 if (0 != ily.fanOutHere) {
1185 unsigned int fanOutCopy(0);
1186 for (
unsigned int ilyFO(0); ilyFO != ily.vecIlyFanOutZ.size(); ++ilyFO) {
1187 const double radius(ilyRMax - 1 * dd4hep::mm - ily.fanOutHeightHalf);
1188 const double phi(ily.vecIlyFanOutPhi[ilyFO]);
1192 xilyLog.placeVolume(ilyFanOutLog,
1194 Transform3D(RotationZ(phi) * RotationY(180._deg),
1195 Position(
xx,
yy, ily.vecIlyFanOutZ[ilyFO] - ilyLengthHalf)));
1198 << ilyFanOutLog.name() <<
":" << fanOutCopy <<
" positioned in " << xilyLog.name() <<
" at (" 1200 <<
cms::convert2mm(ily.vecIlyFanOutZ[ilyFO] - ilyLengthHalf) <<
") with rotation";
1203 unsigned int femCopy(0);
1204 for (
unsigned int ilyFEM(0); ilyFEM != ily.vecIlyFEMZ.size(); ++ilyFEM) {
1205 const double radius(ilyRMax - 1 * dd4hep::mm - ily.fEMHeightHalf);
1206 const double phi(ily.vecIlyFEMPhi[ilyFEM]);
1210 xilyLog.placeVolume(
1213 Transform3D(RotationZ(phi),
Position(
xx,
yy, ily.vecIlyFEMZ[ilyFEM] - ilyLengthHalf)));
1216 << ilyFEMLog.name() <<
":" << femCopy <<
" positioned in " << xilyLog.name() <<
" at (" 1218 <<
cms::convert2mm(ily.vecIlyFEMZ[ilyFEM] - ilyLengthHalf) <<
") with rotation";
1222 for (
unsigned int iPipe(0); iPipe != ily.vecIlyPipePhi.size(); ++iPipe) {
1223 const unsigned int type(static_cast<unsigned int>(round(ily.vecIlyPipeType[iPipe])));
1224 const double zz(-ilyLengthHalf + ily.vecIlyPipeZ[iPipe] + (9 >
type ? ily.vecIlyPipeLengthHalf[
type] : 0));
1226 for (
unsigned int ly(0); ly != 2; ++ly) {
1227 const double radius(0 == ly ? ilyRMin + ily.pipeODHalf + 1 * dd4hep::mm
1228 : ilyRMax - ily.pipeODHalf - 1 * dd4hep::mm);
1229 const double phi(ily.vecIlyPipePhi[iPipe]);
1237 << ilyPipeLog[
type].name() <<
":" << copyNum[
type] <<
" positioned in " << xilyLog.name() <<
" at (" 1239 <<
") with no rotation";
1242 xilyLog.placeVolume(
1261 string clyrName(ns.
prepend(
"ECLYR"));
1262 std::vector<double> cri;
1263 std::vector<double> cro;
1264 std::vector<double> czz;
1265 czz.emplace_back(spm.vecZPts[1]);
1266 cri.emplace_back(spm.vecRMin[0]);
1267 cro.emplace_back(spm.vecRMin[0] + 25 * dd4hep::mm);
1268 czz.emplace_back(spm.vecZPts[2]);
1269 cri.emplace_back(spm.vecRMin[2]);
1270 cro.emplace_back(spm.vecRMin[2] + 10 * dd4hep::mm);
1271 Solid clyrSolid = Polycone(clyrName, -9.5_deg, 19_deg, cri, cro, czz);
1273 edm::LogVerbatim(
"EBGeom") << clyrName <<
" PolyCone from -9.5 to 9.5 with " << czz.size() <<
" points";
1274 for (
unsigned int k = 0;
k < czz.size(); ++
k)
1279 ns.
assembly(spm.name).placeVolume(clyrLog, copyOne);
1281 edm::LogVerbatim(
"EBGeomX") << clyrLog.name() <<
":" << copyOne <<
" positioned in " << ns.
assembly(spm.name).name()
1282 <<
" at (0,0,0) with no rotation";
1290 const double BNom1(cry.vecNomCryDimCR[0]);
1291 const double bNom1(cry.vecNomCryDimCF[0]);
1292 const double sWall1(alv.wallThAlv);
1293 const double fWall1(alv.wallFrAlv);
1294 const double sWrap1(alv.wrapThAlv);
1295 const double fWrap1(alv.wrapFrAlv);
1296 const double sClr1(alv.clrThAlv);
1297 const double fClr1(alv.clrFrAlv);
1298 const double LNom1(cry.nomCryDimLZ);
1299 const double beta1(atan((BNom1 - bNom1) / LNom1));
1300 const double sinbeta1(
sin(beta1));
1302 const double tana_hawR((BNom1 - bNom1) / LNom1);
1304 const double H_hawR(alvWedge.hawRHBIG);
1305 const double h_hawR(alvWedge.hawRhsml);
1306 const double a_hawR(bNom1 + sClr1 + 2 * sWrap1 + 2 * sWall1 - sinbeta1 * (fClr1 + fWrap1 + fWall1));
1307 const double B_hawR(a_hawR + H_hawR * tana_hawR);
1308 const double b_hawR(a_hawR + h_hawR * tana_hawR);
1309 const double L_hawR(spm.vecZPts[2]);
1311 const EcalTrap trapHAWR(0.5 * a_hawR,
1322 string hawRName1(alvWedge.hawRName +
"1");
1324 const double al1_fawR(atan((B_hawR - a_hawR) / H_hawR) +
M_PI_2);
1338 const string fawName1(alvWedge.fawName +
"1");
1339 Solid fawSolid1 = mytrap(fawName1, trapFAW);
1344 const double hawBoxClr(1 * dd4hep::mm);
1347 const string hawCutName(alvWedge.hawRName +
"CUTBOX");
1348 array<double, 3> hawBoxParms{{0.5 * b_hawR + hawBoxClr, 0.5 * alvWedge.hawRCutY, 0.5 * alvWedge.hawRCutZ}};
1355 const Pt3D b1(hawBoxParms[0], hawBoxParms[1], hawBoxParms[2]);
1356 const Pt3D b2(-hawBoxParms[0], hawBoxParms[1], hawBoxParms[2]);
1357 const Pt3D b3(-hawBoxParms[0], hawBoxParms[1], -hawBoxParms[2]);
1360 sqrt(4 * hawBoxParms[2] * hawBoxParms[2] - (h_hawR - alvWedge.hawRCutDelY) * (h_hawR - alvWedge.hawRCutDelY)));
1362 const Tf3D hawCutForm(
b1,
1365 vHAW[2] +
Pt3D(hawBoxClr, -alvWedge.hawRCutDelY, 0),
1366 vHAW[1] +
Pt3D(-hawBoxClr, -alvWedge.hawRCutDelY, 0),
1367 Pt3D(vHAW[0].
x() - hawBoxClr, vHAW[0].y(), vHAW[0].z() - zDel));
1372 const string fawCutName(alvWedge.fawName +
"CUTBOX");
1373 const array<double, 3> fawBoxParms{{2 * hawBoxParms[0], hawBoxParms[1], hawBoxParms[2]}};
1374 Solid fawCutBox = Box(fawCutName, fawBoxParms[0], fawBoxParms[1], fawBoxParms[2]);
1380 const Pt3D bb1(fawBoxParms[0], fawBoxParms[1], fawBoxParms[2]);
1381 const Pt3D bb2(-fawBoxParms[0], fawBoxParms[1], fawBoxParms[2]);
1382 const Pt3D bb3(-fawBoxParms[0], fawBoxParms[1], -fawBoxParms[2]);
1384 const Tf3D fawCutForm(bb1,
1387 vFAW[2] +
Pt3D(2 * hawBoxClr, -5 * dd4hep::mm, 0),
1388 vFAW[1] +
Pt3D(-2 * hawBoxClr, -5 * dd4hep::mm, 0),
1389 Pt3D(vFAW[1].
x() - 2 * hawBoxClr, vFAW[1].y() - trapFAW.
h(), vFAW[1].z() - zDel));
1391 Solid fawSolid = SubtractionSolid(fawSolid1,
1393 Transform3D(myrot(ns, fawCutName +
"R", fawCutForm.getRotation()),
1394 Position(fawCutForm.getTranslation().x(),
1395 fawCutForm.getTranslation().y(),
1396 fawCutForm.getTranslation().z())));
1398 edm::LogVerbatim(
"EBGeom") << alvWedge.fawName <<
" Subtraction " << fawSolid1.name() <<
":" << fawCutBox.name()
1405 const Tf3D hawRform(vHAW[3],
1409 0.5 * (vFAW[0] + vFAW[3]),
1410 0.5 * (vFAW[1] + vFAW[2]));
1416 myrot(ns, alvWedge.hawRName +
"R", hawRform.getRotation()),
1417 Position(hawRform.getTranslation().x(), hawRform.getTranslation().y(), hawRform.getTranslation().z())));
1420 << fawLog.name() <<
" at (" <<
cms::convert2mm(hawRform.getTranslation().x()) <<
"," 1422 <<
cms::convert2mm(hawRform.getTranslation().z()) <<
") with rotation";
1429 Rotation3D(1., 0., 0., 0., 1., 0., 0., 0., -1.) * RotationY(
M_PI),
1430 Position(-hawRform.getTranslation().x(), -hawRform.getTranslation().y(), -hawRform.getTranslation().z())));
1433 << fawLog.name() <<
" at (" <<
cms::convert2mm(-hawRform.getTranslation().x()) <<
"," 1435 <<
cms::convert2mm(-hawRform.getTranslation().z()) <<
") with rotation";
1437 for (
unsigned int iPhi(1); iPhi <= alvWedge.nFawPerSupm; ++iPhi) {
1438 const double rPhi(alvWedge.fawPhiOff + (iPhi - 0.5) * alvWedge.fawDelPhi);
1441 Tl3D(alvWedge.fawRadOff + (trapFAW.
H() + trapFAW.
h()) / 4, 0, 0.5 * trapFAW.
L()) *
1442 RoZ3D(-90._deg + alvWedge.fawPhiRot));
1443 if (alvWedge.fawHere) {
1448 myrot(ns, alvWedge.fawName +
"_Rot" +
std::to_string(iPhi), fawform.getRotation()),
1449 Position(fawform.getTranslation().x(), fawform.getTranslation().y(), fawform.getTranslation().z())));
1454 <<
cms::convert2mm(fawform.getTranslation().z()) <<
") with rotation";
1463 const double h_Grid(
grid.thick);
1465 const EcalTrap trapGrid(0.5 * (B_hawR - h_Grid * (B_hawR - a_hawR) / H_hawR),
1466 0.5 * (b_hawR - h_Grid * (B_hawR - a_hawR) / H_hawR),
1470 0.5 * (L_hawR - 8 * dd4hep::cm),
1476 Solid gridSolid = mytrap(
grid.name, trapGrid);
1481 const Tf3D gridForm(vGrid[4],
1484 vHAW[5] -
Pt3D(0, h_Grid, 0),
1488 if (0 !=
grid.here) {
1490 .placeVolume(gridLog,
1492 Transform3D(myrot(ns,
grid.name +
"R", gridForm.getRotation()),
1493 Position(gridForm.getTranslation().x(),
1494 gridForm.getTranslation().y(),
1495 gridForm.getTranslation().z())));
1497 edm::LogVerbatim(
"EBGeomX") << gridLog.name() <<
":" << copyOne <<
" positioned in " 1498 << ns.
assembly(alvWedge.hawRName).name() <<
" at (" 1501 <<
cms::convert2mm(gridForm.getTranslation().z()) <<
") with rotation";
1508 const double aNom(cry.nomCryDimAF);
1509 const double LNom(cry.nomCryDimLZ);
1511 const double AUnd(cry.underAR);
1512 const double aUnd(cry.underAF);
1513 const double bUnd(cry.underCF);
1514 const double HUnd(cry.underBR);
1515 const double hUnd(cry.underBF);
1516 const double LUnd(cry.underLZ);
1518 const double sWall(alv.wallThAlv);
1519 const double sWrap(alv.wrapThAlv);
1520 const double sClr(alv.clrThAlv);
1522 const double fWall(alv.wallFrAlv);
1523 const double fWrap(alv.wrapFrAlv);
1524 const double fClr(alv.clrFrAlv);
1526 const double rWall(alv.wallReAlv);
1527 const double rWrap(alv.wrapReAlv);
1528 const double rClr(alv.clrReAlv);
1531 double theta(90._deg);
1532 double zee(0 * dd4hep::mm);
1533 double side(0 * dd4hep::mm);
1534 double zeta(0._deg);
1536 for (
unsigned int cryType(1); cryType <= alv.nCryTypes; ++cryType) {
1542 const double ANom(cry.vecNomCryDimAR[cryType - 1]);
1543 const double BNom(cry.vecNomCryDimCR[cryType - 1]);
1544 const double bNom(cry.vecNomCryDimCF[cryType - 1]);
1545 const double HNom(cry.vecNomCryDimBR[cryType - 1]);
1546 const double hNom(cry.vecNomCryDimBF[cryType - 1]);
1548 const double alfCry(90._deg + atan((bNom - bUnd - aNom + aUnd) / (hNom - hUnd)));
1550 const EcalTrap trapCry(0.5 * (ANom - AUnd),
1551 0.5 * (aNom - aUnd),
1552 0.5 * (bNom - bUnd),
1553 0.5 * (HNom - HUnd),
1554 0.5 * (hNom - hUnd),
1555 0.5 * (LNom - LUnd),
1557 aNom - aUnd - ANom + AUnd,
1558 hNom - hUnd - HNom + HUnd
1561 const string cryDDName(cry.name + sType);
1562 Solid crySolid = mytrap(cryDDName, trapCry);
1566 const unsigned int copyCap(1);
1567 const string capDDName(
cap.name + sType);
1568 Solid capSolid = Box(capDDName,
cap.xSizeHalf,
cap.ySizeHalf,
cap.thickHalf);
1575 const string sglDDName(apd.sglName + sType);
1576 Solid sglSolid = Box(sglDDName,
cap.xSizeHalf,
cap.ySizeHalf, apd.sglThick * 0.5);
1582 const unsigned int copySGL(1);
1584 const string cerDDName(cer.name + sType);
1585 Solid cerSolid = Box(cerDDName, cer.xSizeHalf, cer.ySizeHalf, cer.thickHalf);
1591 unsigned int copyCER(0);
1593 const string bsiDDName(bSi.name + sType);
1594 Solid bsiSolid = Box(bsiDDName, bSi.xSizeHalf, bSi.ySizeHalf, bSi.thickHalf);
1600 const unsigned int copyBSi(1);
1602 const string atjDDName(apd.atjName + sType);
1603 Solid atjSolid = Box(atjDDName, 0.5 * apd.side, 0.5 * apd.side, apd.atjThickHalf);
1609 const unsigned int copyATJ(1);
1611 const string aglDDName(apd.aglName + sType);
1612 Solid aglSolid = Box(aglDDName, bSi.xSizeHalf, bSi.ySizeHalf, 0.5 * apd.aglThick);
1618 const unsigned int copyAGL(1);
1620 const string andDDName(apd.andName + sType);
1621 Solid andSolid = Box(andDDName, 0.5 * apd.side, 0.5 * apd.side, 0.5 * apd.andThick);
1627 const unsigned int copyAND(1);
1629 const string apdDDName(apd.name + sType);
1630 Solid apdSolid = Box(apdDDName, 0.5 * apd.side, 0.5 * apd.side, 0.5 * apd.thick);
1636 const unsigned int copyAPD(1);
1640 const double delta(atan((HNom - hNom) / LNom));
1643 const double gamma(atan((ANom - aNom) / LNom));
1646 const double beta(atan((BNom - bNom) / LNom));
1647 const double sinbeta(
sin(
beta));
1650 const double alfClr(90._deg + atan((bNom - aNom) / (hNom + sClr)));
1652 const EcalTrap trapClr(0.5 * (ANom + sClr + rClr * singamma),
1653 0.5 * (aNom + sClr - fClr * singamma),
1654 0.5 * (bNom + sClr - fClr * sinbeta),
1655 0.5 * (HNom + sClr + rClr * sindelta),
1656 0.5 * (hNom + sClr - fClr * sindelta),
1657 0.5 * (LNom + fClr + rClr),
1663 const string clrDDName(cry.clrName + sType);
1664 Solid clrSolid = mytrap(clrDDName, trapClr);
1668 const double alfWrap(90._deg + atan((bNom - aNom) / (hNom + sClr + 2. * sWrap)));
1670 const EcalTrap trapWrap(0.5 * (trapClr.
A() + 2. * sWrap + rWrap * singamma),
1671 0.5 * (trapClr.
a() + 2. * sWrap - fWrap * singamma),
1672 0.5 * (trapClr.
b() + 2. * sWrap - fWrap * sinbeta),
1673 0.5 * (trapClr.
H() + 2. * sWrap + rWrap * sindelta),
1674 0.5 * (trapClr.
h() + 2. * sWrap - fWrap * sindelta),
1675 0.5 * (trapClr.
L() + fWrap + rWrap),
1677 aNom - ANom - (cryType > 9 ? 0 : 0.020 * dd4hep::mm),
1681 const string wrapDDName(cry.wrapName + sType);
1682 Solid wrapSolid = mytrap(wrapDDName, trapWrap);
1687 const double alfWall(90._deg + atan((bNom - aNom) / (hNom + sClr + 2. * sWrap + 2. * sWall)));
1689 const EcalTrap trapWall(0.5 * (trapWrap.A() + 2 * sWall + rWall * singamma),
1690 0.5 * (trapWrap.a() + 2 * sWall - fWall * singamma),
1691 0.5 * (trapWrap.b() + 2 * sWall - fWall * sinbeta),
1692 0.5 * (trapWrap.H() + 2 * sWall + rWall * sindelta),
1693 0.5 * (trapWrap.h() + 2 * sWall - fWall * sindelta),
1694 0.5 * (trapWrap.L() + fWall + rWall),
1696 aNom - ANom - (cryType < 10 ? 0.150 * dd4hep::mm : 0.100 * dd4hep::mm),
1700 const string wallDDName(cry.wallName + sType);
1701 Solid wallSolid = mytrap(wallDDName, trapWall);
1705 const Vec3 cryToClr(0., 0., 0.5 * (rClr - fClr));
1706 clrLog.placeVolume(cryLog, copyOne,
Position(0, 0, 0.5 * (rClr - fClr)));
1708 edm::LogVerbatim(
"EBGeomX") << cryLog.name() <<
":" << copyOne <<
" positioned in " << clrLog.name()
1709 <<
" at (0,0," <<
cms::convert2mm(0.5 * (rClr - fClr)) <<
") with no rotation";
1711 if (0 !=
cap.here) {
1712 bsiLog.placeVolume(aglLog, copyAGL,
Position(0, 0, -0.5 * apd.aglThick + bSi.thickHalf));
1714 edm::LogVerbatim(
"EBGeomX") << aglLog.name() <<
":" << copyAGL <<
" positioned in " << bsiLog.name()
1715 <<
" at (0,0," <<
cms::convert2mm(-0.5 * apd.aglThick + bSi.thickHalf)
1716 <<
") with no rotation";
1718 bsiLog.placeVolume(andLog, copyAND,
Position(0, 0, -0.5 * apd.andThick - apd.aglThick + bSi.thickHalf));
1720 edm::LogVerbatim(
"EBGeomX") << andLog.name() <<
":" << copyAND <<
" positioned in " << bsiLog.name()
1722 <<
cms::convert2mm(-0.5 * apd.andThick - apd.aglThick + bSi.thickHalf)
1723 <<
") with no rotation";
1726 apdLog, copyAPD,
Position(0, 0, -0.5 * apd.thick - apd.andThick - apd.aglThick + bSi.thickHalf));
1728 edm::LogVerbatim(
"EBGeomX") << apdLog.name() <<
":" << copyAPD <<
" positioned in " << bsiLog.name()
1730 <<
cms::convert2mm(-0.5 * apd.thick - apd.andThick - apd.aglThick + bSi.thickHalf)
1731 <<
") with no rotation";
1733 bsiLog.placeVolume(atjLog,
1735 Position(0, 0, -apd.atjThickHalf - apd.thick - apd.andThick - apd.aglThick + bSi.thickHalf));
1737 edm::LogVerbatim(
"EBGeomX") << atjLog.name() <<
":" << copyATJ <<
" positioned in " << bsiLog.name()
1739 <<
cms::convert2mm(-apd.atjThickHalf - apd.thick - apd.andThick - apd.aglThick +
1741 <<
") with no rotation";
1743 cerLog.placeVolume(bsiLog, copyBSi,
Position(0, 0, -bSi.thickHalf + cer.thickHalf));
1745 edm::LogVerbatim(
"EBGeomX") << bsiLog.name() <<
":" << copyBSi <<
" positioned in " << cerLog.name()
1747 <<
") with no rotation";
1749 capLog.placeVolume(sglLog, copySGL,
Position(0, 0, -0.5 * apd.sglThick +
cap.thickHalf));
1751 edm::LogVerbatim(
"EBGeomX") << sglLog.name() <<
":" << copySGL <<
" positioned in " << capLog.name()
1753 <<
") with no rotation";
1756 for (
unsigned int ijkl(0); ijkl != 2; ++ijkl) {
1757 capLog.placeVolume(cerLog,
1759 Position(trapCry.
bl1() - (0 == ijkl ? apd.x1 : apd.x2),
1760 trapCry.
h1() - apd.z,
1761 -apd.sglThick - cer.thickHalf +
cap.thickHalf));
1763 edm::LogVerbatim(
"EBGeomX") << cerLog.name() <<
":" << copyCER <<
" positioned in " << capLog.name()
1767 <<
") with no rotation";
1770 clrLog.placeVolume(capLog, copyCap,
Position(0, 0, -trapCry.
dz() -
cap.thickHalf + 0.5 * (rClr - fClr)));
1772 edm::LogVerbatim(
"EBGeomX") << capLog.name() <<
":" << copyCap <<
" positioned in " << clrLog.name()
1775 <<
") with no rotation";
1779 const Vec3 clrToWrap(0, 0, 0.5 * (rWrap - fWrap));
1780 wrapLog.placeVolume(clrLog, copyOne,
Position(0, 0, 0.5 * (rWrap - fWrap)));
1782 edm::LogVerbatim(
"EBGeomX") << clrLog.name() <<
":" << copyOne <<
" positioned in " << wrapLog.name()
1783 <<
" at (0,0," <<
cms::convert2mm(0.5 * (rWrap - fWrap)) <<
") with no rotation";
1787 const Vec3 wrapToWall1(0, 0, 0.5 * (rWall - fWall));
1788 const Vec3 wrapToWall(
Vec3((cryType > 9 ? 0 : 0.005 * dd4hep::mm), 0, 0) + wrapToWall1);
1789 wallLog.placeVolume(
1792 Position(
Vec3((cryType > 9 ? 0 : 0.005 * dd4hep::mm), 0, 0) + wrapToWall1));
1794 edm::LogVerbatim(
"EBGeomX") << wrapLog.name() <<
":" << copyOne <<
" positioned in " << wallLog.name() <<
" at (" 1802 const double sidePrime(0.5 * (trapWall.a() - trapCry.
a()));
1803 const double frontPrime(fWall + fWrap + fClr + 0.5 * LUnd);
1809 const unsigned int iWeb(0);
1811 const unsigned int copyOne(1);
1812 const double LWebx(
web.vecWebLength[iWeb]);
1813 const double BWebx(trapWall.b() + (trapWall.B() - trapWall.b()) * LWebx / trapWall.L());
1815 const double thick(
web.vecWebPlTh[iWeb] +
web.vecWebClrTh[iWeb]);
1816 const EcalTrap trapWebClr(0.5 * BWebx,
1823 trapWall.b() - BWebx,
1827 Solid webClrSolid = mytrap(webClrName, trapWebClr);
1830 const EcalTrap trapWebPl(0.5 * trapWebClr.A(),
1831 0.5 * trapWebClr.a(),
1832 0.5 * trapWebClr.b(),
1833 0.5 *
web.vecWebPlTh[iWeb],
1834 0.5 *
web.vecWebPlTh[iWeb],
1835 0.5 * trapWebClr.L(),
1837 trapWebClr.b() - trapWebClr.B(),
1841 Solid webPlSolid = mytrap(webPlName, trapWebPl);
1844 webClrLog.placeVolume(webPlLog, copyOne);
1846 edm::LogVerbatim(
"EBGeomX") << webPlLog.name() <<
":" << copyOne <<
" positioned in " << webClrName
1847 <<
" at (0,0,0) with no rotation";
1851 zee += trapWebClr.h() /
sin(
theta);
1855 const double zWeb(zee - frontPrime *
cos(
beta) + sidePrime *
sin(
beta));
1856 const double yWeb(frontPrime *
sin(
beta) + sidePrime *
cos(
beta));
1860 const Pt3D wedge1(wedge3 +
Pt3D(trapWebClr.a(), 0, 0));
1862 edm::LogVerbatim(
"EcalGeom") <<
"trap1=" << vWeb[0] <<
", trap2=" << vWeb[2] <<
", trap3=" << vWeb[3];
1863 edm::LogVerbatim(
"EcalGeom") <<
"wedge1=" << wedge1 <<
", wedge2=" << wedge2 <<
", wedge3=" << wedge3;
1865 const Tf3D tForm(vWeb[0], vWeb[2], vWeb[3], wedge1, wedge2, wedge3);
1867 if (0 !=
web.here) {
1873 myrot(ns, webClrName +
std::to_string(iWeb), tForm.getRotation()),
1874 Position(tForm.getTranslation().x(), tForm.getTranslation().y(), tForm.getTranslation().z())));
1876 edm::LogVerbatim(
"EBGeomX") << webClrLog.name() <<
":" << copyOne <<
" positioned in " 1877 << ns.
assembly(alvWedge.hawRName).name() <<
" at (" 1883 zee += alv.vecGapAlvEta[0];
1886 for (
unsigned int etaAlv(1); etaAlv <= alv.nCryPerAlvEta; ++etaAlv) {
1889 <<
", frontPrime=" << frontPrime <<
", zeta=" << zeta <<
", delta=" <<
delta 1893 zee += 0.075 * dd4hep::mm + (side *
cos(zeta) + trapWall.h() - sidePrime) /
sin(
theta);
1897 const Pt3D trap2(vCry[2] + cryToClr + clrToWrap + wrapToWall);
1899 const Pt3D trap3(trap2 +
Pt3D(0, -trapCry.
h(), 0));
1900 const Pt3D trap1(trap3 +
Pt3D(-trapCry.
a(), 0, 0));
1902 const Pt3D wedge3(vHAW[4] +
Pt3D(sidePrime, alvWedge.hawYOffCry, zee));
1904 const Pt3D wedge1(wedge3 +
Pt3D(trapCry.
a(), 0, 0));
1906 const Tf3D tForm1(trap1, trap2, trap3, wedge1, wedge2, wedge3);
1908 const double xx(0.050 * dd4hep::mm);
1910 const Tf3D tForm(HepGeom::Translate3D(
xx, 0, 0) * tForm1);
1916 myrot(ns, wallDDName +
"_" +
std::to_string(etaAlv), tForm.getRotation()),
1917 Position(tForm.getTranslation().x(), tForm.getTranslation().y(), tForm.getTranslation().z())));
1919 edm::LogVerbatim(
"EBGeomX") << wallLog.name() <<
":" << etaAlv <<
" positioned in " 1920 << ns.
assembly(alvWedge.hawRName).name() <<
" at (" 1929 if (5 == cryType || 9 == cryType || 13 == cryType || 17 == cryType) {
1930 zee += 0.5 * alv.vecGapAlvEta[cryType] /
sin(
theta);
1932 const unsigned int iWeb(cryType / 4);
1934 const unsigned int copyOne(1);
1935 const double LWebx(
web.vecWebLength[iWeb]);
1936 const double BWebx(trapWall.a() + (trapWall.A() - trapWall.a()) * LWebx / trapWall.L());
1938 const double thick(
web.vecWebPlTh[iWeb] +
web.vecWebClrTh[iWeb]);
1939 const EcalTrap trapWebClr(0.5 * BWebx,
1946 trapWall.a() - BWebx,
1950 Solid webClrSolid = mytrap(webClrName, trapWebClr);
1953 const EcalTrap trapWebPl(0.5 * trapWebClr.A(),
1954 0.5 * trapWebClr.a(),
1955 0.5 * trapWebClr.b(),
1956 0.5 *
web.vecWebPlTh[iWeb],
1957 0.5 *
web.vecWebPlTh[iWeb],
1958 0.5 * trapWebClr.L(),
1960 trapWebClr.b() - trapWebClr.B(),
1964 Solid webPlSolid = mytrap(webPlName, trapWebPl);
1967 webClrLog.placeVolume(webPlLog, copyOne);
1969 edm::LogVerbatim(
"EBGeomX") << webPlLog.name() <<
":" << copyOne <<
" positioned in " << webClrName
1970 <<
" at (0,0,0) with no rotation";
1974 zee += trapWebClr.h() /
sin(
theta);
1978 const double zWeb(zee - frontPrime *
cos(
beta) + sidePrime *
sin(
beta));
1979 const double yWeb(frontPrime *
sin(
beta) + sidePrime *
cos(
beta));
1983 const Pt3D wedge1(wedge3 +
Pt3D(trapWebClr.a(), 0, 0));
1985 edm::LogVerbatim(
"EcalGeom") <<
"trap1=" << vWeb[0] <<
", trap2=" << vWeb[2] <<
", trap3=" << vWeb[3];
1986 edm::LogVerbatim(
"EcalGeom") <<
"wedge1=" << wedge1 <<
", wedge2=" << wedge2 <<
", wedge3=" << wedge3;
1988 const Tf3D tForm(vWeb[0], vWeb[2], vWeb[3], wedge1, wedge2, wedge3);
1990 if (0 !=
web.here) {
1996 myrot(ns, webClrName +
std::to_string(iWeb), tForm.getRotation()),
1997 Position(tForm.getTranslation().x(), tForm.getTranslation().y(), tForm.getTranslation().z())));
1999 edm::LogVerbatim(
"EBGeomX") << webClrLog.name() <<
":" << copyOne <<
" positioned in " 2000 << ns.
assembly(alvWedge.hawRName).name() <<
" at (" 2007 zee += 0.5 * alv.vecGapAlvEta[cryType] /
sin(
theta);
2010 zee += alv.vecGapAlvEta[cryType] /
sin(
theta);
2025 if (0 != back.here) {
2032 const Position outtra(back.xOff + 0.5 * back.sideHeight, back.yOff, 0.5 * back.sideLength);
2034 const double realBPthick(back.plateThick + back.plate2Thick);
2035 array<double, 3> backPlateParms{{0.5 * back.plateWidth, 0.5 * realBPthick, 0.5 * back.plateLength}};
2036 Solid backPlateSolid = Box(back.plateName, backPlateParms[0], backPlateParms[1], backPlateParms[2]);
2044 0.5 * back.sideHeight + backPlateParms[1], 0 * dd4hep::mm, backPlateParms[2] - 0.5 * back.sideLength);
2046 Solid backPlate2Solid =
2047 Box(back.plate2Name, 0.5 * back.plateWidth, 0.5 * back.plate2Thick, 0.5 * back.plateLength);
2055 const Position backPlate2Tra(0, -backPlateParms[1] + back.plate2Thick * 0.5, 0);
2056 if (0 != back.plateHere) {
2057 backPlateLog.placeVolume(backPlate2Log, copyOne, Transform3D(backPlate2Tra));
2059 edm::LogVerbatim(
"EBGeomX") << backPlate2Log.name() <<
":" << copyOne <<
" positioned in " 2060 << backPlateLog.name() <<
" at (" <<
cms::convert2mm(backPlate2Tra.x()) <<
"," 2062 <<
") with no rotation";
2067 Transform3D(myrot(ns, back.plateName +
"Rot5", CLHEP::HepRotationZ(270._deg)), outtra + backPlateTra));
2069 edm::LogVerbatim(
"EBGeomX") << backPlateLog.name() <<
":" << copyOne <<
" positioned in " 2070 << ns.
assembly(spm.name).name() <<
" at (" 2088 const EcalTrap trapBS(back.sideWidth * 0.5,
2089 back.sideWidth * 0.5,
2090 back.sideWidth / 4.,
2091 back.sideHeight * 0.5,
2092 back.sideHeight * 0.5,
2093 back.sideLength * 0.5,
2099 Solid backSideSolid = mytrap(back.sideName, trapBS);
2102 const Position backSideTra1(0 * dd4hep::mm, back.plateWidth * 0.5 + back.sideYOff1, 1 * dd4hep::mm);
2103 if (0 != back.sideHere) {
2107 Transform3D(myrot(ns, back.sideName +
"Rot8", CLHEP::HepRotationX(180._deg) * CLHEP::HepRotationZ(90._deg)),
2108 outtra + backSideTra1));
2110 edm::LogVerbatim(
"EBGeomX") << backSideLog.name() <<
":" << copyOne <<
" positioned in " 2111 << ns.
assembly(spm.name).name() <<
" at (" 2116 const Position backSideTra2(0 * dd4hep::mm, -back.plateWidth * 0.5 + back.sideYOff2, 1 * dd4hep::mm);
2120 Transform3D(myrot(ns, back.sideName +
"Rot9", CLHEP::HepRotationZ(90._deg)), outtra + backSideTra2));
2122 edm::LogVerbatim(
"EBGeomX") << backSideLog.name() <<
":" << copyTwo <<
" positioned in " 2123 << ns.
assembly(spm.name).name() <<
" at (" 2136 const double backCoolWidth(backCool.barWidth + 2. * backCoolTank.width);
2144 const double manifCut(2 * dd4hep::mm);
2146 Solid mBManifSolid = Tube(0, mbManif.outDiam * 0.5, backCoolWidth * 0.5 - manifCut, 0._deg, 360._deg);
2153 const string mBManifWaName(mbManif.name +
"Wa");
2154 Solid mBManifWaSolid = Tube(0, mbManif.innDiam * 0.5, backCoolWidth * 0.5 - manifCut, 0._deg, 360._deg);
2159 Volume mBManifWaLog(mBManifWaName, mBManifWaSolid, ns.
material(backPipe.waterMat));
2160 mBManifLog.placeVolume(mBManifWaLog, copyOne);
2162 edm::LogVerbatim(
"EBGeomX") << mBManifWaLog.name() <<
":" << copyOne <<
" positioned in " << mBManifLog.name()
2163 <<
" at (0,0,0) with no rotation";
2178 const double deltaY(-5 * dd4hep::mm);
2180 Solid grEdgeSlotSolid =
2181 Box(grille.edgeSlotName, grille.edgeSlotHeight * 0.5, grille.edgeSlotWidth * 0.5, grille.thick * 0.5);
2187 Volume grEdgeSlotLog =
Volume(grille.edgeSlotName, grEdgeSlotSolid, ns.
material(grille.edgeSlotMat));
2189 unsigned int edgeSlotCopy(0);
2190 unsigned int midSlotCopy(0);
2194 for (
unsigned int iGr(0); iGr != grille.vecHeight.size(); ++iGr) {
2196 Solid grilleSolid = Box(gName, grille.vecHeight[iGr] * 0.5, backCoolWidth * 0.5, grille.thick * 0.5);
2204 const Position grilleTra(-realBPthick * 0.5 - grille.vecHeight[iGr] * 0.5,
2206 grille.vecZOff[iGr] + grille.thick * 0.5 - back.sideLength * 0.5);
2207 const Position gTra(outtra + backPlateTra + grilleTra);
2209 if (0 != grille.midSlotHere && 0 != iGr) {
2210 if (0 == (iGr - 1) % 2) {
2212 Solid grMidSlotSolid =
2213 Box(mName, grille.vecMidSlotHeight[(iGr - 1) / 2] * 0.5, grille.midSlotWidth * 0.5, grille.thick * 0.5);
2216 <<
cms::convert2mm(grille.vecMidSlotHeight[(iGr - 1) / 2] * 0.5) <<
":" 2220 grMidSlotLog[(iGr - 1) / 2] =
Volume(mName, grMidSlotSolid, ns.
material(grille.midSlotMat));
2222 grilleLog.placeVolume(
2223 grMidSlotLog[(iGr - 1) / 2],
2226 grille.vecHeight[iGr] * 0.5 - grille.vecMidSlotHeight[(iGr - 1) / 2] * 0.5, +grille.midSlotXOff, 0)));
2228 edm::LogVerbatim(
"EBGeomX") << grMidSlotLog[(iGr - 1) / 2].
name() <<
":" << midSlotCopy <<
" positioned in " 2229 << grilleLog.name() <<
" at (" 2231 grille.vecMidSlotHeight[(iGr - 1) / 2] * 0.5)
2232 <<
"," <<
cms::convert2mm(grille.midSlotXOff) <<
",0) with no rotation";
2234 grilleLog.placeVolume(
2235 grMidSlotLog[(iGr - 1) / 2],
2238 grille.vecHeight[iGr] * 0.5 - grille.vecMidSlotHeight[(iGr - 1) / 2] * 0.5, -grille.midSlotXOff, 0)));
2240 edm::LogVerbatim(
"EBGeomX") << grMidSlotLog[(iGr - 1) / 2].
name() <<
":" << midSlotCopy <<
" positioned in " 2241 << grilleLog.name() <<
" at (" 2243 grille.vecMidSlotHeight[(iGr - 1) / 2] * 0.5)
2244 <<
"," <<
cms::convert2mm(-grille.midSlotXOff) <<
",0) with no rotation";
2248 if (0 != grille.edgeSlotHere && 0 != iGr) {
2249 grilleLog.placeVolume(grEdgeSlotLog,
2251 Transform3D(
Position(grille.vecHeight[iGr] * 0.5 - grille.edgeSlotHeight * 0.5,
2252 backCoolWidth * 0.5 - grille.edgeSlotWidth * 0.5,
2255 edm::LogVerbatim(
"EBGeomX") << grEdgeSlotLog.name() <<
":" << edgeSlotCopy <<
" positioned in " 2256 << grilleLog.name() <<
" at (" 2257 <<
cms::convert2mm(grille.vecHeight[iGr] * 0.5 - grille.edgeSlotHeight * 0.5)
2258 <<
"," <<
cms::convert2mm(backCoolWidth * 0.5 - grille.edgeSlotWidth * 0.5)
2259 <<
",0) with no rotation";
2261 grilleLog.placeVolume(grEdgeSlotLog,
2263 Transform3D(
Position(grille.vecHeight[iGr] * 0.5 - grille.edgeSlotHeight * 0.5,
2264 -backCoolWidth * 0.5 + grille.edgeSlotWidth * 0.5,
2267 edm::LogVerbatim(
"EBGeomX") << grEdgeSlotLog.name() <<
":" << edgeSlotCopy <<
" positioned in " 2268 << grilleLog.name() <<
" at (" 2269 <<
cms::convert2mm(grille.vecHeight[iGr] * 0.5 - grille.edgeSlotHeight * 0.5)
2270 <<
"," <<
cms::convert2mm(-backCoolWidth * 0.5 + grille.edgeSlotWidth * 0.5)
2271 <<
",0) with no rotation";
2274 if (0 != grille.here) {
2275 ns.
assembly(spm.name).placeVolume(grilleLog, iGr, Transform3D(gTra));
2277 edm::LogVerbatim(
"EBGeomX") << grilleLog.name() <<
":" << iGr <<
" positioned in " 2280 <<
") with no rotation";
2284 if ((0 != iGr % 2) && (0 != mbManif.here)) {
2288 Transform3D(myrot(ns, mbManif.name +
"R1", CLHEP::HepRotationX(90._deg)),
2289 gTra -
Position(-mbManif.outDiam * 0.5 + grille.vecHeight[iGr] * 0.5,
2291 grille.thick * 0.5 + 3 * mbManif.outDiam * 0.5)));
2293 edm::LogVerbatim(
"EBGeomX") << mBManifLog.name() <<
":" << iGr <<
" positioned in " 2294 << ns.
assembly(spm.name).name() <<
" at (" 2295 <<
cms::convert2mm(gTra.x() + mbManif.outDiam * 0.5 - grille.vecHeight[iGr] * 0.5)
2297 <<
cms::convert2mm(gTra.z() - grille.thick * 0.5 - 3 * mbManif.outDiam * 0.5)
2298 <<
") with rotation";
2303 Transform3D(myrot(ns, mbManif.name +
"R2", CLHEP::HepRotationX(90._deg)),
2304 gTra -
Position(-3 * mbManif.outDiam * 0.5 + grille.vecHeight[iGr] * 0.5,
2306 grille.thick * 0.5 + 3 * mbManif.outDiam * 0.5)));
2308 edm::LogVerbatim(
"EBGeomX") << mBManifLog.name() <<
":" << (iGr - 1) <<
" positioned in " 2309 << ns.
assembly(spm.name).name() <<
" at (" 2311 grille.vecHeight[iGr] * 0.5)
2313 <<
cms::convert2mm(gTra.z() - grille.thick * 0.5 - 3 * mbManif.outDiam * 0.5)
2314 <<
") with rotation";
2331 Solid backCoolBarSolid =
2332 Box(backCool.barName, backCool.barHeight * 0.5, backCool.barWidth * 0.5, backCool.barThick * 0.5);
2338 Volume backCoolBarLog =
Volume(backCool.barName, backCoolBarSolid, ns.
material(backCool.barMat));
2340 Solid backCoolBarSSSolid =
2341 Box(backCool.barSSName, backCool.barHeight * 0.5, backCool.barWidth * 0.5, backCool.barSSThick * 0.5);
2347 Volume backCoolBarSSLog =
Volume(backCool.barSSName, backCoolBarSSSolid, ns.
material(backCool.barSSMat));
2348 const Position backCoolBarSSTra(0, 0, 0);
2349 backCoolBarLog.placeVolume(backCoolBarSSLog, copyOne, Transform3D(backCoolBarSSTra));
2351 edm::LogVerbatim(
"EBGeomX") << backCoolBarSSLog.name() <<
":" << copyOne <<
" positioned in " 2352 << backCoolBarLog.name() <<
" at (" <<
cms::convert2mm(backCoolBarSSTra.x()) <<
"," 2357 Solid backCoolBarWaSolid =
2358 Box(backCool.barWaName, backCool.barHeight * 0.5, backCool.barWidth * 0.5, backCool.barWaThick * 0.5);
2364 Volume backCoolBarWaLog =
Volume(backCool.barWaName, backCoolBarWaSolid, ns.
material(backCool.barWaMat));
2365 const Position backCoolBarWaTra(0, 0, 0);
2366 backCoolBarSSLog.placeVolume(backCoolBarWaLog, copyOne, Transform3D(backCoolBarWaTra));
2368 edm::LogVerbatim(
"EBGeomX") << backCoolBarWaLog.name() <<
":" << copyOne <<
" positioned in " 2369 << backCoolBarSSLog.name() <<
" at (" <<
cms::convert2mm(backCoolBarWaTra.x()) <<
"," 2387 for (
unsigned int iLyr(0); iLyr != backCool.vecBackVFELyrThick.size(); ++iLyr) {
2388 thickVFE += backCool.vecBackVFELyrThick[iLyr];
2390 Solid backVFESolid =
2391 Box((myns + backCool.backVFEName), backCool.barHeight * 0.5, backCool.barWidth * 0.5, thickVFE * 0.5);
2399 Position offTra(0, 0, -thickVFE * 0.5);
2400 for (
unsigned int iLyr(0); iLyr != backCool.vecBackVFELyrThick.size(); ++iLyr) {
2401 Solid backVFELyrSolid = Box(backCool.vecBackVFELyrName[iLyr],
2402 backCool.barHeight * 0.5,
2403 backCool.barWidth * 0.5,
2404 backCool.vecBackVFELyrThick[iLyr] * 0.5);
2412 Volume(backCool.vecBackVFELyrName[iLyr], backVFELyrSolid, ns.
material(backCool.vecBackVFELyrMat[iLyr]));
2413 const Position backVFELyrTra(0, 0, backCool.vecBackVFELyrThick[iLyr] * 0.5);
2414 backVFELog.placeVolume(backVFELyrLog, copyOne, Transform3D(backVFELyrTra + offTra));
2416 edm::LogVerbatim(
"EBGeomX") << backVFELyrLog.name() <<
":" << copyOne <<
" positioned in " << backVFELog.name()
2419 <<
cms::convert2mm((backVFELyrTra + offTra).z()) <<
") with no rotation";
2421 offTra += 2 * backVFELyrTra;
2436 const double halfZCoolVFE(thickVFE + backCool.barThick * 0.5);
2437 Solid backCoolVFESolid = Box(backCool.barHeight * 0.5, backCool.barWidth * 0.5, halfZCoolVFE);
2443 if (0 != backCool.barHere) {
2444 backCoolVFELog.placeVolume(backCoolBarLog, copyOne, Transform3D());
2446 edm::LogVerbatim(
"EBGeomX") << backCoolBarLog.name() <<
":" << copyOne <<
" positioned in " 2447 << backCoolVFELog.name() <<
" at (0,0,0) with no rotation";
2450 if (0 != backCool.vFEHere) {
2451 backCoolVFELog.placeVolume(
2452 backVFELog, copyOne, Transform3D(
Position(0, 0, backCool.barThick * 0.5 + thickVFE * 0.5)));
2454 edm::LogVerbatim(
"EBGeomX") << backVFELog.name() <<
":" << copyOne <<
" positioned in " << backCoolVFELog.name()
2455 <<
" at (0,0," <<
cms::convert2mm(backCool.barThick * 0.5 + thickVFE * 0.5)
2456 <<
") with no rotation";
2459 backCoolVFELog.placeVolume(backVFELog,
2461 Transform3D(myrot(ns, backCool.vFEName +
"Flip", CLHEP::HepRotationX(180._deg)),
2462 Position(0, 0, -backCool.barThick * 0.5 - thickVFE * 0.5)));
2464 edm::LogVerbatim(
"EBGeomX") << backVFELog.name() <<
":" << copyTwo <<
" positioned in " << backCoolVFELog.name()
2465 <<
" at (0,0," <<
cms::convert2mm(-backCool.barThick * 0.5 - thickVFE * 0.5)
2466 <<
") with rotation";
2480 unsigned int iCVFECopy(1);
2481 unsigned int iSep(0);
2482 unsigned int iNSec(0);
2483 const unsigned int nMisc(backMisc.vecThick.size() / 4);
2484 for (
unsigned int iMod(0); iMod != 4; ++iMod) {
2485 const double pipeLength(grille.vecZOff[2 * iMod + 1] - grille.vecZOff[2 * iMod] - grille.thick -
2487 const double pipeZPos(grille.vecZOff[2 * iMod + 1] - pipeLength * 0.5 - 1.5 * dd4hep::mm);
2490 double backCoolHeight(backCool.barHeight + mbCoolTube.outDiam);
2491 for (
unsigned int iMisc(0); iMisc != nMisc; ++iMisc) {
2492 backCoolHeight += backMisc.vecThick[iMod * nMisc + iMisc];
2494 double bottomThick(mbCoolTube.outDiam);
2495 for (
unsigned int iMB(0); iMB != mbLyr.vecMBLyrThick.size(); ++iMB) {
2496 backCoolHeight += mbLyr.vecMBLyrThick[iMB];
2497 bottomThick += mbLyr.vecMBLyrThick[iMB];
2500 const double halfZBCool((pipeLength - 2 * mbManif.outDiam - grille.zSpace) * 0.5);
2501 Solid backCoolSolid = Box(backCool.vecName[iMod], backCoolHeight * 0.5, backCoolWidth * 0.5, halfZBCool);
2509 -realBPthick * 0.5 + backCoolHeight * 0.5 - grille.vecHeight[2 * iMod],
2511 grille.vecZOff[2 * iMod] + grille.thick + grille.zSpace + halfZBCool - back.sideLength * 0.5);
2512 if (0 != backCool.here) {
2513 ns.
assembly(spm.name).placeVolume(backCoolLog, iMod + 1, outtra + backPlateTra + bCoolTra);
2515 edm::LogVerbatim(
"EBGeomX") << backCoolLog.name() <<
":" << (iMod + 1) <<
" positioned in " 2516 << ns.
assembly(spm.name).name() <<
" at (" 2520 <<
") with no rotation";
2525 const double backCoolTankHeight(backCool.barHeight);
2526 const double halfZTank(halfZBCool - 5 * dd4hep::cm);
2529 Solid backCoolTankSolid = Box(bTankName, backCoolTankHeight * 0.5, backCoolTank.width * 0.5, halfZTank);
2535 if (0 != backCoolTank.here) {
2536 backCoolLog.placeVolume(backCoolTankLog,
2538 Transform3D(Rotation3D(),
2539 Position(-backCoolHeight * 0.5 + backCoolTankHeight * 0.5 + bottomThick,
2540 backCool.barWidth * 0.5 + backCoolTank.width * 0.5,
2543 edm::LogVerbatim(
"EBGeomX") << backCoolTankLog.name() <<
":" << copyOne <<
" positioned in " 2544 << backCoolLog.name() <<
" at (" 2545 <<
cms::convert2mm(-backCoolHeight * 0.5 + backCoolTankHeight * 0.5 + bottomThick)
2546 <<
"," <<
cms::convert2mm(backCool.barWidth * 0.5 + backCoolTank.width * 0.5)
2547 <<
",0) with no rotation";
2551 string bTankWaName(backCoolTank.waName +
std::to_string(iMod + 1));
2552 Solid backCoolTankWaSolid = Box(bTankWaName,
2553 backCoolTankHeight * 0.5 - backCoolTank.thick * 0.5,
2554 backCoolTank.waWidth * 0.5,
2555 halfZTank - backCoolTank.thick * 0.5);
2558 <<
cms::convert2mm(backCoolTankHeight * 0.5 - backCoolTank.thick * 0.5) <<
":" 2562 Volume backCoolTankWaLog =
Volume(bTankWaName, backCoolTankWaSolid, ns.
material(backCoolTank.waMat));
2563 backCoolTankLog.placeVolume(backCoolTankWaLog, copyOne, Transform3D(Rotation3D(),
Position(0, 0, 0)));
2565 edm::LogVerbatim(
"EBGeomX") << backCoolTankWaLog.name() <<
":" << copyOne <<
" positioned in " 2566 << backCoolTankLog.name() <<
" at (0,0,0) with no rotation";
2569 string bBracketName(backCoolTank.backBracketName +
std::to_string(iMod + 1));
2570 Solid backBracketSolid =
2571 Box(bBracketName, backCoolTank.backBracketHeight * 0.5, backCoolTank.width * 0.5, halfZTank);
2577 Volume backBracketLog =
Volume(bBracketName, backBracketSolid, ns.
material(backCoolTank.backBracketMat));
2578 if (0 != backCoolTank.here) {
2579 backCoolLog.placeVolume(backBracketLog,
2581 Transform3D(Rotation3D(),
2582 Position(backCool.barHeight - backCoolHeight * 0.5 -
2583 backCoolTank.backBracketHeight * 0.5 + bottomThick,
2584 -backCool.barWidth * 0.5 - backCoolTank.width * 0.5,
2587 edm::LogVerbatim(
"EBGeomX") << backBracketLog.name() <<
":" << copyOne <<
" positioned in " 2588 << backCoolLog.name() <<
" at (" 2590 backCoolTank.backBracketHeight * 0.5 + bottomThick)
2591 <<
"," <<
cms::convert2mm(-backCool.barWidth * 0.5 - backCoolTank.width * 0.5)
2592 <<
",0) with no rotation";
2597 Position bSumTra(backCool.barHeight - backCoolHeight * 0.5 + bottomThick, 0, 0);
2598 for (
unsigned int j(0);
j != nMisc; ++
j) {
2599 Solid bSolid = Box(backMisc.vecName[iMod * nMisc +
j],
2600 backMisc.vecThick[iMod * nMisc +
j] * 0.5,
2601 backCool.barWidth * 0.5 + backCoolTank.width,
2606 <<
cms::convert2mm(backCool.barWidth * 0.5 + backCoolTank.width) <<
":" 2611 Volume(backMisc.vecName[iMod * nMisc +
j], bSolid, ns.
material(backMisc.vecMat[iMod * nMisc +
j]));
2613 const Position bTra(backMisc.vecThick[iMod * nMisc +
j] * 0.5, 0 * dd4hep::mm, 0 * dd4hep::mm);
2615 if (0 != backMisc.here) {
2616 backCoolLog.placeVolume(bLog, copyOne, Transform3D(Rotation3D(), bSumTra + bTra));
2618 edm::LogVerbatim(
"EBGeomX") << bLog.name() <<
":" << copyOne <<
" positioned in " << backCoolLog.name()
2625 bSumTra += 2 * bTra;
2628 const double bHalfWidth(backCool.barWidth * 0.5 + backCoolTank.width);
2630 if (0 != mbLyr.here) {
2631 Position mTra(-backCoolHeight * 0.5 + mbCoolTube.outDiam, 0, 0);
2632 for (
unsigned int j(0);
j != mbLyr.vecMBLyrThick.size(); ++
j)
2634 Solid mSolid = Box(mbLyr.vecMBLyrThick[
j] * 0.5, bHalfWidth, halfZBCool);
2643 mTra +=
Position(mbLyr.vecMBLyrThick[
j] * 0.5, 0 * dd4hep::mm, 0 * dd4hep::mm);
2644 backCoolLog.placeVolume(mLog, copyOne, Transform3D(Rotation3D(), mTra));
2646 edm::LogVerbatim(
"EBGeomX") << mLog.name() <<
":" << copyOne <<
" positioned in " << backCoolLog.name()
2650 mTra +=
Position(mbLyr.vecMBLyrThick[
j] * 0.5, 0 * dd4hep::mm, 0 * dd4hep::mm);
2654 if (0 != mbCoolTube.here) {
2655 const string mBName(mbCoolTube.name +
"_" +
std::to_string(iMod + 1));
2657 Solid mBCoolTubeSolid = Tube(0, mbCoolTube.outDiam * 0.5, halfZBCool, 0._deg, 360._deg);
2664 const string mBWaName(mbCoolTube.name +
"Wa_" +
std::to_string(iMod + 1));
2665 Solid mBCoolTubeWaSolid = Tube(mBWaName, 0, mbCoolTube.innDiam * 0.5, halfZBCool, 0._deg, 360._deg);
2671 mBLog.placeVolume(mBWaLog, copyOne);
2673 edm::LogVerbatim(
"EBGeomX") << mBWaLog.name() <<
":" << copyOne <<
" positioned in " << mBLog.name()
2674 <<
" at (0,0,0) with no rotation";
2677 for (
unsigned int j(0);
j != dryAirTube.mbCoolTubeNum; ++
j)
2679 backCoolLog.placeVolume(mBLog,
2681 Transform3D(Rotation3D(),
2682 Position(-backCoolHeight * 0.5 + mbCoolTube.outDiam * 0.5,
2683 -bHalfWidth + (
j + 1) * bHalfWidth / 5,
2686 edm::LogVerbatim(
"EBGeomX") << mBLog.name() <<
":" << (2 *
j + 1) <<
" positioned in " << backCoolLog.name()
2687 <<
" at (" <<
cms::convert2mm(-backCoolHeight * 0.5 + mbCoolTube.outDiam * 0.5)
2689 <<
",0) with no rotation";
2699 if (0 != backPipe.here && 0 != iMod) {
2700 string bPipeName(backPipe.name +
"_" +
std::to_string(iMod + 1));
2701 string bInnerName(backPipe.name +
"_H2O_" +
std::to_string(iMod + 1));
2703 Solid backPipeSolid =
2704 Tube(bPipeName, 0 * dd4hep::mm, backPipe.vecDiam[iMod] * 0.5, pipeLength * 0.5, 0._deg, 360._deg);
2705 Solid backInnerSolid = Tube(bInnerName,
2707 backPipe.vecDiam[iMod] * 0.5 - backPipe.vecThick[iMod],
2713 <<
":0:" <<
cms::convert2mm(backPipe.vecDiam[iMod] * 0.5) <<
":0:360";
2715 <<
":0:" <<
cms::convert2mm(backPipe.vecDiam[iMod] * 0.5 - backPipe.vecThick[iMod])
2722 const Position bPipeTra1(back.xOff + back.sideHeight - 0.7 * backPipe.vecDiam[iMod],
2723 back.yOff + back.plateWidth * 0.5 - back.sideWidth - 0.7 * backPipe.vecDiam[iMod],
2726 ns.
assembly(spm.name).placeVolume(backPipeLog, copyOne, Transform3D(Rotation3D(), bPipeTra1));
2728 edm::LogVerbatim(
"EBGeomX") << backPipeLog.name() <<
":" << copyOne <<
" positioned in " 2731 <<
") with no rotation";
2733 const Position bPipeTra2(bPipeTra1.x(),
2734 back.yOff - back.plateWidth * 0.5 + back.sideWidth + backPipe.vecDiam[iMod],
2737 ns.
assembly(spm.name).placeVolume(backPipeLog, copyTwo, Transform3D(Rotation3D(), bPipeTra2));
2739 edm::LogVerbatim(
"EBGeomX") << backPipeLog.name() <<
":" << copyTwo <<
" positioned in " 2742 <<
") with no rotation";
2745 backPipeLog.placeVolume(backInnerLog, copyOne, Transform3D(Rotation3D(),
Position()));
2747 edm::LogVerbatim(
"EBGeomX") << backInnerLog.name() <<
":" << copyOne <<
" positioned in " 2748 << backPipeLog.name() <<
" at (0,0,0) with no rotation";
2759 if (0 != dryAirTube.here) {
2760 string dryAirTubName(dryAirTube.name +
std::to_string(iMod + 1));
2762 Solid dryAirTubeSolid = Tube(
2763 dryAirTubName, dryAirTube.innDiam * 0.5, dryAirTube.outDiam * 0.5, pipeLength * 0.5, 0._deg, 360._deg);
2769 Volume dryAirTubeLog =
Volume((myns + dryAirTubName), dryAirTubeSolid, ns.
material(dryAirTube.mat));
2771 const Position dryAirTubeTra1(back.xOff + back.sideHeight - 0.7 * dryAirTube.outDiam - backPipe.vecDiam[iMod],
2772 back.yOff + back.plateWidth * 0.5 - back.sideWidth - 1.2 * dryAirTube.outDiam,
2775 ns.
assembly(spm.name).placeVolume(dryAirTubeLog, copyOne, Transform3D(Rotation3D(), dryAirTubeTra1));
2777 edm::LogVerbatim(
"EBGeomX") << dryAirTubeLog.name() <<
":" << copyOne <<
" positioned in " 2783 const Position dryAirTubeTra2(dryAirTubeTra1.x(),
2784 back.yOff - back.plateWidth * 0.5 + back.sideWidth + 0.7 * dryAirTube.outDiam,
2785 dryAirTubeTra1.z());
2787 ns.
assembly(spm.name).placeVolume(dryAirTubeLog, copyTwo, Transform3D(Rotation3D(), dryAirTubeTra2));
2789 edm::LogVerbatim(
"EBGeomX") << dryAirTubeLog.name() <<
":" << copyTwo <<
" positioned in " 2803 Position cTra(backCool.barHeight * 0.5 - backCoolHeight * 0.5 + bottomThick, 0, -halfZTank + halfZCoolVFE);
2804 const unsigned int numSec(static_cast<unsigned int>(backCool.vecBackCoolNSec[iMod]));
2805 for (
unsigned int jSec(0); jSec != numSec; ++jSec) {
2806 const unsigned int nMax(static_cast<unsigned int>(backCool.vecBackCoolNPerSec[iNSec++]));
2807 for (
unsigned int iBar(0); iBar !=
nMax; ++iBar) {
2808 backCoolLog.placeVolume(backCoolVFELog, iCVFECopy++, cTra);
2810 edm::LogVerbatim(
"EBGeomX") << backCoolVFELog.name() <<
":" << iCVFECopy <<
" positioned in " 2813 <<
") with no rotation";
2815 cTra +=
Position(0, 0, backMisc.backCBStdSep);
2817 cTra -=
Position(0, 0, backMisc.backCBStdSep);
2818 if (jSec != numSec - 1)
2819 cTra +=
Position(0, 0, backCool.vecBackCoolSecSep[iSep++]);
2840 double patchHeight(0);
2841 for (
unsigned int iPatch(0); iPatch != patchPanel.vecThick.size(); ++iPatch) {
2842 patchHeight += patchPanel.vecThick[iPatch];
2845 array<double, 3> patchParms{{patchHeight * 0.5,
2846 backCool.barWidth * 0.5,
2847 (spm.vecZPts.back() - grille.vecZOff.back() - grille.thick) / 2}};
2848 Solid patchSolid = Box(patchParms[0], patchParms[1], patchParms[2]);
2856 back.xOff + 4 * dd4hep::mm, 0 * dd4hep::mm, grille.vecZOff.back() + grille.thick + patchParms[2]);
2857 if (0 != patchPanel.here) {
2858 ns.
assembly(spm.name).placeVolume(patchLog, copyOne, patchTra);
2860 edm::LogVerbatim(
"EBGeomX") << patchLog.name() <<
":" << copyOne <<
" positioned in " << spm.name <<
" at (" 2866 Position pTra(-patchParms[0], 0, 0);
2868 for (
unsigned int j(0);
j != patchPanel.vecNames.size(); ++
j) {
2869 Solid pSolid = Box(patchPanel.vecThick[
j] * 0.5, patchParms[1], patchParms[2]);
2876 pTra +=
Position(patchPanel.vecThick[
j] * 0.5, 0 * dd4hep::mm, 0 * dd4hep::mm);
2877 patchLog.placeVolume(pLog, copyOne, pTra);
2879 edm::LogVerbatim(
"EBGeomX") << pLog.name() <<
":" << copyOne <<
" positioned in " << patchLog.name() <<
" at (" 2884 pTra +=
Position(patchPanel.vecThick[
j] * 0.5, 0 * dd4hep::mm, 0 * dd4hep::mm);
2898 if (0 != pincer.rodHere) {
2901 Solid rodSolid = Box(pincer.rodName, pincer.envWidthHalf, pincer.envHeightHalf, ilyLengthHalf);
2908 array<double, 3> envParms{{pincer.envWidthHalf, pincer.envHeightHalf, pincer.envLengthHalf}};
2909 Solid envSolid = Box(pincer.envName, envParms[0], envParms[1], envParms[2]);
2916 array<double, 3> blkParms{{pincer.envWidthHalf, pincer.envHeightHalf, pincer.blkLengthHalf}};
2917 Solid blkSolid = Box(pincer.blkName, blkParms[0], blkParms[1], blkParms[2]);
2924 envLog.placeVolume(blkLog, copyOne,
Position(0, 0, pincer.envLengthHalf - pincer.blkLengthHalf));
2926 edm::LogVerbatim(
"EBGeomX") << blkLog.name() <<
":" << copyOne <<
" positioned in " << envLog.name()
2927 <<
" at (0,0," <<
cms::convert2mm(pincer.envLengthHalf - pincer.blkLengthHalf)
2928 <<
") with no rotation";
2931 array<double, 3> cutParms{{pincer.cutWidth * 0.5, pincer.cutHeight * 0.5, pincer.blkLengthHalf}};
2932 Solid cutSolid = Box(pincer.cutName, cutParms[0], cutParms[1], cutParms[2]);
2942 +blkParms[0] - cutParms[0] - pincer.shim1Width + pincer.shim2Width, -blkParms[1] + cutParms[1], 0));
2944 edm::LogVerbatim(
"EBGeomX") << cutLog.name() <<
":" << copyOne <<
" positioned in " << blkLog.name() <<
" at (" 2947 <<
"," <<
cms::convert2mm(-blkParms[1] + cutParms[1]) <<
",0) with no rotation";
2949 array<double, 3> shim2Parms{{pincer.shim2Width * 0.5, pincer.shimHeight * 0.5, pincer.blkLengthHalf}};
2950 Solid shim2Solid = Box(pincer.shim2Name, shim2Parms[0], shim2Parms[1], shim2Parms[2]);
2956 cutLog.placeVolume(shim2Log, copyOne,
Position(+cutParms[0] - shim2Parms[0], -cutParms[1] + shim2Parms[1], 0));
2958 edm::LogVerbatim(
"EBGeomX") << shim2Log.name() <<
":" << copyOne <<
" positioned in " << cutLog.name()
2960 <<
cms::convert2mm(-cutParms[1] + shim2Parms[1]) <<
",0) with no rotation";
2963 array<double, 3> shim1Parms{
2964 {pincer.shim1Width * 0.5, pincer.shimHeight * 0.5, pincer.envLengthHalf - pincer.blkLengthHalf}};
2965 Solid shim1Solid = Box(pincer.shim1Name, shim1Parms[0], shim1Parms[1], shim1Parms[2]);
2974 Position(+envParms[0] - shim1Parms[0], -envParms[1] + shim1Parms[1], -envParms[2] + shim1Parms[2]));
2976 edm::LogVerbatim(
"EBGeomX") << shim1Log.name() <<
":" << copyOne <<
" positioned in " << envLog.name()
2979 <<
cms::convert2mm(-envParms[2] + shim1Parms[2]) <<
") with no rotation";
2982 for (
unsigned int iEnv(0); iEnv != pincer.vecEnvZOff.size(); ++iEnv) {
2984 envLog, 1 + iEnv,
Position(0, 0, -ilyLengthHalf + pincer.vecEnvZOff[iEnv] - pincer.envLengthHalf));
2986 edm::LogVerbatim(
"EBGeomX") << envLog.name() <<
":" << (1 + iEnv) <<
" positioned in " << rodLog.name()
2989 pincer.envLengthHalf)
2990 <<
") with no rotation";
2995 const double radius(ilyRMin - pincer.envHeightHalf - 1 * dd4hep::mm);
2996 const string xilyName(ily.name +
std::to_string(ily.vecIlyMat.size() - 1));
2998 for (
unsigned int iRod(0); iRod != pincer.vecRodAzimuth.size(); ++iRod) {
3000 xilyLog.placeVolume(rodLog,
3002 Transform3D(myrot(ns,
3004 CLHEP::HepRotationZ(90._deg + pincer.vecRodAzimuth[iRod])),
3007 edm::LogVerbatim(
"EBGeomX") << rodLog.name() <<
":" << (1 + iRod) <<
" positioned in " << xilyLog.name()
VertexList vertexList() const
Log< level::Info, true > LogVerbatim
HepGeom::Point3D< double > Pt3D
const dd4hep::Rotation3D & rotation(const std::string &name) const
HepGeom::Translate3D Tl3D
constexpr NumType convertRadToDeg(NumType radians)
constexpr NumType convert2mm(NumType length)
dd4hep::Assembly addAssembly(dd4hep::Assembly asmb, bool addSolid=true) const
Sin< T >::type sin(const T &t)
HepGeom::Transform3D Tf3D
std::string to_string(const V &value)
dd4hep::Material material(const std::string &name) const
static std::string const input
#define DECLARE_DDCMS_DETELEMENT(name, func)
static double delPhi(const double phi1, const double phi2)
void addRotation(const std::string &name, const dd4hep::Rotation3D &rot) const
Cos< T >::type cos(const T &t)
dd4hep::Volume addVolume(dd4hep::Volume vol) const
Namespace of DDCMS conversion namespace.
CaloCellGeometry::Pt3D Pt3D
Crystal()=default
Empty constructor.
char data[epos_bytes_allocation]
static std::atomic< unsigned int > counter
static constexpr float b2
math::XYZVector XYZVector
Geom::Theta< T > theta() const
CaloCellGeometry::Pt3DVec VertexList
vector< double > VecDouble
dd4hep::Volume volume(const std::string &name, bool exc=true) const
static constexpr float b1
static long algorithm(dd4hep::Detector &, cms::DDParsingContext &ctxt, xml_h e)
std::string prepend(const std::string &) const
dd4hep::Assembly assembly(const std::string &name, bool exception=true) const