diff --git a/InnerDetector/InDetDetDescr/InDetTrackingGeometry/InDetTrackingGeometry/DiscOverlapDescriptor.h b/InnerDetector/InDetDetDescr/InDetTrackingGeometry/InDetTrackingGeometry/DiscOverlapDescriptor.h index 3137a28cf14d6ea15cc27da7fc280b7c0170468b..50defa5feda85fe3de9044a44e98e64d1948c906 100644 --- a/InnerDetector/InDetDetDescr/InDetTrackingGeometry/InDetTrackingGeometry/DiscOverlapDescriptor.h +++ b/InnerDetector/InDetDetDescr/InDetTrackingGeometry/InDetTrackingGeometry/DiscOverlapDescriptor.h @@ -118,9 +118,6 @@ namespace InDet { const Trk::BinnedArray<Trk::Surface>* m_bin_array; std::vector<Trk::BinUtility*>* m_singleBinUtils; bool m_pixelCase; - mutable std::atomic<const SCT_ID*> m_sctIdHelper{nullptr}; - mutable std::atomic<const PixelID*> m_pixIdHelper{nullptr}; - }; diff --git a/InnerDetector/InDetDetDescr/InDetTrackingGeometry/src/DiscOverlapDescriptor.cxx b/InnerDetector/InDetDetDescr/InDetTrackingGeometry/src/DiscOverlapDescriptor.cxx index 7c0bcf1a99399b30946ea514f9367189464684c8..8be2bfede9609924ff385465f48473c93de55b30 100644 --- a/InnerDetector/InDetDetDescr/InDetTrackingGeometry/src/DiscOverlapDescriptor.cxx +++ b/InnerDetector/InDetDetDescr/InDetTrackingGeometry/src/DiscOverlapDescriptor.cxx @@ -19,6 +19,47 @@ #include "InDetIdentifier/PixelID.h" #include "Identifier/Identifier.h" #include <utility> +#include <exception> + +namespace { + +//Helpers to do "pseudo retrievals" +//if this was an alg/tool these would have been done +//once in init. + +const StoreGateSvc* +getDetStore() +{ + ISvcLocator* svcLocator = Gaudi::svcLocator(); + const StoreGateSvc* detStore = nullptr; + if (svcLocator->service("DetectorStore", detStore).isFailure()) { + throw std::runtime_error( + "DiscOverlapDescriptor can not locate DetectorStore"); + } + return detStore; +} + +const PixelID* +getPixelID(StoreGateSvc const * const detStore) +{ + const PixelID* pixIdHelper = nullptr; + if (detStore->retrieve(pixIdHelper, "PixelID").isFailure()) { + throw std::runtime_error("DiscOverlapDescriptor can not locate PixelID"); + } + return pixIdHelper; +} + +const SCT_ID* +getSCT_ID(StoreGateSvc const * const detStore) +{ + const SCT_ID* sctIdHelper = nullptr; + if (detStore->retrieve(sctIdHelper, "SCT_ID").isFailure()) { + throw std::runtime_error("DiscOverlapDescriptor can not locate SCT_ID"); + } + return sctIdHelper; +} + +} // end anonymous namespace InDet::DiscOverlapDescriptor::DiscOverlapDescriptor(const Trk::BinnedArray<Trk::Surface>* bin_array, std::vector<Trk::BinUtility*>* singleBinUtils, @@ -34,39 +75,22 @@ bool InDet::DiscOverlapDescriptor::reachableSurfaces(std::vector<Trk::SurfaceInt const Amg::Vector3D& pos, const Amg::Vector3D&) const { - // Get Storegate, ID helpers, and so on - if (m_sctIdHelper==nullptr || m_pixIdHelper==nullptr) { - ISvcLocator* svcLocator = Gaudi::svcLocator(); - - // get DetectorStore service - StoreGateSvc* detStore = nullptr; - if (svcLocator->service("DetectorStore", detStore).isFailure()) { - return false; - } - - if (m_pixelCase) { - const PixelID* pixIdHelper = nullptr; - if (detStore->retrieve(pixIdHelper, "PixelID").isFailure()) { - return false; - } - m_pixIdHelper = pixIdHelper; - } else { - const SCT_ID* sctIdHelper = nullptr; - if (detStore->retrieve(sctIdHelper, "SCT_ID").isFailure()) { - return false; - } - m_sctIdHelper = sctIdHelper; - } - } + //These are done once no matter how many + //instances of DiscOverlapDescriptor we have + static const StoreGateSvc* const detStore = getDetStore(); + static const PixelID* const pixIdHelper = getPixelID(detStore); + static const SCT_ID* const sctIdHelper = getSCT_ID(detStore); // get the according detector element const InDetDD::SiDetectorElement* pElement = dynamic_cast<const InDetDD::SiDetectorElement*>(tsf.associatedDetectorElement()); // first add the target surface surfaces.emplace_back(Trk::Intersection(pos, 0., true),&tsf); - int etaModule = m_pixelCase ? m_pixIdHelper.load()->eta_module(tsf.associatedDetectorElementIdentifier()) - : m_sctIdHelper.load()->eta_module(tsf.associatedDetectorElementIdentifier()); - + int etaModule = + m_pixelCase + ? pixIdHelper->eta_module(tsf.associatedDetectorElementIdentifier()) + : sctIdHelper->eta_module(tsf.associatedDetectorElementIdentifier()); + // return empty cell vector if (pElement) { size_t newCapacity = surfaces.size() + 19; @@ -103,13 +127,19 @@ bool InDet::DiscOverlapDescriptor::reachableSurfaces(std::vector<Trk::SurfaceInt std::vector<const Trk::Surface*> surf = m_bin_array->arrayObjects(); size_t offset = 0; for (unsigned int bin = 0; bin < m_singleBinUtils->size(); bin++) { - int etamod = m_pixelCase ? m_pixIdHelper.load()->eta_module((*(surf.at(offset))).associatedDetectorElementIdentifier()) : m_sctIdHelper.load()->eta_module((*(surf.at(offset))).associatedDetectorElementIdentifier()); - - if (etamod == etaModule || etamod<(etaModule-1) || etamod>(etaModule+1)) { + int etamod = + m_pixelCase + ? pixIdHelper->eta_module( + (*(surf.at(offset))).associatedDetectorElementIdentifier()) + : sctIdHelper->eta_module( + (*(surf.at(offset))).associatedDetectorElementIdentifier()); + + if (etamod == etaModule || etamod < (etaModule - 1) || + etamod > (etaModule + 1)) { offset += (std::as_const(*m_singleBinUtils).at(bin))->bins(); continue; } - + double PrevDeltaPhi = 9999.; double NextDeltaPhi = -9999.; for (unsigned int ss = offset; ss < (offset+(std::as_const(*m_singleBinUtils).at(bin))->bins()); ss++ ) { @@ -210,20 +240,25 @@ bool InDet::DiscOverlapDescriptor::reachableSurfaces(std::vector<Trk::SurfaceInt } bool InDet::DiscOverlapDescriptor::dumpSurfaces(std::vector<Trk::SurfaceIntersection>& surfaces) const { - std::cout << "Dumping Surfaces for "<< (m_pixelCase ? "Pixel " : "SCT ") << "with size = " << surfaces.size() << std::endl; + std::cout << "Dumping Surfaces for " << (m_pixelCase ? "Pixel " : "SCT ") + << "with size = " << surfaces.size() << std::endl; + static const StoreGateSvc* const detStore = getDetStore(); + static const PixelID* const pixIdHelper = getPixelID(detStore); + static const SCT_ID* const sctIdHelper = getSCT_ID(detStore); + for (unsigned int surf = 0; surf < surfaces.size(); surf++) { Identifier hitId = ((surfaces.at(surf)).object)->associatedDetectorElementIdentifier(); if (m_pixelCase) - std::cout << "barrel_ec " << m_pixIdHelper.load()->barrel_ec(hitId) - << ", layer_disk " << m_pixIdHelper.load()->layer_disk(hitId) - << ", phi_module " << m_pixIdHelper.load()->phi_module(hitId) - << ", eta_module " << m_pixIdHelper.load()->eta_module(hitId) << std::endl; + std::cout << "barrel_ec " << pixIdHelper->barrel_ec(hitId) + << ", layer_disk " << pixIdHelper->layer_disk(hitId) + << ", phi_module " << pixIdHelper->phi_module(hitId) + << ", eta_module " << pixIdHelper->eta_module(hitId) << std::endl; else - std::cout << "barrel_ec " << m_sctIdHelper.load()->barrel_ec(hitId) - << ", layer_disk " << m_sctIdHelper.load()->layer_disk(hitId) - << ", phi_module " << m_sctIdHelper.load()->phi_module(hitId) - << ", eta_module " << m_sctIdHelper.load()->eta_module(hitId) - << ", side " << m_sctIdHelper.load()->side(hitId) << std::endl; + std::cout << "barrel_ec " << sctIdHelper->barrel_ec(hitId) + << ", layer_disk " << sctIdHelper->layer_disk(hitId) + << ", phi_module " << sctIdHelper->phi_module(hitId) + << ", eta_module " << sctIdHelper->eta_module(hitId) + << ", side " << sctIdHelper->side(hitId) << std::endl; } return true; }