34 #include "GaudiKernel/SystemOfUnits.h"
38 const std::string&
t,
const std::string&
n,
const IInterface*
p)
51 if (m_trackingVolumeArrayCreator.retrieve().isFailure()) {
52 ATH_MSG_FATAL(
"Failed to retrieve tool " << m_trackingVolumeArrayCreator);
53 return StatusCode::FAILURE;
55 ATH_MSG_INFO(
"Retrieved tool " << m_trackingVolumeArrayCreator);
59 if (m_trackingVolumeHelper.retrieve().isFailure()) {
60 ATH_MSG_FATAL(
"Failed to retrieve tool " << m_trackingVolumeHelper);
61 return StatusCode::FAILURE;
63 ATH_MSG_INFO(
"Retrieved tool " << m_trackingVolumeHelper);
66 if (m_buildMBTS && m_trackingVolumeCreator.retrieve().isFailure()) {
67 ATH_MSG_FATAL(
"Failed to retrieve tool " << m_trackingVolumeCreator);
68 return StatusCode::FAILURE;
70 ATH_MSG_INFO(
"Retrieved tool " << m_trackingVolumeCreator);
76 if (m_lArVolumeBuilder.retrieve().isFailure()) {
77 ATH_MSG_FATAL(
"Failed to retrieve tool " << m_lArVolumeBuilder);
78 return StatusCode::FAILURE;
84 if (m_tileVolumeBuilder.retrieve().isFailure()) {
85 ATH_MSG_FATAL(
"Failed to retrieve tool " << m_tileVolumeBuilder);
86 return StatusCode::FAILURE;
92 return StatusCode::SUCCESS;
95 std::unique_ptr<Trk::TrackingGeometry>
108 double enclosedInnerSectorHalflength = 0.;
109 double enclosedInnerSectorRadius = 0.;
123 if (!innerDetectorBounds)
126 enclosedInnerSectorHalflength = innerDetectorBounds->
halflengthZ();
127 enclosedInnerSectorRadius = innerDetectorBounds->
outerRadius();
129 keyDim.emplace_back(enclosedInnerSectorRadius, enclosedInnerSectorHalflength);
133 m_enclosingEnvelopeSvc->getCaloRZBoundary();
137 for (
unsigned int i = 0;
i < envelopeDefsIn.size();
i++) {
140 else if (envelopeDefsIn[
i].
second == envelopeDefsIn[ii].
second &&
141 envelopeDefsIn[
i].
first > envelopeDefsIn[ii].
first)
147 unsigned int inext = ii + 1;
148 if (inext == envelopeDefsIn.size())
150 if (envelopeDefsIn[inext].
second != envelopeDefsIn[ii].
second) {
152 inext = ii > 0 ? ii - 1 : envelopeDefsIn.size() - 1;
158 for (
unsigned int i = inext;
i < envelopeDefsIn.size();
i++)
159 envelopeDefs.push_back(envelopeDefsIn[
i]);
161 for (
unsigned int i = 0;
i <= inext - 1;
i++)
162 envelopeDefs.push_back(envelopeDefsIn[
i]);
166 envelopeDefs.push_back(envelopeDefsIn[
i]);
169 inext = envelopeDefsIn.size() - 1;
170 while (inext >= ii) {
171 envelopeDefs.push_back(envelopeDefsIn[inext]);
176 double envEnclosingVolumeHalfZ = m_caloDefaultHalflengthZ;
180 for (
unsigned int i = 0;
i < envelopeDefs.size();
i++) {
183 if (std::abs(envelopeDefs[
i].
second) < envEnclosingVolumeHalfZ)
184 envEnclosingVolumeHalfZ = std::abs(envelopeDefs[
i].
second);
186 if (envelopeDefs[
i].
first > 1100. && envelopeDefs[
i].
first < 1200. &&
189 if (enclosedInnerSectorRadius != envelopeDefs[
i].
first)
191 "Enclosed ID volume radius does not match ID envelope, adjusting "
193 envEnclosingVolumeHalfZ = envelopeDefs[
i].second;
195 enclosedInnerSectorRadius = envelopeDefs[
i].first;
196 enclosedInnerSectorHalflength = envelopeDefs[
i].second;
202 if (envelopeDefs[
i].
second > 0. && envelopeDefs[
i].
second < 6785. &&
203 (envelopeDefs[
i].
first > 1200. ||
204 envelopeDefs[
i].
second > envEnclosingVolumeHalfZ)) {
205 if (msCutouts.empty())
206 msCutouts.push_back(envelopeDefs[
i]);
209 while (envIter != msCutouts.end() &&
210 (*envIter).second < envelopeDefs[
i].second)
212 while (envIter != msCutouts.end() &&
213 (*envIter).second == envelopeDefs[
i].second &&
214 (*envIter).first > envelopeDefs[
i].first)
216 msCutouts.insert(envIter, envelopeDefs[
i]);
222 for (
unsigned int i = 0;
i < msCutouts.size();
i++)
224 <<
i <<
":" << msCutouts[
i].
first <<
","
229 double caloDefaultRadius = m_caloDefaultRadius;
230 double caloDefaultHalflengthZ = m_caloDefaultHalflengthZ;
232 if (!msCutouts.empty()) {
233 caloDefaultRadius = msCutouts[0].first;
234 caloDefaultHalflengthZ = msCutouts[0].second;
236 " Calo central cylinder dimensions adjusted using EnvelopeSvc:"
237 << m_caloDefaultRadius <<
"," << m_caloDefaultHalflengthZ);
244 enclosedInnerSectorRadius, enclosedInnerSectorHalflength);
250 dummyVolumes,
"Calo::GapVolumes::DummyID");
252 keyDim.emplace_back(enclosedInnerSectorRadius, enclosedInnerSectorHalflength);
256 const RZPairVector& bpDefs = m_enclosingEnvelopeSvc->getBeamPipeRZBoundary();
260 for (
unsigned int i = 0;
i < bpDefs.size();
i++) {
266 bpDefs[
i].
second >= envEnclosingVolumeHalfZ &&
267 bpDefs[
i].
second <= msCutouts.back().second) {
268 bpCutouts.push_back(bpDefs[
i]);
271 keyDim.push_back(bpDefs[
i]);
278 if (bpCutouts.size() > 1 &&
279 bpCutouts.back().second == bpCutouts[bpCutouts.size() - 2].second)
280 bpCutouts.erase(bpCutouts.end() - 1);
282 for (
unsigned int i = 0;
i < bpCutouts.size();
i++)
284 <<
i <<
":" << bpCutouts[
i].
first <<
","
287 keyDim.emplace_back(caloDefaultRadius, caloDefaultHalflengthZ);
296 const std::vector<Trk::TrackingVolume*>* lArVolumes =
297 m_lArVolumeBuilder->trackingVolumes(*caloDDM,geoAlign);
300 <<
" volumes retrieved from " << m_lArVolumeBuilder.name());
326 std::vector<Trk::TrackingVolume*>* tileVolumes =
327 m_tileVolumeBuilder->trackingVolumes(*caloDDM,geoAlign);
330 <<
" volumes retrieved from " << m_tileVolumeBuilder.name());
331 if (msgLvl(MSG::INFO)) {
333 "--------------- detailed output "
334 "---------------------------------------------------------- ");
335 std::vector<Trk::TrackingVolume*>::const_iterator tileVolIter =
336 tileVolumes->begin();
337 std::vector<Trk::TrackingVolume*>::const_iterator tileVolIterEnd =
339 for (; tileVolIter != tileVolIterEnd;
353 double rTileMin = ebBounds ? ebBounds->
innerRadius() : 2288.;
354 double zTileMin = ebBounds ? tilePositiveExtendedBarrel->
center().z() -
358 keyDim.emplace_back(rTileMin, zTileMin);
359 for (
unsigned int i = 0;
i < keyDim.size();
i++) {
373 if (!lArBarrelBounds)
378 if (!lArPositiveEndcapBounds)
383 if (!lArNegativeEndcapBounds)
388 if (!lArPositiveHecBounds)
393 if (!lArPositiveFcalBounds)
398 if (!lArNegativeFcalBounds)
404 if (!tileCombinedBounds)
423 double caloPositiveOuterBoundary = tileCombinedBounds->
halflengthZ();
425 double lArPositiveOuterBoundary = lArPositiveFcal->
center().z();
426 lArPositiveOuterBoundary += lArPositiveFcalBounds->
halflengthZ();
434 float caloVolsOuterRadius = tileCombinedBounds->
outerRadius();
435 float caloVolsExtendZ = caloPositiveOuterBoundary;
444 float rInnerGapBP = 0.;
445 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*> innerGapBP =
446 createBeamPipeVolumes(
447 bpCutouts, keyDim[0].
second,
449 keyDim.back().second,
"InnerGap", rInnerGapBP);
451 double z = 0.5 * (keyDim.back().second + keyDim[0].second);
453 auto mbtsNegLayers = std::make_unique<std::vector<Trk::Layer*>>();
454 auto mbtsPosLayers = std::make_unique<std::vector<Trk::Layer*>>();
456 if (lArPositiveMBTS && lArNegativeMBTS) {
461 if (mbtsBounds && m_buildMBTS) {
479 mbtsPosZpos, dibo->
clone(),
485 mbtsNegLayers->push_back(mbtsNegLayer);
486 mbtsPosLayers->push_back(mbtsPosLayer);
494 keyDim[0].
first, 0.5 * (keyDim.back().second - keyDim[0].second));
499 lArG1P, lArG1Bounds, lArSectorInnerGapMaterial, mbtsPosLayers.release(),
500 "Calo::GapVolumes::LAr::PositiveSectorInnerGap");
505 lArG1N, lArG1Bounds->
clone(), lArSectorInnerGapMaterial,
506 mbtsNegLayers.release(),
"Calo::GapVolumes::LAr::NegativeSectorInnerGap");
510 if (innerGapBP.first) {
511 std::vector<Trk::TrackingVolume*> volsInnerGap;
512 volsInnerGap.push_back(innerGapBP.first);
513 volsInnerGap.push_back(lArPositiveSectorInnerGap);
514 positiveInnerGap = m_trackingVolumeCreator->createContainerTrackingVolume(
515 volsInnerGap, m_caloMaterial,
"Calo::Container::PositiveInnerGap");
517 positiveInnerGap = lArPositiveSectorInnerGap;
520 if (innerGapBP.second) {
521 std::vector<Trk::TrackingVolume*> volsInnerGap;
522 volsInnerGap.push_back(innerGapBP.second);
523 volsInnerGap.push_back(lArNegativeSectorInnerGap);
524 negativeInnerGap = m_trackingVolumeCreator->createContainerTrackingVolume(
525 volsInnerGap, m_caloMaterial,
"Calo::Container::NegativeInnerGap");
527 negativeInnerGap = lArNegativeSectorInnerGap;
530 std::vector<Trk::TrackingVolume*> inBufferVolumes;
531 inBufferVolumes.push_back(negativeInnerGap);
532 inBufferVolumes.push_back(innerVol);
533 inBufferVolumes.push_back(positiveInnerGap);
536 m_trackingVolumeCreator->createContainerTrackingVolume(
537 inBufferVolumes, m_caloMaterial,
538 "Calo::Container::EnclosedInnerDetector");
545 float rEndcapBP = 0.;
546 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*> endcapBP =
547 createBeamPipeVolumes(bpCutouts, keyDim.back().second,
548 lArPositiveEndcap->
center().z() +
550 "Endcap", rEndcapBP);
574 ecpPos, ecpUpBounds, m_Al, dummyLayers, dummyVolumes,
575 "Calo::GapVolumes::LAr::PositiveECPresamplerCover");
577 ecpNeg, ecpUpBounds->
clone(), m_Al, dummyLayers, dummyVolumes,
578 "Calo::GapVolumes::LAr::NegativeECPresamplerCover");
581 dummyVolumes,
"Calo::GapVolumes::LAr::PositiveECPresamplerInner");
584 dummyVolumes,
"Calo::GapVolumes::LAr::NegativeECPresamplerInner");
587 std::vector<Trk::TrackingVolume*> volsECP;
588 volsECP.push_back(ecPresamplerInnerPos);
589 volsECP.push_back(lArPosECPresampler);
590 volsECP.push_back(ecPresamplerCoverPos);
592 m_trackingVolumeCreator->createContainerTrackingVolume(
593 volsECP, m_caloMaterial,
"Calo::Container::PositiveECPresamplerR");
594 std::vector<Trk::TrackingVolume*> volsECN;
595 volsECN.push_back(ecPresamplerInnerNeg);
596 volsECN.push_back(lArNegECPresampler);
597 volsECN.push_back(ecPresamplerCoverNeg);
599 m_trackingVolumeCreator->createContainerTrackingVolume(
600 volsECN, m_caloMaterial,
"Calo::Container::NegativeECPresamplerR");
603 z = lArPosECPresampler->
center().z() - ecpHz;
604 float z1 = lArPosECPresampler->
center().z() + ecpHz;
612 rEndcapBP, keyDim.back().first, 0.5 * (
z - keyDim.back().second));
618 rEndcapBP, keyDim.back().first, 0.5 * (z2 - z1));
621 ecIPos, ecpIBounds, m_Ar, dummyLayers, dummyVolumes,
622 "Calo::GapVolumes::LAr::PositiveECPresamplerIn");
624 ecINeg, ecpIBounds->
clone(), m_Ar, dummyLayers, dummyVolumes,
625 "Calo::GapVolumes::LAr::NegativeECPresamplerIn");
627 ecOPos, ecpOBounds, m_Ar, dummyLayers, dummyVolumes,
628 "Calo::GapVolumes::LAr::PositiveECPresamplerOut");
630 ecONeg, ecpOBounds->
clone(), m_Ar, dummyLayers, dummyVolumes,
631 "Calo::GapVolumes::LAr::NegativeECPresamplerOut");
634 std::vector<Trk::TrackingVolume*> volECP;
635 volECP.push_back(ecPresamplerInPos);
636 volECP.push_back(positiveECP);
637 volECP.push_back(ecPresamplerOutPos);
639 m_trackingVolumeCreator->createContainerTrackingVolume(
640 volECP, m_caloMaterial,
"Calo::Container::PositiveECPresampler");
641 std::vector<Trk::TrackingVolume*> volECN;
642 volECN.push_back(ecPresamplerOutNeg);
643 volECN.push_back(negativeECP);
644 volECN.push_back(ecPresamplerInNeg);
646 m_trackingVolumeCreator->createContainerTrackingVolume(
647 volECN, m_caloMaterial,
"Calo::Container::NegativeECPresampler");
665 ecPos, ecUpBounds, m_Ar, dummyLayers, dummyVolumes,
666 "Calo::GapVolumes::LAr::PositiveEndcapCover");
668 ecNeg, ecUpBounds->
clone(), m_Ar, dummyLayers, dummyVolumes,
669 "Calo::GapVolumes::LAr::NegativeEndcapCover");
672 dummyVolumes,
"Calo::GapVolumes::LAr::PositiveEndcapInner");
675 dummyVolumes,
"Calo::GapVolumes::LAr::NegativeEndcapInner");
678 std::vector<Trk::TrackingVolume*> volsEC;
679 volsEC.push_back(ecInnerPos);
680 volsEC.push_back(lArPositiveEndcap);
681 volsEC.push_back(ecCoverPos);
683 m_trackingVolumeCreator->createContainerTrackingVolume(
684 volsEC, m_caloMaterial,
"Calo::Container::PositiveEndcapR");
685 std::vector<Trk::TrackingVolume*> volsEN;
686 volsEN.push_back(ecInnerNeg);
687 volsEN.push_back(lArNegativeEndcap);
688 volsEN.push_back(ecCoverNeg);
690 m_trackingVolumeCreator->createContainerTrackingVolume(
691 volsEN, m_caloMaterial,
"Calo::Container::NegativeEndcapR");
694 std::vector<Trk::TrackingVolume*> volEEP;
695 volEEP.push_back(positiveEP);
696 volEEP.push_back(positiveEC);
698 m_trackingVolumeCreator->createContainerTrackingVolume(
699 volEEP, m_caloMaterial,
"Calo::Container::PositiveEMEC");
700 std::vector<Trk::TrackingVolume*> volEEN;
701 volEEN.push_back(negativeEC);
702 volEEN.push_back(negativeEP);
704 m_trackingVolumeCreator->createContainerTrackingVolume(
705 volEEN, m_caloMaterial,
"Calo::Container::NegativeEMEC");
709 std::vector<Trk::TrackingVolume*> volsEndcapPos;
711 volsEndcapPos.push_back(endcapBP.first);
712 volsEndcapPos.push_back(positiveEEP);
714 std::unique_ptr<Trk::TrackingVolume> positiveEndcap(
715 m_trackingVolumeCreator->createContainerTrackingVolume(
716 volsEndcapPos, m_caloMaterial,
"Calo::Container::PositiveEndcap"));
718 std::vector<Trk::TrackingVolume*> volsEndcapNeg;
720 volsEndcapNeg.push_back(endcapBP.second);
721 volsEndcapNeg.push_back(negativeEEP);
723 std::unique_ptr<Trk::TrackingVolume> negativeEndcap(
724 m_trackingVolumeCreator->createContainerTrackingVolume(
725 volsEndcapNeg, m_caloMaterial,
"Calo::Container::NegativeEndcap"));
731 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*> hecBP =
732 createBeamPipeVolumes(
752 lArHecPos, lArHecInnerGapBounds, m_Al, dummyLayers, dummyVolumes,
753 "Calo::GapVolumes::LAr::PositiveHecInnerGap");
756 lArHecNeg, lArHecInnerGapBounds->
clone(), m_Al, dummyLayers, dummyVolumes,
757 "Calo::GapVolumes::LAr::NegativeHecInnerGap");
766 dummyVolumes,
"Calo::GapVolumes::LAr::PositiveHecOuterGap");
770 dummyLayers, dummyVolumes,
"Calo::GapVolumes::LAr::NegativeHecOuterGap");
774 std::vector<Trk::TrackingVolume*> volsHecPos;
776 volsHecPos.push_back(hecBP.first);
777 volsHecPos.push_back(lArPositiveHecInnerGap);
778 volsHecPos.push_back(lArPositiveHec);
779 volsHecPos.push_back(lArPositiveHecOuterGap);
781 std::unique_ptr<Trk::TrackingVolume> positiveHec(
782 m_trackingVolumeCreator->createContainerTrackingVolume(
783 volsHecPos, m_caloMaterial,
"Calo::Container::PositiveHec"));
785 std::vector<Trk::TrackingVolume*> volsHecNeg;
787 volsHecNeg.push_back(hecBP.second);
788 volsHecNeg.push_back(lArNegativeHecInnerGap);
789 volsHecNeg.push_back(lArNegativeHec);
790 volsHecNeg.push_back(lArNegativeHecOuterGap);
792 std::unique_ptr<Trk::TrackingVolume> negativeHec(
793 m_trackingVolumeCreator->createContainerTrackingVolume(
794 volsHecNeg, m_caloMaterial,
"Calo::Container::NegativeHec"));
801 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*> fcalBP =
802 createBeamPipeVolumes(
811 if (rFcalBP > lArPositiveFcalBounds->
innerRadius()) {
813 << rFcalBP <<
">" << lArPositiveFcalBounds->
innerRadius()
830 lArFcalPos, lArFcalInnerGapBounds, m_Al, dummyLayers, dummyVolumes,
831 "Calo::GapVolumes::LAr::PositiveFcalInnerGap");
834 lArFcalNeg, lArFcalInnerGapBounds->
clone(), m_Al, dummyLayers,
835 dummyVolumes,
"Calo::GapVolumes::LAr::NegativeFcalInnerGap");
845 dummyLayers, dummyVolumes,
"Calo::GapVolumes::LAr::PositiveFcalOuterGap");
849 dummyLayers, dummyVolumes,
"Calo::GapVolumes::LAr::NegativeFcalOuterGap");
853 std::vector<Trk::TrackingVolume*> volsFcalPos;
855 volsFcalPos.push_back(fcalBP.first);
856 volsFcalPos.push_back(lArPositiveFcalInnerGap);
857 volsFcalPos.push_back(lArPositiveFcal);
858 volsFcalPos.push_back(lArPositiveHecFcalCover);
859 volsFcalPos.push_back(lArPositiveFcalOuterGap);
861 std::unique_ptr<Trk::TrackingVolume> positiveFcal(
862 m_trackingVolumeCreator->createContainerTrackingVolume(
863 volsFcalPos, m_caloMaterial,
"Calo::Container::PositiveFcal"));
865 std::vector<Trk::TrackingVolume*> volsFcalNeg;
867 volsFcalNeg.push_back(fcalBP.second);
868 volsFcalNeg.push_back(lArNegativeFcalInnerGap);
869 volsFcalNeg.push_back(lArNegativeFcal);
870 volsFcalNeg.push_back(lArNegativeHecFcalCover);
871 volsFcalNeg.push_back(lArNegativeFcalOuterGap);
873 std::unique_ptr<Trk::TrackingVolume> negativeFcal(
874 m_trackingVolumeCreator->createContainerTrackingVolume(
875 volsFcalNeg, m_caloMaterial,
"Calo::Container::NegativeFcal"));
882 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*> outBP =
883 createBeamPipeVolumes(bpCutouts, lArPositiveOuterBoundary,
884 caloPositiveOuterBoundary,
"Outer", rOutBP);
893 0.5 * (caloPositiveOuterBoundary - lArPositiveOuterBoundary));
897 430., keyDim.back().first,
899 0.5 * (caloPositiveOuterBoundary - lArPositiveOuterBoundary));
901 z = 0.5 * (caloPositiveOuterBoundary + lArPositiveOuterBoundary);
909 lArSecOutG0P, lArSectorOuterG0Bounds, lArSectorOuterGapMat, dummyLayers,
910 dummyVolumes,
"Calo::GapVolumes::LAr::PositiveSectorOuterGap0");
913 lArSecOutG1P, lArSectorOuterG1Bounds, m_Ar, dummyLayers, dummyVolumes,
914 "Calo::GapVolumes::LAr::PositiveSectorOuterGap");
921 lArNegativeSectorOuterGap0 =
923 lArSectorOuterGapMat, dummyLayers, dummyVolumes,
924 "Calo::GapVolumes::LAr::NegativeSectorOuterGap0");
927 lArSecOutG1N, lArSectorOuterG1Bounds->
clone(), m_Ar, dummyLayers,
928 dummyVolumes,
"Calo::GapVolumes::LAr::NegativeSectorOuterGap");
931 std::vector<Trk::TrackingVolume*> volsOuterGapP;
933 volsOuterGapP.push_back(outBP.first);
934 volsOuterGapP.push_back(lArPositiveSectorOuterGap0);
935 volsOuterGapP.push_back(lArPositiveSectorOuterGap);
936 std::unique_ptr<Trk::TrackingVolume> positiveOuterGap(
937 m_trackingVolumeCreator->createContainerTrackingVolume(
938 volsOuterGapP, m_caloMaterial,
"Calo::Container::PositiveOuterGap"));
940 std::vector<Trk::TrackingVolume*> volsOuterGapN;
942 volsOuterGapN.push_back(outBP.second);
943 volsOuterGapN.push_back(lArNegativeSectorOuterGap0);
944 volsOuterGapN.push_back(lArNegativeSectorOuterGap);
945 std::unique_ptr<Trk::TrackingVolume> negativeOuterGap(
946 m_trackingVolumeCreator->createContainerTrackingVolume(
947 volsOuterGapN, m_caloMaterial,
"Calo::Container::NegativeOuterGap"));
954 std::vector<Trk::TrackingVolume*> lArNegativeSectorVolumes;
956 lArNegativeSectorVolumes.push_back(negativeOuterGap.release());
958 lArNegativeSectorVolumes.push_back(negativeFcal.release());
960 lArNegativeSectorVolumes.push_back(negativeHec.release());
962 lArNegativeSectorVolumes.push_back(negativeEndcap.release());
964 lArNegativeSector = m_trackingVolumeCreator->createContainerTrackingVolume(
965 lArNegativeSectorVolumes, m_caloMaterial,
966 "Calo::LAr::Container::NegativeSector");
971 std::vector<Trk::TrackingVolume*> lArPositiveSectorVolumes;
973 lArPositiveSectorVolumes.push_back(positiveEndcap.release());
975 lArPositiveSectorVolumes.push_back(positiveHec.release());
977 lArPositiveSectorVolumes.push_back(positiveFcal.release());
979 lArPositiveSectorVolumes.push_back(positiveOuterGap.release());
981 lArPositiveSector = m_trackingVolumeCreator->createContainerTrackingVolume(
982 lArPositiveSectorVolumes, m_caloMaterial,
983 "Calo::LAr::Container::PositiveSector");
998 dummyVolumes,
"Calo::GapVolumes::SolenoidGap");
1006 nullptr, lArTileCentralG1Bounds, m_Ar, dummyLayers, dummyVolumes,
1007 "Calo::GapVolumes::LArTileCentralSectorGap");
1011 std::vector<Trk::TrackingVolume*> lArCentralBarrelSectorVolumes;
1013 lArCentralBarrelSectorVolumes.push_back(trtSolenoidGap);
1015 lArCentralBarrelSectorVolumes.push_back(solenoid);
1017 lArCentralBarrelSectorVolumes.push_back(solenoidlArPresamplerGap);
1019 lArCentralBarrelSectorVolumes.push_back(lArBarrelPresampler);
1021 lArCentralBarrelSectorVolumes.push_back(lArBarrel);
1023 lArCentralBarrelSectorVolumes.push_back(lArTileCentralSectorGap);
1025 lArCentralBarrelSector =
1026 m_trackingVolumeCreator->createContainerTrackingVolume(
1027 lArCentralBarrelSectorVolumes, m_caloMaterial,
1028 "Calo::Containers::LAr::CentralBarrelSector",
false,
true);
1034 std::vector<Trk::IdentifiedMaterial> matCrack;
1037 matCrack.emplace_back(&m_Scint, baseID);
1038 matCrack.emplace_back(&m_caloMaterial, -1);
1039 matCrack.emplace_back(&m_Al, -1);
1050 std::vector<std::vector<size_t>> indexP;
1051 std::vector<std::vector<size_t>> indexN;
1053 std::vector<Trk::BinUtility*> layDN(bun->
bins());
1054 std::vector<Trk::BinUtility*> layUP(bup->
bins());
1055 double crackZ1 = 3532.;
1056 double crackZ2 = 3540.;
1058 std::vector<float>
steps;
1059 for (
unsigned int i = 0;
i < bup->
bins();
i++) {
1061 std::vector<size_t> indx;
1063 steps.push_back(crackZ1);
1064 indx.push_back(i < bup->
bins() - 1 ? 0 : 1);
1065 steps.push_back(crackZ2);
1067 steps.push_back(keyDim.back().second);
1070 indexP.push_back(indx);
1080 0.5 * (keyDim.back().second - crackZ1));
1081 z = 0.5 * (keyDim.back().second + crackZ1);
1086 crackPosTransform, align, crackBoundsPos, crackBinPos, 17,
1087 "Calo::Detectors::Tile::CrackPos");
1089 for (
unsigned int i = 0;
i < bun->
bins();
i++) {
1091 std::vector<size_t> indx;
1093 steps.push_back(-keyDim.back().second);
1095 steps.push_back(-crackZ2);
1096 indx.push_back(
i > 0 ? 0 : 1);
1097 steps.push_back(-crackZ1);
1100 indexN.push_back(indx);
1112 crackNegTransform, align, crackBoundsPos->
clone(), crackBinNeg, 17,
1113 "Calo::Detectors::Tile::CrackNeg");
1118 0.5 * (crackZ1 - lArBarrelBounds->
halflengthZ()));
1125 lArCentralG1P, lArCentralG1Bounds, m_Ar, dummyLayers, dummyVolumes,
1126 "Calo::GapVolumes::LArCentralPositiveGap");
1132 lArCentralG1N, lArCentralG1Bounds->
clone(), m_Ar, dummyLayers,
1133 dummyVolumes,
"Calo::GapVolumes::LArCentralNegativeGap");
1138 std::vector<Trk::TrackingVolume*> lArCentralSectorVolumes;
1140 lArCentralSectorVolumes.push_back(crackNeg);
1142 lArCentralSectorVolumes.push_back(lArCentralNegativeGap);
1144 lArCentralSectorVolumes.push_back(lArCentralBarrelSector);
1146 lArCentralSectorVolumes.push_back(lArCentralPositiveGap);
1148 lArCentralSectorVolumes.push_back(crackPos);
1150 lArCentralSector = m_trackingVolumeCreator->createContainerTrackingVolume(
1151 lArCentralSectorVolumes, m_caloMaterial,
1152 "Calo::Containers::LAr::CentralSector");
1157 std::vector<Trk::TrackingVolume*> caloCentralSectorVolumes;
1159 caloCentralSectorVolumes.push_back(inDetEnclosed);
1161 caloCentralSectorVolumes.push_back(lArCentralSector);
1163 caloCentralSector = m_trackingVolumeCreator->createContainerTrackingVolume(
1164 caloCentralSectorVolumes, m_caloMaterial,
1165 "Calo::Containers::CaloCentralSector");
1172 std::vector<Trk::TrackingVolume*> lArCombinedVolumes;
1174 lArCombinedVolumes.push_back(lArNegativeSector);
1176 lArCombinedVolumes.push_back(caloCentralSector);
1178 lArCombinedVolumes.push_back(lArPositiveSector);
1180 lArCombined = m_trackingVolumeCreator->createContainerTrackingVolume(
1181 lArCombinedVolumes, m_caloMaterial,
"Calo::Containers::LAr::Combined");
1186 std::vector<Trk::TrackingVolume*> caloVolumes;
1188 caloVolumes.push_back(lArCombined);
1190 caloVolumes.push_back(tileCombined);
1192 caloCombined = m_trackingVolumeCreator->createContainerTrackingVolume(
1193 caloVolumes, m_caloMaterial,
"Calo::Containers::CombinedCalo");
1203 if (caloVolsOuterRadius > caloDefaultRadius) {
1205 "Calo volumes exceeds envelope radius: adjusting envelope "
1206 "(de-synchronizing...)");
1207 caloDefaultRadius = caloVolsOuterRadius;
1210 if (caloVolsOuterRadius < caloDefaultRadius) {
1212 "Build radial buffer to synchronize the boundaries in between R "
1213 << caloVolsOuterRadius <<
" and " << caloDefaultRadius);
1216 caloVolsOuterRadius, caloDefaultRadius, caloVolsExtendZ);
1218 nullptr, centralSynBounds, m_caloMaterial, dummyLayers, dummyVolumes,
1219 "Calo::GapVolumes::EnvelopeBuffer");
1222 if (caloVolsExtendZ < caloDefaultHalflengthZ) {
1224 "Build longitudinal buffers to synchronize the boundaries in between Z "
1225 << caloVolsExtendZ <<
" and " << caloDefaultHalflengthZ);
1228 0., caloDefaultRadius,
1229 0.5 * (caloDefaultHalflengthZ - caloVolsExtendZ));
1232 0.0053 *
pow(0.38, 3));
1234 float zPos = 0.5 * (caloDefaultHalflengthZ + caloVolsExtendZ);
1237 endcapSynBounds, m_Ar, dummyLayers, dummyVolumes,
1238 "Calo::GapVolumes::PosECBuffer");
1242 endcapSynBounds->
clone(), m_Ar, dummyLayers, dummyVolumes,
1243 "Calo::GapVolumes::NegECBuffer");
1247 "All gap volumes for the Calorimeter created. Starting to build Volume "
1256 std::vector<float> zCutStep;
1257 std::vector<float> rCutStep;
1258 if (msCutouts.size() > 1) {
1259 zCutStep.push_back(msCutouts[0].
second);
1260 rCutStep.push_back(msCutouts[0].
first);
1261 for (
unsigned int i = 1;
i < msCutouts.size();
i++) {
1262 if (msCutouts[
i].
second == zCutStep.back())
1263 rCutStep.push_back(msCutouts[
i].
first);
1265 zCutStep.push_back(msCutouts[
i].
second);
1267 nCutVol = zCutStep.size() - 1;
1272 std::vector<Trk::TrackingVolume*> forwardCutoutVols;
1273 std::vector<Trk::TrackingVolume*> backwardCutoutVols;
1276 std::vector<Trk::Material> cutOutMat;
1277 cutOutMat.emplace_back(19.9, 213., 50., 23.,
1279 cutOutMat.push_back(m_caloMaterial);
1285 float rout = rCutStep[0];
1286 float zlow = zCutStep[0];
1287 for (
unsigned int i = 1;
i < zCutStep.size();
i++) {
1288 float zup = zCutStep[
i];
1289 float rcut = rCutStep[
i];
1290 std::stringstream
ss;
1293 float rCutOutBP = 0.;
1294 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*> cutOutBP =
1295 createBeamPipeVolumes(bpCutouts, zlow, zup,
"CutOuts" +
ss.str(),
1299 unsigned int mindex =
i > 1 ? 1 :
i;
1306 cutInBounds, cutOutMat[mindex], dummyLayers, dummyVolumes,
1307 "Calo::GapVolumes::CaloPositiveCutIn" +
ss.str());
1311 cutInBounds->
clone(), cutOutMat[mindex], dummyLayers, dummyVolumes,
1312 "Calo::GapVolumes::CaloNegativeCutIn" +
ss.str());
1320 cutOutBounds, m_caloMaterial, dummyLayers, dummyVolumes,
1321 "Muon::GapVolumes::CaloPositiveCutOut" +
ss.str());
1325 cutOutBounds->
clone(), m_caloMaterial, dummyLayers, dummyVolumes,
1326 "Muon::GapVolumes::CaloNegativeCutOut" +
ss.str());
1333 std::vector<Trk::TrackingVolume*> cvPos;
1334 cvPos.push_back(cutOutBP.first);
1335 cvPos.push_back(caloInPos);
1336 cvPos.push_back(caloOutPos);
1338 m_trackingVolumeCreator->createContainerTrackingVolume(
1339 cvPos, m_caloMaterial,
1340 "Calo::GapVolumes::CaloPositiveCutoutVolume" +
ss.str());
1341 forwardCutoutVols.push_back(cutOutPos);
1343 std::vector<Trk::TrackingVolume*> cvNeg;
1344 cvNeg.push_back(cutOutBP.second);
1345 cvNeg.push_back(caloInNeg);
1346 cvNeg.push_back(caloOutNeg);
1348 m_trackingVolumeCreator->createContainerTrackingVolume(
1349 cvNeg, m_caloMaterial,
1350 "Calo::GapVolumes::CaloNegativeCutoutVolume" +
ss.str());
1351 backwardCutoutVols.insert(backwardCutoutVols.begin(), cutOutNeg);
1359 if (!centralBuffer) {
1361 calorimeter = caloCombined;
1365 std::vector<Trk::TrackingVolume*> envRVols;
1366 envRVols.push_back(caloCombined);
1367 envRVols.push_back(centralBuffer);
1370 if (!forwardCutoutVols.empty() || ecNegBuffer) {
1373 m_trackingVolumeCreator->createContainerTrackingVolume(
1374 envRVols, m_caloMaterial,
"Calo::Containers::CombinedRCalo");
1375 std::vector<Trk::TrackingVolume*> envZVols;
1376 envZVols.reserve(backwardCutoutVols.size());
1377 for (
auto& backwardCutoutVol : backwardCutoutVols)
1378 envZVols.push_back(backwardCutoutVol);
1380 envZVols.push_back(ecNegBuffer);
1381 envZVols.push_back(caloRVolume);
1383 envZVols.push_back(ecPosBuffer);
1384 for (
auto& forwardCutoutVol : forwardCutoutVols)
1385 envZVols.push_back(forwardCutoutVol);
1387 calorimeter = m_trackingVolumeCreator->createContainerTrackingVolume(
1388 envZVols, m_caloMaterial, m_exitVolume);
1392 calorimeter = m_trackingVolumeCreator->createContainerTrackingVolume(
1393 envRVols, m_caloMaterial, m_exitVolume);
1398 "TrackingVolume 'Calorimeter' built successfully. Wrap it in "
1399 "TrackingGeometry.");
1402 lArVolumes =
nullptr;
1404 tileVolumes =
nullptr;
1406 auto caloTrackingGeometry =
1407 std::make_unique<Trk::TrackingGeometry>(calorimeter);
1413 if (m_indexStaticLayers && caloTrackingGeometry){
1414 caloTrackingGeometry->indexStaticLayers(signature());
1417 return caloTrackingGeometry;
1426 << vol.
volumeName() <<
"' in LayerIndex/CaloCell_ID map");
1430 if (!confinedLayers)
1436 layerObjects.begin();
1441 std::vector<const Trk::Layer*> materialLayers;
1442 for (; layerObjIter != layerObjEnd; ++layerObjIter)
1443 if ((*layerObjIter)->layerMaterialProperties())
1444 materialLayers.push_back((*layerObjIter));
1446 unsigned int matLaySize = materialLayers.size();
1447 unsigned int ccidSize = ccid.size();
1450 << ccidSize <<
" CaloSample ids )");
1451 if (matLaySize != ccidSize)
1457 std::vector<const Trk::Layer*>::const_iterator layerIt = materialLayers.begin();
1458 std::vector<const Trk::Layer*>::const_iterator layerItEnd = materialLayers.end();
1459 std::vector<CaloCell_ID::CaloSample>::const_iterator ccidIt = ccid.begin();
1460 std::vector<CaloCell_ID::CaloSample>::const_iterator ccidItEnd = ccid.end();
1462 for (; layerIt != layerItEnd && ccidIt != ccidItEnd; ++layerIt, ++ccidIt)
1463 licsMap.insert(std::make_pair((*layerIt)->layerIndex(),
int(*ccidIt)));
1469 std::vector<CaloCell_ID::CaloSample>::const_iterator ccidIt = ccid.begin();
1470 std::vector<CaloCell_ID::CaloSample>::const_iterator ccidItEnd = ccid.end();
1472 for (; ccidIt != ccidItEnd; ++ccidIt, --matLaySize)
1473 licsMap.insert(std::make_pair(
1474 (materialLayers[matLaySize - 1])->layerIndex(),
int(*ccidIt)));
1478 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*>
1481 const std::string&
name,
float& outerRadius)
const {
1489 if (bpCutouts.empty()) {
1490 return std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*>(0, 0);
1495 float rOut = bpCutouts[0].first;
1496 for (
const auto& bpCutout : bpCutouts) {
1497 if (bpCutout.second <=
dim[0].second)
1498 dim[0].first = bpCutout.first;
1499 else if (bpCutout.second <=
zmax)
1500 dim.push_back(bpCutout);
1501 if (bpCutout.second <=
zmax)
1502 rOut = bpCutout.first;
1508 if (
dim.size() == 2) {
1510 outerRadius =
dim[0].first;
1520 dummyVolumes,
"BeamPipe::Positive" +
name);
1526 bpNeg, bpBounds->
clone(), m_caloMaterial, dummyLayers, dummyVolumes,
1527 "BeamPipe::Negative" +
name);
1533 return std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*>(bpVolPos,
1539 outerRadius =
dim[0].first;
1542 for (
unsigned int i = 1;
i <
dim.size();
i++)
1544 outerRadius =
dim[
i].first;
1547 std::vector<Trk::TrackingVolume*> posVols;
1549 for (
unsigned int i = 0;
i <
dim.size() - 1;
i++) {
1563 dummyVolumes,
"BeamPipe::Positive" +
name);
1575 dummyLayers, dummyVolumes,
1576 "Calo::GapVolumes::Positive" +
name);
1582 std::vector<Trk::TrackingVolume*> gapVols;
1583 gapVols.push_back(bpVolPos);
1584 gapVols.push_back(bpVolGap);
1585 bpSector = m_trackingVolumeCreator->createContainerTrackingVolume(
1586 gapVols, m_caloMaterial,
"Calo::Container::PositiveBPSector" +
name);
1588 posVols.push_back(bpSector);
1592 m_trackingVolumeCreator->createContainerTrackingVolume(
1593 posVols, m_caloMaterial,
"Calo::Container::PositiveBP" +
name);
1596 std::vector<Trk::TrackingVolume*> negVols;
1598 for (
unsigned int i = 0;
i <
dim.size() - 1;
i++) {
1600 float zmax2 = -1. * (
dim[
i].second);
1601 float zmin2 = -1. * (
dim[
i + 1].second);
1615 dummyVolumes,
"BeamPipe::Negative" +
name);
1619 dim[
i].first < outerRadius
1623 0.5 * (zmax2 - zmin2)),
1624 m_caloMaterial, dummyLayers, dummyVolumes,
1625 "Calo::GapVolumes::Negative" +
name)
1631 std::vector<Trk::TrackingVolume*> gapVols;
1632 gapVols.push_back(bpVolNeg);
1633 gapVols.push_back(bpVolGap);
1634 bpSector = m_trackingVolumeCreator->createContainerTrackingVolume(
1635 gapVols, m_caloMaterial,
"Calo::Container::NegativeBPSector" +
name);
1638 if (negVols.empty())
1639 negVols.push_back(bpSector);
1641 negVols.insert(negVols.begin(), bpSector);
1645 m_trackingVolumeCreator->createContainerTrackingVolume(
1646 negVols, m_caloMaterial,
"Calo::Container::NegativeBP" +
name);
1648 return std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*>(bpPosSector,