16 const IInterface*
p ) :
30 ATH_CHECK( m_truthEventKey.initialize() );
34 for (
const auto&
key : m_inputKeys) {
35 m_parentLinksDecorKeys.emplace_back(
key.key()+
".parentLinks");
36 m_childLinksDecorKeys.emplace_back(
key.key()+
".childLinks");
39 ATH_CHECK( m_parentLinksDecorKeys.initialize() );
40 ATH_CHECK( m_childLinksDecorKeys.initialize() );
42 return StatusCode::SUCCESS;
54 ATH_MSG_ERROR(
"Couldn't retrieve TruthEvent collection with name " << m_truthEventKey);
55 return StatusCode::FAILURE;
59 std::vector<SG::ReadHandle<xAOD::TruthParticleContainer> > inputParticles;
60 inputParticles.reserve(m_inputKeys.size());
66 std::map<int,ElementLink<xAOD::TruthParticleContainer> > linkMap;
67 for (
auto& coll : inputParticles){
68 for (
size_t p=0;
p<coll.ptr()->
size();++
p){
69 if (!coll.ptr()->at(
p))
continue;
70 if (linkMap.find(
HepMC::uniqueID(coll.ptr()->at(
p))) != linkMap.end())
continue;
82 std::map< int , std::vector<ElementLink<xAOD::TruthParticleContainer> > > parentMap;
83 std::map< int , std::vector<ElementLink<xAOD::TruthParticleContainer> > > childMap;
86 std::vector<int> seen_particles(20);
89 for (
size_t p=0;
p<
event->nTruthParticles();++
p){
90 if (!
event->truthParticle(
p))
continue;
93 std::vector<ElementLink<xAOD::TruthParticleContainer> >
parents;
94 std::vector<ElementLink<xAOD::TruthParticleContainer> >
children;
96 seen_particles.clear();
97 find_parents(
event->truthParticle(
p) ,
parents , linkMap , seen_particles );
98 seen_particles.clear();
99 find_children(
event->truthParticle(
p) ,
children , linkMap , seen_particles );
106 auto parent_decorator = m_parentLinksDecorKeys.makeHandles (ctx);
107 auto child_decorator = m_childLinksDecorKeys.makeHandles (ctx);
108 unsigned int pCntr{0};
109 for (
auto coll : inputParticles){
110 if (parent_decorator.at(pCntr).isAvailable()) {
114 for (
size_t p=0;
p<coll.ptr()->
size();++
p){
115 if (!coll.ptr()->at(
p))
continue;
116 parent_decorator.at(pCntr)(*coll.ptr()->at(
p)) = parentMap[
HepMC::uniqueID(coll->at(
p)) ];
117 child_decorator.at(pCntr)(*coll.ptr()->at(
p)) = childMap[
HepMC::uniqueID(coll->at(
p)) ];
122 return StatusCode::SUCCESS;
128 std::vector<int>& seen_particles )
const {
150 std::vector<int>& seen_particles )
const {
157 for (
size_t child=0;child<
part->nChildren();++child){
158 if (!
part->child(child))
continue;
164 find_children(
part->child(child) ,
children , linkMap , seen_particles );