diff --git a/Reconstruction/RecoAlgs/IsolationAlgs/src/IsolationBuilder.cxx b/Reconstruction/RecoAlgs/IsolationAlgs/src/IsolationBuilder.cxx index 4a52a704bee1968c34892df956390086fb366761..b2d683b7b41efe79be3e9a2f36b28d072f1892f4 100644 --- a/Reconstruction/RecoAlgs/IsolationAlgs/src/IsolationBuilder.cxx +++ b/Reconstruction/RecoAlgs/IsolationAlgs/src/IsolationBuilder.cxx @@ -4,55 +4,69 @@ Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration */ -// IsolationBuilder.cxx +// IsolationBuilder.cxx // Implementation file for class IsolationBuilder -/////////////////////////////////////////////////////////////////// - +/////////////////////////////////////////////////////////////////// // Isolation includes #include "IsolationBuilder.h" #include "xAODEgamma/Egamma.h" -#include "xAODEgamma/Photon.h" #include "xAODEgamma/EgammaxAODHelpers.h" +#include "xAODEgamma/Photon.h" -IsolationBuilder::IsolationBuilder( const std::string& name, - ISvcLocator* pSvcLocator ) : - ::AthAlgorithm( name, pSvcLocator ) -{ -} +IsolationBuilder::IsolationBuilder(const std::string& name, + ISvcLocator* pSvcLocator) + : ::AthReentrantAlgorithm(name, pSvcLocator) +{} IsolationBuilder::~IsolationBuilder() {} -StatusCode IsolationBuilder::initialize() +StatusCode +IsolationBuilder::initialize() { - ATH_MSG_INFO ("Initializing " << name() << "..."); - + ATH_MSG_INFO("Initializing " << name() << "..."); + std::set<xAOD::Iso::IsolationFlavour> runIsoType; - + ATH_MSG_DEBUG("Initializing central electrons"); - ATH_CHECK(initializeIso(runIsoType, &m_elCaloIso, &m_elTrackIso, - m_ElectronContainerName, - m_elisoInts, m_elcorInts, m_elcorIntsExtra, - m_customConfigEl)); - + ATH_CHECK(initializeIso(runIsoType, + &m_elCaloIso, + &m_elTrackIso, + m_ElectronContainerName, + m_elisoInts, + m_elcorInts, + m_elcorIntsExtra, + m_customConfigEl)); + ATH_MSG_DEBUG("Initializing central photons"); - ATH_CHECK(initializeIso(runIsoType, &m_phCaloIso, &m_phTrackIso, - m_PhotonContainerName, - m_phisoInts, m_phcorInts, m_phcorIntsExtra, - m_customConfigPh)); - + ATH_CHECK(initializeIso(runIsoType, + &m_phCaloIso, + &m_phTrackIso, + m_PhotonContainerName, + m_phisoInts, + m_phcorInts, + m_phcorIntsExtra, + m_customConfigPh)); + ATH_MSG_DEBUG("Initializing forward electrons"); - ATH_CHECK(initializeIso(runIsoType, &m_feCaloIso, nullptr, - m_FwdElectronContainerName, - m_feisoInts, m_fecorInts, m_fecorIntsExtra, - m_customConfigFwd)); + ATH_CHECK(initializeIso(runIsoType, + &m_feCaloIso, + nullptr, + m_FwdElectronContainerName, + m_feisoInts, + m_fecorInts, + m_fecorIntsExtra, + m_customConfigFwd)); ATH_MSG_DEBUG("Initializing muons"); - ATH_CHECK(initializeIso(runIsoType, &m_muCaloIso, &m_muTrackIso, - m_MuonContainerName, - m_muisoInts, m_mucorInts, m_mucorIntsExtra, - m_customConfigMu)); - + ATH_CHECK(initializeIso(runIsoType, + &m_muCaloIso, + &m_muTrackIso, + m_MuonContainerName, + m_muisoInts, + m_mucorInts, + m_mucorIntsExtra, + m_customConfigMu)); // declare the dependencies // (need to do this since the WriteDecorHandleKeys are not properties @@ -66,72 +80,76 @@ StatusCode IsolationBuilder::initialize() declareIso(m_muTrackIso); // Retrieve the tools (there three Calo ones are the same in fact) - if (!m_cellIsolationTool.empty() && runIsoType.find(xAOD::Iso::etcone) != runIsoType.end()) { + if (!m_cellIsolationTool.empty() && + runIsoType.find(xAOD::Iso::etcone) != runIsoType.end()) { ATH_CHECK(m_cellIsolationTool.retrieve()); } else { m_cellIsolationTool.disable(); } - if (!m_topoIsolationTool.empty() && runIsoType.find(xAOD::Iso::topoetcone) != runIsoType.end()) { + if (!m_topoIsolationTool.empty() && + runIsoType.find(xAOD::Iso::topoetcone) != runIsoType.end()) { ATH_CHECK(m_topoIsolationTool.retrieve()); } else { m_topoIsolationTool.disable(); } - if (!m_pflowIsolationTool.empty() && runIsoType.find(xAOD::Iso::neflowisol) != runIsoType.end()) { + if (!m_pflowIsolationTool.empty() && + runIsoType.find(xAOD::Iso::neflowisol) != runIsoType.end()) { ATH_CHECK(m_pflowIsolationTool.retrieve()); } else { m_pflowIsolationTool.disable(); } - if (!m_trackIsolationTool.empty() && runIsoType.find(xAOD::Iso::IsolationFlavour::ptcone) != runIsoType.end()) { + if (!m_trackIsolationTool.empty() && + runIsoType.find(xAOD::Iso::IsolationFlavour::ptcone) != + runIsoType.end()) { ATH_CHECK(m_trackIsolationTool.retrieve()); } else { m_trackIsolationTool.disable(); } - - //initialise data handles + + // initialise data handles ATH_CHECK(m_cellsKey.initialize(!m_cellIsolationTool.empty())); return StatusCode::SUCCESS; } -StatusCode IsolationBuilder::finalize() +StatusCode +IsolationBuilder::finalize() { - ATH_MSG_INFO ("Finalizing " << name() << "..."); + ATH_MSG_INFO("Finalizing " << name() << "..."); return StatusCode::SUCCESS; } -StatusCode IsolationBuilder::execute() -{ - ATH_MSG_DEBUG ("Executing " << name() << "..."); +StatusCode +IsolationBuilder::execute(const EventContext& ctx) const +{ + ATH_MSG_DEBUG("Executing " << name() << "..."); // For etcone, needs the cells + + const CaloCellContainer* cellColl = nullptr; if (!m_cellIsolationTool.empty()) { - SG::ReadHandle<CaloCellContainer> cellcoll(m_cellsKey); - + SG::ReadHandle<CaloCellContainer> cellcoll(m_cellsKey, ctx); // check is only used for serial running; remove when MT scheduler used - if(!cellcoll.isValid()) { - ATH_MSG_FATAL("Failed to retrieve cell container: "<< m_cellsKey.key()); + if (!cellcoll.isValid()) { + ATH_MSG_FATAL("Failed to retrieve cell container: " << m_cellsKey.key()); return StatusCode::FAILURE; } - - m_cellColl = cellcoll.cptr(); - } else { - m_cellColl = nullptr; + cellColl = cellcoll.cptr(); } - // Compute isolations ATH_MSG_DEBUG("About to execute Electron calo iso"); - ATH_CHECK(executeCaloIso(m_elCaloIso)); + ATH_CHECK(executeCaloIso(m_elCaloIso, cellColl)); ATH_MSG_DEBUG("About to execute Photon calo iso"); - ATH_CHECK(executeCaloIso(m_phCaloIso)); + ATH_CHECK(executeCaloIso(m_phCaloIso, cellColl)); ATH_MSG_DEBUG("About to execute Forwerd Electron calo iso"); - ATH_CHECK(executeCaloIso(m_feCaloIso)); + ATH_CHECK(executeCaloIso(m_feCaloIso, cellColl)); ATH_MSG_DEBUG("About to execute muon calo iso"); - ATH_CHECK(executeCaloIso(m_muCaloIso)); + ATH_CHECK(executeCaloIso(m_muCaloIso, cellColl)); ATH_MSG_DEBUG("About to execute Electron track iso"); ATH_CHECK(executeTrackIso(m_elTrackIso)); @@ -139,7 +157,7 @@ StatusCode IsolationBuilder::execute() ATH_CHECK(executeTrackIso(m_phTrackIso)); ATH_MSG_DEBUG("About to execute Muon track iso"); ATH_CHECK(executeTrackIso(m_muTrackIso)); - + return StatusCode::SUCCESS; } @@ -151,7 +169,8 @@ IsolationBuilder::CaloIsoHelpKey::CaloIsoHelpKey(IDataHandleHolder* owningAlg) } // declare dependencies -void IsolationBuilder::CaloIsoHelpKey::declare(IDataHandleHolder* owningAlg) +void +IsolationBuilder::CaloIsoHelpKey::declare(IDataHandleHolder* owningAlg) { isoDeco.declare(owningAlg); owningAlg->declare(corrBitsetDeco); @@ -174,7 +193,8 @@ IsolationBuilder::TrackIsoHelpKey::TrackIsoHelpKey(IDataHandleHolder* owningAlg) } // declare dependencies -void IsolationBuilder::TrackIsoHelpKey::declare(IDataHandleHolder* owningAlg) +void +IsolationBuilder::TrackIsoHelpKey::declare(IDataHandleHolder* owningAlg) { isoDeco.declare(owningAlg); isoDecoV.declare(owningAlg); @@ -186,8 +206,9 @@ void IsolationBuilder::TrackIsoHelpKey::declare(IDataHandleHolder* owningAlg) } // constructor -IsolationBuilder::CaloIsoHelpHandles::CaloIsoHelpHandles(const IsolationBuilder::CaloIsoHelpKey& keys) : - corrBitsetDeco(keys.corrBitsetDeco) +IsolationBuilder::CaloIsoHelpHandles::CaloIsoHelpHandles( + const IsolationBuilder::CaloIsoHelpKey& keys) + : corrBitsetDeco(keys.corrBitsetDeco) { for (const auto& key : keys.isoDeco) { isoDeco.emplace_back(key); @@ -196,15 +217,16 @@ IsolationBuilder::CaloIsoHelpHandles::CaloIsoHelpHandles(const IsolationBuilder: coreCorDeco.emplace(coreCor); } for (const auto& noncoreCor : keys.noncoreCorDeco) { - noncoreCorDeco.emplace(noncoreCor.first, - std::vector<SG::WriteDecorHandle<xAOD::IParticleContainer, float> >{ - std::begin(noncoreCor.second), - std::end(noncoreCor.second)}); + noncoreCorDeco.emplace( + noncoreCor.first, + std::vector<SG::WriteDecorHandle<xAOD::IParticleContainer, float>>{ + std::begin(noncoreCor.second), std::end(noncoreCor.second) }); } } -IsolationBuilder::TrackIsoHelpHandles::TrackIsoHelpHandles(const IsolationBuilder::TrackIsoHelpKey& keys) : - corrBitsetDeco(keys.corrBitsetDeco) +IsolationBuilder::TrackIsoHelpHandles::TrackIsoHelpHandles( + const IsolationBuilder::TrackIsoHelpKey& keys) + : corrBitsetDeco(keys.corrBitsetDeco) { for (const auto& key : keys.isoDeco) { isoDeco.emplace_back(key); @@ -217,26 +239,29 @@ IsolationBuilder::TrackIsoHelpHandles::TrackIsoHelpHandles(const IsolationBuilde } } -bool IsolationBuilder::isCoreCor(xAOD::Iso::IsolationCaloCorrection cor) { - return (cor == xAOD::Iso::coreCone || - cor == xAOD::Iso::coreConeSC || - cor == xAOD::Iso::coreMuon || - cor == xAOD::Iso::core57cells); +bool +IsolationBuilder::isCoreCor(xAOD::Iso::IsolationCaloCorrection cor) +{ + return (cor == xAOD::Iso::coreCone || cor == xAOD::Iso::coreConeSC || + cor == xAOD::Iso::coreMuon || cor == xAOD::Iso::core57cells); } - -StatusCode IsolationBuilder::initializeIso(std::set<xAOD::Iso::IsolationFlavour>& runIsoType, // out - std::vector<std::pair<xAOD::Iso::IsolationFlavour,CaloIsoHelpKey> >* caloIsoMap, // out - std::vector<std::pair<xAOD::Iso::IsolationFlavour,TrackIsoHelpKey> >* trackIsoMap, // out - const std::string& containerName, - const std::vector<std::vector<int> >& isoInts, - const std::vector<std::vector<int> >& corInts, - const std::vector<std::vector<int> >& corIntsExtra, - const std::string& customConfig) +StatusCode +IsolationBuilder::initializeIso( + std::set<xAOD::Iso::IsolationFlavour>& runIsoType, // out + std::vector<std::pair<xAOD::Iso::IsolationFlavour, CaloIsoHelpKey>>* + caloIsoMap, // out + std::vector<std::pair<xAOD::Iso::IsolationFlavour, TrackIsoHelpKey>>* + trackIsoMap, // out + const std::string& containerName, + const std::vector<std::vector<int>>& isoInts, + const std::vector<std::vector<int>>& corInts, + const std::vector<std::vector<int>>& corIntsExtra, + const std::string& customConfig) { - + std::string prefix = containerName + "."; - + for (size_t flavor = 0; flavor < isoInts.size(); flavor++) { // iterate over the flavor (cell, topo, eflow, track // Note: it is a configuration error if different types @@ -244,50 +269,56 @@ StatusCode IsolationBuilder::initializeIso(std::set<xAOD::Iso::IsolationFlavour> CaloIsoHelpKey cisoH(this); TrackIsoHelpKey tisoH(this); - - //std::vector<SG::AuxElement::Decorator<float>*> Deco; - xAOD::Iso::IsolationFlavour isoFlav = - xAOD::Iso::numIsolationFlavours; - xAOD::Iso::IsolationFlavour oldIsoFlav = - xAOD::Iso::numIsolationFlavours; - - for (size_t type = 0; type < isoInts[flavor].size();type++) { + + // std::vector<SG::AuxElement::Decorator<float>*> Deco; + xAOD::Iso::IsolationFlavour isoFlav = xAOD::Iso::numIsolationFlavours; + xAOD::Iso::IsolationFlavour oldIsoFlav = xAOD::Iso::numIsolationFlavours; + + for (size_t type = 0; type < isoInts[flavor].size(); type++) { // iterate over the cone sizes for a given flavor. - // (also check that the cone sizes really are of the same flavor; otherwise an error) - - xAOD::Iso::IsolationType isoType = static_cast<xAOD::Iso::IsolationType>(isoInts[flavor][type]); + // (also check that the cone sizes really are of the same flavor; + // otherwise an error) + + xAOD::Iso::IsolationType isoType = + static_cast<xAOD::Iso::IsolationType>(isoInts[flavor][type]); isoFlav = xAOD::Iso::isolationFlavour(isoType); ATH_MSG_DEBUG("Saw isoType " << isoType << " and isoFlav " << isoFlav); - if (oldIsoFlav != xAOD::Iso::numIsolationFlavours && oldIsoFlav != isoFlav) { - ATH_MSG_FATAL("Configuration error: can only have one type of isolation in inner vector"); - return StatusCode::FAILURE; + if (oldIsoFlav != xAOD::Iso::numIsolationFlavours && + oldIsoFlav != isoFlav) { + ATH_MSG_FATAL("Configuration error: can only have one type of " + "isolation in inner vector"); + return StatusCode::FAILURE; } oldIsoFlav = isoFlav; std::string isoName = prefix + xAOD::Iso::toString(isoType); - if (customConfig != "") { - isoName += "_" + customConfig; + if (!customConfig.empty()) { + isoName += "_" + customConfig; } - if (isoFlav == xAOD::Iso::etcone || isoFlav == xAOD::Iso::topoetcone || isoFlav == xAOD::Iso::neflowisol) { - cisoH.isoTypes.push_back(isoType); - cisoH.isoDeco.emplace_back(isoName); + if (isoFlav == xAOD::Iso::etcone || isoFlav == xAOD::Iso::topoetcone || + isoFlav == xAOD::Iso::neflowisol) { + cisoH.isoTypes.push_back(isoType); + cisoH.isoDeco.emplace_back(isoName); } else if (isoFlav == xAOD::Iso::ptcone) { - tisoH.isoTypes.push_back(isoType); - tisoH.isoDeco.emplace_back(isoName); - auto coneSize = static_cast<int>(round(100*xAOD::Iso::coneSize(isoType))); - std::string isoNameV = prefix + "ptvarcone" + std::to_string(coneSize); - if (customConfig != "") { - isoNameV += "_" + customConfig; - } - tisoH.isoDecoV.emplace_back(isoNameV); + tisoH.isoTypes.push_back(isoType); + tisoH.isoDeco.emplace_back(isoName); + auto coneSize = + static_cast<int>(round(100 * xAOD::Iso::coneSize(isoType))); + std::string isoNameV = prefix + "ptvarcone" + std::to_string(coneSize); + if (!customConfig.empty()) { + isoNameV += "_" + customConfig; + } + tisoH.isoDecoV.emplace_back(isoNameV); } else { - ATH_MSG_FATAL("Configuration error: Isolation flavor " << isoFlav << " not supported."); - return StatusCode::FAILURE; - } + ATH_MSG_FATAL("Configuration error: Isolation flavor " + << isoFlav << " not supported."); + return StatusCode::FAILURE; + } } - + // check that there were isolations configured if (isoFlav == xAOD::Iso::numIsolationFlavours) { - ATH_MSG_WARNING("The configuration was malformed: an empty inner vector was added; ignoring"); + ATH_MSG_WARNING("The configuration was malformed: an empty inner vector " + "was added; ignoring"); continue; } @@ -298,133 +329,149 @@ StatusCode IsolationBuilder::initializeIso(std::set<xAOD::Iso::IsolationFlavour> // and finally add it to the IsoMap. /////////////////////////////// - if (isoFlav == xAOD::Iso::etcone || isoFlav == xAOD::Iso::topoetcone || isoFlav == xAOD::Iso::neflowisol) { - + if (isoFlav == xAOD::Iso::etcone || isoFlav == xAOD::Iso::topoetcone || + isoFlav == xAOD::Iso::neflowisol) { + // let's initialize the decos ATH_MSG_DEBUG("Initializing cisoH.isoDeco"); ATH_CHECK(cisoH.isoDeco.initialize()); - ATH_CHECK(addCaloIsoCorrections(flavor, isoFlav, cisoH, corInts, false, prefix, customConfig)); - ATH_CHECK(addCaloIsoCorrections(flavor, isoFlav, cisoH, corIntsExtra, true, prefix, customConfig)); - + ATH_CHECK(addCaloIsoCorrections( + flavor, isoFlav, cisoH, corInts, false, prefix, customConfig)); + ATH_CHECK(addCaloIsoCorrections( + flavor, isoFlav, cisoH, corIntsExtra, true, prefix, customConfig)); + if (caloIsoMap) { - caloIsoMap->push_back(std::make_pair(isoFlav,cisoH)); + caloIsoMap->push_back(std::make_pair(isoFlav, cisoH)); } else { - ATH_MSG_FATAL("caloIsoMap was nullptr but the configuration attempted to use it"); - return StatusCode::FAILURE; + ATH_MSG_FATAL( + "caloIsoMap was nullptr but the configuration attempted to use it"); + return StatusCode::FAILURE; } } else if (isoFlav == xAOD::Iso::ptcone) { - + // let's initialize the decos ATH_MSG_DEBUG("Initializing tisoH.isoDeco"); ATH_CHECK(tisoH.isoDeco.initialize()); ATH_MSG_DEBUG("Initializing tisoH.isoDecoV"); ATH_CHECK(tisoH.isoDecoV.initialize()); - - ATH_CHECK(addTrackIsoCorrections(flavor, isoFlav, tisoH, corInts, false, prefix, customConfig)); - ATH_CHECK(addTrackIsoCorrections(flavor, isoFlav, tisoH, corIntsExtra, true, prefix, customConfig)); - + + ATH_CHECK(addTrackIsoCorrections( + flavor, isoFlav, tisoH, corInts, false, prefix, customConfig)); + ATH_CHECK(addTrackIsoCorrections( + flavor, isoFlav, tisoH, corIntsExtra, true, prefix, customConfig)); + if (trackIsoMap) { - trackIsoMap->push_back(std::make_pair(isoFlav,tisoH)); + trackIsoMap->push_back(std::make_pair(isoFlav, tisoH)); } else { - ATH_MSG_FATAL("trackIsoMap was nullptr but the configuration attempted to use it"); - return StatusCode::FAILURE; - } + ATH_MSG_FATAL( + "trackIsoMap was nullptr but the configuration attempted to use it"); + return StatusCode::FAILURE; + } } else { - ATH_MSG_WARNING("Isolation flavour " << xAOD::Iso::toCString(isoFlav) << " does not exist ! Check your inputs"); + ATH_MSG_WARNING("Isolation flavour " + << xAOD::Iso::toCString(isoFlav) + << " does not exist ! Check your inputs"); } runIsoType.insert(isoFlav); } return StatusCode::SUCCESS; } - -StatusCode IsolationBuilder::addCaloIsoCorrections(size_t flavor, - xAOD::Iso::IsolationFlavour isoFlav, - CaloIsoHelpKey& cisoH, - const std::vector<std::vector<int> >& corInts, - bool corrsAreExtra, - const std::string& prefix, - const std::string& customConfig ) +StatusCode +IsolationBuilder::addCaloIsoCorrections( + size_t flavor, + xAOD::Iso::IsolationFlavour isoFlav, + CaloIsoHelpKey& cisoH, + const std::vector<std::vector<int>>& corInts, + bool corrsAreExtra, + const std::string& prefix, + const std::string& customConfig) { - + if (!corrsAreExtra) { - std::string bitsetName = prefix + xAOD::Iso::toString(isoFlav) + "CorrBitset"; - if (customConfig != "") { + std::string bitsetName = + prefix + xAOD::Iso::toString(isoFlav) + "CorrBitset"; + if (!customConfig.empty()) { bitsetName += "_" + customConfig; } - + cisoH.corrBitsetDeco = bitsetName; ATH_MSG_DEBUG("Initializing " << cisoH.corrBitsetDeco.key()); ATH_CHECK(cisoH.corrBitsetDeco.initialize()); } for (size_t corrType = 0; corrType < corInts[flavor].size(); corrType++) { - + // iterate over the calo isolation corrections const auto cor = static_cast<unsigned int>(corInts[flavor][corrType]); - if (!corrsAreExtra) cisoH.CorrList.calobitset.set(cor); - const xAOD::Iso::IsolationCaloCorrection isoCor = static_cast<xAOD::Iso::IsolationCaloCorrection>(cor); - - // ATH_MSG_DEBUG("for corrections, prefix = " << prefix << ", flavor = " << xAOD::Iso::toString(isoFlav) - // << ", cor = " << xAOD::Iso::toString(isoCor) << ", coreEnergy " << xAOD::Iso::toString(xAOD::Iso::coreEnergy)); - - + if (!corrsAreExtra) + cisoH.CorrList.calobitset.set(cor); + const xAOD::Iso::IsolationCaloCorrection isoCor = + static_cast<xAOD::Iso::IsolationCaloCorrection>(cor); + if (isCoreCor(isoCor)) { std::string isoCorName = prefix; - + if (isoCor != xAOD::Iso::core57cells) { - isoCorName += xAOD::Iso::toString(isoFlav); // since this doesn't depend on the flavor, just have one + isoCorName += xAOD::Iso::toString( + isoFlav); // since this doesn't depend on the flavor, just have one } - + // a core correction; only store core energy, not the core area - isoCorName += xAOD::Iso::toString(isoCor) + xAOD::Iso::toString(xAOD::Iso::coreEnergy) - + "Correction"; - if (customConfig != "") { - isoCorName += "_" + customConfig; + isoCorName += xAOD::Iso::toString(isoCor) + + xAOD::Iso::toString(xAOD::Iso::coreEnergy) + "Correction"; + if (!customConfig.empty()) { + isoCorName += "_" + customConfig; } cisoH.coreCorDeco.emplace(isoCor, isoCorName); cisoH.coreCorDeco[isoCor].setOwner(this); ATH_MSG_DEBUG("initializing " << cisoH.coreCorDeco[isoCor].key()); ATH_CHECK(cisoH.coreCorDeco[isoCor].initialize()); } else if (isoCor == xAOD::Iso::pileupCorrection) { - // do not store pileup corrections as they are rho * pi * (R**2 - areaCore) and rho is stored... + // do not store pileup corrections as they are rho * pi * (R**2 - + // areaCore) and rho is stored... continue; - } else { + } else { // noncore correction - cisoH.noncoreCorDeco.emplace(isoCor, SG::WriteDecorHandleKeyArray<xAOD::IParticleContainer>() ); + cisoH.noncoreCorDeco.emplace( + isoCor, SG::WriteDecorHandleKeyArray<xAOD::IParticleContainer>()); auto& vec = cisoH.noncoreCorDeco[isoCor]; vec.setOwner(this); for (auto type : cisoH.isoTypes) { - std::string corName = prefix + xAOD::Iso::toString(type) + xAOD::Iso::toString(isoCor) + "Correction"; - if (customConfig != "") { - corName += "_" + customConfig; - } - vec.emplace_back(corName); + std::string corName = prefix + xAOD::Iso::toString(type) + + xAOD::Iso::toString(isoCor) + "Correction"; + if (!customConfig.empty()) { + corName += "_" + customConfig; + } + vec.emplace_back(corName); } - ATH_MSG_DEBUG("Initializing " << xAOD::Iso::toString(isoCor) << " Corrections"); + ATH_MSG_DEBUG("Initializing " << xAOD::Iso::toString(isoCor) + << " Corrections"); ATH_CHECK(vec.initialize()); } } return StatusCode::SUCCESS; } - -StatusCode IsolationBuilder::addTrackIsoCorrections(size_t flavor, - xAOD::Iso::IsolationFlavour isoFlav, - TrackIsoHelpKey& tisoH, - const std::vector<std::vector<int> >& corInts, - bool corrsAreExtra, - const std::string& prefix, - const std::string& customConfig) +StatusCode +IsolationBuilder::addTrackIsoCorrections( + size_t flavor, + xAOD::Iso::IsolationFlavour isoFlav, + TrackIsoHelpKey& tisoH, + const std::vector<std::vector<int>>& corInts, + bool corrsAreExtra, + const std::string& prefix, + const std::string& customConfig) { if (!corrsAreExtra) { - std::string bitsetName = prefix + xAOD::Iso::toString(isoFlav) + "CorrBitset"; - if (customConfig != "") { + std::string bitsetName = + prefix + xAOD::Iso::toString(isoFlav) + "CorrBitset"; + if (!customConfig.empty()) { bitsetName += "_" + customConfig; } - + tisoH.corrBitsetDeco = bitsetName; ATH_MSG_DEBUG("Initializing " << tisoH.corrBitsetDeco.key()); ATH_CHECK(tisoH.corrBitsetDeco.initialize()); @@ -432,14 +479,16 @@ StatusCode IsolationBuilder::addTrackIsoCorrections(size_t flavor, for (size_t corrType = 0; corrType < corInts[flavor].size(); corrType++) { const auto cor = static_cast<unsigned int>(corInts[flavor][corrType]); - if (!corrsAreExtra) tisoH.CorrList.trackbitset.set(cor); - const xAOD::Iso::IsolationTrackCorrection isoCor = static_cast<xAOD::Iso::IsolationTrackCorrection>(cor); - + if (!corrsAreExtra) + tisoH.CorrList.trackbitset.set(cor); + const xAOD::Iso::IsolationTrackCorrection isoCor = + static_cast<xAOD::Iso::IsolationTrackCorrection>(cor); + // all pt corrections are core type - std::string isoCorName = prefix + xAOD::Iso::toString(isoFlav) + - xAOD::Iso::toString(isoCor) + "Correction"; - - if (customConfig != "") { + std::string isoCorName = prefix + xAOD::Iso::toString(isoFlav) + + xAOD::Iso::toString(isoCor) + "Correction"; + + if (!customConfig.empty()) { isoCorName += "_" + customConfig; } tisoH.coreCorDeco.emplace(isoCor, isoCorName); @@ -450,227 +499,236 @@ StatusCode IsolationBuilder::addTrackIsoCorrections(size_t flavor, return StatusCode::SUCCESS; } -StatusCode IsolationBuilder::executeCaloIso(const std::vector<std::pair<xAOD::Iso::IsolationFlavour,CaloIsoHelpKey> >& caloIsoMap) +StatusCode +IsolationBuilder::executeCaloIso( + const std::vector<std::pair<xAOD::Iso::IsolationFlavour, CaloIsoHelpKey>>& + caloIsoMap, + const CaloCellContainer* cellColl) const { for (const auto& pr : caloIsoMap) { const xAOD::Iso::IsolationFlavour flav = pr.first; - const auto& keys = pr.second; + const auto& keys = pr.second; CaloIsoHelpHandles handles(keys); ATH_MSG_DEBUG("Executing calo iso flavor: " << xAOD::Iso::toString(flav)); if (handles.isoDeco.empty()) { - ATH_MSG_FATAL("Have a CaloIsoHelpHandles with no actual isolations; something wrong happened"); + ATH_MSG_FATAL("Have a CaloIsoHelpHandles with no actual isolations; " + "something wrong happened"); return StatusCode::FAILURE; } - auto& readHandle = handles.isoDeco[0]; // can treat the writeDecorHandle as a read handle; + auto& readHandle = + handles.isoDeco[0]; // can treat the writeDecorHandle as a read handle; if (!readHandle.isValid()) { - ATH_MSG_FATAL("Could not retrieve read handle for " << keys.isoDeco[0].key()); + ATH_MSG_FATAL("Could not retrieve read handle for " + << keys.isoDeco[0].key()); return StatusCode::FAILURE; } - for (auto part : *readHandle) { + for (const auto *part : *readHandle) { xAOD::CaloIsolation CaloIsoResult; bool successfulCalc = false; - if (flav == xAOD::Iso::IsolationFlavour::etcone && m_cellColl) { - successfulCalc = m_cellIsolationTool->caloCellIsolation(CaloIsoResult, *part, keys.isoTypes, keys.CorrList, m_cellColl); + if (flav == xAOD::Iso::IsolationFlavour::etcone && cellColl) { + successfulCalc = m_cellIsolationTool->caloCellIsolation( + CaloIsoResult, *part, keys.isoTypes, keys.CorrList, cellColl); } else if (flav == xAOD::Iso::IsolationFlavour::topoetcone) { - successfulCalc = m_topoIsolationTool->caloTopoClusterIsolation(CaloIsoResult, *part, keys.isoTypes, keys.CorrList); + successfulCalc = m_topoIsolationTool->caloTopoClusterIsolation( + CaloIsoResult, *part, keys.isoTypes, keys.CorrList); } else if (flav == xAOD::Iso::IsolationFlavour::neflowisol) { - successfulCalc = m_pflowIsolationTool->neutralEflowIsolation(CaloIsoResult, *part, keys.isoTypes, keys.CorrList); + successfulCalc = m_pflowIsolationTool->neutralEflowIsolation( + CaloIsoResult, *part, keys.isoTypes, keys.CorrList); } if (successfulCalc) { - for (unsigned int i = 0; i < keys.isoTypes.size(); i++) { - float iso = CaloIsoResult.etcones[i]; - ATH_MSG_DEBUG("custom Iso " << xAOD::Iso::toCString(keys.isoTypes[i]) << " = " << iso/1e3); - (handles.isoDeco[i])(*part) = iso; - } - // corrections - (handles.corrBitsetDeco)(*part) = keys.CorrList.calobitset.to_ulong(); - - // // let's do the core corrections - // for (const auto& coreCorPr : CaloIsoResult.coreCorrections) { - // std::map<xAOD::Iso::IsolationCorrectionParameter,float>::const_iterator it = - // coreCorPr.second.find(xAOD::Iso::coreEnergy); - // if (it != coreCorPr.second.end()) { - // ATH_MSG_DEBUG("About to write core correction: " << coreCorPr.first); - // try { - // (handles.coreCorDeco.at(coreCorPr.first))(*part) = it->second; - // } catch (const std::exception& e) { - // ATH_MSG_FATAL("Failed writing the core iso correction: " << e.what()); - // return StatusCode::FAILURE; - // } - // } - // } - - // let's do the core corrections - - // iterate over the values we want to store - for (auto& coreCorDecoPr : handles.coreCorDeco) { - // find the matching result - auto corIter = CaloIsoResult.coreCorrections.find(coreCorDecoPr.first); - if (corIter == CaloIsoResult.coreCorrections.end()) { - ATH_MSG_FATAL("Could not find core correction of required type: " << xAOD::Iso::toCString(coreCorDecoPr.first)); - ATH_MSG_FATAL("Check configuration"); - return StatusCode::FAILURE; - } - // now that we have the match, let's find the energy - std::map<xAOD::Iso::IsolationCorrectionParameter,float>::const_iterator it = - corIter->second.find(xAOD::Iso::coreEnergy); - if (it == corIter->second.end()) { - ATH_MSG_FATAL("Could not find coreEnergy correction for: " << xAOD::Iso::toCString(coreCorDecoPr.first)); - ATH_MSG_FATAL("Check configuration"); - return StatusCode::FAILURE; - } - ATH_MSG_DEBUG("About to write core correction: " << xAOD::Iso::toCString(coreCorDecoPr.first)); - (coreCorDecoPr.second)(*part) = it->second; - } - - // // let's do the noncore corrections - // for (const auto& noncoreCorPr : CaloIsoResult.noncoreCorrections) { - // auto& vecHandles = handles.noncoreCorDeco[noncoreCorPr.first]; - // if (vecHandles.size() != noncoreCorPr.second.size()) { - // ATH_MSG_FATAL("Got back the wrong number of corrections for " << noncoreCorPr.first); - // ATH_MSG_FATAL(" Expected: " << vecHandles.size() << ", received: " << noncoreCorPr.second.size()); - // return StatusCode::FAILURE; - // } - // for (size_t i = 0; i < vecHandles.size(); i++) { - // (vecHandles[i])(*part) = noncoreCorPr.second[i]; - // } - // } - - // let's do the noncore corrections - for (auto& noncoreCorDecoPr : handles.noncoreCorDeco) { - // find the matching result - auto corIter = CaloIsoResult.noncoreCorrections.find(noncoreCorDecoPr.first); - if (corIter == CaloIsoResult.noncoreCorrections.end()) { - ATH_MSG_FATAL("Could not find noncore correction of required type: " << xAOD::Iso::toCString(noncoreCorDecoPr.first)); - ATH_MSG_FATAL("Check configuration"); - return StatusCode::FAILURE; - } - - ATH_MSG_DEBUG("About to write noncore correction: " << xAOD::Iso::toCString(noncoreCorDecoPr.first)); - auto& vecHandles = noncoreCorDecoPr.second; - for (size_t i = 0; i < vecHandles.size(); i++) { - (vecHandles[i])(*part) = corIter->second[i]; - } - } + for (unsigned int i = 0; i < keys.isoTypes.size(); i++) { + float iso = CaloIsoResult.etcones[i]; + ATH_MSG_DEBUG("custom Iso " << xAOD::Iso::toCString(keys.isoTypes[i]) + << " = " << iso / 1e3); + (handles.isoDeco[i])(*part) = iso; + } + // corrections + (handles.corrBitsetDeco)(*part) = keys.CorrList.calobitset.to_ulong(); + + // let's do the core corrections + + // iterate over the values we want to store + for (auto& coreCorDecoPr : handles.coreCorDeco) { + // find the matching result + auto corIter = + CaloIsoResult.coreCorrections.find(coreCorDecoPr.first); + if (corIter == CaloIsoResult.coreCorrections.end()) { + ATH_MSG_FATAL("Could not find core correction of required type: " + << xAOD::Iso::toCString(coreCorDecoPr.first)); + ATH_MSG_FATAL("Check configuration"); + return StatusCode::FAILURE; + } + // now that we have the match, let's find the energy + std::map<xAOD::Iso::IsolationCorrectionParameter, + float>::const_iterator it = + corIter->second.find(xAOD::Iso::coreEnergy); + if (it == corIter->second.end()) { + ATH_MSG_FATAL("Could not find coreEnergy correction for: " + << xAOD::Iso::toCString(coreCorDecoPr.first)); + ATH_MSG_FATAL("Check configuration"); + return StatusCode::FAILURE; + } + ATH_MSG_DEBUG("About to write core correction: " + << xAOD::Iso::toCString(coreCorDecoPr.first)); + (coreCorDecoPr.second)(*part) = it->second; + } + + // let's do the noncore corrections + for (auto& noncoreCorDecoPr : handles.noncoreCorDeco) { + // find the matching result + auto corIter = + CaloIsoResult.noncoreCorrections.find(noncoreCorDecoPr.first); + if (corIter == CaloIsoResult.noncoreCorrections.end()) { + ATH_MSG_FATAL("Could not find noncore correction of required type: " + << xAOD::Iso::toCString(noncoreCorDecoPr.first)); + ATH_MSG_FATAL("Check configuration"); + return StatusCode::FAILURE; + } + + ATH_MSG_DEBUG("About to write noncore correction: " + << xAOD::Iso::toCString(noncoreCorDecoPr.first)); + auto& vecHandles = noncoreCorDecoPr.second; + for (size_t i = 0; i < vecHandles.size(); i++) { + (vecHandles[i])(*part) = corIter->second[i]; + } + } } else { - ATH_MSG_FATAL("Call to CaloIsolationTool failed for flavor " << xAOD::Iso::toCString(flav)); - return StatusCode::FAILURE; + ATH_MSG_FATAL("Call to CaloIsolationTool failed for flavor " + << xAOD::Iso::toCString(flav)); + return StatusCode::FAILURE; } } } return StatusCode::SUCCESS; } -// FIXME: need to add the electron bremAssoc -StatusCode IsolationBuilder::executeTrackIso(const std::vector<std::pair<xAOD::Iso::IsolationFlavour,TrackIsoHelpKey > >& trackIsoMap) +StatusCode +IsolationBuilder::executeTrackIso( + const std::vector<std::pair<xAOD::Iso::IsolationFlavour, TrackIsoHelpKey>>& + trackIsoMap) const { for (const auto& pr : trackIsoMap) { const xAOD::Iso::IsolationFlavour flav = pr.first; - const auto& keys = pr.second; + const auto& keys = pr.second; TrackIsoHelpHandles handles(keys); ATH_MSG_DEBUG("Executing track iso flavor: " << xAOD::Iso::toString(flav)); if (handles.isoDeco.empty()) { - ATH_MSG_FATAL("Have a TrackIsoHelpHandles with no actual isolations; something wrong happened"); + ATH_MSG_FATAL("Have a TrackIsoHelpHandles with no actual isolations; " + "something wrong happened"); return StatusCode::FAILURE; } - auto& readHandle = handles.isoDeco[0]; // can treat the writeDecorHandle as a read handle; + auto& readHandle = + handles.isoDeco[0]; // can treat the writeDecorHandle as a read handle; if (!readHandle.isValid()) { - ATH_MSG_FATAL("Could not retrieve read handle for " << keys.isoDeco[0].key()); + ATH_MSG_FATAL("Could not retrieve read handle for " + << keys.isoDeco[0].key()); return StatusCode::FAILURE; } - for (auto part : *readHandle) { + for (const auto *part : *readHandle) { xAOD::TrackIsolation TrackIsoResult; bool successfulCalc = false; // check to see if we are dealing with an electron - auto *eg = dynamic_cast<const xAOD::Egamma*>(part); + const auto * eg = dynamic_cast<const xAOD::Egamma*>(part); if (eg) { - ATH_MSG_DEBUG("Doing track isolation on an egamma particle"); - std::set<const xAOD::TrackParticle*> tracksToExclude; - if (xAOD::EgammaHelpers::isElectron(eg)) { - tracksToExclude = xAOD::EgammaHelpers::getTrackParticles(eg, m_useBremAssoc); - } else { - if (m_allTrackRemoval) { //New (from ??/??/16) : now this gives all tracks - tracksToExclude = xAOD::EgammaHelpers::getTrackParticles(eg, m_useBremAssoc); - } else { // this is just to be able to have the 2015+2016 default case (only tracks from first vertex) - auto *gam = dynamic_cast<const xAOD::Photon *>(eg); - if (gam && gam->nVertices() > 0) { - const xAOD::Vertex *phvtx = gam->vertex(0); - for (unsigned int itk = 0; itk < phvtx->nTrackParticles(); itk++) - tracksToExclude.insert(m_useBremAssoc ? xAOD::EgammaHelpers::getOriginalTrackParticleFromGSF(phvtx->trackParticle(itk)) : phvtx->trackParticle(itk)); - } - } - } - successfulCalc = m_trackIsolationTool->trackIsolation(TrackIsoResult, *part, keys.isoTypes, keys.CorrList, nullptr, &tracksToExclude); + ATH_MSG_DEBUG("Doing track isolation on an egamma particle"); + std::set<const xAOD::TrackParticle*> tracksToExclude; + if (xAOD::EgammaHelpers::isElectron(eg)) { + tracksToExclude = + xAOD::EgammaHelpers::getTrackParticles(eg, m_useBremAssoc); + } else { + if (m_allTrackRemoval) { // New (from ??/??/16) : now this gives all + // tracks + tracksToExclude = + xAOD::EgammaHelpers::getTrackParticles(eg, m_useBremAssoc); + } else { // this is just to be able to have the 2015+2016 default case + // (only tracks from first vertex) + const auto * gam = dynamic_cast<const xAOD::Photon*>(eg); + if (gam && gam->nVertices() > 0) { + const xAOD::Vertex* phvtx = gam->vertex(0); + for (unsigned int itk = 0; itk < phvtx->nTrackParticles(); itk++) + tracksToExclude.insert( + m_useBremAssoc + ? xAOD::EgammaHelpers::getOriginalTrackParticleFromGSF( + phvtx->trackParticle(itk)) + : phvtx->trackParticle(itk)); + } + } + } + successfulCalc = m_trackIsolationTool->trackIsolation(TrackIsoResult, + *part, + keys.isoTypes, + keys.CorrList, + nullptr, + &tracksToExclude); } else { - ATH_MSG_DEBUG("Not doing track isolation on an egamma particle"); - successfulCalc = m_trackIsolationTool->trackIsolation(TrackIsoResult, *part, keys.isoTypes, keys.CorrList); + ATH_MSG_DEBUG("Not doing track isolation on an egamma particle"); + successfulCalc = m_trackIsolationTool->trackIsolation( + TrackIsoResult, *part, keys.isoTypes, keys.CorrList); } if (successfulCalc) { - for (unsigned int i = 0; i < keys.isoTypes.size(); i++) { - float iso = TrackIsoResult.ptcones[i]; - float isoV = TrackIsoResult.ptvarcones_10GeVDivPt[i]; - ATH_MSG_DEBUG("custom Iso " << xAOD::Iso::toCString(keys.isoTypes[i]) << " = " << iso/1e3 << ", var cone = " << isoV/1e3); - (handles.isoDeco[i])(*part) = iso; - (handles.isoDecoV[i])(*part) = isoV; - } - - // corrections - (handles.corrBitsetDeco)(*part) = keys.CorrList.trackbitset.to_ulong(); - - // // let's do the core corrections - // for (const auto& coreCorPr : TrackIsoResult.coreCorrections) { - // ATH_MSG_DEBUG("About to write track correction: " << coreCorPr.first); - // try { - // (handles.coreCorDeco.at(coreCorPr.first))(*part) = coreCorPr.second; - // } catch (const std::exception& e) { - // ATH_MSG_FATAL("Failed writing the track iso correction: " << e.what()); - // return StatusCode::FAILURE; - // } - // } - - // let's do the core corrections - - // iterate over the values we want to store - for (auto& coreCorDecoPr : handles.coreCorDeco) { - // find the matching result - auto corIter = TrackIsoResult.coreCorrections.find(coreCorDecoPr.first); - if (corIter == TrackIsoResult.coreCorrections.end()) { - ATH_MSG_FATAL("Could not find core correction of required type: " << xAOD::Iso::toCString(coreCorDecoPr.first)); - ATH_MSG_FATAL("Check configuration"); - return StatusCode::FAILURE; - } - ATH_MSG_DEBUG("About to write tracking core correction: " << xAOD::Iso::toCString(coreCorDecoPr.first)); - (coreCorDecoPr.second)(*part) = corIter->second; - } + for (unsigned int i = 0; i < keys.isoTypes.size(); i++) { + float iso = TrackIsoResult.ptcones[i]; + float isoV = TrackIsoResult.ptvarcones_10GeVDivPt[i]; + ATH_MSG_DEBUG("custom Iso " << xAOD::Iso::toCString(keys.isoTypes[i]) + << " = " << iso / 1e3 + << ", var cone = " << isoV / 1e3); + (handles.isoDeco[i])(*part) = iso; + (handles.isoDecoV[i])(*part) = isoV; + } + + // corrections + (handles.corrBitsetDeco)(*part) = keys.CorrList.trackbitset.to_ulong(); + // let's do the core corrections + // iterate over the values we want to store + for (auto& coreCorDecoPr : handles.coreCorDeco) { + // find the matching result + auto corIter = + TrackIsoResult.coreCorrections.find(coreCorDecoPr.first); + if (corIter == TrackIsoResult.coreCorrections.end()) { + ATH_MSG_FATAL("Could not find core correction of required type: " + << xAOD::Iso::toCString(coreCorDecoPr.first)); + ATH_MSG_FATAL("Check configuration"); + return StatusCode::FAILURE; + } + ATH_MSG_DEBUG("About to write tracking core correction: " + << xAOD::Iso::toCString(coreCorDecoPr.first)); + (coreCorDecoPr.second)(*part) = corIter->second; + } } else { - ATH_MSG_FATAL("Call to TrackIsolationTool failed for flavor " << xAOD::Iso::toCString(flav)); - return StatusCode::FAILURE; + ATH_MSG_FATAL("Call to TrackIsolationTool failed for flavor " + << xAOD::Iso::toCString(flav)); + return StatusCode::FAILURE; } } } return StatusCode::SUCCESS; } -void IsolationBuilder::declareIso(std::vector<std::pair<xAOD::Iso::IsolationFlavour,CaloIsoHelpKey> >& caloIso) +void +IsolationBuilder::declareIso( + std::vector<std::pair<xAOD::Iso::IsolationFlavour, CaloIsoHelpKey>>& caloIso) { - for (auto &iso : caloIso) { + for (auto& iso : caloIso) { iso.second.declare(this); } } -void IsolationBuilder::declareIso(std::vector<std::pair<xAOD::Iso::IsolationFlavour,TrackIsoHelpKey> >& trackIso) +void +IsolationBuilder::declareIso( + std::vector<std::pair<xAOD::Iso::IsolationFlavour, TrackIsoHelpKey>>& + trackIso) { - for (auto &iso : trackIso) { + for (auto& iso : trackIso) { iso.second.declare(this); } } diff --git a/Reconstruction/RecoAlgs/IsolationAlgs/src/IsolationBuilder.h b/Reconstruction/RecoAlgs/IsolationAlgs/src/IsolationBuilder.h index a9cfafa0df2157707a2030a250f07d7c026f3108..fe82e54b96b0f8a8d7e12309077e2dd27656266e 100644 --- a/Reconstruction/RecoAlgs/IsolationAlgs/src/IsolationBuilder.h +++ b/Reconstruction/RecoAlgs/IsolationAlgs/src/IsolationBuilder.h @@ -1,12 +1,12 @@ ///////////////////////// -*- C++ -*- ///////////////////////////// /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration */ -// IsolationBuilder.h +// IsolationBuilder.h // Header file for class IsolationBuilder -/////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////// #ifndef ISOLATIONALGS_ISOLATIONBUILDER_H #define ISOLATIONALGS_ISOLATIONBUILDER_H 1 @@ -14,204 +14,287 @@ #include "VectorVectorIntParser.h" // STL includes -#include <string> #include <set> -#include <vector> +#include <string> #include <utility> +#include <vector> // FrameWork includes -#include "AthenaBaseComps/AthAlgorithm.h" -#include "GaudiKernel/ToolHandle.h" #include "AthContainers/AuxElement.h" +#include "AthenaBaseComps/AthReentrantAlgorithm.h" +#include "GaudiKernel/ToolHandle.h" #include "StoreGate/ReadHandleKey.h" -#include "StoreGate/WriteDecorHandleKeyArray.h" -#include "StoreGate/WriteDecorHandleKey.h" #include "StoreGate/WriteDecorHandle.h" +#include "StoreGate/WriteDecorHandleKey.h" +#include "StoreGate/WriteDecorHandleKeyArray.h" -#include "xAODPrimitives/IsolationType.h" -#include "xAODPrimitives/IsolationFlavour.h" #include "RecoToolInterfaces/IsolationCommon.h" +#include "xAODPrimitives/IsolationFlavour.h" +#include "xAODPrimitives/IsolationType.h" #include "IsolationCorrections/IIsolationCorrectionTool.h" +#include "xAODBase/IParticleContainer.h" #include "xAODPrimitives/IsolationConeSize.h" #include "xAODPrimitives/IsolationHelpers.h" -#include "xAODBase/IParticleContainer.h" #include "RecoToolInterfaces/ICaloCellIsolationTool.h" #include "RecoToolInterfaces/ICaloTopoClusterIsolationTool.h" -#include "RecoToolInterfaces/ITrackIsolationTool.h" #include "RecoToolInterfaces/INeutralEFlowIsolationTool.h" +#include "RecoToolInterfaces/ITrackIsolationTool.h" #include "CaloEvent/CaloCellContainer.h" +class IsolationBuilder : public AthReentrantAlgorithm +{ -class IsolationBuilder - : public ::AthAlgorithm -{ - - /////////////////////////////////////////////////////////////////// - // Public methods: - /////////////////////////////////////////////////////////////////// - public: - - // Copy constructor: + /////////////////////////////////////////////////////////////////// + // Public methods: + /////////////////////////////////////////////////////////////////// +public: + // Copy constructor: - /// Constructor with parameters: - IsolationBuilder( const std::string& name, ISvcLocator* pSvcLocator ); + /// Constructor with parameters: + IsolationBuilder(const std::string& name, ISvcLocator* pSvcLocator); - /// Destructor: - virtual ~IsolationBuilder(); + /// Destructor: + virtual ~IsolationBuilder(); // Athena algorithm's Hooks - virtual StatusCode initialize(); - virtual StatusCode execute(); - virtual StatusCode finalize(); + virtual StatusCode initialize() override final; + virtual StatusCode execute(const EventContext& ctx) const override final; + virtual StatusCode finalize() override final; - /////////////////////////////////////////////////////////////////// - // Const methods: + /////////////////////////////////////////////////////////////////// + // Const methods: /////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////// - // Non-const methods: - /////////////////////////////////////////////////////////////////// - - /////////////////////////////////////////////////////////////////// - // Private data: - /////////////////////////////////////////////////////////////////// - private: + /////////////////////////////////////////////////////////////////// + // Non-const methods: + /////////////////////////////////////////////////////////////////// - /// Default constructor: + /////////////////////////////////////////////////////////////////// + // Private data: + /////////////////////////////////////////////////////////////////// +private: + /// Default constructor: IsolationBuilder(); /// Containers (Is it best to make them as strings? Used by multiple handles) - Gaudi::Property <std::string> m_ElectronContainerName {this, - "ElectronCollectionContainerName", "Electrons"}; + Gaudi::Property<std::string> m_ElectronContainerName{ + this, + "ElectronCollectionContainerName", + "Electrons" + }; - Gaudi::Property <std::string> m_FwdElectronContainerName {this, - "FwdElectronCollectionContainerName", "ForwardElectrons"}; + Gaudi::Property<std::string> m_FwdElectronContainerName{ + this, + "FwdElectronCollectionContainerName", + "ForwardElectrons" + }; - Gaudi::Property <std::string> m_PhotonContainerName {this, - "PhotonCollectionContainerName", "Photons"}; + Gaudi::Property<std::string> m_PhotonContainerName{ + this, + "PhotonCollectionContainerName", + "Photons" + }; - Gaudi::Property <std::string> m_MuonContainerName {this, - "MuonCollectionContainerName", "Muons"}; + Gaudi::Property<std::string> m_MuonContainerName{ + this, + "MuonCollectionContainerName", + "Muons" + }; /** @brief Tool for cell isolation calculation */ - ToolHandle<xAOD::ICaloCellIsolationTool> m_cellIsolationTool {this, - "CaloCellIsolationTool", "", "Handle of the calo cell IsolationTool"}; + ToolHandle<xAOD::ICaloCellIsolationTool> m_cellIsolationTool{ + this, + "CaloCellIsolationTool", + "", + "Handle of the calo cell IsolationTool" + }; /** @brief Cell container*/ - SG::ReadHandleKey<CaloCellContainer> m_cellsKey {this, - "CellCollectionName", "AllCalo", "Name of container which contain calo cells"}; - const CaloCellContainer* m_cellColl = nullptr; - + SG::ReadHandleKey<CaloCellContainer> m_cellsKey{ + this, + "CellCollectionName", + "AllCalo", + "Name of container which contain calo cells" + }; /** @brief Tool for topo isolation calculation */ - ToolHandle<xAOD::ICaloTopoClusterIsolationTool> m_topoIsolationTool {this, - "CaloTopoIsolationTool", "", "Handle of the calo topo IsolationTool"}; + ToolHandle<xAOD::ICaloTopoClusterIsolationTool> m_topoIsolationTool{ + this, + "CaloTopoIsolationTool", + "", + "Handle of the calo topo IsolationTool" + }; /** @brief Tool for neutral pflow isolation calculation */ - ToolHandle<xAOD::INeutralEFlowIsolationTool> m_pflowIsolationTool {this, - "PFlowIsolationTool", "", "Handle of the pflow IsolationTool"}; + ToolHandle<xAOD::INeutralEFlowIsolationTool> m_pflowIsolationTool{ + this, + "PFlowIsolationTool", + "", + "Handle of the pflow IsolationTool" + }; /** @brief Tool for neutral pflow isolation calculation */ - ToolHandle<xAOD::ITrackIsolationTool> m_trackIsolationTool {this, - "TrackIsolationTool", "", "Handle of the track IsolationTool"}; + ToolHandle<xAOD::ITrackIsolationTool> m_trackIsolationTool{ + this, + "TrackIsolationTool", + "", + "Handle of the track IsolationTool" + }; // FIXME: need to add the electron bremAssoc stuff - Gaudi::Property<bool> m_useBremAssoc {this, - "useBremAssoc", true, "use track to track assoc after brem"}; + Gaudi::Property<bool> m_useBremAssoc{ this, + "useBremAssoc", + true, + "use track to track assoc after brem" }; - Gaudi::Property<bool> m_allTrackRemoval {this, - "AllTrackRemoval", true}; + Gaudi::Property<bool> m_allTrackRemoval{ this, "AllTrackRemoval", true }; /** @brief Isolation types */ - Gaudi::Property<std::vector<std::vector<int> > > m_elisoInts {this, - "ElIsoTypes", {}, - "The isolation types to do for electrons: vector of vector of enum type Iso::IsolationType"}; + Gaudi::Property<std::vector<std::vector<int>>> m_elisoInts{ + this, + "ElIsoTypes", + {}, + "The isolation types to do for electrons: vector of vector of enum type " + "Iso::IsolationType" + }; - Gaudi::Property<std::vector<std::vector<int> > > m_elcorInts {this, - "ElCorTypes", {}, - "The correction types to do for electron iso: vector of vector of enum type Iso::IsolationCalo/TrackCorrection"}; + Gaudi::Property<std::vector<std::vector<int>>> m_elcorInts{ + this, + "ElCorTypes", + {}, + "The correction types to do for electron iso: vector of vector of enum " + "type Iso::IsolationCalo/TrackCorrection" + }; - Gaudi::Property<std::vector<std::vector<int> > > m_elcorIntsExtra {this, - "ElCorTypesExtra", {}, - "The extra correction types to store but not apply for electrons"}; + Gaudi::Property<std::vector<std::vector<int>>> m_elcorIntsExtra{ + this, + "ElCorTypesExtra", + {}, + "The extra correction types to store but not apply for electrons" + }; - /** @brief Isolation types (for the alg. properties, only vector<vector<double>> available */ - Gaudi::Property<std::vector<std::vector<int> > > m_phisoInts {this, - "PhIsoTypes", {}, - "The isolation types to do for photons: vector of vector of enum type Iso::IsolationType"}; + /** @brief Isolation types (for the alg. properties, only + * vector<vector<double>> available */ + Gaudi::Property<std::vector<std::vector<int>>> m_phisoInts{ + this, + "PhIsoTypes", + {}, + "The isolation types to do for photons: vector of vector of enum type " + "Iso::IsolationType" + }; - Gaudi::Property<std::vector<std::vector<int> > > m_phcorInts {this, - "PhCorTypes", {}, - "The correction types to do for photons iso: vector of vector of enum type Iso::IsolationCalo/TrackCorrection"}; + Gaudi::Property<std::vector<std::vector<int>>> m_phcorInts{ + this, + "PhCorTypes", + {}, + "The correction types to do for photons iso: vector of vector of enum type " + "Iso::IsolationCalo/TrackCorrection" + }; - Gaudi::Property<std::vector<std::vector<int> > > m_phcorIntsExtra {this, - "PhCorTypesExtra", {}, - "The extra correction types to store but not apply for photons"}; + Gaudi::Property<std::vector<std::vector<int>>> m_phcorIntsExtra{ + this, + "PhCorTypesExtra", + {}, + "The extra correction types to store but not apply for photons" + }; - Gaudi::Property<std::vector<std::vector<int> > > m_muisoInts {this, - "MuIsoTypes", {}, - "The isolation types to do for Muons : vector of vector of enum type Iso::IsolationType"}; + Gaudi::Property<std::vector<std::vector<int>>> m_muisoInts{ + this, + "MuIsoTypes", + {}, + "The isolation types to do for Muons : vector of vector of enum type " + "Iso::IsolationType" + }; - Gaudi::Property<std::vector<std::vector<int> > > m_mucorInts {this, - "MuCorTypes", {}, - "The correction types to do for Muon iso: vector of vector of enum type Iso::IsolationCalo/TrackCorrection"}; + Gaudi::Property<std::vector<std::vector<int>>> m_mucorInts{ + this, + "MuCorTypes", + {}, + "The correction types to do for Muon iso: vector of vector of enum type " + "Iso::IsolationCalo/TrackCorrection" + }; - Gaudi::Property<std::vector<std::vector<int> > > m_mucorIntsExtra {this, - "MuCorTypesExtra", {}, - "The extra correction types to store but not apply for muons"}; + Gaudi::Property<std::vector<std::vector<int>>> m_mucorIntsExtra{ + this, + "MuCorTypesExtra", + {}, + "The extra correction types to store but not apply for muons" + }; - Gaudi::Property<std::vector<std::vector<int> > > m_feisoInts {this, - "FeIsoTypes", {}, - "The isolation types to do for forward electron: vector of vector of enum type Iso::IsolationType"}; + Gaudi::Property<std::vector<std::vector<int>>> m_feisoInts{ + this, + "FeIsoTypes", + {}, + "The isolation types to do for forward electron: vector of vector of enum " + "type Iso::IsolationType" + }; - Gaudi::Property<std::vector<std::vector<int> > > m_fecorInts {this, - "FeCorTypes", {}, - "The correction types to do for forward electron iso: vector of vector of enum type Iso::IsolationCalo/TrackCorrection"}; + Gaudi::Property<std::vector<std::vector<int>>> m_fecorInts{ + this, + "FeCorTypes", + {}, + "The correction types to do for forward electron iso: vector of vector of " + "enum type Iso::IsolationCalo/TrackCorrection" + }; - Gaudi::Property<std::vector<std::vector<int> > > m_fecorIntsExtra {this, - "FeCorTypesExtra", {}, - "The extra correction types to store but not apply for forward electrons"}; + Gaudi::Property<std::vector<std::vector<int>>> m_fecorIntsExtra{ + this, + "FeCorTypesExtra", + {}, + "The extra correction types to store but not apply for forward electrons" + }; - struct CaloIsoHelpKey { + struct CaloIsoHelpKey + { /// constructor CaloIsoHelpKey(IDataHandleHolder* owningAlg); - /// only to be called after placed in the final location, to propagate dependencies + /// only to be called after placed in the final location, to propagate + /// dependencies void declare(IDataHandleHolder* owningAlg); /// The actual isolations SG::WriteDecorHandleKeyArray<xAOD::IParticleContainer> isoDeco; /// The corrections (one per flavor) - std::map<xAOD::Iso::IsolationCaloCorrection, - SG::WriteDecorHandleKey<xAOD::IParticleContainer> > coreCorDeco; + std::map<xAOD::Iso::IsolationCaloCorrection, + SG::WriteDecorHandleKey<xAOD::IParticleContainer>> + coreCorDeco; /// The corrections (one per flavor/type combination) - std::map<xAOD::Iso::IsolationCaloCorrection, - SG::WriteDecorHandleKeyArray<xAOD::IParticleContainer> > noncoreCorDeco; + std::map<xAOD::Iso::IsolationCaloCorrection, + SG::WriteDecorHandleKeyArray<xAOD::IParticleContainer>> + noncoreCorDeco; /// the types of isolations to calculate std::vector<xAOD::Iso::IsolationType> isoTypes; /// to keep track of the corrections - xAOD::CaloCorrection CorrList; - // xAOD::CaloCorrection CorrListExtra; // should ideally pass this, but not possible yet + xAOD::CaloCorrection CorrList; + // xAOD::CaloCorrection CorrListExtra; // should ideally pass this, but not + // possible yet SG::WriteDecorHandleKey<xAOD::IParticleContainer> corrBitsetDeco; }; - std::vector<std::pair<xAOD::Iso::IsolationFlavour,CaloIsoHelpKey> > m_elCaloIso; - std::vector<std::pair<xAOD::Iso::IsolationFlavour,CaloIsoHelpKey> > m_phCaloIso; - std::vector<std::pair<xAOD::Iso::IsolationFlavour,CaloIsoHelpKey> > m_feCaloIso; - std::vector<std::pair<xAOD::Iso::IsolationFlavour,CaloIsoHelpKey> > m_muCaloIso; - - struct TrackIsoHelpKey { + std::vector<std::pair<xAOD::Iso::IsolationFlavour, CaloIsoHelpKey>> + m_elCaloIso; + std::vector<std::pair<xAOD::Iso::IsolationFlavour, CaloIsoHelpKey>> + m_phCaloIso; + std::vector<std::pair<xAOD::Iso::IsolationFlavour, CaloIsoHelpKey>> + m_feCaloIso; + std::vector<std::pair<xAOD::Iso::IsolationFlavour, CaloIsoHelpKey>> + m_muCaloIso; + + struct TrackIsoHelpKey + { /// constructor TrackIsoHelpKey(IDataHandleHolder* owningAlg); - /// only to be called after placed in the final location, to propagate dependencies + /// only to be called after placed in the final location, to propagate + /// dependencies void declare(IDataHandleHolder* owningAlg); /// The actual isolations @@ -219,103 +302,134 @@ class IsolationBuilder SG::WriteDecorHandleKeyArray<xAOD::IParticleContainer> isoDecoV; /// The corrections - std::map<xAOD::Iso::IsolationTrackCorrection, - SG::WriteDecorHandleKey<xAOD::IParticleContainer> > coreCorDeco; + std::map<xAOD::Iso::IsolationTrackCorrection, + SG::WriteDecorHandleKey<xAOD::IParticleContainer>> + coreCorDeco; /// the types of isolations to calculate std::vector<xAOD::Iso::IsolationType> isoTypes; /// to keep track of the corrections xAOD::TrackCorrection CorrList; - // xAOD::TrackCorrection CorrListExtra; // should ideally pass this, but not possible yet + // xAOD::TrackCorrection CorrListExtra; // should ideally pass this, but not + // possible yet SG::WriteDecorHandleKey<xAOD::IParticleContainer> corrBitsetDeco; }; - std::vector<std::pair<xAOD::Iso::IsolationFlavour,TrackIsoHelpKey> > m_elTrackIso; - std::vector<std::pair<xAOD::Iso::IsolationFlavour,TrackIsoHelpKey> > m_phTrackIso; - std::vector<std::pair<xAOD::Iso::IsolationFlavour,TrackIsoHelpKey> > m_muTrackIso; + std::vector<std::pair<xAOD::Iso::IsolationFlavour, TrackIsoHelpKey>> + m_elTrackIso; + std::vector<std::pair<xAOD::Iso::IsolationFlavour, TrackIsoHelpKey>> + m_phTrackIso; + std::vector<std::pair<xAOD::Iso::IsolationFlavour, TrackIsoHelpKey>> + m_muTrackIso; - struct CaloIsoHelpHandles { + struct CaloIsoHelpHandles + { CaloIsoHelpHandles(const CaloIsoHelpKey& keys); - std::vector<SG::WriteDecorHandle<xAOD::IParticleContainer, float> > isoDeco; - std::map<xAOD::Iso::IsolationCaloCorrection, - SG::WriteDecorHandle<xAOD::IParticleContainer, float> > coreCorDeco; - std::map<xAOD::Iso::IsolationCaloCorrection, - std::vector<SG::WriteDecorHandle<xAOD::IParticleContainer, float> > > noncoreCorDeco; + std::vector<SG::WriteDecorHandle<xAOD::IParticleContainer, float>> isoDeco; + std::map<xAOD::Iso::IsolationCaloCorrection, + SG::WriteDecorHandle<xAOD::IParticleContainer, float>> + coreCorDeco; + std::map<xAOD::Iso::IsolationCaloCorrection, + std::vector<SG::WriteDecorHandle<xAOD::IParticleContainer, float>>> + noncoreCorDeco; SG::WriteDecorHandle<xAOD::IParticleContainer, uint32_t> corrBitsetDeco; }; - - struct TrackIsoHelpHandles { + struct TrackIsoHelpHandles + { TrackIsoHelpHandles(const TrackIsoHelpKey& keys); - std::vector<SG::WriteDecorHandle<xAOD::IParticleContainer, float> > isoDeco; - std::vector<SG::WriteDecorHandle<xAOD::IParticleContainer, float> > isoDecoV; - std::map<xAOD::Iso::IsolationTrackCorrection, - SG::WriteDecorHandle<xAOD::IParticleContainer, float> > coreCorDeco; + std::vector<SG::WriteDecorHandle<xAOD::IParticleContainer, float>> isoDeco; + std::vector<SG::WriteDecorHandle<xAOD::IParticleContainer, float>> isoDecoV; + std::map<xAOD::Iso::IsolationTrackCorrection, + SG::WriteDecorHandle<xAOD::IParticleContainer, float>> + coreCorDeco; SG::WriteDecorHandle<xAOD::IParticleContainer, uint32_t> corrBitsetDeco; }; - // for the time being, only mu vs eg, no separation in eg - Gaudi::Property<std::string> m_customConfigEl {this, - "CustomConfigurationNameEl", "", - "use a custom configuration for electron"}; - - Gaudi::Property<std::string> m_customConfigPh {this, - "CustomConfigurationNamePh", "", - "use a custom configuration for photon"}; + Gaudi::Property<std::string> m_customConfigEl{ + this, + "CustomConfigurationNameEl", + "", + "use a custom configuration for electron" + }; - Gaudi::Property<std::string> m_customConfigFwd {this, - "CustomConfigurationNameFwd", "", - "use a custom configuration for forward electron"}; + Gaudi::Property<std::string> m_customConfigPh{ + this, + "CustomConfigurationNamePh", + "", + "use a custom configuration for photon" + }; - Gaudi::Property<std::string> m_customConfigMu {this, - "CustomConfigurationNameMu", "", - "use a custom configuration for muon"}; + Gaudi::Property<std::string> m_customConfigFwd{ + this, + "CustomConfigurationNameFwd", + "", + "use a custom configuration for forward electron" + }; + Gaudi::Property<std::string> m_customConfigMu{ + this, + "CustomConfigurationNameMu", + "", + "use a custom configuration for muon" + }; static bool isCoreCor(xAOD::Iso::IsolationCaloCorrection corr); - /// called by algorithm initialize per object (electron, photon, forward electron, muon) - StatusCode initializeIso(std::set<xAOD::Iso::IsolationFlavour>& runIsoType, // out - std::vector<std::pair<xAOD::Iso::IsolationFlavour,CaloIsoHelpKey > >* caloIsoMap, // out - std::vector<std::pair<xAOD::Iso::IsolationFlavour,TrackIsoHelpKey > >* trackIsoMap, // out - const std::string& containerName, - const std::vector<std::vector<int> >& isoInts, - const std::vector<std::vector<int> >& corInts, - const std::vector<std::vector<int> >& corIntsExtra, - const std::string& customConfig); + /// called by algorithm initialize per object (electron, photon, forward + /// electron, muon) + StatusCode initializeIso( + std::set<xAOD::Iso::IsolationFlavour>& runIsoType, // out + std::vector<std::pair<xAOD::Iso::IsolationFlavour, CaloIsoHelpKey>>* + caloIsoMap, // out + std::vector<std::pair<xAOD::Iso::IsolationFlavour, TrackIsoHelpKey>>* + trackIsoMap, // out + const std::string& containerName, + const std::vector<std::vector<int>>& isoInts, + const std::vector<std::vector<int>>& corInts, + const std::vector<std::vector<int>>& corIntsExtra, + const std::string& customConfig); /// called by initializeIso - StatusCode addCaloIsoCorrections(size_t flavor, - xAOD::Iso::IsolationFlavour isoFlav, - CaloIsoHelpKey& cisoH, // in-out - const std::vector<std::vector<int> >& corInts, - bool corrsAreExtra, - const std::string& prefix, - const std::string& customConfig); + StatusCode addCaloIsoCorrections(size_t flavor, + xAOD::Iso::IsolationFlavour isoFlav, + CaloIsoHelpKey& cisoH, // in-out + const std::vector<std::vector<int>>& corInts, + bool corrsAreExtra, + const std::string& prefix, + const std::string& customConfig); /// called by initializeIso - StatusCode addTrackIsoCorrections(size_t flavor, - xAOD::Iso::IsolationFlavour isoFlav, - TrackIsoHelpKey& tisoH, // in-out - const std::vector<std::vector<int> >& corInts, - bool corrsAreExtra, - const std::string& prefix, - const std::string& customConfig); - - StatusCode executeCaloIso(const std::vector<std::pair<xAOD::Iso::IsolationFlavour,CaloIsoHelpKey> >& caloIsoMap); - - StatusCode executeTrackIso(const std::vector<std::pair<xAOD::Iso::IsolationFlavour,TrackIsoHelpKey> >& trackIsoMap); - - void declareIso(std::vector<std::pair<xAOD::Iso::IsolationFlavour,CaloIsoHelpKey> >& caloIso); - void declareIso(std::vector<std::pair<xAOD::Iso::IsolationFlavour,TrackIsoHelpKey> >& trackIso); - -}; - + StatusCode addTrackIsoCorrections( + size_t flavor, + xAOD::Iso::IsolationFlavour isoFlav, + TrackIsoHelpKey& tisoH, // in-out + const std::vector<std::vector<int>>& corInts, + bool corrsAreExtra, + const std::string& prefix, + const std::string& customConfig); + + StatusCode executeCaloIso( + const std::vector<std::pair<xAOD::Iso::IsolationFlavour, CaloIsoHelpKey>>& + caloIsoMap, + const CaloCellContainer* cellColl) const; + + StatusCode executeTrackIso( + const std::vector<std::pair<xAOD::Iso::IsolationFlavour, TrackIsoHelpKey>>& + trackIsoMap) const; + + void declareIso( + std::vector<std::pair<xAOD::Iso::IsolationFlavour, CaloIsoHelpKey>>& + caloIso); + void declareIso( + std::vector<std::pair<xAOD::Iso::IsolationFlavour, TrackIsoHelpKey>>& + trackIso); +}; #endif //> !ISOLATIONALGS_ISOLATIONBUILDER_H