ATLAS Offline Software
TruthParticleDecoratorAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 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 
45  CHECK( m_dec_origin_label.initialize() );
46  CHECK( m_dec_type_label.initialize() );
47  CHECK( m_dec_source_label.initialize() );
48  CHECK( m_dec_vertex_index.initialize() );
49  CHECK( m_dec_parent_barcode.initialize() );
50 
51  // Retrieve tools
52  ATH_CHECK( m_truthOriginTool.retrieve() );
53 
54  return StatusCode::SUCCESS;
55  }
56 
57  StatusCode TruthParticleDecoratorAlg::execute(const EventContext& ctx) const {
58  ATH_MSG_DEBUG( "Executing " << name() << "... " );
59 
60  using TPC = xAOD::TruthParticleContainer;
61 
62  // read collections
63  SG::ReadHandle<TPC> truth_particles(m_TruthContainerKey,ctx);
64  CHECK( truth_particles.isValid() );
65  ATH_MSG_DEBUG( "Retrieved " << truth_particles->size() << " truth_particles..." );
67  CHECK( truth_PVs.isValid() );
68  ATH_MSG_DEBUG( "Retrieved " << truth_PVs->size() << " truth PVs..." );
69 
70  // get the truth primary vertex
71  if (truth_PVs->size() != 1) {
72  ATH_MSG_ERROR( "Truth PVs != 1" );
73  return StatusCode::FAILURE;
74  }
75  const xAOD::TruthVertex* truth_PV = truth_PVs->at(0);
76 
77 
78  // instantiate decorators
84 
85  // sort the particles by pt to ensure the vertex clustering is deterministic
86  std::vector<const xAOD::TruthParticle*> sorted_truth_particles;
87  for (const auto tp : *truth_particles) { sorted_truth_particles.push_back(tp); }
88  std::sort(sorted_truth_particles.begin(), sorted_truth_particles.end(), TruthDecoratorHelpers::sort_particles);
89 
90  // first loop - decorate origin label, just store truth vertex for now
91  auto tp_truth_vertices = std::vector<const xAOD::TruthVertex*>();
92  for ( const auto& truth_particle : sorted_truth_particles ) {
93 
94  // for efficiency, skip unstable and low pt particles (< 500 MeV)
95  // c-hadrons are exempt and always labelled so we can trace the b->c decay chains
96  if ( (!MC::isStable(truth_particle) or truth_particle->pt() < 500) and !truth_particle->isCharmHadron()) {
97  dec_origin_label(*truth_particle) = InDet::ExclusiveOrigin::Pileup;
98  dec_type_label(*truth_particle) = TruthDecoratorHelpers::TruthType::Label::NoTruth;
99  dec_source_label(*truth_particle) = TruthDecoratorHelpers::TruthSource::Label::NoTruth;
100  tp_truth_vertices.push_back(nullptr);
101  dec_vertex_index(*truth_particle) = -1;
102  dec_parent_barcode(*truth_particle) = HepMC::UNDEFINED_ID; // FIXME barcode-based
103  continue;
104  }
105 
106  // get parent hadron and decorate barcode
107  auto truth_parent = TruthDecoratorHelpers::get_parent_hadron(truth_particle);
108  dec_parent_barcode(*truth_particle) = truth_parent ? HepMC::barcode(truth_parent) : HepMC::UNDEFINED_ID; // FIXME barcode-based
109 
110  // get truth origin and use it for exclusive origin and secondary origin
111  int truth_origin = m_truthOriginTool->getTruthOrigin(truth_particle);
112 
113  int truth_origin_label = InDet::ExclusiveOrigin::getExclusiveOrigin(truth_origin);
114  dec_origin_label(*truth_particle) = truth_origin_label;
115 
116  int truth_source_label = TruthDecoratorHelpers::get_source_type(truth_origin);
117  dec_source_label(*truth_particle) = truth_source_label;
118 
119 
120  // get the truth vertex of the particle and store for now
121  auto truth_vertex = TruthDecoratorHelpers::get_truth_vertex(truth_particle);
122  tp_truth_vertices.push_back(truth_vertex);
123 
124  // decorate truth type
125  dec_type_label(*truth_particle) = TruthDecoratorHelpers::get_truth_type(truth_particle);
126  }
127 
128  // check sorted_truth_particles and tp_truth_vertices have the same length
129  if ( sorted_truth_particles.size() != tp_truth_vertices.size() ) {
130  ATH_MSG_ERROR( "sorted_truth_particles and tp_truth_vertices have different lengths" );
131  return StatusCode::FAILURE;
132  }
133 
134  // decorate particle with truth vertex info
135  auto seen_vertices = std::vector<const xAOD::TruthVertex*>();
136  for ( size_t i = 0; i != tp_truth_vertices.size(); i++) {
137  auto this_vert = tp_truth_vertices.at(i);
138  auto this_tp = sorted_truth_particles.at(i);
139  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
140  }
141  return StatusCode::SUCCESS;
142  }
143 }
144 
145 
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
FlavorTagDiscriminants
This file contains "getter" functions used for accessing tagger inputs from the EDM.
Definition: AssociationEnums.h:11
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:70
FlavorTagDiscriminants::TruthParticleDecoratorAlg::execute
virtual StatusCode execute(const EventContext &) const override
Definition: TruthParticleDecoratorAlg.cxx:57
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::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
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
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
HepMC::barcode
int barcode(const T *p)
Definition: Barcode.h:16
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:228
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
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
TruthParticle.h
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
HepMCHelpers.h
FlavorTagDiscriminants::TruthParticleDecoratorAlg::m_dec_parent_barcode
SG::WriteDecorHandleKey< xAOD::TruthParticleContainer > m_dec_parent_barcode
Definition: TruthParticleDecoratorAlg.h:52