ATLAS Offline Software
Loading...
Searching...
No Matches
TruthDecoratorHelpers.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
5
7
8
10 namespace TruthDecoratorHelpers {
11
12 bool sort_particles(const xAOD::IParticle* particle_A, const xAOD::IParticle* particle_B) {
13 return particle_A->pt() < particle_B->pt();
14 }
15
17 // no truth
18 if ( not truth ) { return nullptr; }
19
20 // no vertex
21 const xAOD::TruthVertex* truth_vertex = truth->prodVtx();
22 if ( not truth_vertex || truth_vertex->perp() > 440.0 ) {
23 return nullptr;
24 }
25
26 return truth_vertex;
27 }
28
29 float get_distance(const xAOD::TruthVertex* vertex_A, const xAOD::TruthVertex* vertex_B) {
30 if ( !vertex_A || !vertex_B ) { return 999.0; }
31 return (vertex_A->v4().Vect() - vertex_B->v4().Vect()).Mag();
32 }
33
34 bool is_bc_hadron(const xAOD::TruthParticle* truth_particle, int flavour) {
35 if( truth_particle == nullptr ) { return false; }
36 if( flavour == 5 && truth_particle->isBottomHadron() ) { return true; }
37 if( flavour == 4 && truth_particle->isCharmHadron() ) { return true; }
38 return false;
39 }
40
41 bool is_weakly_decaying_hadron(const xAOD::TruthParticle* truth_particle, int flavour) {
42 if (!is_bc_hadron(truth_particle, flavour)) return false;
43 if (!truth_particle->hasDecayVtx() ) return false;
44 for ( const auto out_part: truth_particle->decayVtx()->particles_out()) {
45 if ( is_bc_hadron(out_part, flavour) ) return false;
46 }
47 return true;
48 }
49
50 bool is_weakly_decaying_hadron(const xAOD::TruthParticle* truth_particle) {
51 return is_weakly_decaying_hadron(truth_particle, 5) || is_weakly_decaying_hadron(truth_particle, 4);
52 }
53
54 const xAOD::TruthParticle* get_parent_hadron(const xAOD::TruthParticle* truth_particle, bool user_called, int depth) {
55 // get the weakly decaying parent hadron of truth_particle
56 // check for sensible input
57 if ( truth_particle == nullptr ) { return nullptr; }
58 // loop protection
59 if (depth>30) { return nullptr; }
60 // if this is the weakly decaying hadron, stop here
61 if ( !user_called && is_weakly_decaying_hadron(truth_particle) ) {
62 return truth_particle;
63 }
64 for (unsigned int p = 0; p < truth_particle->nParents(); p++) {
65 const auto parent = truth_particle->parent(p);
66 if(parent == truth_particle) continue;// avoid infinite recursion
67 const auto parent_hadron = get_parent_hadron(parent, false, depth+1);
68 if ( parent_hadron != nullptr ) {
69 return parent_hadron;
70 }
71 }
72 return nullptr;
73 }
74
75 int get_truth_type(const xAOD::TruthParticle* truth_particle) {
76 if (!truth_particle) return TruthType::Label::NoTruth;
77 // simple pdgid check for pion based on
78 // PhysicsAnalysis/MCTruthClassifier/Root/MCTruthClassifierGen.cxx#L1159
79 if (std::abs(truth_particle->pdgId()) == 211) return TruthType::Label::Pion * truth_particle->charge();
80 if (truth_particle->isStrangeMeson()) return TruthType::Label::Kaon * truth_particle->charge();
81 if (std::abs(truth_particle->pdgId()) == 3122) return TruthType::Label::Lambda;
82 if (truth_particle->isElectron()) return TruthType::Label::Electron * truth_particle->charge() * -1;
83 if (truth_particle->isMuon()) return TruthType::Label::Muon * truth_particle->charge() * -1;
84 if (truth_particle->isPhoton()) return TruthType::Label::Photon;
85 return TruthType::Label::Other;
86 }
87
88 int get_source_type(const int origin) {
89 /* this label gives information about the origin of secondary
90 particles (material interactions, gamme conversions, etc.)*/
91
92 if (!(InDet::TrkOrigin::isSecondary(origin))) return TruthSource::Label::NotSecondary;
93 if ( InDet::TrkOrigin::isHadronicInteraction(origin) ) return TruthSource::Label::HadronicInteraction;
94 if ( InDet::TrkOrigin::isStrangeMesonDecay(origin) ) return TruthSource::Label::StrangeMesonDecay;
95 if ( InDet::TrkOrigin::isStrangeBaryonDecay(origin) ) return TruthSource::Label::StrangeBaryonDecay;
96 if ( InDet::TrkOrigin::isGammaConversion(origin) ) return TruthSource::Label::GammaConversion;
97 // For simulation tracks not included in the above categories
98 return TruthSource::Label::Other;
99 }
100
101 int get_vertex_index(const xAOD::TruthVertex* this_vertex,
102 const xAOD::TruthVertex* truth_PV,
103 std::vector<const xAOD::TruthVertex*>& seen_vertices,
104 const float truthVertexMergeDistance) {
105 // no vertex
106 if (!this_vertex) {
107 return -2;
108 }
109 // primary vertex
110 if (get_distance(this_vertex, truth_PV) < truthVertexMergeDistance) {
111 return 0;
112 }
113 // have we already seen this vertex?
114 for ( size_t i = 0; i != seen_vertices.size(); i++) {
115 float dr = get_distance(seen_vertices.at(i), this_vertex);
116 if ( dr < truthVertexMergeDistance ) {
117 // a vertex is nearby, reuse it
118 return i + 1;
119 }
120 }
121 seen_vertices.push_back(this_vertex);
122 return seen_vertices.size();
123 }
124 }
125}
Class providing the definition of the 4-vector interface.
virtual double pt() const =0
The transverse momentum ( ) of the particle.
bool isBottomHadron() const
Determine if the PID is that of a b-hadron.
bool isStrangeMeson() const
Determine if the PID is that of a strange meson.
int pdgId() const
PDG ID code.
const TruthVertex_v1 * decayVtx() const
The decay vertex of this particle.
const TruthParticle_v1 * parent(size_t i) const
Retrieve the i-th mother (TruthParticle) of this TruthParticle.
bool hasDecayVtx() const
Check for a decay vertex on this particle.
const TruthVertex_v1 * prodVtx() const
The production vertex of this particle.
double charge() const
Physical charge.
size_t nParents() const
Number of parents of this particle.
bool isElectron() const
Whether the particle is an electron (or positron)
bool isPhoton() const
Whether the particle is a photon.
bool isMuon() const
Whether the particle is a muon (or antimuon)
bool isCharmHadron() const
Determine if the PID is that of a c-hadron.
FourVec_t v4() const
The full 4-vector of the vertex.
std::vector< const TruthParticle * > particles_out() const
Get the outgoing particles.
float perp() const
Vertex transverse distance from the beam line.
std::string depth
tag string for intendation
Definition fastadd.cxx:46
bool is_weakly_decaying_hadron(const xAOD::TruthParticle *truth_particle)
float get_distance(const xAOD::TruthVertex *vertex_A, const xAOD::TruthVertex *vertex_B)
const xAOD::TruthVertex * get_truth_vertex(const xAOD::TruthParticle *truth)
const xAOD::TruthParticle * get_parent_hadron(const xAOD::TruthParticle *truth_particle, bool user_called=true, int depth=0)
int get_truth_type(const xAOD::TruthParticle *truth_particle)
bool is_bc_hadron(const xAOD::TruthParticle *truth_particle, int flavour)
int get_vertex_index(const xAOD::TruthVertex *vertex, const xAOD::TruthVertex *truth_PV, std::vector< const xAOD::TruthVertex * > &seen_vertices, const float truthVertexMergeDistance)
bool sort_particles(const xAOD::IParticle *particle_A, const xAOD::IParticle *particle_B)
bool isHadronicInteraction(int origin)
from hadronic interactions
bool isSecondary(int origin)
from long living particle decays or gamma conversions or hadronic interactions and anything else with...
bool isGammaConversion(int origin)
from conversions
bool isStrangeMesonDecay(int origin)
from strange meson decay
bool isStrangeBaryonDecay(int origin)
from strange baryon decay
TruthVertex_v1 TruthVertex
Typedef to implementation.
Definition TruthVertex.h:15
TruthParticle_v1 TruthParticle
Typedef to implementation.