22 const IInterface* parent) :
26 declareInterface<Trk::ITruthTrajectoryBuilder>(
this);
34 ATH_MSG_DEBUG(
" New TruthTrajectory: input: " << input <<
" PDG id " << input->pdg_id());
39 std::stack<HepMC::ConstGenParticlePtr> tmp;
40 while ((next =
getDaughter(current))) { tmp.push(current = next); }
43 while (!tmp.empty()) {
60 std::vector<HepMcParticleLink>::const_iterator pit =
result->begin();
61 std::vector<HepMcParticleLink>::const_iterator pit_end =
result->end();
62 for (; pit != pit_end; ++pit) {
63 const HepMC::GenParticle& par = *pit->cptr();
65 msg(MSG::DEBUG) <<
" PDG ID " << par.pdg_id()
66 <<
" pt: " << par.momentum().perp();
67 if (par.production_vertex())
68 msg(MSG::DEBUG) <<
" vertices prod: r " << par.production_vertex()->position().perp() <<
" z "
69 << par.production_vertex()->position().z();
71 msg(MSG::DEBUG) <<
" end: r " << par.end_vertex()->position().perp() <<
" z " << par.end_vertex()->position().z();
83 int particles_in_size = vtx ? vtx->particles_in_size() : 0;
84 int particles_out_size = vtx ? vtx->particles_out_size() : 0;
85 if (vtx &&
msgLvl(MSG::DEBUG))
msg(MSG::DEBUG) <<
" new vertex: nparticles in " << particles_in_size <<
endmsg;
87 if (vtx && (particles_in_size == 1)) {
89 mother = vtx->particles_in().front();
91 mother = *vtx->particles_in_const_begin();
94 if (mother &&
msgLvl(MSG::DEBUG))
95 msg(MSG::DEBUG) <<
" new mother: " << mother->pdg_id() <<
" status " << mother->status() <<
" particles out "
96 << particles_out_size <<
endmsg;
99 unsigned int nDecayMuons = 0;
101 for (
const auto& candidate : *vtx) {
103 msg(MSG::DEBUG) <<
" PDG ID " << candidate->pdg_id() <<
" particle: " << candidate
104 <<
" pt: " << candidate->momentum().perp();
105 if (candidate->production_vertex())
106 msg(MSG::DEBUG) <<
" vertices prod: r " << candidate->production_vertex()->position().perp() <<
" z "
107 << candidate->production_vertex()->position().z();
108 if (candidate->end_vertex())
109 msg(MSG::DEBUG) <<
" end: r " << candidate->end_vertex()->position().perp() <<
" z "
110 << candidate->end_vertex()->position().z();
114 if (candidate->pdg_id() == mother->pdg_id()) {
116 if (candidate->momentum().e() > passed_cuts->momentum().e()) { passed_cuts = candidate; }
118 passed_cuts = candidate;
123 passed_cuts = candidate;
125 msg(MSG::DEBUG) <<
" Neither muon nor identical pdgId " <<
endmsg;
126 passed_cuts = candidate;
130 if (nDecayMuons > 0) {
131 daughter = std::move(passed_cuts);
132 if (nDecayMuons == 2) {
139 return std::make_pair(mother, daughter);
146 if(
res.first == mother)
return res.second;
An STL vector of pointers that by default owns its pointed-to elements.
ATLAS-specific HepMC functions.
std::pair< std::vector< unsigned int >, bool > res
bool msgLvl(const MSG::Level lvl) const
HepMC::ConstGenParticlePtr getDaughter(const HepMC::ConstGenParticlePtr &particle) const override
Returns an umambiguous daughter of the truth particle on a TruthTrajectory, or 0.
HepMC::ConstGenParticlePtr getMother(const HepMC::ConstGenParticlePtr &particle) const override
Returns an umambiguous mother of the truth particle on a TruthTrajectory, or 0.
std::pair< HepMC::ConstGenParticlePtr, HepMC::ConstGenParticlePtr > MotherDaughter
Return type for the next method.
MotherDaughter truthTrajectoryCuts(const HepMC::ConstGenVertexPtr &vtx) const
Decides if the vertex connects two particles on the same TruthTrajectory.
MuonDecayTruthTrajectoryBuilder(const std::string &type, const std::string &name, const IInterface *parent)
void buildTruthTrajectory(TruthTrajectory *result, const HepMC::ConstGenParticlePtr &input) const override
Build a TruthTrajectory this particle belongs to.
A TruthTrajectory is a chain of charged MC particles connected through the mother-daughter relationsh...
const GenParticle * ConstGenParticlePtr
const HepMC::GenVertex * ConstGenVertexPtr
bool isElectron(const T &p)
bool isPhysical(const T &p)
Identify if the particle is physical, i.e. is stable or decayed.
NRpcCablingAlg reads raw condition data and writes derived condition data to the condition store.