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());
26 ATH_CHECK(m_linkWriteKey.initialize());
27 ATH_CHECK(m_truthMuonKey.initialize());
28
29 ATH_CHECK(m_idHelperSvc.retrieve());
30 ATH_CHECK(m_edmHelperSvc.retrieve());
31
32 for (const std::string& hitIds : m_simHitIds) {
33 m_simHitKeys.emplace_back(m_truthMuonKey, hitIds);
34 }
35 ATH_CHECK(m_simHitKeys.initialize());
36 ATH_CHECK(m_truMuOriginKey.initialize());
37 ATH_CHECK(m_truMuTypeKey.initialize());
38 return StatusCode::SUCCESS;
39 }
40 StatusCode TrackToTruthPartAssocAlg::execute(const EventContext& ctx) const {
41
42 const xAOD::TrackParticleContainer* tracks{nullptr};
43 ATH_CHECK(SG::get(tracks, m_trkKey, ctx));
44
50 std::vector<IdDecorHandle_t> idDecorHandles{};
52 idDecorHandles.emplace_back(hitKey, ctx);
53 }
54
55 std::vector<TruthPartWithIds_t> truthWithIds{};
57 const xAOD::TruthParticleContainer* truthMuonCont{nullptr};
58 ATH_CHECK(SG::get(truthMuonCont, m_truthMuonKey, ctx));
59 for (const xAOD::TruthParticle* truthMuon : *truthMuonCont) {
60 IdSet_t assocIds{};
61 ATH_MSG_DEBUG("Truth muon: pT:"<<truthMuon->pt()<<" [GeV], eta: "<<truthMuon->eta()<<", phi: "
62 <<truthMuon->phi()<<", q: "<<truthMuon->charge()<<", truthType: "<<xAOD::TruthHelpers::getParticleTruthType(*truthMuon)
63 <<", origin: "<<xAOD::TruthHelpers::getParticleTruthOrigin(*truthMuon));
64 for (const IdDecorHandle_t& hitDecor : idDecorHandles) {
65 std::ranges::transform(hitDecor(*truthMuon), std::inserter(assocIds, assocIds.begin()),
66 [this](unsigned long long rawId) {
67 const Identifier id{rawId};
68 ATH_MSG_VERBOSE(" --- associated hit id: "<<m_idHelperSvc->toString(id));
69 return id;
70 });
71 }
72 truthWithIds.emplace_back(std::make_tuple(truthMuon, std::move(assocIds)));
73 }
74
75 for (const xAOD::TrackParticle* trackPart : *tracks){
76 const Trk::Track* track = trackPart->track();
77 if (!track) {
78 ATH_MSG_ERROR("Associated reconstructed track is not available for "<<m_trkKey);
79 return StatusCode::FAILURE;
80 }
82 IdSet_t trackIds{};
83 for (const Trk::TrackStateOnSurface* tsos : *track->trackStateOnSurfaces()) {
84 const Trk::MeasurementBase* meas = tsos->measurementOnTrack();
86 if (!meas) {
87 continue;
88 }
89 const Identifier measId = m_edmHelperSvc->getIdentifier(*meas);
90 if (!measId.is_valid() || !m_idHelperSvc->isMuon(measId)){
91 ATH_MSG_VERBOSE("Measurement is not a muon one");
92 continue;
93 }
94 trackIds.insert(measId);
95 }
97 int bestMatchFrac{-1};
98 const xAOD::TruthParticle* bestMatch{nullptr};
99 for (const auto& [truthPart, truthIds]: truthWithIds) {
100 const int matchedReco = std::ranges::count_if(trackIds,[&truthIds](const Identifier& recoId){
101 return truthIds.count(recoId);
102 });
104 if (!matchedReco || matchedReco < bestMatchFrac){
105 continue;
106 }
107 bestMatchFrac = matchedReco;
108 bestMatch = truthPart;
109 }
111 if (!bestMatch) {
112 continue;
113 }
114 acc_truthOrigin(*trackPart) = xAOD::TruthHelpers::getParticleTruthOrigin(*bestMatch);
115 acc_truthType(*trackPart) = xAOD::TruthHelpers::getParticleTruthType(*bestMatch);
116 acc_truthLink(*trackPart) = TruthLink_t{truthMuonCont, bestMatch->index()};
117 }
118 return StatusCode::SUCCESS;
119 }
120}
#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.
TruthDecorArr_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 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.