diff --git a/PhysicsAnalysis/AnalysisCommon/IsolationSelection/IsolationSelection/IIsolationCloseByCorrectionTool.h b/PhysicsAnalysis/AnalysisCommon/IsolationSelection/IsolationSelection/IIsolationCloseByCorrectionTool.h index 4b5bc8067be64baa01f1d82de77830e29e8e3757..2076cc598e83d8a78c361f97228794c908c21386 100644 --- a/PhysicsAnalysis/AnalysisCommon/IsolationSelection/IsolationSelection/IIsolationCloseByCorrectionTool.h +++ b/PhysicsAnalysis/AnalysisCommon/IsolationSelection/IsolationSelection/IIsolationCloseByCorrectionTool.h @@ -35,8 +35,8 @@ namespace CP { const std::vector<xAOD::Iso::IsolationType>& types, const xAOD::IParticleContainer& closePar) const = 0; - virtual CorrectionCode getCloseByIsoCorrection(const xAOD::ElectronContainer* Electrons = nullptr, const xAOD::MuonContainer* Muons = nullptr, - const xAOD::PhotonContainer* Photons = nullptr) const = 0; + virtual CorrectionCode getCloseByIsoCorrection(xAOD::ElectronContainer* Electrons = nullptr, xAOD::MuonContainer* Muons = nullptr, + xAOD::PhotonContainer* Photons = nullptr) const = 0; virtual CorrectionCode subtractCloseByContribution(xAOD::IParticle& x, const xAOD::IParticleContainer& closebyPar) const = 0; virtual float getOriginalIsolation(const xAOD::IParticle& P, IsoType type) const = 0; diff --git a/PhysicsAnalysis/AnalysisCommon/IsolationSelection/IsolationSelection/IsolationCloseByCorrectionTool.h b/PhysicsAnalysis/AnalysisCommon/IsolationSelection/IsolationSelection/IsolationCloseByCorrectionTool.h index 92805fe3a596f8593c939a4c167f4b0893cb2db4..6764b6e9f68fb60ffc7927e14533cfd436a89aef 100644 --- a/PhysicsAnalysis/AnalysisCommon/IsolationSelection/IsolationSelection/IsolationCloseByCorrectionTool.h +++ b/PhysicsAnalysis/AnalysisCommon/IsolationSelection/IsolationSelection/IsolationCloseByCorrectionTool.h @@ -57,8 +57,8 @@ namespace CP { virtual asg::AcceptData acceptCorrected(const xAOD::IParticle& x, const xAOD::IParticleContainer& closePar) const override; - virtual CorrectionCode getCloseByIsoCorrection(const xAOD::ElectronContainer* Electrons, const xAOD::MuonContainer* Muons, - const xAOD::PhotonContainer* Photons) const override; + virtual CorrectionCode getCloseByIsoCorrection(xAOD::ElectronContainer* Electrons, xAOD::MuonContainer* Muons, + xAOD::PhotonContainer* Photons) const override; virtual CorrectionCode subtractCloseByContribution(xAOD::IParticle& x, const xAOD::IParticleContainer& closebyPar) const override; virtual float getOriginalIsolation(const xAOD::IParticle& P, IsoType type) const override; diff --git a/PhysicsAnalysis/AnalysisCommon/IsolationSelection/Root/IsolationCloseByCorrectionTool.cxx b/PhysicsAnalysis/AnalysisCommon/IsolationSelection/Root/IsolationCloseByCorrectionTool.cxx index dc4857aa91391a97af91ce0e58298acb8e040bf9..3efbe8d0f571954362abf5a10762ec8caf81b022 100644 --- a/PhysicsAnalysis/AnalysisCommon/IsolationSelection/Root/IsolationCloseByCorrectionTool.cxx +++ b/PhysicsAnalysis/AnalysisCommon/IsolationSelection/Root/IsolationCloseByCorrectionTool.cxx @@ -180,8 +180,8 @@ namespace CP { } } } - CorrectionCode IsolationCloseByCorrectionTool::getCloseByIsoCorrection(const xAOD::ElectronContainer* Electrons, const xAOD::MuonContainer* Muons, - const xAOD::PhotonContainer* Photons) const { + CorrectionCode IsolationCloseByCorrectionTool::getCloseByIsoCorrection(xAOD::ElectronContainer* Electrons, xAOD::MuonContainer* Muons, + xAOD::PhotonContainer* Photons) const { if (!m_isInitialised) { ATH_MSG_ERROR("The IsolationCloseByCorrectionTool was not initialised!!!"); return CorrectionCode::Error; diff --git a/PhysicsAnalysis/AnalysisCommon/IsolationSelection/src/TestIsolationCloseByCorrAlg.cxx b/PhysicsAnalysis/AnalysisCommon/IsolationSelection/src/TestIsolationCloseByCorrAlg.cxx index a6ca42888c6aa42e383b0381b01f65e471573fc7..9b2b8d4eb3763ddf0a290c12f8432a502a491ae3 100644 --- a/PhysicsAnalysis/AnalysisCommon/IsolationSelection/src/TestIsolationCloseByCorrAlg.cxx +++ b/PhysicsAnalysis/AnalysisCommon/IsolationSelection/src/TestIsolationCloseByCorrAlg.cxx @@ -57,9 +57,11 @@ namespace CP { ATH_CHECK(m_tree.write()); return StatusCode::SUCCESS; } - template <class CONT_TYPE> - StatusCode TestIsolationCloseByCorrAlg::loadContainer(const EventContext& ctx, const SG::ReadHandleKey<CONT_TYPE>& key, - const CONT_TYPE*& cont) const { + template <class TARGET_TYPE, class CONT_TYPE, class COPY_TYPE> + StatusCode TestIsolationCloseByCorrAlg::loadContainer(const EventContext& ctx, + const SG::ReadHandleKey<CONT_TYPE>& key, + std::pair<std::unique_ptr<COPY_TYPE>, + std::unique_ptr<xAOD::ShallowAuxContainer>>& cont) const { if (key.empty()) { ATH_MSG_DEBUG("No key given. Assume it's no required to load the container"); return StatusCode::SUCCESS; @@ -69,9 +71,11 @@ namespace CP { ATH_MSG_FATAL("Failed to load container " << key.fullKey()); return StatusCode::FAILURE; } - cont = readHandle.ptr(); + + cont = xAOD::shallowCopyContainer(dynamic_cast<const TARGET_TYPE&> (*readHandle),ctx); if (!m_selDecorator && !m_isoDecorator) return StatusCode::SUCCESS; - for (const auto part : *cont) { + std::unique_ptr<COPY_TYPE>& elems = cont.first; + for (auto part : *(elems.get()) ) { if (m_selDecorator) (*m_selDecorator)(*part) = passSelection(ctx, part); if (m_isoDecorator) (*m_isoDecorator)(*part) = true && m_isoSelectorTool->accept(*part); } @@ -95,15 +99,21 @@ namespace CP { StatusCode TestIsolationCloseByCorrAlg::execute() { const EventContext& ctx = Gaudi::Hive::currentContext(); - const xAOD::ElectronContainer* Electrons{nullptr}; - const xAOD::MuonContainer* Muons{nullptr}; - const xAOD::PhotonContainer* Photons{nullptr}; - const xAOD::EgammaContainer* Egamma{nullptr}; - ATH_CHECK(loadContainer(ctx, m_elecKey, Egamma)); - Electrons = dynamic_cast<const xAOD::ElectronContainer*>(Egamma); - ATH_CHECK(loadContainer(ctx, m_photKey, Egamma)); - Photons = dynamic_cast<const xAOD::PhotonContainer*>(Egamma); - ATH_CHECK(loadContainer(ctx, m_muonKey, Muons)); + // + xAOD::ElectronContainer* Electrons = nullptr; + std::pair<std::unique_ptr<xAOD::ElectronContainer>, std::unique_ptr<xAOD::ShallowAuxContainer>> ElShallow; + ATH_CHECK(loadContainer<xAOD::ElectronContainer>(ctx, m_elecKey, ElShallow)); + Electrons = ElShallow.first.get(); + // + xAOD::PhotonContainer* Photons = nullptr; + std::pair<std::unique_ptr<xAOD::PhotonContainer>, std::unique_ptr<xAOD::ShallowAuxContainer>> PhShallow; + ATH_CHECK(loadContainer<xAOD::PhotonContainer>(ctx, m_photKey, PhShallow)); + Photons = PhShallow.first.get(); + // + xAOD::MuonContainer* Muons = nullptr; + std::pair<std::unique_ptr<xAOD::MuonContainer>, std::unique_ptr<xAOD::ShallowAuxContainer>> MuonsShallow; + ATH_CHECK(loadContainer<xAOD::MuonContainer>(ctx, m_muonKey, MuonsShallow)); + Muons = MuonsShallow.first.get(); // Okay everything is defined for the preselection of the algorithm. lets pass the things towards the IsoCorrectionTool if (m_isoCloseByCorrTool->getCloseByIsoCorrection(Electrons, Muons, Photons).code() == CorrectionCode::Error) { diff --git a/PhysicsAnalysis/AnalysisCommon/IsolationSelection/src/TestIsolationCloseByCorrAlg.h b/PhysicsAnalysis/AnalysisCommon/IsolationSelection/src/TestIsolationCloseByCorrAlg.h index 076c8b25a8ae5646081cccacd4a2048d4253bd5f..918d8003ff00c804b16d4359379769915cb67ce2 100644 --- a/PhysicsAnalysis/AnalysisCommon/IsolationSelection/src/TestIsolationCloseByCorrAlg.h +++ b/PhysicsAnalysis/AnalysisCommon/IsolationSelection/src/TestIsolationCloseByCorrAlg.h @@ -25,6 +25,7 @@ #include "xAODEgamma/PhotonContainer.h" #include "xAODEventInfo/EventInfo.h" #include "xAODMuon/MuonContainer.h" +#include "xAODCore/ShallowCopy.h" /** * @brief Simple algorithm to check the performance of the IsolationCloseByCorrectionTool. The algorithm writes TTrees that can be analyzed @@ -47,8 +48,10 @@ namespace CP { unsigned int cardinality() const override { return 1; } private: - template <class CONT_TYPE> - StatusCode loadContainer(const EventContext& ctx, const SG::ReadHandleKey<CONT_TYPE>& key, const CONT_TYPE*& cont) const; + template <class TARGET_TYPE, class CONT_TYPE, class COPY_TYPE> + StatusCode loadContainer(const EventContext& ctx, const SG::ReadHandleKey<CONT_TYPE>& key, + std::pair<std::unique_ptr<COPY_TYPE>, + std::unique_ptr<xAOD::ShallowAuxContainer>>& cont) const; bool passSelection(const EventContext& ctx, const xAOD::Muon* muon) const; bool passSelection(const EventContext& ctx, const xAOD::Egamma* egamm) const;