20 const IInterface*
p ) :
34 ATH_CHECK( m_truthEventKey.initialize() );
38 for (
const auto&
key : m_inputKeys) {
39 m_parentLinksDecorKeys.emplace_back(
key.key()+
".parentLinks");
40 m_childLinksDecorKeys.emplace_back(
key.key()+
".childLinks");
43 ATH_CHECK( m_parentLinksDecorKeys.initialize() );
44 ATH_CHECK( m_childLinksDecorKeys.initialize() );
46 return StatusCode::SUCCESS;
54 const EventContext& ctx = Gaudi::Hive::currentContext();
59 ATH_MSG_ERROR(
"Couldn't retrieve TruthEvent collection with name " << m_truthEventKey);
60 return StatusCode::FAILURE;
64 std::vector<SG::ReadHandle<xAOD::TruthParticleContainer> > inputParticles;
65 inputParticles.reserve(m_inputKeys.size());
71 std::map<int,ElementLink<xAOD::TruthParticleContainer> > linkMap;
72 for (
auto& coll : inputParticles){
73 for (
size_t p=0;
p<coll.ptr()->
size();++
p){
74 if (!coll.ptr()->at(
p))
continue;
75 if (linkMap.find(
HepMC::uniqueID(coll.ptr()->at(
p))) != linkMap.end())
continue;
87 std::map< int , std::vector<ElementLink<xAOD::TruthParticleContainer> > > parentMap;
88 std::map< int , std::vector<ElementLink<xAOD::TruthParticleContainer> > > childMap;
91 std::vector<int> seen_particles(20);
94 for (
size_t p=0;
p<
event->nTruthParticles();++
p){
95 if (!
event->truthParticle(
p))
continue;
98 std::vector<ElementLink<xAOD::TruthParticleContainer> >
parents;
99 std::vector<ElementLink<xAOD::TruthParticleContainer> >
children;
101 seen_particles.clear();
102 find_parents(
event->truthParticle(
p) ,
parents , linkMap , seen_particles );
103 seen_particles.clear();
104 find_children(
event->truthParticle(
p) ,
children , linkMap , seen_particles );
111 auto parent_decorator = m_parentLinksDecorKeys.makeHandles (ctx);
112 auto child_decorator = m_childLinksDecorKeys.makeHandles (ctx);
113 unsigned int pCntr{0};
114 for (
auto coll : inputParticles){
115 if (parent_decorator.at(pCntr).isAvailable()) {
119 for (
size_t p=0;
p<coll.ptr()->
size();++
p){
120 if (!coll.ptr()->at(
p))
continue;
121 parent_decorator.at(pCntr)(*coll.ptr()->at(
p)) = parentMap[
HepMC::uniqueID(coll->at(
p)) ];
122 child_decorator.at(pCntr)(*coll.ptr()->at(
p)) = childMap[
HepMC::uniqueID(coll->at(
p)) ];
127 return StatusCode::SUCCESS;
133 std::vector<int>& seen_particles )
const {
155 std::vector<int>& seen_particles )
const {
162 for (
size_t child=0;child<
part->nChildren();++child){
163 if (!
part->child(child))
continue;
169 find_children(
part->child(child) ,
children , linkMap , seen_particles );