17 #include "GeoModelKernel/GeoFullPhysVol.h"
18 #include "GeoModelKernel/GeoLogVol.h"
19 #include "GeoModelKernel/GeoShape.h"
20 #include "GeoModelKernel/GeoTubs.h"
21 #include "GeoModelKernel/GeoTube.h"
22 #include "GeoModelKernel/GeoPcon.h"
23 #include "GeoModelKernel/GeoTrd.h"
24 #include "GeoModelKernel/GeoMaterial.h"
53 declareInterface<Trk::ICaloTrackingVolumeBuilder>(
this);
57 LAr::LArVolumeBuilder::~ LArVolumeBuilder()
66 ATH_CHECK(m_lArTrackingVolumeHelper.retrieve());
67 ATH_MSG_DEBUG(
"Retrieved tool " << m_lArTrackingVolumeHelper );
70 ATH_CHECK(m_trackingVolumeCreator.retrieve());
71 ATH_MSG_DEBUG(
"Retrieved tool " << m_trackingVolumeCreator );
73 if(m_useCaloSurfBuilder){
79 return StatusCode::SUCCESS;
88 for (
const auto *
mat : m_materialGarbage ) {
92 return StatusCode::SUCCESS;
95 std::vector<Trk::TrackingVolume*>*
106 struct GarbageCollector {
107 explicit GarbageCollector(
MaterialGarbage& globalGarbage) : globalBin(globalGarbage) {}
108 ~GarbageCollector() {
110 std::scoped_lock lock(
mutex);
111 globalBin.merge(
bin);
118 GarbageCollector gc(m_materialGarbage);
123 ATH_MSG_FATAL(
"Could not get LArDetectorManager! Calo TrackingGeometry will not be built");
129 ATH_MSG_DEBUG(
"Retrieved " << numTreeTops <<
" tree tops from the LArDetDescrManager. " );
131 for (
unsigned int itreetop = 0; itreetop<numTreeTops; ++itreetop){
132 PVConstLink currentVPhysVolLink = lArMgr->
getTreeTop(itreetop);
133 const GeoLogVol* currentLogVol = currentVPhysVolLink->getLogVol();
135 unsigned int currentChilds = currentVPhysVolLink->getNChildVols();
137 ATH_MSG_DEBUG(
"Processing " << currentLogVol->getName() <<
"... has "
138 << currentChilds <<
" childs, position " << currentVPhysVolLink->getX(geoAlign).translation());
145 ATH_MSG_DEBUG(
"============ Barrel Section ======================" );
164 gc.bin.insert(lArBarrelPresamplerMaterial);
165 gc.bin.insert(lArBarrelMaterial);
168 std::vector<std::pair<const Trk::Surface*, const Trk::Surface*>> entrySurf =
169 m_calosurf->entrySurfaces(&caloDDM);
170 std::vector<std::pair<const Trk::Surface*, const Trk::Surface*>> exitSurf =
171 m_calosurf->exitSurfaces(&caloDDM);
181 if(
detStore()->contains<StoredPhysVol>(
"EMB_POS"))
189 GeoFullPhysVol* lArBarrelPosPhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
193 if(
detStore()->contains<StoredPhysVol>(
"EMB_NEG"))
201 GeoFullPhysVol* lArBarrelNegPhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
203 const GeoLogVol* lArBarrelPosLogVol = lArBarrelPosPhysVol ? lArBarrelPosPhysVol->getLogVol() :
nullptr;
204 const GeoLogVol* lArBarrelNegLogVol = lArBarrelNegPhysVol ? lArBarrelNegPhysVol->getLogVol() :
nullptr;
208 double lArBarrelHalflength = 0.;
209 std::vector<double> zBoundaries;
212 if (lArBarrelPosLogVol && lArBarrelNegLogVol){
214 int poschilds = lArBarrelPosPhysVol->getNChildVols();
215 int negchilds = lArBarrelNegPhysVol->getNChildVols();
217 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArBarrelPosPhysVol->getAbsoluteName()
218 <<
" (" << poschilds <<
" childs) ." );
219 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArBarrelNegPhysVol->getAbsoluteName()
220 <<
" (" << negchilds <<
" childs) ." );
223 const GeoShape* lArBarrelPosShape = lArBarrelPosLogVol->getShape();
224 const GeoShape* lArBarrelNegShape = lArBarrelNegLogVol->getShape();
227 const GeoPcon* lArBarrelPosPcon =
dynamic_cast<const GeoPcon*
>(lArBarrelPosShape);
229 const GeoPcon* lArBarrelNegPcon =
dynamic_cast<const GeoPcon*
>(lArBarrelNegShape);
232 if (lArBarrelPosBounds)
233 ATH_MSG_VERBOSE(
" -> Positive Barrel Bounds: " << *lArBarrelPosBounds );
234 if (lArBarrelNegBounds)
235 ATH_MSG_VERBOSE(
" -> Negative Barrel Bounds: " << *lArBarrelNegBounds );
240 if (lArBarrelPosBounds && lArBarrelNegBounds){
243 double lArBarrelRmin = lArBarrelPosBounds->
innerRadius();
244 double lArBarrelRmax = lArBarrelPosBounds->
outerRadius();
245 lArBarrelHalflength = zBoundaries[1];
250 0.5*lArBarrelHalflength);
262 std::vector<Trk::IdentifiedMaterial> matID;
265 matID.emplace_back(lArBarrelMaterial,0);
266 matID.emplace_back(lArBarrelMaterial,baseID+1);
267 matID.emplace_back(lArBarrelMaterial,baseID+2);
268 matID.emplace_back(lArBarrelMaterial,baseID+3);
270 matID.emplace_back(lArBarrelMaterial->
scale(1.3),baseID+1);
271 gc.bin.insert(matID.back().first);
272 matID.emplace_back(lArBarrelMaterial->
scale(1.3),baseID+2);
273 gc.bin.insert(matID.back().first);
274 matID.emplace_back(lArBarrelMaterial->
scale(0.6),baseID+3);
275 gc.bin.insert(matID.back().first);
276 matID.emplace_back(lArBarrelMaterial->
scale(0.7),baseID+3);
277 gc.bin.insert(matID.back().first);
278 matID.emplace_back(lArBarrelMaterial->
scale(0.8),baseID+3);
279 gc.bin.insert(matID.back().first);
280 matID.emplace_back(lArBarrelMaterial->
scale(0.9),baseID+3);
281 gc.bin.insert(matID.back().first);
282 matID.emplace_back(lArBarrelMaterial->
scale(1.1),baseID+3);
283 gc.bin.insert(matID.back().first);
289 std::vector<std::vector<size_t> > indexP(bubn->
bins());
290 std::vector<std::vector<size_t> > indexN;
292 std::vector< Trk::BinUtility*> layBUN(bubn->
bins());
293 std::vector< Trk::BinUtility*> layBUP(bubp->
bins());
299 std::vector<float> offset2{};
301 if (scyl2) offset2 = scyl2->
offset();
302 std::vector<float> offset3{};
304 if (scyl3) offset3 = scyl3->
offset();
306 std::vector<float>
steps;
307 for (
unsigned int i=0;
i< bubn->
bins();
i++) {
310 std::vector<size_t> indx; indx.clear();
313 indx.push_back(
i<14 ? 1:4 );
314 steps.push_back(r2 + offset2[
i] );
315 indx.push_back(
i<14 ? 2:5 );
316 steps.push_back(r3 + offset3[
i]);
318 if (
i>19) indx.push_back(7);
319 else if (
i>17) indx.push_back(8);
320 else if (
i>15) indx.push_back(9);
321 else if (
i>13) indx.push_back(3);
322 else if (
i>11) indx.push_back(6);
323 else if (
i>9) indx.push_back(7);
324 else if (
i>7) indx.push_back(8);
325 else if (
i>5) indx.push_back(8);
326 else if (
i>4) indx.push_back(9);
327 else indx.push_back(3);
333 indexN.push_back(indx);
334 indexP[bubp->
bins()-1-
i] = std::vector<size_t>(indx);
344 lArBarrelMaterialBinPos,
346 "Calo::Detectors::LAr::BarrelPos");
350 lArBarrelMaterialBinNeg,
352 "Calo::Detectors::LAr::BarrelNeg");
355 std::vector<Trk::TrackingVolume*> volsB;
356 volsB.push_back(lArBarrelNeg);
357 volsB.push_back(lArBarrelPos);
359 lArBarrel = m_trackingVolumeCreator->createContainerTrackingVolume(volsB,
361 "Calo::Container::LAr::Barrel");
364 delete lArBarrelPosBounds; lArBarrelPosBounds =
nullptr;
365 delete lArBarrelNegBounds; lArBarrelNegBounds =
nullptr;
370 if(
detStore()->contains<StoredPhysVol>(
"SOLENOID"))
378 GeoFullPhysVol* solenoidPhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
381 const GeoLogVol* solenoidLogVol = solenoidPhysVol ? solenoidPhysVol->getLogVol() :
nullptr;
385 int childs = solenoidPhysVol->getNChildVols();
388 << solenoidPhysVol->getAbsoluteName() <<
" (" << childs <<
" childs) ." );
390 const GeoShape* solenoidShape = solenoidLogVol->getShape();
392 const GeoTubs* solenoidTubs =
dynamic_cast<const GeoTubs*
>(solenoidShape);
395 const GeoMaterial* solenoidMaterialGM = solenoidLogVol->getMaterial();
396 if (solenoidMaterialGM) {
402 if (solenoidBounds) {
409 dummyLayers, dummyVolumes,
420 if(
detStore()->contains<StoredPhysVol>(
"PRESAMPLER_B_POS"))
424 ATH_MSG_DEBUG(
"Unable to retrieve Stored PV PRESAMPLER_B_POS" );
428 GeoFullPhysVol* lArBarrelPresamplerPosPhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
432 if(
detStore()->contains<StoredPhysVol>(
"PRESAMPLER_B_NEG"))
436 ATH_MSG_DEBUG(
"Unable to retrieve Stored PV PRESAMPLER_B_NEG" );
440 GeoFullPhysVol* lArBarrelPresamplerNegPhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
443 const GeoLogVol* lArBarrelPresamplerPosLogVol = lArBarrelPresamplerPosPhysVol ? lArBarrelPresamplerPosPhysVol->getLogVol() :
nullptr;
444 const GeoLogVol* lArBarrelPresamplerNegLogVol = lArBarrelPresamplerNegPhysVol ? lArBarrelPresamplerNegPhysVol->getLogVol() :
nullptr;
447 if (lArBarrelPresamplerPosLogVol && lArBarrelPresamplerNegLogVol){
449 int poschilds = lArBarrelPresamplerPosPhysVol->getNChildVols();
450 int negchilds = lArBarrelPresamplerNegPhysVol->getNChildVols();
453 << lArBarrelPresamplerPosPhysVol->getAbsoluteName() <<
" (" << poschilds <<
" childs) ." );
455 << lArBarrelPresamplerNegPhysVol->getAbsoluteName() <<
" (" << negchilds <<
" childs) ." );
463 const GeoShape* lArBarrelPresamplerPosShape = lArBarrelPresamplerPosLogVol->getShape();
466 const GeoTubs* lArBarrelPresamplerPosTubs =
dynamic_cast<const GeoTubs*
>(lArBarrelPresamplerPosShape);
468 lArBarrelPresamplerPosTubs->getRMax(),
469 0.5*lArBarrelHalflength);
472 if (lArBarrelPresamplerPosBounds){
473 lArBarrelPresamplerNegBounds = lArBarrelPresamplerPosBounds->
clone();
475 << *lArBarrelPresamplerPosBounds );
477 if (lArBarrelPresamplerNegBounds){
479 << *lArBarrelPresamplerNegBounds );
487 std::vector<float> bpsteps{
float(lArBarrelPresamplerPosBounds->
innerRadius()),
492 std::vector<size_t> dummylay (1,0);
494 std::vector<Trk::IdentifiedMaterial> matBP;
497 matBP.emplace_back(lArBarrelPresamplerMaterial,baseID);
503 lArBarrelPresamplerPosBounds,
504 lArBarrelPresamplerMaterialBinPos,
506 "Calo::Detectors::LAr::BarrelPresamplerPos");
509 lArBarrelPresamplerNegBounds,
510 lArBarrelPresamplerMaterialBinNeg,
512 "Calo::Detectors::LAr::BarrelPresamplerNeg");
515 std::vector<Trk::TrackingVolume*> volsBP;
516 volsBP.push_back(lArBarrelPresamplerNeg);
517 volsBP.push_back(lArBarrelPresamplerPos);
519 lArBarrelPresampler = m_trackingVolumeCreator->createContainerTrackingVolume(volsBP,
521 "Calo::Container::LAr::BarrelPresampler");
526 if (solenoidBounds && lArBarrelPresamplerPosBounds) {
529 lArBarrelHalflength);
536 solenoidLArBarrelGapBounds,
538 dummyLayers, dummyVolumes,
539 "Calo::GapVolumes::LAr::SolenoidPresamplerGap");
544 ATH_MSG_DEBUG(
"============ Endcap Section ======================" );
579 std::unique_ptr<Trk::CylinderVolumeBounds> lArPositiveEndcapBounds;
580 std::unique_ptr<Trk::CylinderVolumeBounds> lArNegativeEndcapBounds;
582 if(
detStore()->contains<StoredPhysVol>(
"EMEC_POS"))
590 GeoFullPhysVol* lArPositiveEndcapPhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
592 const GeoLogVol* lArPositiveEndcapLogVol = lArPositiveEndcapPhysVol ? lArPositiveEndcapPhysVol->getLogVol() :
nullptr;
594 if(
detStore()->contains<StoredPhysVol>(
"EMEC_NEG"))
602 GeoFullPhysVol* lArNegativeEndcapPhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
604 const GeoLogVol* lArNegativeEndcapLogVol = lArNegativeEndcapPhysVol ? lArNegativeEndcapPhysVol->getLogVol() :
nullptr;
607 const GeoMaterial* lArPositiveEndcapMaterial =
nullptr;
610 std::vector<double> positiveEndcapZboundaries;
611 std::vector<double> negativeEndcapZboundaries;
613 double lArEndcapZpos = 0.;
616 if (lArPositiveEndcapLogVol && lArNegativeEndcapLogVol){
618 int poschilds = lArPositiveEndcapPhysVol->getNChildVols();
619 int negchilds = lArNegativeEndcapPhysVol->getNChildVols();
621 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArPositiveEndcapPhysVol->getAbsoluteName()
622 <<
" (" << poschilds <<
" childs)." );
623 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArNegativeEndcapPhysVol->getAbsoluteName()
624 <<
" (" << negchilds <<
" childs)." );
628 const GeoShape* lArPositiveEndcapShape = lArPositiveEndcapLogVol->getShape();
629 const GeoShape* lArNegativeEndcapShape = lArNegativeEndcapLogVol->getShape();
633 ? lArPositiveEndcapPhysVol->getCachedAbsoluteTransform(geoAlign)
634 : lArPositiveEndcapPhysVol->getAbsoluteTransform();
636 Amg::Vector3D lArPositiveEndcapNomPosition = lArPositiveEndcapTransform.translation();
640 const GeoPcon* lArPositiveEndcapPcon =
dynamic_cast<const GeoPcon*
>(lArPositiveEndcapShape);
641 if (lArPositiveEndcapPcon)
642 lArPositiveEndcapBounds = std::unique_ptr<Trk::CylinderVolumeBounds>
644 positiveEndcapZboundaries));
646 const GeoPcon* lArNegativeEndcapPcon =
dynamic_cast<const GeoPcon*
>(lArNegativeEndcapShape);
647 if (lArNegativeEndcapPcon)
648 lArNegativeEndcapBounds = std::unique_ptr<Trk::CylinderVolumeBounds>
650 negativeEndcapZboundaries));
652 if (lArPositiveEndcapBounds)
653 ATH_MSG_DEBUG(
" -> Positive Endcap Bounds: " << *lArPositiveEndcapBounds );
654 if (lArNegativeEndcapBounds)
655 ATH_MSG_DEBUG(
" -> Negative Endcap Bounds: " << *lArNegativeEndcapBounds );
657 double positiveEndcapZpos = 0.5 *(positiveEndcapZboundaries[1] + positiveEndcapZboundaries[0]);
659 lArEndcapZpos = positiveEndcapZpos+lArPositiveEndcapNomPosition.z();
661 ATH_MSG_DEBUG(
" located at z-positions " << lArEndcapZpos <<
" / " << -lArEndcapZpos );
664 lArPositiveEndcapMaterial = lArPositiveEndcapLogVol->getMaterial();
669 double lArEndcapHalfZ = 0.;
670 double lArEndcapZmin = 0.;
671 double lArEndcapZmax = 0.;
672 double lArEndcapInnerRadius = 0;
673 double lArEndcapOuterRadius = 0;
676 if (lArPositiveEndcapBounds && lArNegativeEndcapBounds && lArPositiveEndcapMaterial){
682 gc.bin.insert(lArEndcapMaterial);
684 lArEndcapHalfZ = lArPositiveEndcapBounds->
halflengthZ();
685 lArEndcapZmin = lArEndcapZpos - lArPositiveEndcapBounds->
halflengthZ();
686 lArEndcapZmax = lArEndcapZpos + lArPositiveEndcapBounds->
halflengthZ();
687 lArEndcapInnerRadius = lArPositiveEndcapBounds->
innerRadius();
688 lArEndcapOuterRadius = lArPositiveEndcapBounds->
outerRadius();
701 std::vector<Trk::IdentifiedMaterial> matEID;
704 matEID.emplace_back(lArEndcapMaterial,0);
705 matEID.emplace_back(lArEndcapMaterial,baseID+1);
706 matEID.emplace_back(lArEndcapMaterial,baseID+2);
707 matEID.emplace_back(lArEndcapMaterial,baseID+3);
709 matEID.emplace_back(lArEndcapMaterial->
scale(1.05),baseID+1);
710 gc.bin.insert(matEID.back().first);
711 matEID.emplace_back(lArEndcapMaterial->
scale(1.1),baseID+1);
712 gc.bin.insert(matEID.back().first);
713 matEID.emplace_back(lArEndcapMaterial->
scale(1.15),baseID+1);
714 gc.bin.insert(matEID.back().first);
715 matEID.emplace_back(lArEndcapMaterial->
scale(1.2),baseID+1);
716 gc.bin.insert(matEID.back().first);
717 matEID.emplace_back(lArEndcapMaterial->
scale(1.25),baseID+1);
718 gc.bin.insert(matEID.back().first);
719 matEID.emplace_back(lArEndcapMaterial->
scale(1.3),baseID+1);
720 gc.bin.insert(matEID.back().first);
721 matEID.emplace_back(lArEndcapMaterial->
scale(1.35),baseID+1);
722 gc.bin.insert(matEID.back().first);
723 matEID.emplace_back(lArEndcapMaterial->
scale(1.4),baseID+1);
724 gc.bin.insert(matEID.back().first);
725 matEID.emplace_back(lArEndcapMaterial->
scale(1.05),baseID+2);
726 gc.bin.insert(matEID.back().first);
727 matEID.emplace_back(lArEndcapMaterial->
scale(1.1),baseID+2);
728 gc.bin.insert(matEID.back().first);
729 matEID.emplace_back(lArEndcapMaterial->
scale(1.15),baseID+2);
730 gc.bin.insert(matEID.back().first);
731 matEID.emplace_back(lArEndcapMaterial->
scale(1.2),baseID+2);
732 gc.bin.insert(matEID.back().first);
733 matEID.emplace_back(lArEndcapMaterial->
scale(1.25),baseID+2);
734 gc.bin.insert(matEID.back().first);
735 matEID.emplace_back(lArEndcapMaterial->
scale(1.3),baseID+2);
736 gc.bin.insert(matEID.back().first);
737 matEID.emplace_back(lArEndcapMaterial->
scale(1.35),baseID+2);
738 gc.bin.insert(matEID.back().first);
739 matEID.emplace_back(lArEndcapMaterial->
scale(1.4),baseID+2);
740 gc.bin.insert(matEID.back().first);
741 matEID.emplace_back(lArEndcapMaterial->
scale(1.45),baseID+2);
742 gc.bin.insert(matEID.back().first);
743 matEID.emplace_back(lArEndcapMaterial->
scale(0.7),baseID+3);
744 gc.bin.insert(matEID.back().first);
745 matEID.emplace_back(lArEndcapMaterial->
scale(0.75),baseID+3);
746 gc.bin.insert(matEID.back().first);
747 matEID.emplace_back(lArEndcapMaterial->
scale(0.8),baseID+3);
748 gc.bin.insert(matEID.back().first);
749 matEID.emplace_back(lArEndcapMaterial->
scale(0.85),baseID+3);
750 gc.bin.insert(matEID.back().first);
751 matEID.emplace_back(lArEndcapMaterial->
scale(0.9),baseID+3);
752 gc.bin.insert(matEID.back().first);
753 matEID.emplace_back(lArEndcapMaterial->
scale(0.95),baseID+3);
754 gc.bin.insert(matEID.back().first);
755 matEID.emplace_back(lArEndcapMaterial->
scale(1.05),baseID+3);
756 gc.bin.insert(matEID.back().first);
757 matEID.emplace_back(lArEndcapMaterial->
scale(1.1),baseID+3);
758 gc.bin.insert(matEID.back().first);
759 matEID.emplace_back(lArEndcapMaterial->
scale(1.15),baseID+3);
760 gc.bin.insert(matEID.back().first);
761 matEID.emplace_back(lArEndcapMaterial->
scale(1.2),baseID+3);
762 gc.bin.insert(matEID.back().first);
765 std::vector< Trk::BinUtility*> layEUP(bup->
bins());
767 std::vector<std::vector<size_t> > indexEP;
773 std::vector<float> offset2;
775 if (sd2) offset2 = sd2->
offset();
776 std::vector<float>offset3;
778 if (sd3) offset3 = sd3->
offset();
780 std::vector<float>
steps;
781 for (
unsigned int i=0;
i< bup->
bins();
i++) {
783 std::vector<size_t> indx; indx.clear();
784 steps.push_back( lArEndcapZmin);
787 if (
i<4) indx.push_back(1);
788 else if (
i<6) indx.push_back(4);
789 else if (
i<8) indx.push_back(5);
790 else if (
i<10) indx.push_back(6);
791 else if (
i<12) indx.push_back(7);
792 else if (
i<14) indx.push_back(8);
793 else if (
i<16) indx.push_back(9);
794 else if (
i<18) indx.push_back(10);
795 else if (
i<23) indx.push_back(11);
796 else indx.push_back(1);
798 float z2c = z2 + offset2[
i];
799 if (z2c!=
steps.back()) {
steps.push_back(z2c); indx.push_back(2);}
800 else { indx.back()=2; }
802 else if (
i<6) indx.back()=12;
803 else if (
i<8) indx.back()=13;
804 else if (
i<10) indx.back()=14;
805 else if (
i<12) indx.back()=15;
806 else if (
i<14) indx.back()=16;
807 else if (
i<16) indx.back()=17;
808 else if (
i<18) indx.back()=18;
809 else if (
i<21) indx.back()=19;
810 else if (
i<23) indx.back()=20;
811 else if (
i<25) indx.back()=14;
812 else if (
i<27) indx.back()=15;
813 else if (
i<29) indx.back()=16;
814 else if (
i<31) indx.back()=17;
815 else if (
i<33) indx.back()=18;
816 else if (
i<35) indx.back()=19;
817 else if (
i<37) indx.back()=20;
819 steps.push_back(z3 + offset3[
i] );
820 if (
i<6) indx.push_back(21);
821 else if (
i<8) indx.push_back(22);
822 else if (
i<10) indx.push_back(23);
823 else if (
i<12) indx.push_back(24);
824 else if (
i<14) indx.push_back(25);
825 else if (
i<16) indx.push_back(26);
826 else if (
i<18) indx.push_back(3);
827 else if (
i<20) indx.push_back(28);
828 else if (
i<23) indx.push_back(29);
829 else if (
i<25) indx.push_back(22);
830 else if (
i<27) indx.push_back(23);
831 else if (
i<29) indx.push_back(24);
832 else if (
i<31) indx.push_back(26);
833 else if (
i<33) indx.push_back(3);
834 else if (
i<35) indx.push_back(27);
835 else indx.push_back(28);
836 steps.push_back(lArEndcapZmax);
839 indexEP.push_back(indx);
843 std::vector< Trk::BinUtility*> layEUN(bun->
bins());
844 std::vector<std::vector<size_t> > indexEN;
845 for (
int j=indexEP.size()-1; j>-1; j--) {
846 std::vector<size_t> indx; indx.clear();
847 for (
int jj=indexEP[j].
size()-1; jj>-1; jj--) {
848 indx.push_back(indexEP[j][jj]);
850 indexEN.push_back(indx);
859 if (sd2) offset2 = sd2->
offset();
862 if (sd3) offset3 = sd3->
offset();
864 for (
unsigned int i=0;
i< bun->
bins();
i++) {
866 steps.push_back(-lArEndcapZmax);
867 steps.push_back(z3 + offset3[
i] );
868 steps.push_back(z2 + offset2[
i] );
869 if (z1!=
steps.back()) {
steps.push_back(z1); }
870 steps.push_back(-lArEndcapZmin);
879 lArPositiveEndcapBounds.release(),
880 lArEndcapMaterialBinnedPos,
883 "Calo::Detectors::LAr::PositiveEndcap");
886 lArNegativeEndcapBounds.release(),
887 lArEndcapMaterialBinnedNeg,
890 "Calo::Detectors::LAr::NegativeEndcap");
898 if(
detStore()->contains<StoredPhysVol>(
"PRESAMPLER_EC_POS"))
902 ATH_MSG_DEBUG(
"Unable to retrieve Stored PV PRESAMPLER_EC_POS" );
906 GeoFullPhysVol* lArECPresamplerPhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
909 const GeoLogVol* lArECPresamplerLogVol = lArECPresamplerPhysVol ? lArECPresamplerPhysVol->getLogVol() :
nullptr;
912 std::vector<Trk::IdentifiedMaterial> matECP;
920 matECP.emplace_back(mAl,0);
921 matECP.emplace_back(mAr,baseID);
923 if ( lArECPresamplerLogVol ) {
925 const GeoShape* lArECPresamplerShape = lArECPresamplerLogVol->getShape();
927 ? lArECPresamplerPhysVol->getCachedAbsoluteTransform(geoAlign)
928 : lArECPresamplerPhysVol->getAbsoluteTransform();
930 const GeoTubs* psTubs =
dynamic_cast<const GeoTubs*
>(lArECPresamplerShape);
932 float d = psTubs->getZHalfLength();
936 float zec = lArECPresamplerTransform.translation().z()-ecd+
d;
945 std::vector<float> ecp;
946 ecp.push_back( zec-ecd);
947 ecp.push_back( zec+ecd-2*
d);
948 ecp.push_back( zec+ecd);
952 std::vector<size_t> iep{0,1};
960 lArECPresamplerBounds,
961 lArECPresamplerMaterialBinPos,
963 "Calo::Detectors::LAr::PositiveECPresampler");
966 std::vector<float> ecpn;
967 ecpn.push_back(-zec-ecd);
968 ecpn.push_back(-zec-ecd+2*
d);
969 ecpn.push_back(-zec+ecd);
973 std::vector<size_t> ien{1,0};
979 lArECPresamplerBounds->
clone(),
980 lArECPresamplerMaterialBinNeg,
982 "Calo::Detectors::LAr::NegativeECPresampler");
994 if(
detStore()->contains<StoredPhysVol>(
"HEC1_POS")){
1002 GeoFullPhysVol* lArPositiveHec1PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
1004 if(
detStore()->contains<StoredPhysVol>(
"HEC2_POS")){
1012 GeoFullPhysVol* lArPositiveHec2PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
1014 if(
detStore()->contains<StoredPhysVol>(
"HEC1_NEG")){
1022 GeoFullPhysVol* lArNegativeHec1PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
1024 if(
detStore()->contains<StoredPhysVol>(
"HEC2_NEG")){
1033 GeoFullPhysVol* lArNegativeHec2PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
1035 const GeoLogVol* lArPositiveHec1LogVol = lArPositiveHec1PhysVol ? lArPositiveHec1PhysVol->getLogVol() :
nullptr;
1036 const GeoLogVol* lArPositiveHec2LogVol = lArPositiveHec2PhysVol ? lArPositiveHec2PhysVol->getLogVol() :
nullptr;
1037 const GeoLogVol* lArNegativeHec1LogVol = lArNegativeHec1PhysVol ? lArNegativeHec1PhysVol->getLogVol() :
nullptr;
1038 const GeoLogVol* lArNegativeHec2LogVol = lArNegativeHec2PhysVol ? lArNegativeHec2PhysVol->getLogVol() :
nullptr;
1040 std::vector<double> positiveEndcapZboundariesHec1;
1041 std::vector<double> positiveEndcapZboundariesHec2;
1042 std::vector<double> negativeEndcapZboundariesHec1;
1043 std::vector<double> negativeEndcapZboundariesHec2;
1047 if (lArPositiveHec1LogVol && lArPositiveHec2LogVol && lArNegativeHec1LogVol && lArNegativeHec2LogVol){
1049 int poschildsHec1 = lArPositiveHec1PhysVol->getNChildVols();
1050 int poschildsHec2 = lArPositiveHec2PhysVol->getNChildVols();
1051 int negchildsHec1 = lArNegativeHec1PhysVol->getNChildVols();
1052 int negchildsHec2 = lArNegativeHec2PhysVol->getNChildVols();
1054 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArPositiveHec1PhysVol->getAbsoluteName()
1055 <<
" (" << poschildsHec1 <<
" childs) ." );
1056 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArNegativeHec2PhysVol->getAbsoluteName()
1057 <<
" (" << poschildsHec2 <<
" childs) ." );
1058 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArPositiveHec1PhysVol->getAbsoluteName()
1059 <<
" (" << negchildsHec1 <<
" childs) ." );
1060 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArNegativeHec2PhysVol->getAbsoluteName()
1061 <<
" (" << negchildsHec2 <<
" childs) ." );
1064 const GeoShape* lArPositiveHec1Shape = lArPositiveHec1LogVol->getShape();
1065 const GeoShape* lArPositiveHec2Shape = lArPositiveHec2LogVol->getShape();
1066 const GeoShape* lArNegativeHec1Shape = lArNegativeHec1LogVol->getShape();
1067 const GeoShape* lArNegativeHec2Shape = lArNegativeHec2LogVol->getShape();
1071 ? lArPositiveHec1PhysVol->getCachedAbsoluteTransform(geoAlign)
1072 : lArPositiveHec1PhysVol->getAbsoluteTransform();
1074 ? lArPositiveHec2PhysVol->getCachedAbsoluteTransform(geoAlign)
1075 : lArPositiveHec2PhysVol->getAbsoluteTransform();
1077 ? lArNegativeHec1PhysVol->getCachedAbsoluteTransform(geoAlign)
1078 : lArNegativeHec1PhysVol->getAbsoluteTransform();
1080 ? lArNegativeHec2PhysVol->getCachedAbsoluteTransform(geoAlign)
1081 : lArNegativeHec2PhysVol->getAbsoluteTransform();
1083 Amg::Vector3D lArPositiveHec1NomPosition = lArPositiveHec1Transform.translation();
1084 Amg::Vector3D lArPositiveHec2NomPosition = lArPositiveHec2Transform.translation();
1085 Amg::Vector3D lArNegativeHec1NomPosition = lArNegativeHec1Transform.translation();
1086 Amg::Vector3D lArNegativeHec2NomPosition = lArNegativeHec2Transform.translation();
1089 const GeoPcon* lArPositiveHec1Pcon =
dynamic_cast<const GeoPcon*
>(lArPositiveHec1Shape);
1091 positiveEndcapZboundariesHec1).release() :
nullptr;
1092 const GeoPcon* lArPositiveHec2Pcon =
dynamic_cast<const GeoPcon*
>(lArPositiveHec2Shape);
1094 positiveEndcapZboundariesHec2).release() :
nullptr;
1095 const GeoPcon* lArNegativeHec1Pcon =
dynamic_cast<const GeoPcon*
>(lArNegativeHec1Shape);
1097 negativeEndcapZboundariesHec1).release() :
nullptr;
1098 const GeoPcon* lArNegativeHec2Pcon =
dynamic_cast<const GeoPcon*
>(lArNegativeHec2Shape);
1100 negativeEndcapZboundariesHec2).release() :
nullptr;
1102 if (lArPositiveHec1Bounds)
1103 ATH_MSG_VERBOSE(
" -> Positive Hec1 Bounds: " << *lArPositiveHec1Bounds );
1104 if (lArPositiveHec2Bounds)
1105 ATH_MSG_VERBOSE(
" -> Positive Hec2 Bounds: " << *lArPositiveHec2Bounds );
1107 if (lArNegativeHec1Bounds)
1108 ATH_MSG_VERBOSE(
" -> Negative Hec1 Bounds: " << *lArNegativeHec1Bounds );
1109 if (lArNegativeHec2Bounds)
1110 ATH_MSG_VERBOSE(
" -> Negative Hec2 Bounds: " << *lArNegativeHec2Bounds );
1113 double positiveHec1Zpos = 0.5 *(positiveEndcapZboundariesHec1[1] + positiveEndcapZboundariesHec1[0]);
1114 double positiveHec2Zpos = 0.5 *(positiveEndcapZboundariesHec2[1] + positiveEndcapZboundariesHec2[0]);
1115 double negativeHec1Zpos = -fabs(0.5 *(negativeEndcapZboundariesHec1[1] + negativeEndcapZboundariesHec1[0]));
1116 double negativeHec2Zpos = -fabs(0.5 *(negativeEndcapZboundariesHec2[1] + negativeEndcapZboundariesHec2[0]));
1118 ATH_MSG_VERBOSE(
" Positive parts located at: " << positiveHec1Zpos + lArPositiveHec1NomPosition.z()
1119 <<
" / " << positiveHec2Zpos + lArPositiveHec2NomPosition.z() );
1121 ATH_MSG_VERBOSE(
" Negative parts located at: " << negativeHec1Zpos + lArNegativeHec1NomPosition.z()
1122 <<
" / " << negativeHec2Zpos + lArNegativeHec2NomPosition.z() );
1142 if(
detStore()->contains<StoredPhysVol>(
"FCAL1_POS"))
1150 GeoFullPhysVol* lArPositiveFcal1PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
1152 if(
detStore()->contains<StoredPhysVol>(
"FCAL2_POS"))
1160 GeoFullPhysVol* lArPositiveFcal2PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
1163 if(
detStore()->contains<StoredPhysVol>(
"FCAL3_POS"))
1171 GeoFullPhysVol* lArPositiveFcal3PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
1173 if(
detStore()->contains<StoredPhysVol>(
"FCAL1_NEG"))
1181 GeoFullPhysVol* lArNegativeFcal1PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
1183 if(
detStore()->contains<StoredPhysVol>(
"FCAL2_NEG"))
1191 GeoFullPhysVol* lArNegativeFcal2PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
1193 if(
detStore()->contains<StoredPhysVol>(
"FCAL3_NEG"))
1201 GeoFullPhysVol* lArNegativeFcal3PhysVol = storedPV ? storedPV->
getPhysVol() :
nullptr;
1203 const GeoLogVol* lArPositiveFcal1LogVol = lArPositiveFcal1PhysVol ? lArPositiveFcal1PhysVol->getLogVol() :
nullptr;
1204 const GeoLogVol* lArPositiveFcal2LogVol = lArPositiveFcal2PhysVol ? lArPositiveFcal2PhysVol->getLogVol() :
nullptr;
1205 const GeoLogVol* lArPositiveFcal3LogVol = lArPositiveFcal3PhysVol ? lArPositiveFcal3PhysVol->getLogVol() :
nullptr;
1207 const GeoLogVol* lArNegativeFcal1LogVol = lArNegativeFcal1PhysVol ? lArNegativeFcal1PhysVol->getLogVol() :
nullptr;
1208 const GeoLogVol* lArNegativeFcal2LogVol = lArNegativeFcal2PhysVol ? lArNegativeFcal2PhysVol->getLogVol() :
nullptr;
1209 const GeoLogVol* lArNegativeFcal3LogVol = lArNegativeFcal3PhysVol ? lArNegativeFcal3PhysVol->getLogVol() :
nullptr;
1212 double lArFcalHalflength = 0.;
1213 double lArFcalZposition = 0.;
1214 double lArFcalZmin = 0.;
1215 double lArFcalZmax = 0.;
1218 if (lArPositiveFcal1LogVol &&
1219 lArPositiveFcal2LogVol &&
1220 lArPositiveFcal3LogVol &&
1221 lArNegativeFcal1LogVol &&
1222 lArNegativeFcal2LogVol &&
1223 lArNegativeFcal3LogVol){
1225 int poschildsFcal1 = lArPositiveFcal1PhysVol->getNChildVols();
1226 int poschildsFcal2 = lArPositiveFcal2PhysVol->getNChildVols();
1227 int poschildsFcal3 = lArPositiveFcal3PhysVol->getNChildVols();
1229 int negchildsFcal1 = lArNegativeFcal1PhysVol->getNChildVols();
1230 int negchildsFcal2 = lArNegativeFcal2PhysVol->getNChildVols();
1231 int negchildsFcal3 = lArNegativeFcal3PhysVol->getNChildVols();
1234 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArPositiveFcal1PhysVol->getAbsoluteName()
1235 <<
" (" << poschildsFcal1 <<
" childs) ." );
1236 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArPositiveFcal2PhysVol->getAbsoluteName()
1237 <<
" (" << poschildsFcal2 <<
" childs) ." );
1238 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArPositiveFcal3PhysVol->getAbsoluteName()
1239 <<
" (" << poschildsFcal3 <<
" childs) ." );
1241 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArNegativeFcal1PhysVol->getAbsoluteName()
1242 <<
" (" << negchildsFcal1 <<
" childs) ." );
1243 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArNegativeFcal2PhysVol->getAbsoluteName()
1244 <<
" (" << negchildsFcal2 <<
" childs) ." );
1245 ATH_MSG_VERBOSE(
" -> Retrieved GeoModel Volume " << lArNegativeFcal3PhysVol->getAbsoluteName()
1246 <<
" (" << negchildsFcal3 <<
" childs) ." );
1249 const GeoShape* lArPositiveFcal1Shape = lArPositiveFcal1LogVol->getShape();
1250 const GeoShape* lArPositiveFcal2Shape = lArPositiveFcal2LogVol->getShape();
1251 const GeoShape* lArPositiveFcal3Shape = lArPositiveFcal3LogVol->getShape();
1253 const GeoShape* lArNegativeFcal1Shape = lArNegativeFcal1LogVol->getShape();
1254 const GeoShape* lArNegativeFcal2Shape = lArNegativeFcal2LogVol->getShape();
1255 const GeoShape* lArNegativeFcal3Shape = lArNegativeFcal3LogVol->getShape();
1260 ? lArPositiveFcal1PhysVol->getCachedAbsoluteTransform(geoAlign)
1261 : lArPositiveFcal1PhysVol->getAbsoluteTransform();
1263 ? lArPositiveFcal2PhysVol->getCachedAbsoluteTransform(geoAlign)
1264 : lArPositiveFcal2PhysVol->getAbsoluteTransform();
1266 ? lArPositiveFcal3PhysVol->getCachedAbsoluteTransform(geoAlign)
1267 : lArPositiveFcal3PhysVol->getAbsoluteTransform();
1270 ? lArNegativeFcal1PhysVol->getCachedAbsoluteTransform(geoAlign)
1271 : lArNegativeFcal1PhysVol->getAbsoluteTransform();
1273 ? lArNegativeFcal2PhysVol->getCachedAbsoluteTransform(geoAlign)
1274 : lArNegativeFcal2PhysVol->getAbsoluteTransform();
1276 ? lArNegativeFcal3PhysVol->getCachedAbsoluteTransform(geoAlign)
1277 : lArNegativeFcal3PhysVol->getAbsoluteTransform();
1279 Amg::Vector3D lArPositiveFcal1NomPosition = lArPositiveFcal1Transform.translation();
1280 Amg::Vector3D lArPositiveFcal2NomPosition = lArPositiveFcal2Transform.translation();
1281 Amg::Vector3D lArPositiveFcal3NomPosition = lArPositiveFcal3Transform.translation();
1283 Amg::Vector3D lArNegativeFcal1NomPosition = lArNegativeFcal1Transform.translation();
1284 Amg::Vector3D lArNegativeFcal2NomPosition = lArNegativeFcal2Transform.translation();
1285 Amg::Vector3D lArNegativeFcal3NomPosition = lArNegativeFcal3Transform.translation();
1288 const GeoTubs* lArPositiveFcal1Tubs =
dynamic_cast<const GeoTubs*
>(lArPositiveFcal1Shape);
1290 const GeoTubs* lArPositiveFcal2Tubs =
dynamic_cast<const GeoTubs*
>(lArPositiveFcal2Shape);
1292 const GeoTubs* lArPositiveFcal3Tubs =
dynamic_cast<const GeoTubs*
>(lArPositiveFcal3Shape);
1295 const GeoTubs* lArNegativeFcal1Tubs =
dynamic_cast<const GeoTubs*
>(lArNegativeFcal1Shape);
1297 const GeoTubs* lArNegativeFcal2Tubs =
dynamic_cast<const GeoTubs*
>(lArNegativeFcal2Shape);
1299 const GeoTubs* lArNegativeFcal3Tubs =
dynamic_cast<const GeoTubs*
>(lArNegativeFcal3Shape);
1302 if (lArPositiveFcal1Bounds)
1303 ATH_MSG_VERBOSE(
" -> Positive Fcal1 Bounds: " << *lArPositiveFcal1Bounds );
1304 if (lArPositiveFcal2Bounds)
1305 ATH_MSG_VERBOSE(
" -> Positive Fcal2 Bounds: " << *lArPositiveFcal2Bounds );
1306 if (lArPositiveFcal3Bounds)
1307 ATH_MSG_VERBOSE(
" -> Positive Fcal3 Bounds: " << *lArPositiveFcal3Bounds );
1310 if (lArNegativeFcal1Bounds)
1311 ATH_MSG_VERBOSE(
" -> Negative Fcal1 Bounds: " << *lArNegativeFcal1Bounds );
1312 if (lArNegativeFcal2Bounds)
1313 ATH_MSG_VERBOSE(
" -> Negative Fcal2 Bounds: " << *lArNegativeFcal2Bounds );
1314 if (lArNegativeFcal3Bounds)
1315 ATH_MSG_VERBOSE(
" -> Negative Fcal3 Bounds: " << *lArNegativeFcal3Bounds );
1318 ATH_MSG_VERBOSE(
" Positive parts located at: " << lArPositiveFcal1NomPosition.z()
1319 <<
" / " << lArPositiveFcal2NomPosition.z() <<
" / " << lArPositiveFcal3NomPosition.z() );
1321 ATH_MSG_VERBOSE(
" Negative parts located at: " << lArNegativeFcal1NomPosition.z()
1322 <<
" / " << lArNegativeFcal2NomPosition.z() <<
" / " << lArNegativeFcal3NomPosition.z() );
1327 lArFcalHalflength = lArPositiveFcal3NomPosition.z() + lArPositiveFcal3Bounds->
halflengthZ()
1328 - lArPositiveFcal1NomPosition.z() + lArNegativeFcal1Bounds->
halflengthZ();
1330 lArFcalHalflength *= 0.5;
1334 lArFcalZposition = lArPositiveFcal3NomPosition.z() + lArPositiveFcal3Bounds->
halflengthZ();
1335 lArFcalZposition += lArPositiveFcal1NomPosition.z() - lArNegativeFcal1Bounds->
halflengthZ();
1336 lArFcalZposition *= 0.5;
1344 double lArHecZmax = lArFcalZposition - lArFcalHalflength;
1345 double lArHecZmin = 0;
1346 if (lArPositiveEndcap && lArEndcapHalfZ != 0)
1347 lArHecZmin = lArPositiveEndcap->
center().z() + lArEndcapHalfZ;
1352 double caloSurfZOffset = 0;
1354 if(m_useCaloSurfBuilder){
1356 double z, rmin, rmax, hphi,
depth;
1359 caloSurfZOffset = lArHecZmin -
z;
1360 lArHecZmax =
z +
depth + caloSurfZOffset;
1362 hecEnd =
z +
depth + caloSurfZOffset;
1366 double lArHecZpos = 0.5*(lArHecZmax + lArHecZmin);
1367 double lArHecHalflength = 0.5*(lArHecZmax - lArHecZmin);
1369 double hecFcalCoverHalflength = 0.5*(hecEnd - lArHecZmax);
1370 double hecFcalCoverZpos = 0.5*(lArHecZmax + hecEnd);
1372 lArFcalHalflength = hecFcalCoverHalflength;
1373 lArFcalZposition = hecFcalCoverZpos;
1376 std::vector<Trk::IdentifiedMaterial> matHEC;
1381 gc.bin.insert(lArHecFcalCoverMaterial);
1382 gc.bin.insert(lArHecMaterial);
1386 matHEC.emplace_back(lArHecFcalCoverMaterial->
scale(0.13*m_scale_HECmaterial),0);
1387 gc.bin.insert(matHEC.back().first);
1388 matHEC.emplace_back(lArHecMaterial->
scale(m_scale_HECmaterial),baseID);
1389 gc.bin.insert(matHEC.back().first);
1390 matHEC.emplace_back(lArHecFcalCoverMaterial->
scale(0.93*m_scale_HECmaterial),baseID+1);
1391 gc.bin.insert(matHEC.back().first);
1392 matHEC.emplace_back(lArHecFcalCoverMaterial->
scale(1.09*m_scale_HECmaterial),baseID+2);
1393 gc.bin.insert(matHEC.back().first);
1394 matHEC.emplace_back(lArHecFcalCoverMaterial->
scale(1.12*m_scale_HECmaterial),baseID+3);
1395 gc.bin.insert(matHEC.back().first);
1399 if (lArPositiveFcal1Bounds && lArNegativeFcal1Bounds){
1401 delete lArPositiveHec1Bounds; lArPositiveHec1Bounds =
nullptr;
1402 delete lArPositiveHec2Bounds; lArPositiveHec2Bounds =
nullptr;
1403 delete lArNegativeHec1Bounds; lArNegativeHec1Bounds =
nullptr;
1404 delete lArNegativeHec2Bounds; lArNegativeHec2Bounds =
nullptr;
1408 lArEndcapOuterRadius,
1409 hecFcalCoverHalflength);
1411 lArNegativeHecFcalCoverBounds = lArPositiveHecFcalCoverBounds->
clone();
1413 ATH_MSG_DEBUG(
"Smoothed LAr Hec (Fcal covering part) bounds : " << *lArPositiveHecFcalCoverBounds );
1414 ATH_MSG_DEBUG(
" -> at z-position: +/- " << hecFcalCoverZpos );
1417 Amg::Vector3D lArPositiveHecFcalCoverPos(0.,0.,hecFcalCoverZpos);
1418 Amg::Vector3D lArPositiveHecFcalCoverNeg(0.,0.,-hecFcalCoverZpos);
1426 std::vector<float> spCover;
1427 spCover.push_back(hecFcalCoverZpos-hecFcalCoverHalflength);
1431 spCover.push_back(hecFcalCoverZpos+hecFcalCoverHalflength);
1435 std::vector<size_t> hfc{0,2,3,4};
1441 lArPositiveHecFcalCoverBounds,
1442 lArHecFcalCoverMaterialBinPos,
1445 "Calo::Detectors::LAr::PositiveHecFcalCover");
1447 std::vector<float> snCover;
1448 snCover.push_back(-hecFcalCoverZpos-hecFcalCoverHalflength);
1452 snCover.push_back(-hecFcalCoverZpos+hecFcalCoverHalflength);
1456 std::vector<size_t> hfcn{4,3,2,0};
1462 lArNegativeHecFcalCoverBounds,
1463 lArHecFcalCoverMaterialBinNeg,
1466 "Calo::Detectors::LAr::NegativeHecFcalCover");
1471 if (lArPositiveFcal1Bounds && lArEndcapOuterRadius != 0){
1475 double lArHecRmin = 0.5*(lArPositiveFcal1Bounds->
outerRadius()+lArEndcapInnerRadius);
1476 double lArHecRmax = lArEndcapOuterRadius;
1480 lArNegativeHecBounds = lArPositiveHecBounds->
clone();
1482 ATH_MSG_DEBUG(
"Smoothed LAr Hec bounds : " << *lArPositiveHecBounds );
1495 std::vector<float> sphec;
1496 sphec.push_back(lArHecZpos-lArHecHalflength);
1498 sphec.push_back(lArHecZpos+lArHecHalflength);
1502 std::vector<size_t> hf{0,1};
1508 lArPositiveHecBounds,
1509 lArHecMaterialBinPos,
1512 "Calo::Detectors::LAr::PositiveHec");
1515 std::vector<float> snhec;
1516 snhec.push_back(-lArHecZpos-lArHecHalflength);
1518 snhec.push_back(-lArHecZpos+lArHecHalflength);
1522 std::vector<size_t>
hfn{1,0};
1528 lArNegativeHecBounds,
1529 lArHecMaterialBinNeg,
1532 "Calo::Detectors::LAr::NegativeHec");
1537 std::vector<Trk::IdentifiedMaterial> matFCAL;
1541 gc.bin.insert(lArFcalMaterial);
1542 gc.bin.insert(lArFcalMaterial0);
1546 matFCAL.emplace_back(lArFcalMaterial0,0);
1547 matFCAL.emplace_back(lArFcalMaterial->
scale(0.5),baseID+1);
1548 gc.bin.insert(matFCAL.back().first);
1549 matFCAL.emplace_back(lArFcalMaterial->
scale(1.5),baseID+2);
1550 gc.bin.insert(matFCAL.back().first);
1551 matFCAL.emplace_back(lArFcalMaterial->
scale(1.4),baseID+3);
1552 gc.bin.insert(matFCAL.back().first);
1555 if (lArPositiveFcal1Bounds && lArPositiveFcal2Bounds && lArPositiveFcal3Bounds &&
1556 lArNegativeFcal1Bounds && lArNegativeFcal2Bounds && lArNegativeFcal3Bounds){
1559 double lArFcalRmin = lArPositiveFcal1Bounds->
innerRadius();
1560 double lArFcalRmax = lArPositiveFcal1Bounds->
outerRadius();
1563 lArNegativeFcalBounds = lArPositiveFcalBounds->
clone();
1565 ATH_MSG_DEBUG(
"Smoothed LAr Fcal bounds : " << *lArPositiveFcalBounds );
1566 ATH_MSG_DEBUG(
" -> at z-position: +/- " << lArFcalZposition );
1569 lArFcalZmin = lArFcalZposition - lArFcalHalflength;
1570 lArFcalZmax = lArFcalZposition + lArFcalHalflength;
1573 delete lArPositiveFcal1Bounds; lArPositiveFcal1Bounds =
nullptr;
1574 delete lArPositiveFcal2Bounds; lArPositiveFcal2Bounds =
nullptr;
1575 delete lArPositiveFcal3Bounds; lArPositiveFcal3Bounds =
nullptr;
1577 delete lArNegativeFcal1Bounds; lArNegativeFcal1Bounds =
nullptr;
1578 delete lArNegativeFcal2Bounds; lArNegativeFcal2Bounds =
nullptr;
1579 delete lArNegativeFcal3Bounds; lArNegativeFcal3Bounds =
nullptr;
1582 std::vector<float> spfc;
1583 spfc.push_back(lArFcalZmin);
1587 spfc.push_back(lArFcalZmax);
1591 std::vector<size_t> hf{0,1,2,3};
1597 std::vector<float> snfc;
1598 snfc.push_back(-lArFcalZmax);
1602 snfc.push_back(-lArFcalZmin);
1606 std::vector<size_t>
hfn{3,2,1,0};
1621 lArPositiveFcalBounds,
1622 lArFcalMaterialBinPos,
1625 "Calo::Detectors::LAr::PositiveFcal");
1628 lArNegativeFcalBounds,
1629 lArFcalMaterialBinNeg,
1632 "Calo::Detectors::LAr::NegativeFcal");
1639 const PVConstLink topEC = lArMgr->
getTreeTop(1U);
1642 const PVConstLink
mbts= getChild(topEC,
"MBTS_mother",trIn);
1650 const PVConstLink mbts1= getChild(
mbts,
"MBTS1",trIn);
1651 if (mbts1) mbtsZ=fabs(trIn.translation().z());
1655 const GeoLogVol* clv = mbts1->getLogVol();
1656 const GeoTrd* trd=
dynamic_cast<const GeoTrd*
> (clv->getShape());
1657 if (trd) mbts_rmin = trIn.translation().perp()-trd->getZHalfLength();
1660 const PVConstLink mbts2= getChild(
mbts,
"MBTS2",tr2);
1662 const GeoLogVol* clv = mbts2->getLogVol();
1663 const GeoTrd* trd=
dynamic_cast<const GeoTrd*
> (clv->getShape());
1664 if (trd) mbts_rmax = (tr2.translation().perp()+trd->getZHalfLength())/
cos(acos(-1.)/8);
1672 if (mbtsZ>0. && mbts_rmin>0. && mbts_rmax>0.){
1679 ATH_MSG_DEBUG(
"Filled in LAr MBTS bounds : " << *lArNegativeMBTSBounds );
1690 lArNegativeMBTSBounds->
clone(),
1692 dummyLayers, dummyVolumes,
1693 "Calo::Detectors::MBTS");
1696 lArNegativeMBTSBounds,
1698 dummyLayers, dummyVolumes,
1699 "Calo::Detectors::MBTS");
1703 ATH_MSG_DEBUG(
"Checking the existence of all Tracking Volumes:" );
1706 ATH_MSG_DEBUG(
" -> Calo::GapVolumes::LAr::SolenoidPresamplerGap ");
1708 ATH_MSG_DEBUG(
" -> Calo::Detectors::LAr::BarrelPresampler ");
1712 if (lArPositiveEndcapInnerGap) {
1713 ATH_MSG_DEBUG(
" -> Calo::GapVolumes::LAr::PositiveEndcapInnerGap ");
1714 printCheckResult(
msg(
MSG::DEBUG), lArPositiveEndcapInnerGap);
1716 ATH_MSG_DEBUG(
" -> Calo::Detectors::LAr::PositiveEndcap ");
1722 ATH_MSG_DEBUG(
" -> Calo::Detectors::LAr::LArPositiveHecFcalCover ");
1724 if (lArNegativeEndcapInnerGap) {
1725 ATH_MSG_DEBUG(
" -> Calo::GapVolumes::LAr::NegativeEndcapInnerGap ");
1726 printCheckResult(
msg(
MSG::DEBUG), lArNegativeEndcapInnerGap);
1728 ATH_MSG_DEBUG(
" -> Calo::Detectors::LAr::NegativeEndcap ");
1734 ATH_MSG_DEBUG(
" -> Calo::Detectors::LAr::LArNegativeHecFcalCover ");
1736 ATH_MSG_DEBUG(
" -> Calo::Detectors::LAr::LArPositiveECPresampler ");
1738 ATH_MSG_DEBUG(
" -> Calo::Detectors::LAr::LArNegativeECPresampler ");
1743 std::vector<Trk::TrackingVolume*>* lArTrackingVolumes =
new std::vector<Trk::TrackingVolume*>;
1746 if (solenoid && solenoidLArBarrelGap && lArBarrelPresampler && lArBarrel &&
1747 lArPositiveEndcap && lArPositiveHec && lArPositiveFcal && lArPositiveHecFcalCover &&
1748 lArNegativeEndcap && lArNegativeHec && lArNegativeFcal && lArNegativeHecFcalCover){
1753 lArTrackingVolumes->push_back(solenoid);
1755 lArTrackingVolumes->push_back(solenoidLArBarrelGap);
1757 lArTrackingVolumes->push_back(lArBarrelPresampler);
1759 lArTrackingVolumes->push_back(lArBarrel);
1762 lArTrackingVolumes->push_back(lArPositiveEndcapInnerGap);
1763 lArTrackingVolumes->push_back(lArPositiveEndcap);
1765 lArTrackingVolumes->push_back(lArPositiveHec);
1767 lArTrackingVolumes->push_back(lArPositiveFcal);
1769 lArTrackingVolumes->push_back(lArPositiveHecFcalCover);
1772 lArTrackingVolumes->push_back(lArNegativeEndcapInnerGap);
1773 lArTrackingVolumes->push_back(lArNegativeEndcap);
1775 lArTrackingVolumes->push_back(lArNegativeHec);
1777 lArTrackingVolumes->push_back(lArNegativeFcal);
1779 lArTrackingVolumes->push_back(lArNegativeHecFcalCover);
1781 lArTrackingVolumes->push_back(lArPosECPresampler);
1783 lArTrackingVolumes->push_back(lArNegECPresampler);
1787 return lArTrackingVolumes;
1798 const GeoLogVol* lv =
pv->getLogVol();
1799 ATH_MSG_VERBOSE(
"New LAr Object:"<<lv->getName()<<
", made of"<<lv->getMaterial()->getName()<<
","<<lv->getShape()->type());
1800 const GeoTrd* trd=
dynamic_cast<const GeoTrd*
> (lv->getShape());
1801 if (trd)
ATH_MSG_VERBOSE(
"trddim:"<< trd->getXHalfLength1()<<
","<<trd->getXHalfLength2()<<
","<<trd->getYHalfLength1()<<
","<<trd->getYHalfLength2()<<
","<<trd->getZHalfLength());
1802 const GeoTubs* tub=
dynamic_cast<const GeoTubs*
> (lv->getShape());
1803 if (tub)
ATH_MSG_VERBOSE(
"tubdim:"<< tub->getRMin()<<
","<<tub->getRMax()<<
","<<tub->getZHalfLength());
1804 const GeoTube*
tube=
dynamic_cast<const GeoTube*
> (lv->getShape());
1806 const GeoPcon* con=
dynamic_cast<const GeoPcon*
> (lv->getShape());
1808 const unsigned int nPlanes=con->getNPlanes();
1809 for (
unsigned int i=0;
i<nPlanes;
i++) {
1810 ATH_MSG_VERBOSE(
"polycone:"<<
i<<
":"<< con->getRMinPlane(
i)<<
","<<con->getRMaxPlane(
i)<<
","<<con->getZPlane(
i));
1814 ATH_MSG_VERBOSE(
"position:"<<
"R:"<<transf.translation().perp()<<
",phi:"<< transf.translation().phi()<<
",x:"<<transf.translation().x()<<
",y:"<<transf.translation().y()<<
",z:"<<transf.translation().z());
1816 printChildren(
pv,
gen,igen,transf);
1822 unsigned int nc =
pv->getNChildVols();
1824 if (
gen>-1 && igen>
gen)
return;
1826 for (
unsigned int ic=0;
ic<
nc;
ic++) {
1828 const PVConstLink cv =
pv->getChildVol(
ic);
1829 const GeoLogVol* clv = cv->getLogVol();
1831 ATH_MSG_VERBOSE(
"subcomponent:"<<igen<<
":"<<
ic<<
":"<<clv->getName()<<
", made of"<<clv->getMaterial()->getName()<<
","<<clv->getShape()->type());
1832 ATH_MSG_VERBOSE(
"position:"<<
"R:"<<transf.translation().perp()<<
",phi:"<< transf.translation().phi()<<
",x:"<<transf.translation().x()<<
",y:"<<transf.translation().y()<<
",z:"<<transf.translation().z());
1833 const GeoTrd* trd=
dynamic_cast<const GeoTrd*
> (clv->getShape());
1834 if (trd)
ATH_MSG_VERBOSE(
"trddim:"<< trd->getXHalfLength1()<<
","<<trd->getXHalfLength2()<<
","<<trd->getYHalfLength1()<<
","<<trd->getYHalfLength2()<<
","<<trd->getZHalfLength());
1835 const GeoTubs* tub=
dynamic_cast<const GeoTubs*
> (clv->getShape());
1836 if (tub)
ATH_MSG_VERBOSE(
"tubdim:"<< tub->getRMin()<<
","<<tub->getRMax()<<
","<<tub->getZHalfLength());
1837 const GeoTube*
tube=
dynamic_cast<const GeoTube*
> (clv->getShape());
1839 const GeoPcon* con=
dynamic_cast<const GeoPcon*
> (clv->getShape());
1841 const unsigned int nPlanes=con->getNPlanes();
1842 for (
unsigned int i=0;
i<nPlanes;
i++) {
1843 ATH_MSG_VERBOSE(
"polycone:"<<
i<<
":"<< con->getRMinPlane(
i)<<
","<<con->getRMaxPlane(
i)<<
","<<con->getZPlane(
i));
1847 if (
ic==0 || cname != clv->getName() ) {
1848 printChildren(cv,
gen,igen,transf);
1849 cname = clv->getName();
1858 for (
const GeoVolumeVec_t::value_type&
p :
geoGetVolumes (&*mother))
1861 GeoPVConstLink cv =
p.first;
1862 const GeoLogVol* clv = cv->getLogVol();
1863 if (clv->getName().substr(0,
name.size())==
name) { trIn = transf;
return cv; }
1864 GeoPVConstLink
next=getChild(cv,
name,transf);
1865 if (
next) {trIn = transf;
return next; }