35 return StatusCode::FAILURE;
39 std::vector<SG::ReadHandle<xAOD::TruthParticleContainer> > inputParticles;
46 std::map<int,ElementLink<xAOD::TruthParticleContainer> > linkMap;
47 for (
auto& coll : inputParticles){
48 for (
size_t p=0;p<coll.ptr()->size();++p){
49 if (!coll.ptr()->at(p))
continue;
50 if (linkMap.find(
HepMC::uniqueID(coll.ptr()->at(p))) != linkMap.end())
continue;
62 std::map< int , std::vector<ElementLink<xAOD::TruthParticleContainer> > > parentMap;
63 std::map< int , std::vector<ElementLink<xAOD::TruthParticleContainer> > > childMap;
66 std::vector<int> seen_particles(20);
69 for (
size_t p=0;p<
event->nTruthParticles();++p){
70 if (!event->truthParticle(p))
continue;
71 if (linkMap.find(
HepMC::uniqueID(event->truthParticle(p))) == linkMap.end())
continue;
73 std::vector<ElementLink<xAOD::TruthParticleContainer> > parents;
74 std::vector<ElementLink<xAOD::TruthParticleContainer> > children;
76 seen_particles.clear();
77 find_parents( event->truthParticle(p) , parents , linkMap , seen_particles );
78 seen_particles.clear();
79 find_children( event->truthParticle(p) , children , linkMap , seen_particles );
81 parentMap[
HepMC::uniqueID(event->truthParticle(p))] = std::move(parents);
82 childMap[
HepMC::uniqueID(event->truthParticle(p))] = std::move(children);
88 unsigned int pCntr{0};
89 for (
auto coll : inputParticles){
90 if (parent_decorator.at(pCntr).isAvailable()) {
94 for (
size_t p=0;p<coll.ptr()->size();++p){
95 if (!coll.ptr()->at(p))
continue;
96 parent_decorator.at(pCntr)(*coll.ptr()->at(p)) = parentMap[
HepMC::uniqueID(coll->at(p)) ];
97 child_decorator.at(pCntr)(*coll.ptr()->at(p)) = childMap[
HepMC::uniqueID(coll->at(p)) ];
102 return StatusCode::SUCCESS;
108 std::vector<int>& seen_particles )
const {
112 if (std::find(seen_particles.begin(), seen_particles.end(),
HepMC::uniqueID(part)) != seen_particles.end())
return;
115 for (
size_t parent=0;parent<part->nParents();++parent){
116 if (!part->parent(parent))
continue;
117 if (linkMap.find(
HepMC::uniqueID(part->parent(parent))) != linkMap.end()){
122 find_parents( part->parent(parent) , parents , linkMap , seen_particles );
130 std::vector<int>& seen_particles )
const {
134 if (std::find(seen_particles.begin(),seen_particles.end(),
HepMC::uniqueID(part)) != seen_particles.end())
return;
137 for (
size_t child=0;child<part->nChildren();++child){
138 if (!part->child(child))
continue;
139 if (linkMap.find(
HepMC::uniqueID(part->child(child))) != linkMap.end()){
144 find_children( part->child(child) , children , linkMap , seen_particles );
void find_parents(const xAOD::TruthParticle *part, std::vector< ElementLink< xAOD::TruthParticleContainer > > &parents, std::map< int, ElementLink< xAOD::TruthParticleContainer > > &linkMap, std::vector< int > &seen_particles) const
Helper function for finding all the parents of a particle.
void find_children(const xAOD::TruthParticle *part, std::vector< ElementLink< xAOD::TruthParticleContainer > > &parents, std::map< int, ElementLink< xAOD::TruthParticleContainer > > &linkMap, std::vector< int > &seen_particles) const
Helper function for finding all the children of a particle.