ATLAS Offline Software
TruthParticleDecoratorAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 
8 
11 
13 
16 #include "xAODTruth/TruthVertex.h"
19 
20 
21 namespace FlavorTagDiscriminants {
22 
24  const std::string& name, ISvcLocator* loc )
25  : AthReentrantAlgorithm(name, loc) {}
26 
28  ATH_MSG_INFO( "Inizializing " << name() << "... " );
29 
30  // Initialize Container keys
31  ATH_MSG_DEBUG( "Inizializing containers:" );
33  ATH_MSG_DEBUG( " ** " << m_TruthPVsKey );
34 
36  ATH_CHECK( m_TruthPVsKey.initialize() );
37 
38  // Prepare decorators
44 
50 
51  // Retrieve tools
52  ATH_CHECK( m_truthOriginTool.retrieve() );
53 
54  // ATLASRECTS-8290: this should be removed eventually
55  if (m_use_barcode) m_uid = SG::ConstAccessor<int>("barcode");
56 
57  return StatusCode::SUCCESS;
58  }
59 
60  StatusCode TruthParticleDecoratorAlg::execute(const EventContext& ctx) const {
61  ATH_MSG_DEBUG( "Executing " << name() << "... " );
62 
63  using TPC = xAOD::TruthParticleContainer;
64 
65  // read collections
66  SG::ReadHandle<TPC> truth_particles(m_TruthContainerKey,ctx);
67  CHECK( truth_particles.isValid() );
68  ATH_MSG_DEBUG( "Retrieved " << truth_particles->size() << " truth_particles..." );
70  CHECK( truth_PVs.isValid() );
71  ATH_MSG_DEBUG( "Retrieved " << truth_PVs->size() << " truth PVs..." );
72 
73  // get the truth primary vertex
74  if (truth_PVs->size() != 1) {
75  ATH_MSG_ERROR( "Truth PVs != 1" );
76  return StatusCode::FAILURE;
77  }
78  const xAOD::TruthVertex* truth_PV = truth_PVs->at(0);
79 
80 
81  // instantiate decorators
86  SG::WriteDecorHandle<TPC, int> dec_parent_uniqueID(m_dec_parent_uniqueID, ctx);
87 
88  // sort the particles by pt to ensure the vertex clustering is deterministic
89  std::vector<const xAOD::TruthParticle*> sorted_truth_particles;
90  for (const auto tp : *truth_particles) { sorted_truth_particles.push_back(tp); }
91  std::sort(sorted_truth_particles.begin(), sorted_truth_particles.end(), TruthDecoratorHelpers::sort_particles);
92 
93  // first loop - decorate origin label, just store truth vertex for now
94  auto tp_truth_vertices = std::vector<const xAOD::TruthVertex*>();
95  for ( const auto& truth_particle : sorted_truth_particles ) {
96 
97  // for efficiency, skip unstable and low pt particles (< 500 MeV)
98  // c-hadrons are exempt and always labelled so we can trace the b->c decay chains
99  if ( (!MC::isStable(truth_particle) or truth_particle->pt() < 500) and !truth_particle->isCharmHadron()) {
100  dec_origin_label(*truth_particle) = InDet::ExclusiveOrigin::Pileup;
101  dec_type_label(*truth_particle) = TruthDecoratorHelpers::TruthType::Label::NoTruth;
102  dec_source_label(*truth_particle) = TruthDecoratorHelpers::TruthSource::Label::NoTruth;
103  tp_truth_vertices.push_back(nullptr);
104  dec_vertex_index(*truth_particle) = -1;
105  dec_parent_uniqueID(*truth_particle) = HepMC::UNDEFINED_ID;
106  continue;
107  }
108 
109  // get parent hadron and decorate uniqueID
110  auto truth_parent = TruthDecoratorHelpers::get_parent_hadron(truth_particle);
111  // ATLASRECTS-8290: replace m_uid with HepMC::uniqueID
112  dec_parent_uniqueID(*truth_particle) = truth_parent ? m_uid(*truth_parent) : HepMC::UNDEFINED_ID;
113 
114  // get truth origin and use it for exclusive origin and secondary origin
115  int truth_origin = m_truthOriginTool->getTruthOrigin(truth_particle);
116 
117  int truth_origin_label = InDet::ExclusiveOrigin::getExclusiveOrigin(truth_origin);
118  dec_origin_label(*truth_particle) = truth_origin_label;
119 
120  int truth_source_label = TruthDecoratorHelpers::get_source_type(truth_origin);
121  dec_source_label(*truth_particle) = truth_source_label;
122 
123 
124  // get the truth vertex of the particle and store for now
125  auto truth_vertex = TruthDecoratorHelpers::get_truth_vertex(truth_particle);
126  tp_truth_vertices.push_back(truth_vertex);
127 
128  // decorate truth type
129  dec_type_label(*truth_particle) = TruthDecoratorHelpers::get_truth_type(truth_particle);
130  }
131 
132  // check sorted_truth_particles and tp_truth_vertices have the same length
133  if ( sorted_truth_particles.size() != tp_truth_vertices.size() ) {
134  ATH_MSG_ERROR( "sorted_truth_particles and tp_truth_vertices have different lengths" );
135  return StatusCode::FAILURE;
136  }
137 
138  // decorate particle with truth vertex info
139  auto seen_vertices = std::vector<const xAOD::TruthVertex*>();
140  for ( size_t i = 0; i != tp_truth_vertices.size(); i++) {
141  auto this_vert = tp_truth_vertices.at(i);
142  auto this_tp = sorted_truth_particles.at(i);
143  dec_vertex_index(*this_tp) = TruthDecoratorHelpers::get_vertex_index(this_vert, truth_PV, seen_vertices, m_truthVertexMergeDistance); // This is a position in an array of xAOD::TruthVertex objects
144  }
145  return StatusCode::SUCCESS;
146  }
147 }
148 
149 
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
FlavorTagDiscriminants
Definition: DL2.h:18
FlavorTagDiscriminants::TruthDecoratorHelpers::get_parent_hadron
const xAOD::TruthParticle * get_parent_hadron(const xAOD::TruthParticle *truth_particle, bool user_called=true, int depth=0)
Definition: TruthDecoratorHelpers.cxx:54
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
FlavorTagDiscriminants::TruthParticleDecoratorAlg::execute
virtual StatusCode execute(const EventContext &) const override
Definition: TruthParticleDecoratorAlg.cxx:60
TruthVertexContainer.h
TruthParticleContainer.h
FlavorTagDiscriminants::TruthDecoratorHelpers::get_source_type
int get_source_type(const int origin)
Definition: TruthDecoratorHelpers.cxx:88
FlavorTagDiscriminants::TruthParticleDecoratorAlg::m_truthOriginTool
ToolHandle< InDet::InDetTrackTruthOriginTool > m_truthOriginTool
Definition: TruthParticleDecoratorAlg.h:57
ParticleTest.tp
tp
Definition: ParticleTest.py:25
SG::ConstAccessor< int >
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
TruthDecoratorHelpers.h
FlavorTagDiscriminants::TruthParticleDecoratorAlg::m_TruthPVsKey
SG::ReadHandleKey< xAOD::TruthVertexContainer > m_TruthPVsKey
Definition: TruthParticleDecoratorAlg.h:35
FlavorTagDiscriminants::TruthParticleDecoratorAlg::m_use_barcode
Gaudi::Property< bool > m_use_barcode
Definition: TruthParticleDecoratorAlg.h:66
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:74
InDet::ExclusiveOrigin::Pileup
@ Pileup
Definition: InDetTrackTruthOriginDefs.h:161
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:85
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
SG::WriteDecorHandle
Handle class for adding a decoration to an object.
Definition: StoreGate/StoreGate/WriteDecorHandle.h:100
FlavorTagDiscriminants::TruthDecoratorHelpers::get_truth_vertex
const xAOD::TruthVertex * get_truth_vertex(const xAOD::TruthParticle *truth)
Definition: TruthDecoratorHelpers.cxx:16
WriteDecorHandle.h
Handle class for adding a decoration to an object.
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
FlavorTagDiscriminants::TruthParticleDecoratorAlg::m_truthVertexMergeDistance
Gaudi::Property< float > m_truthVertexMergeDistance
Definition: TruthParticleDecoratorAlg.h:61
TruthParticleDecoratorAlg.h
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
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
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
HepMC::UNDEFINED_ID
constexpr int UNDEFINED_ID
Definition: MagicNumbers.h:56
TruthVertex.h
FlavorTagDiscriminants::TruthDecoratorHelpers::get_vertex_index
int get_vertex_index(const xAOD::TruthVertex *vertex, const xAOD::TruthVertex *truth_PV, std::vector< const xAOD::TruthVertex * > &seen_vertices, const float truthVertexMergeDistance)
Definition: TruthDecoratorHelpers.cxx:101
xAOD::TruthVertex_v1
Class describing a truth vertex in the MC record.
Definition: TruthVertex_v1.h:37
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
FlavorTagDiscriminants::TruthParticleDecoratorAlg::TruthParticleDecoratorAlg
TruthParticleDecoratorAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: TruthParticleDecoratorAlg.cxx:23
FlavorTagDiscriminants::TruthParticleDecoratorAlg::m_dec_source_label
SG::WriteDecorHandleKey< xAOD::TruthParticleContainer > m_dec_source_label
Definition: TruthParticleDecoratorAlg.h:46
xAOD::TruthParticleContainer
TruthParticleContainer_v1 TruthParticleContainer
Declare the latest version of the truth particle container.
Definition: Event/xAOD/xAODTruth/xAODTruth/TruthParticleContainer.h:17
FlavorTagDiscriminants::TruthParticleDecoratorAlg::m_TruthContainerKey
SG::ReadHandleKey< xAOD::TruthParticleContainer > m_TruthContainerKey
Definition: TruthParticleDecoratorAlg.h:32
InDetTrackTruthOriginDefs.h
FlavorTagDiscriminants::TruthParticleDecoratorAlg::m_dec_type_label
SG::WriteDecorHandleKey< xAOD::TruthParticleContainer > m_dec_type_label
Definition: TruthParticleDecoratorAlg.h:43
FlavorTagDiscriminants::TruthDecoratorHelpers::TruthType::NoTruth
@ NoTruth
Definition: TruthDecoratorHelpers.h:17
FlavorTagDiscriminants::TruthDecoratorHelpers::sort_particles
bool sort_particles(const xAOD::IParticle *particle_A, const xAOD::IParticle *particle_B)
Definition: TruthDecoratorHelpers.cxx:12
MC::isStable
bool isStable(const T &p)
Identify if the particle is stable, i.e. has not decayed.
Definition: HepMCHelpers.h:45
SG::WriteDecorHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
FlavorTagDiscriminants::TruthParticleDecoratorAlg::m_dec_vertex_index
SG::WriteDecorHandleKey< xAOD::TruthParticleContainer > m_dec_vertex_index
Definition: TruthParticleDecoratorAlg.h:49
InDet::ExclusiveOrigin::getExclusiveOrigin
int getExclusiveOrigin(int origin)
Definition: InDetTrackTruthOriginDefs.h:171
FlavorTagDiscriminants::TruthParticleDecoratorAlg::initialize
virtual StatusCode initialize() override
Definition: TruthParticleDecoratorAlg.cxx:27
FlavorTagDiscriminants::TruthParticleDecoratorAlg::m_dec_origin_label
SG::WriteDecorHandleKey< xAOD::TruthParticleContainer > m_dec_origin_label
Definition: TruthParticleDecoratorAlg.h:40
ReadDecorHandle.h
Handle class for reading a decoration on an object.
DataVector::at
const T * at(size_type n) const
Access an element, as an rvalue.
FlavorTagDiscriminants::TruthDecoratorHelpers::get_truth_type
int get_truth_type(const xAOD::TruthParticle *truth_particle)
Definition: TruthDecoratorHelpers.cxx:75
FlavorTagDiscriminants::TruthParticleDecoratorAlg::m_dec_parent_uniqueID
SG::WriteDecorHandleKey< xAOD::TruthParticleContainer > m_dec_parent_uniqueID
Definition: TruthParticleDecoratorAlg.h:52
TruthParticle.h
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
HepMCHelpers.h
FlavorTagDiscriminants::TruthParticleDecoratorAlg::m_uid
SG::ConstAccessor< int > m_uid
Definition: TruthParticleDecoratorAlg.h:69