TrackingGeometry Interface method.
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);
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]);
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 <<
","
232 if (!msCutouts.empty()) {
233 caloDefaultRadius = msCutouts[0].first;
234 caloDefaultHalflengthZ = msCutouts[0].second;
236 " Calo central cylinder dimensions adjusted using EnvelopeSvc:"
244 enclosedInnerSectorRadius, enclosedInnerSectorHalflength);
250 dummyVolumes,
"Calo::GapVolumes::DummyID");
252 keyDim.emplace_back(enclosedInnerSectorRadius, enclosedInnerSectorHalflength);
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 =
326 std::vector<Trk::TrackingVolume*>* tileVolumes =
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 =
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) {
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);
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);
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);
538 "Calo::Container::EnclosedInnerDetector");
545 float rEndcapBP = 0.;
546 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*> endcapBP =
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);
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);
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);
641 std::vector<Trk::TrackingVolume*> volECN;
642 volECN.push_back(ecPresamplerOutNeg);
643 volECN.push_back(negativeECP);
644 volECN.push_back(ecPresamplerInNeg);
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);
685 std::vector<Trk::TrackingVolume*> volsEN;
686 volsEN.push_back(ecInnerNeg);
687 volsEN.push_back(lArNegativeEndcap);
688 volsEN.push_back(ecCoverNeg);
694 std::vector<Trk::TrackingVolume*> volEEP;
695 volEEP.push_back(positiveEP);
696 volEEP.push_back(positiveEC);
700 std::vector<Trk::TrackingVolume*> volEEN;
701 volEEN.push_back(negativeEC);
702 volEEN.push_back(negativeEP);
709 std::vector<Trk::TrackingVolume*> volsEndcapPos;
711 volsEndcapPos.push_back(endcapBP.first);
712 volsEndcapPos.push_back(positiveEEP);
714 std::unique_ptr<Trk::TrackingVolume> positiveEndcap(
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(
725 volsEndcapNeg,
m_caloMaterial,
"Calo::Container::NegativeEndcap"));
731 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*> hecBP =
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(
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(
801 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*> fcalBP =
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(
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(
882 std::pair<Trk::TrackingVolume*, Trk::TrackingVolume*> outBP =
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(
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(
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());
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());
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 =
1028 "Calo::Containers::LAr::CentralBarrelSector",
false,
true);
1034 std::vector<Trk::IdentifiedMaterial> matCrack;
1037 matCrack.emplace_back(&
m_Scint, baseID);
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);
1152 "Calo::Containers::LAr::CentralSector");
1157 std::vector<Trk::TrackingVolume*> caloCentralSectorVolumes;
1159 caloCentralSectorVolumes.push_back(inDetEnclosed);
1161 caloCentralSectorVolumes.push_back(lArCentralSector);
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);
1181 lArCombinedVolumes,
m_caloMaterial,
"Calo::Containers::LAr::Combined");
1186 std::vector<Trk::TrackingVolume*> caloVolumes;
1188 caloVolumes.push_back(lArCombined);
1190 caloVolumes.push_back(tileCombined);
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.,
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 =
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());
1321 "Muon::GapVolumes::CaloPositiveCutOut" +
ss.str());
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);
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);
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) {
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);
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);
1414 caloTrackingGeometry->indexStaticLayers(
signature());
1417 return caloTrackingGeometry;