48 ATH_MSG_INFO(
"Using " << m_particlesKey.key() <<
" as the input truth container key");
51 ATH_CHECK(m_originAccessorKey.initialize());
52 ATH_CHECK(m_typeAccessorKey.initialize());
53 ATH_CHECK(m_outcomeAccessorKey.initialize());
54 ATH_CHECK(m_classificationAccessorKey.initialize());
57 ATH_CHECK(m_outputParticlesKey.initialize());
58 ATH_MSG_INFO(
"New truth particles container key: " << m_outputParticlesKey.key() );
59 ATH_CHECK(m_outputVerticesKey.initialize());
60 ATH_MSG_INFO(
"New truth vertices container key: " << m_outputVerticesKey.key() );
62 if (m_pdgIdsToKeep.empty() && !m_keepBHadrons && !m_keepCHadrons && !m_keepBSM) {
63 ATH_MSG_FATAL(
"No PDG IDs provided, not keeping b- or c-hadrons or BSM particles -- what do you want?");
64 return StatusCode::FAILURE;
68 ATH_CHECK(m_originDecoratorKey.initialize());
69 ATH_CHECK(m_typeDecoratorKey.initialize());
70 ATH_CHECK(m_outcomeDecoratorKey.initialize());
71 ATH_CHECK(m_classificationDecoratorKey.initialize());
72 ATH_CHECK(m_motherIDDecoratorKey.initialize());
73 ATH_CHECK(m_daughterIDDecoratorKey.initialize());
75 return StatusCode::SUCCESS;
83 const EventContext& ctx = Gaudi::Hive::currentContext();
87 if (!truthParticles.
isValid()) {
88 ATH_MSG_ERROR(
"Couldn't retrieve TruthParticle collection with name " << m_particlesKey);
89 return StatusCode::FAILURE;
94 ATH_CHECK(newParticlesWriteHandle.
record(std::make_unique<xAOD::TruthParticleContainer>(),
95 std::make_unique<xAOD::TruthParticleAuxContainer>()));
96 ATH_MSG_DEBUG(
"Recorded new TruthParticleContainer with key: " << (m_outputParticlesKey.key()));
99 ATH_CHECK(newVerticesWriteHandle.
record(std::make_unique<xAOD::TruthVertexContainer>(),
100 std::make_unique<xAOD::TruthVertexAuxContainer>()));
101 ATH_MSG_DEBUG(
"Recorded new TruthVertexContainer with key: " << (m_outputVerticesKey.key()));
106 std::vector<int> seen_particles;
108 for (
const auto *
part : *truthParticles){
111 addTruthParticle( ctx, *
part, newParticlesWriteHandle.
ptr(), newVerticesWriteHandle.
ptr(), seen_particles , m_generations );
114 return StatusCode::SUCCESS;
121 std::vector<int>& seen_particles,
125 for (
size_t p=0;
p<part_cont->
size();++
p){
147 xTruthParticle->
setM(old_part.
m());
148 xTruthParticle->
setPx(old_part.
px());
149 xTruthParticle->
setPy(old_part.
py());
150 xTruthParticle->
setPz(old_part.
pz());
151 xTruthParticle->
setE(old_part.
e());
158 int my_index = part_cont->
size()-1;
162 int vert_index = addTruthVertex( ctx, *old_part.
decayVtx(), part_cont, vert_cont, seen_particles,
generations);
165 (*vert_cont)[vert_index]->addIncomingParticleLink( eltp );
173 typeDecorator(*xTruthParticle) = classifierParticleTypeAcc.
withDefault (old_part, 0);
174 originDecorator(*xTruthParticle) = classifierParticleOriginAcc.
withDefault (old_part, 0);
175 outcomeDecorator(*xTruthParticle) = classifierParticleOutcomeAcc.
withDefault (old_part, 0);
176 classificationDecorator(*xTruthParticle) = ClassificationAcc.
withDefault (old_part, 0);
186 std::vector<int>& seen_particles,
192 int my_index = vert_cont->
size()-1;
197 xTruthVertex->
setX(old_vert.
x());
198 xTruthVertex->
setY(old_vert.
y());
199 xTruthVertex->
setZ(old_vert.
z());
200 xTruthVertex->
setT(old_vert.
t());
210 int part_index = addTruthParticle( ctx, *old_vert.
outgoingParticle(
n), part_cont, vert_cont, seen_particles,
214 (*part_cont)[part_index]->setProdVtxLink( eltv );
223 for (
int id : m_pdgIdsToKeep){
224 if (
part.absPdgId()==
id){
229 return (m_keepBHadrons &&
part.isBottomHadron()) ||
231 (m_keepCHadrons &&
part.isCharmHadron()) ||
233 (m_keepBSM &&
part.isBSM());