ATLAS Offline Software
TrackParticleTruthDecorationAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 #undef NDEBUG
9 #include <unordered_map>
10 #include "decoratorUtils.h"
11 
12 
13 namespace ActsTrk
14 {
15 
17  {
19  ATH_CHECK( m_trackToTruth.initialize() );
21  std::vector<std::string> float_decor_names(kNFloatDecorators);
22  float_decor_names[kMatchingProbability]="truthMatchProbability";
23  float_decor_names[kHitPurity]="truthHitPurity";
24  float_decor_names[kHitEfficiency]="truthHitEfficiency";
25  createDecoratorKeys(*this,m_trkParticleName,"" /*prefix ? */, float_decor_names,m_floatDecor);
26  assert( m_floatDecor.size() == kNFloatDecorators);
27  std::vector<std::string> link_decor_names;
28  link_decor_names.push_back("truthParticleLink");
29  createDecoratorKeys(*this,m_trkParticleName,"" /*prefix ? */, link_decor_names,m_linkDecor);
30  assert( m_linkDecor.size() == 1);
31  return sc;
32  }
33 
35  {
37  return sc;
38  }
39 
41  {
42  const TruthParticleHitCounts &truth_particle_hit_counts = getTruthParticleHitCounts(ctx);
43  // @TODO or use simply a vector ?
44  std::unordered_map<const ActsTrk::TrackContainerBase *, const ActsTrk::TrackToTruthParticleAssociation *> truth_association_map;
45  truth_association_map.reserve( m_trackToTruth.size());
46  for (const SG::ReadHandleKey<TrackToTruthParticleAssociation> &truth_association_key : m_trackToTruth) {
47  SG::ReadHandle<TrackToTruthParticleAssociation> track_to_truth_handle = SG::makeHandle(truth_association_key, ctx);
48  if (!track_to_truth_handle.isValid()) {
49  ATH_MSG_ERROR("No track to truth particle association for key " << truth_association_key.key() );
50  return StatusCode::FAILURE;
51  }
52  truth_association_map.insert(std::make_pair( track_to_truth_handle->sourceContainer(), track_to_truth_handle.cptr() ));
53  }
54 
56  if (!track_particle_handle.isValid()) {
57  ATH_MSG_ERROR("No track particle container for key " << track_particle_handle.key() );
58  return StatusCode::FAILURE;
59  }
60  std::vector< SG::WriteDecorHandle<xAOD::TrackParticleContainer,float > >
61  float_decor( createDecorators<xAOD::TrackParticleContainer, float >(m_floatDecor, ctx) );
63  link_decor(m_linkDecor.at(0), ctx);
64 
65  EventStat event_stat(truthSelectionTool(),
66  perEtaSize(),
67  perPdgIdSize(),
68  track_particle_handle->size());
69 
70  static const SG::AuxElement::ConstAccessor<ElementLink<ActsTrk::TrackContainer> > actsTrackLink("actsTrack");
71 
72  std::pair<const ActsTrk::TrackContainerBase *, const ActsTrk::TrackToTruthParticleAssociation *>
73  the_track_truth_association{ nullptr, nullptr};
75  for(const xAOD::TrackParticle *track_particle : *track_particle_handle) {
76  ElementLink<ActsTrk::TrackContainer> link_to_track = actsTrackLink(*track_particle);
78  std::optional<ActsTrk::TrackContainer::ConstTrackProxy> >::value);
79  TruthMatchResult truth_match{} ;
80 
81  {
82  std::optional<ActsTrk::TrackContainer::ConstTrackProxy> optional_track = *link_to_track;
83  if (optional_track.has_value()) {
84  const ActsTrk::TrackContainerBase *track_container = &(optional_track.value().container());
85  if (track_container != the_track_truth_association.first && track_container ) {
86  std::unordered_map<const ActsTrk::TrackContainerBase *, const ActsTrk::TrackToTruthParticleAssociation *>::const_iterator
87  truth_association_map_iter = truth_association_map.find( track_container );
88  if (truth_association_map_iter != truth_association_map.end()) {
89  the_track_truth_association = *truth_association_map_iter;
90  }
91  }
92  if (the_track_truth_association.second) {
93  truth_match = analyseTrackTruth(truth_particle_hit_counts,
94  (*the_track_truth_association.second).at(optional_track.value().index()),
95  event_stat);
96 
97  const xAOD::TruthParticle *truth_particle = truth_match.m_truthParticle;
98 
99  // decorate track particle with link to truth particle, matching probability etc.
100  if (truth_particle) {
101  if (!ref_truth_link.isValid()) {
102  const xAOD::TruthParticleContainer *truth_particle_container
103  = dynamic_cast<const xAOD::TruthParticleContainer *>(truth_particle->container());
104  if (!truth_particle_container) {
105  ATH_MSG_ERROR("Valid truth particle not part of a xAOD::TruthParticleContainer");
106  }
107  else {
108  ref_truth_link= ElementLink<xAOD::TruthParticleContainer>(*truth_particle_container,0u,ctx);
109  }
110  }
111  assert( truth_particle->container() == ref_truth_link.getStorableObjectPointer() );
112  link_decor(*track_particle) = ElementLink<xAOD::TruthParticleContainer>(ref_truth_link, truth_particle->index());
113  }
114  else {
115  link_decor(*track_particle) = ElementLink<xAOD::TruthParticleContainer>();
116  }
117  }
118  }
119  }
120  float_decor[kMatchingProbability](*track_particle) = truth_match.m_matchProbability;
121  float_decor[kHitPurity](*track_particle) = truth_match.m_hitPurity;
122  float_decor[kHitEfficiency](*track_particle) = truth_match.m_hitEfficiency;
123  }
124  postProcessEventStat(truth_particle_hit_counts,
125  track_particle_handle->size(),
126  event_stat);
127  return StatusCode::SUCCESS;
128  }
129 
130 }
ActsTrk::TrackTruthMatchingBaseAlg::postProcessEventStat
void postProcessEventStat(const TruthParticleHitCounts &truth_particle_hit_counts, std::size_t n_tracks, EventStat &event_stat) const
Definition: TrackTruthMatchingBaseAlg.cxx:331
ActsTrk::TrackContainerBase
Acts::TrackContainer< ActsTrk::TrackBackend, ActsTrk::TrackStateBackend, ActsTrk::DataLinkHolder > TrackContainerBase
Definition: TrackContainer.h:27
ActsTrk::TrackTruthMatchingBaseAlg::TruthMatchResult
Match result returned by analyseTrackTruth.
Definition: TrackTruthMatchingBaseAlg.h:133
ActsTrk::TrackParticleTruthDecorationAlg::kHitEfficiency
@ kHitEfficiency
Definition: TrackParticleTruthDecorationAlg.h:41
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
TruthParticleContainer.h
ActsTrk::TrackTruthMatchingBaseAlg::initialize
virtual StatusCode initialize() override
Definition: TrackTruthMatchingBaseAlg.cxx:135
ActsTrk::TrackParticleTruthDecorationAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override
Definition: TrackParticleTruthDecorationAlg.cxx:40
ActsTrk::TrackParticleTruthDecorationAlg::m_trackToTruth
SG::ReadHandleKeyArray< TrackToTruthParticleAssociation > m_trackToTruth
Definition: TrackParticleTruthDecorationAlg.h:35
athena.value
value
Definition: athena.py:122
ActsTrk::TrackParticleTruthDecorationAlg::m_trkParticleName
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trkParticleName
Definition: TrackParticleTruthDecorationAlg.h:39
ActsTrk::TrackParticleTruthDecorationAlg::m_linkDecor
std::vector< SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > > m_linkDecor
Definition: TrackParticleTruthDecorationAlg.h:42
SG::ConstAccessor
Helper class to provide constant type-safe access to aux data.
Definition: ConstAccessor.h:54
SG::ReadHandleKey
Property holding a SG store/key/clid from which a ReadHandle is made.
Definition: StoreGate/StoreGate/ReadHandleKey.h:39
ActsTrk::TrackTruthMatchingBaseAlg::truthSelectionTool
const IAthSelectionTool & truthSelectionTool() const
Definition: TrackTruthMatchingBaseAlg.h:69
ActsTrk::TrackParticleTruthDecorationAlg::kHitPurity
@ kHitPurity
Definition: TrackParticleTruthDecorationAlg.h:41
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:83
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
ActsTrk::TrackParticleTruthDecorationAlg::finalize
virtual StatusCode finalize() override
Definition: TrackParticleTruthDecorationAlg.cxx:34
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:269
ActsTrk::TrackParticleTruthDecorationAlg::initialize
virtual StatusCode initialize() override
Definition: TrackParticleTruthDecorationAlg.cxx:16
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
xAOD::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:41
SG::WriteDecorHandle
Handle class for adding a decoration to an object.
Definition: StoreGate/StoreGate/WriteDecorHandle.h:99
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
ActsTrk::TrackParticleTruthDecorationAlg::m_floatDecor
std::vector< SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > > m_floatDecor
Definition: TrackParticleTruthDecorationAlg.h:43
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
ActsTrk::TrackTruthMatchingBaseAlg::EventStatBase
Definition: TrackTruthMatchingBaseAlg.h:79
SG::AuxElement::index
size_t index() const
Return the index of this element within its container.
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
ActsTrk::TrackTruthMatchingBaseAlg::perEtaSize
std::size_t perEtaSize() const
Definition: TrackTruthMatchingBaseAlg.h:71
SG::VarHandleBase::key
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleBase.cxx:64
ActsTrk::TruthParticleHitCounts
std::unordered_map< const xAOD::TruthParticle *, HitCounterArray > TruthParticleHitCounts
Definition: TruthParticleHitCounts.h:19
TrackParticleTruthDecorationAlg.h
ActsTrk::createDecoratorKeys
void createDecoratorKeys(T_Parent &parent, const SG::ReadHandleKey< T_Cont > &container_key, const std::string &prefix, const std::vector< std::string > &decor_names, std::vector< SG::WriteDecorHandleKey< T_Cont > > &decor_out)
Definition: decoratorUtils.h:49
ActsTrk
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Definition: MuonDetectorBuilderTool.cxx:34
ActsTrk::TrackParticleTruthDecorationAlg::kMatchingProbability
@ kMatchingProbability
Definition: TrackParticleTruthDecorationAlg.h:41
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
ActsTrk::TrackTruthMatchingBaseAlg::analyseTrackTruth
TruthMatchResult analyseTrackTruth(const TruthParticleHitCounts &truth_particle_hit_counts, const HitCountsPerTrack &track_hit_counts, EventStat &event_stat) const
Definition: TrackTruthMatchingBaseAlg.cxx:209
ActsTrk::TrackParticleTruthDecorationAlg::kNFloatDecorators
@ kNFloatDecorators
Definition: TrackParticleTruthDecorationAlg.h:41
SG::AuxElement::container
const SG::AuxVectorData * container() const
Return the container holding this element.
decoratorUtils.h
TruthParticle.h
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
TrackContainer.h
ActsTrk::TrackTruthMatchingBaseAlg::getTruthParticleHitCounts
const TruthParticleHitCounts & getTruthParticleHitCounts(const EventContext &ctx) const
Definition: TrackTruthMatchingBaseAlg.h:60
ActsTrk::TrackTruthMatchingBaseAlg::perPdgIdSize
std::size_t perPdgIdSize() const
Definition: TrackTruthMatchingBaseAlg.h:74
ActsTrk::TrackTruthMatchingBaseAlg::finalize
virtual StatusCode finalize() override
Definition: TrackTruthMatchingBaseAlg.cxx:173