diff --git a/InnerDetector/InDetRecTools/InDetGNNHardScatterSelection/src/VertexDecoratorAlg.cxx b/InnerDetector/InDetRecTools/InDetGNNHardScatterSelection/src/VertexDecoratorAlg.cxx index f161ea4ba58819ec8d42542db9168a5b79b9269e..16d1754bf72c075b64c876663bf8da4689a984dd 100644 --- a/InnerDetector/InDetRecTools/InDetGNNHardScatterSelection/src/VertexDecoratorAlg.cxx +++ b/InnerDetector/InDetRecTools/InDetGNNHardScatterSelection/src/VertexDecoratorAlg.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration */ #include "VertexDecoratorAlg.h" @@ -34,11 +34,31 @@ namespace InDetGNNHardScatterSelection m_jetLinksKey = baseName + ".jetLinks"; m_electronLinksKey = baseName + ".electronLinks"; m_muonLinksKey = baseName + ".muonLinks"; - + m_mDecor_ntrk = baseName + "." + m_mDecor_ntrk.key(); + m_mDecor_sumPt = baseName + "." + m_mDecor_sumPt.key(); + m_mDecor_chi2Over_ndf = baseName + "." + m_mDecor_chi2Over_ndf.key(); + m_mDecor_z_asym = baseName + "." + m_mDecor_z_asym.key(); + m_mDecor_weighted_z_asym = baseName + "." + m_mDecor_weighted_z_asym.key(); + m_mDecor_weighted_z_kurt = baseName + "." + m_mDecor_weighted_z_kurt.key(); + m_mDecor_z_skew = baseName + "." + m_mDecor_z_skew.key(); + m_mDecor_photon_deltaz = baseName + "." + m_mDecor_photon_deltaz.key(); + m_mDecor_photon_deltaPhi = baseName + "." + m_mDecor_photon_deltaPhi.key(); + m_mDecor_actualInterPerXing = baseName + "." + m_mDecor_actualInterPerXing.key(); + ATH_CHECK(m_photonLinksKey.initialize()); ATH_CHECK(m_jetLinksKey.initialize()); ATH_CHECK(m_electronLinksKey.initialize()); ATH_CHECK(m_muonLinksKey.initialize()); + ATH_CHECK(m_mDecor_ntrk.initialize()); + ATH_CHECK(m_mDecor_sumPt.initialize()); + ATH_CHECK(m_mDecor_chi2Over_ndf.initialize()); + ATH_CHECK(m_mDecor_z_asym.initialize()); + ATH_CHECK(m_mDecor_weighted_z_asym.initialize()); + ATH_CHECK(m_mDecor_weighted_z_kurt.initialize()); + ATH_CHECK(m_mDecor_z_skew.initialize()); + ATH_CHECK(m_mDecor_photon_deltaz.initialize()); + ATH_CHECK(m_mDecor_photon_deltaPhi.initialize()); + ATH_CHECK(m_mDecor_actualInterPerXing.initialize()); // ReadHandleKeys m_deltaZKey = baseName + ".deltaZ"; @@ -59,7 +79,11 @@ namespace InDetGNNHardScatterSelection // Tools ATH_CHECK(m_gnnTool.retrieve()); + ATH_CHECK(m_trkVtxAssociationTool->setProperty("WorkingPoint","Prompt_MaxWeight")); + ATH_CHECK(m_trkVtxAssociationTool->setProperty("AMVFVerticesDeco","TTVA_AMVFVertices_forReco")); + ATH_CHECK(m_trkVtxAssociationTool->setProperty("AMVFWeightsDeco","TTVA_AMVFWeights_forReco")); ATH_CHECK(m_trkVtxAssociationTool.retrieve()); + ATH_CHECK(m_trkVtxAssociationTool->initialize()); return StatusCode::SUCCESS; } @@ -90,16 +114,16 @@ namespace InDetGNNHardScatterSelection SG::ReadDecorHandle<xAOD::VertexContainer, float> acc_deltaPhi(m_deltaPhiKey, ctx); // Decorations needed by the GNNTool - SG::AuxElement::Decorator<int> dec_ntrk("ntrk"); - SG::AuxElement::Decorator<float> dec_sumPt("sumPt"); - SG::AuxElement::Decorator<float> dec_chi2Over_ndf("chi2Over_ndf"); - SG::AuxElement::Decorator<float> dec_z_asym("z_asymmetry"); - SG::AuxElement::Decorator<float> dec_weighted_z_asym("weighted_z_asymmetry"); - SG::AuxElement::Decorator<float> dec_z_kurt("z_kurtosis"); - SG::AuxElement::Decorator<float> dec_z_skew("z_skewness"); - SG::AuxElement::Decorator<float> dec_photon_deltaz("photon_deltaz"); - SG::AuxElement::Decorator<float> dec_photon_deltaPhi("photon_deltaPhi"); - SG::AuxElement::Decorator<float> dec_actualInterPerXing("actualIntPerXing"); + SG::WriteDecorHandle<xAOD::VertexContainer, int> dec_ntrk(m_mDecor_ntrk, ctx); + SG::WriteDecorHandle<xAOD::VertexContainer, float> dec_sumPt(m_mDecor_sumPt,ctx); + SG::WriteDecorHandle<xAOD::VertexContainer, float> dec_chi2Over_ndf(m_mDecor_chi2Over_ndf,ctx); + SG::WriteDecorHandle<xAOD::VertexContainer, float> dec_z_asym(m_mDecor_z_asym,ctx); + SG::WriteDecorHandle<xAOD::VertexContainer, float> dec_weighted_z_asym(m_mDecor_weighted_z_asym,ctx); + SG::WriteDecorHandle<xAOD::VertexContainer, float> dec_z_kurt(m_mDecor_weighted_z_kurt,ctx); + SG::WriteDecorHandle<xAOD::VertexContainer, float> dec_z_skew(m_mDecor_z_skew,ctx); + SG::WriteDecorHandle<xAOD::VertexContainer, float> dec_photon_deltaz(m_mDecor_photon_deltaz,ctx); + SG::WriteDecorHandle<xAOD::VertexContainer, float> dec_photon_deltaPhi(m_mDecor_photon_deltaPhi,ctx); + SG::WriteDecorHandle<xAOD::VertexContainer, float> dec_actualInterPerXing(m_mDecor_actualInterPerXing,ctx); std::map< const xAOD::Vertex*, std::vector<const xAOD::Jet*> > jetsInVertex; std::map< const xAOD::Jet*, std::map< const xAOD::Vertex*, int> > jetVertexPt; @@ -186,10 +210,11 @@ namespace InDetGNNHardScatterSelection } dec_ntrk(*vertex) = number_tracks; - dec_sumPt(*vertex) = sumPt; + if(!dec_sumPt.isAvailable()){ + dec_sumPt(*vertex) = sumPt; + } dec_chi2Over_ndf(*vertex) = vertex->chiSquared() / vertex->numberDoF(); - dec_z_asym(*vertex) = z_asym; dec_weighted_z_asym(*vertex) = weighted_z_asym; dec_z_kurt(*vertex) = z_kurt; @@ -211,20 +236,17 @@ namespace InDetGNNHardScatterSelection // associate objects to vertices std::vector<ElementLink<xAOD::ElectronContainer>> electronLinks; for(const xAOD::Electron* electron : *electronsIn){ - const auto *id_trk = xAOD::EgammaHelpers::getOriginalTrackParticle(electron); if(!id_trk) continue; - - for(size_t i = 0; i < vertex->nTrackParticles(); i++){ - const xAOD::TrackParticle *trk = vertex->trackParticle(i); - if(trk && id_trk == trk) { - ElementLink<xAOD::ElectronContainer> elLink; + auto eleVertex = m_trkVtxAssociationTool->getUniqueMatchVertexLink(*id_trk, *vertices); + if(!eleVertex) continue; + ElementLink<xAOD::ElectronContainer> elLink; + if(*eleVertex == vertex){ elLink.setElement(electron); elLink.setStorableObject(*electronsIn.ptr(), true); electronLinks.push_back(elLink); - break; - } } + } dec_electronLinks(*vertex) = electronLinks; @@ -269,19 +291,22 @@ namespace InDetGNNHardScatterSelection std::vector<ElementLink<xAOD::MuonContainer>> muonLinks; for(const xAOD::Muon* muon : *muonsIn){ - auto tp = muon->trackParticle(xAOD::Muon::InnerDetectorTrackParticle); - - for (size_t i = 0; i < vertex->nTrackParticles(); i++){ - const xAOD::TrackParticle *trk = vertex->trackParticle(i); - if(trk && tp == trk){ - ElementLink<xAOD::MuonContainer> muonLink; + if(!tp) continue; + try{ + auto muonVertex = m_trkVtxAssociationTool->getUniqueMatchVertexLink(*tp, *vertices); + if(!muonVertex) continue; + ElementLink<xAOD::MuonContainer> muonLink; + if(*muonVertex == vertex){ muonLink.setElement(muon); muonLink.setStorableObject(*muonsIn.ptr(), true); muonLinks.push_back(muonLink); - break; } + }catch(...) { + ATH_MSG_DEBUG("Skipping muon as the track is not associated to any PV "); + ATH_MSG_DEBUG("Muon pT, eta = " << muon->pt() << " " << muon->eta()); } + } dec_muonLinks(*vertex) = muonLinks; diff --git a/InnerDetector/InDetRecTools/InDetGNNHardScatterSelection/src/VertexDecoratorAlg.h b/InnerDetector/InDetRecTools/InDetGNNHardScatterSelection/src/VertexDecoratorAlg.h index a64b9336c0550114d11764fd08bc34f5d85f2a81..1f5567d59efdb3560f22a11765002bdc35547011 100644 --- a/InnerDetector/InDetRecTools/InDetGNNHardScatterSelection/src/VertexDecoratorAlg.h +++ b/InnerDetector/InDetRecTools/InDetGNNHardScatterSelection/src/VertexDecoratorAlg.h @@ -58,6 +58,27 @@ private: SG::ReadHandleKey<xAOD::PhotonContainer> m_photonsInKey{ this, "photonsIn", "Photons", "containerName to read"}; + SG::WriteDecorHandleKey<xAOD::VertexContainer> m_mDecor_ntrk { + this, "decor_ntrkKey", "ntrk", ""}; + SG::WriteDecorHandleKey<xAOD::VertexContainer> m_mDecor_sumPt { + this, "decor_sumPtKey", "sumPt", ""}; + SG::WriteDecorHandleKey<xAOD::VertexContainer> m_mDecor_chi2Over_ndf { + this, "decor_chi2Over_ndfKey", "chi2Over_ndf", ""}; + SG::WriteDecorHandleKey<xAOD::VertexContainer> m_mDecor_z_asym { + this, "decor_z_asymmetryKey", "z_asymmetry", ""}; + SG::WriteDecorHandleKey<xAOD::VertexContainer> m_mDecor_weighted_z_asym { + this, "decor_weighted_z_asym", "weighted_z_asymmetry", ""}; + SG::WriteDecorHandleKey<xAOD::VertexContainer> m_mDecor_weighted_z_kurt { + this, "decor_weighted_z_kurt", "z_kurtosis", ""}; + SG::WriteDecorHandleKey<xAOD::VertexContainer> m_mDecor_z_skew { + this, "decor_z_skew", "z_skewness", ""}; + SG::WriteDecorHandleKey<xAOD::VertexContainer> m_mDecor_photon_deltaz { + this, "decor_photon_deltaz", "photon_deltaz", ""}; + SG::WriteDecorHandleKey<xAOD::VertexContainer> m_mDecor_photon_deltaPhi { + this, "decor_photon_deltaPhi", "photon_deltaPhi", ""}; + SG::WriteDecorHandleKey<xAOD::VertexContainer> m_mDecor_actualInterPerXing { + this, "decor_actualInterPerXing", "actualIntPerXing", ""}; + SG::WriteDecorHandleKey<xAOD::VertexContainer> m_photonLinksKey{ this, "photonLinks", "", "" }; SG::WriteDecorHandleKey<xAOD::VertexContainer> m_jetLinksKey{