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;
86 if (!truthParticles.
isValid()) {
87 ATH_MSG_ERROR(
"Couldn't retrieve TruthParticle collection with name " << m_particlesKey);
88 return StatusCode::FAILURE;
93 ATH_CHECK(newParticlesWriteHandle.
record(std::make_unique<xAOD::TruthParticleContainer>(),
94 std::make_unique<xAOD::TruthParticleAuxContainer>()));
95 ATH_MSG_DEBUG(
"Recorded new TruthParticleContainer with key: " << (m_outputParticlesKey.key()));
98 ATH_CHECK(newVerticesWriteHandle.
record(std::make_unique<xAOD::TruthVertexContainer>(),
99 std::make_unique<xAOD::TruthVertexAuxContainer>()));
100 ATH_MSG_DEBUG(
"Recorded new TruthVertexContainer with key: " << (m_outputVerticesKey.key()));
105 std::vector<int> seen_particles;
107 for (
const auto *
part : *truthParticles){
110 addTruthParticle( ctx, *
part, newParticlesWriteHandle.
ptr(), newVerticesWriteHandle.
ptr(), seen_particles , m_generations );
113 return StatusCode::SUCCESS;
120 std::vector<int>& seen_particles,
124 for (
size_t p=0;
p<part_cont->
size();++
p){
146 xTruthParticle->
setM(old_part.
m());
147 xTruthParticle->
setPx(old_part.
px());
148 xTruthParticle->
setPy(old_part.
py());
149 xTruthParticle->
setPz(old_part.
pz());
150 xTruthParticle->
setE(old_part.
e());
157 int my_index = part_cont->
size()-1;
161 int vert_index = addTruthVertex( ctx, *old_part.
decayVtx(), part_cont, vert_cont, seen_particles,
generations);
164 (*vert_cont)[vert_index]->addIncomingParticleLink( eltp );
172 typeDecorator(*xTruthParticle) = classifierParticleTypeAcc(old_part);
173 originDecorator(*xTruthParticle) = classifierParticleOriginAcc(old_part);
174 outcomeDecorator(*xTruthParticle) = classifierParticleOutcomeAcc(old_part);
175 classificationDecorator(*xTruthParticle) = ClassificationAcc(old_part);
185 std::vector<int>& seen_particles,
191 int my_index = vert_cont->
size()-1;
196 xTruthVertex->
setX(old_vert.
x());
197 xTruthVertex->
setY(old_vert.
y());
198 xTruthVertex->
setZ(old_vert.
z());
199 xTruthVertex->
setT(old_vert.
t());
209 int part_index = addTruthParticle( ctx, *old_vert.
outgoingParticle(
n), part_cont, vert_cont, seen_particles,
213 (*part_cont)[part_index]->setProdVtxLink( eltv );
222 for (
int id : m_pdgIdsToKeep){
223 if (
part.absPdgId()==
id){
228 return (m_keepBHadrons &&
part.isBottomHadron()) ||
230 (m_keepCHadrons &&
part.isCharmHadron()) ||
232 (m_keepBSM &&
part.isBSM());