ATLAS Offline Software
Loading...
Searching...
No Matches
TrackToTruthPartAssocAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
6
10
11#include <unordered_set>
12namespace {
13 using IdSet_t = std::unordered_set<Identifier>;
15 using TruthPartWithIds_t = std::tuple<const xAOD::TruthParticle*, IdSet_t>;
17}
18
19namespace MuonR4{
21
22
23 ATH_CHECK(m_trkKey.initialize());
24 ATH_CHECK(m_originWriteKey.initialize());
25 ATH_CHECK(m_typeWriteKey.initialize());
27 ATH_CHECK(m_linkWriteKey.initialize());
28 ATH_CHECK(m_truthMuonKey.initialize());
29
30 ATH_CHECK(m_idHelperSvc.retrieve());
31 ATH_CHECK(m_edmHelperSvc.retrieve());
32
33 for (const std::string& hitIds : m_simHitIds) {
34 m_simHitKeys.emplace_back(m_truthMuonKey, hitIds);
35 }
36 ATH_CHECK(m_simHitKeys.initialize());
37 ATH_CHECK(m_truMuOriginKey.initialize());
38 ATH_CHECK(m_truMuTypeKey.initialize());
40 return StatusCode::SUCCESS;
41 }
42 StatusCode TrackToTruthPartAssocAlg::execute(const EventContext& ctx) const {
43
44 const xAOD::TrackParticleContainer* tracks{nullptr};
45 ATH_CHECK(SG::get(tracks, m_trkKey, ctx));
46
53 std::vector<IdDecorHandle_t> idDecorHandles{};
55 idDecorHandles.emplace_back(hitKey, ctx);
56 }
57
58 std::vector<TruthPartWithIds_t> truthWithIds{};
60 const xAOD::TruthParticleContainer* truthMuonCont{};
61 ATH_CHECK(SG::get(truthMuonCont, m_truthMuonKey, ctx));
62 for (const xAOD::TruthParticle* truthMuon : *truthMuonCont) {
63 IdSet_t assocIds{};
64 ATH_MSG_DEBUG("Truth muon: pT:"<<truthMuon->pt()<<" [GeV], eta: "<<truthMuon->eta()<<", phi: "
65 <<truthMuon->phi()<<", q: "<<truthMuon->charge()<<", truthType: "<<xAOD::TruthHelpers::getParticleTruthType(*truthMuon)
66 <<", origin: "<<xAOD::TruthHelpers::getParticleTruthOrigin(*truthMuon)
67 <<", classification: " <<xAOD::TruthHelpers::getParticleTruthClassification(*truthMuon));
68 for (const IdDecorHandle_t& hitDecor : idDecorHandles) {
69 std::ranges::transform(hitDecor(*truthMuon), std::inserter(assocIds, assocIds.begin()),
70 [this](unsigned long long rawId) {
71 const Identifier id{rawId};
72 ATH_MSG_VERBOSE(" --- associated hit id: "<<m_idHelperSvc->toString(id));
73 return id;
74 });
75 }
76 truthWithIds.emplace_back(std::make_tuple(truthMuon, std::move(assocIds)));
77 }
78
79 for (const xAOD::TrackParticle* trackPart : *tracks){
80 const Trk::Track* track = trackPart->track();
81 if (!track) {
82 ATH_MSG_ERROR("Associated reconstructed track is not available for "<<m_trkKey);
83 return StatusCode::FAILURE;
84 }
86 IdSet_t trackIds{};
87 for (const Trk::TrackStateOnSurface* tsos : *track->trackStateOnSurfaces()) {
88 const Trk::MeasurementBase* meas = tsos->measurementOnTrack();
90 if (!meas) {
91 continue;
92 }
93 const Identifier measId = m_edmHelperSvc->getIdentifier(*meas);
94 if (!measId.is_valid() || !m_idHelperSvc->isMuon(measId)){
95 ATH_MSG_VERBOSE("Measurement is not a muon one");
96 continue;
97 }
98 trackIds.insert(measId);
99 }
101 int bestMatchFrac{-1};
102 const xAOD::TruthParticle* bestMatch{nullptr};
103 for (const auto& [truthPart, truthIds]: truthWithIds) {
104 const int matchedReco = std::ranges::count_if(trackIds,[&truthIds](const Identifier& recoId){
105 return truthIds.count(recoId);
106 });
108 if (!matchedReco || matchedReco < bestMatchFrac){
109 continue;
110 }
111 bestMatchFrac = matchedReco;
112 bestMatch = truthPart;
113 }
115 if (!bestMatch) {
116 continue;
117 }
118 acc_truthOrigin(*trackPart) = xAOD::TruthHelpers::getParticleTruthOrigin(*bestMatch);
119 acc_truthType(*trackPart) = xAOD::TruthHelpers::getParticleTruthType(*bestMatch);
120 acc_truthLink(*trackPart) = TruthLink_t{truthMuonCont, bestMatch->index()};
121 acc_truthClassification(*trackPart) = xAOD::TruthHelpers::getParticleTruthClassification(*bestMatch);
122 }
123 return StatusCode::SUCCESS;
124 }
125}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
Handle class for adding a decoration to an object.
ElementLink< xAOD::TruthParticleContainer > TruthLink_t
bool is_valid() const
Check if id is in a valid state.
TruthReadDecorKey_t m_truMuOriginKey
FIXME ReadDecorHandle should not be used to access dynamic variables applied by the algorithm which c...
TruthReadDecorKeyArr_t m_simHitKeys
Declaration of the dependency on the simHit decorations.
TrkWriteDecorKey_t m_originWriteKey
Decorations to be written to the TrackParticle truthOrigin/truthType/truthParticleLink.
ServiceHandle< Muon::IMuonEDMHelperSvc > m_edmHelperSvc
Helper service to handle the Identifiers of measurements.
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
IdHelperSvc to decode the Identifiers.
StatusCode execute(const EventContext &ctx) const override final
Gaudi::Property< std::vector< std::string > > m_simHitIds
List of simHit id decorations to read from the truth particle.
size_t index() const
Return the index of this element within its container.
Property holding a SG store/key/clid/attr name from which a ReadDecorHandle is made.
Handle class for reading a decoration on an object.
Handle class for adding a decoration to an object.
This header ties the generic definitions in this package.
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.
int getParticleTruthClassification(const xAOD::IParticle &p)
Return the particle's truth classification (as defined by the MC Truth Classifier)
int getParticleTruthType(const xAOD::IParticle &p)
Return the particle's truth type (as defined by the MC Truth Classifier)
int getParticleTruthOrigin(const xAOD::IParticle &p)
Return the particle's truth origin (as defined by the MC Truth Classifier)
TrackParticle_v1 TrackParticle
Reference the current persistent version:
TruthParticle_v1 TruthParticle
Typedef to implementation.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
TruthParticleContainer_v1 TruthParticleContainer
Declare the latest version of the truth particle container.