13#include "AthLinks/ElementLink.h"
51 ATH_MSG_WARNING(
"Truth electron container is not available, won't perform matching to truth electrons");
54 ATH_MSG_WARNING(
"Truth muon container is not available, won't perform matching to truth muons");
57 ATH_MSG_WARNING(
"Truth jet container is not available, won't perform matching to truth jets");
79 return StatusCode::SUCCESS;
85 const EventContext& ctx = Gaudi::Hive::currentContext();
102 if (!truthElectronsHandle.
isValid()) {
104 return StatusCode::FAILURE;
106 truthTausEvent.m_xTruthElectronContainerConst = truthElectronsHandle.
cptr();
111 if (!truthMuonsHandle.
isValid()) {
113 return StatusCode::FAILURE;
115 truthTausEvent.m_xTruthMuonContainerConst = truthMuonsHandle.
cptr();
120 if (!truthJetsHandle.
isValid()) {
122 return StatusCode::FAILURE;
124 truthTausEvent.m_xTruthJetContainerConst = truthJetsHandle.
cptr();
128 if (!truthTausHandle.
isValid()) {
130 return StatusCode::FAILURE;
132 truthTausEvent.m_xTruthTauContainerConst = truthTausHandle.
cptr();
137 if (!truthParticlesHandle.
isValid()) {
139 return StatusCode::FAILURE;
141 truthTausEvent.m_xTruthParticleContainer = truthParticlesHandle.
cptr();
143 auto truthTausOutput = std::make_unique<xAOD::TruthParticleContainer>();
144 auto truthTausOutputAux = std::make_unique<xAOD::TruthParticleAuxContainer>();
145 truthTausOutput->setStore(truthTausOutputAux.get());
146 truthTausEvent.m_xTruthTauContainer = truthTausOutput.get();
149 ATH_CHECK(writeHandle.record(std::move(truthTausOutput), std::move(truthTausOutputAux)));
154 return StatusCode::SUCCESS;
174 for (
auto xTruthParticle : *truthTausEvent.m_xTruthParticleContainer)
176 if ( xTruthParticle->isTau() )
178 auto xTruthTau = std::make_unique<xAOD::TruthParticle>();
179 xTruthTau->makePrivateStore( *xTruthParticle );
187 truthTausEvent.m_xTruthTauContainer->push_back(std::move(xTruthTau));
191 typeDecorator(*truthTau) = typeReadDecor.
isAvailable() ? typeReadDecor(*xTruthParticle) : -1234;
192 originDecorator(*truthTau) = originReadDecor.
isAvailable() ? originReadDecor(*xTruthParticle) : -1234;
193 outcomeDecorator(*truthTau) = outcomeReadDecor.
isAvailable() ? outcomeReadDecor(*xTruthParticle) : -1234;
194 classificationDecorator(*truthTau) = classificationReadDecor.
isAvailable() ? classificationReadDecor(*xTruthParticle) : -1234;
197 ElementLink < xAOD::TruthParticleContainer > lTruthParticleLink(xTruthParticle, *truthTausEvent.m_xTruthParticleContainer);
198 linkDecorator(*truthTau) = lTruthParticleLink;
201 return StatusCode::SUCCESS;
209 return StatusCode::FAILURE;
216 if (xDecayVertex ==
nullptr)
217 return StatusCode::FAILURE;
218 for (
size_t iOutgoingParticle = 0; iOutgoingParticle < xDecayVertex->
nOutgoingParticles(); ++iOutgoingParticle )
221 if (xTruthDaughter ==
nullptr)
223 ATH_MSG_ERROR(
"Truth daughter of tau decay was not found in "<<
m_truthParticleContainer.key() <<
" container. Please ensure that this container has the full tau decay information or produce the TruthTaus container in AtlasDerivation.");
224 return StatusCode::FAILURE;
228 if ( xTruthDaughter->
isTau() )
231 return StatusCode::FAILURE;
272 TLorentzVector vTruthInvisTLV = xTruthParticle.
p4() - truthInfo.
m_vTruthVisTLV;
277 decPtInvis(xTruthParticle) = vTruthInvisTLV.Pt();
278 decEtaInvis(xTruthParticle) = vTruthInvisTLV.Eta();
279 decPhiInvis(xTruthParticle) = vTruthInvisTLV.Phi();
280 decMInvis(xTruthParticle) = vTruthInvisTLV.M();
301 for(
size_t iProducts=0; iProducts < truthInfo.
m_TLVCharged.size(); ++iProducts){
302 TLorentzVector iTLV_c = truthInfo.
m_TLVCharged.at(iProducts);
303 vec_ptcharged.push_back(iTLV_c.Pt());
304 vec_etacharged.push_back(iTLV_c.Eta());
305 vec_phicharged.push_back(iTLV_c.Phi());
306 vec_mcharged.push_back(iTLV_c.M());
308 decCharged_pt(xTruthParticle) = std::move(vec_ptcharged);
309 decCharged_eta(xTruthParticle) = std::move(vec_etacharged);
310 decCharged_phi(xTruthParticle) = std::move(vec_phicharged);
311 decCharged_m(xTruthParticle) = std::move(vec_mcharged);
332 for(
size_t iProducts=0; iProducts < truthInfo.
m_TLVNeutral.size(); ++iProducts){
333 TLorentzVector iTLV_n = truthInfo.
m_TLVNeutral.at(iProducts);
334 vec_ptneutral.push_back(iTLV_n.Pt());
335 vec_etaneutral.push_back(iTLV_n.Eta());
336 vec_phineutral.push_back(iTLV_n.Phi());
337 vec_mneutral.push_back(iTLV_n.M());
339 decNeutral_pt(xTruthParticle) = std::move(vec_ptneutral);
340 decNeutral_eta(xTruthParticle) = std::move(vec_etaneutral);
341 decNeutral_phi(xTruthParticle) = std::move(vec_phineutral);
342 decNeutral_m(xTruthParticle) = std::move(vec_mneutral);
348 decDecayModeVector(xTruthParticle) = truthInfo.
m_vDecayMode;
367 decProdVertexX(xTruthParticle) = truthInfo.
m_vProdVertex.X();
368 decProdVertexY(xTruthParticle) = truthInfo.
m_vProdVertex.Y();
369 decProdVertexZ(xTruthParticle) = truthInfo.
m_vProdVertex.Z();
372 return StatusCode::SUCCESS;
382 return StatusCode::SUCCESS;
384 truthInfo.
m_vDecayVertex.SetXYZ(xDecayVertex->
x(),xDecayVertex->
y(),xDecayVertex->
z());
388 truthInfo.
m_vProdVertex.SetXYZ(xProdVertex->
x(),xProdVertex->
y(),xProdVertex->
z());
393 for (
size_t iOutgoingParticle = 0; iOutgoingParticle < xDecayVertex->
nOutgoingParticles(); ++iOutgoingParticle )
396 if (xTruthDaughter ==
nullptr)
398 ATH_MSG_ERROR(
"Truth daughter of tau decay was not found in "<<
m_truthParticleContainer.key() <<
" container. Please ensure that this container has the full tau decay information or produce the TruthTaus container in AtlasDerivation.");
399 return StatusCode::FAILURE;
402 int iAbsPdgId = xTruthDaughter->
absPdgId();
403 int iPdgId = xTruthDaughter->
pdgId();
408 if ( iAbsPdgId != 111 && iAbsPdgId != 311 && iAbsPdgId != 310 && iAbsPdgId != 130 )
466 return StatusCode::SUCCESS;
474 if (xDecayVertex ==
nullptr)
477 for (
size_t iOutgoingParticle = 0; iOutgoingParticle < xDecayVertex->
nOutgoingParticles(); ++iOutgoingParticle )
480 if (xTruthDaughter ==
nullptr)
482 ATH_MSG_WARNING(
"Truth daughter of tau decay was not found in "<<
m_truthParticleContainer.key() <<
" container. Please ensure that this container has the full tau decay information or produce the TruthTaus container in AtlasDerivation.");
486 <<
" e "<<xTruthDaughter->
e()
487 <<
" eta "<<xTruthDaughter->
p4().Eta()
488 <<
" phi "<<xTruthDaughter->
p4().Phi()
489 <<
" pdgid "<<xTruthDaughter->
pdgId()
490 <<
" status "<<xTruthDaughter->
status()
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
Helper class to provide type-safe access to aux data.
Handle class for reading a decoration on an object.
bool isAvailable()
Test to see if this variable exists in the store, for the referenced object.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
Handle class for adding a decoration to an object.
bool isNeutrino() const
Whether the particle is a neutrino (or antineutrino).
int status() const
Status code.
bool isHadron() const
Whether the particle is a hadron.
int pdgId() const
PDG ID code.
const TruthVertex_v1 * decayVtx() const
The decay vertex of this particle.
bool isCharged() const
Whether the particle is electrically charged.
int absPdgId() const
Absolute PDG ID code (often useful).
bool hasProdVtx() const
Check for a production vertex on this particle.
bool hasDecayVtx() const
Check for a decay vertex on this particle.
virtual double e() const override final
The total energy of the particle.
bool isNeutral() const
Whether the particle is electrically neutral.
const TruthVertex_v1 * prodVtx() const
The production vertex of this particle.
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
bool isTau() const
Whether the particle is a tau (or antitau).
const TruthParticle_v1 * outgoingParticle(size_t index) const
Get one of the outgoing particles.
float z() const
Vertex longitudinal distance along the beam line form the origin.
float y() const
Vertex y displacement.
size_t nOutgoingParticles() const
Get the number of outgoing particles.
float x() const
Vertex x displacement.
std::string depth
tag string for intendation
bool isStable(const T &p)
Identify if the particle is stable, i.e. has not decayed.
bool isDecayed(const T &p)
Identify if the particle decayed.
bool isPhysical(const T &p)
Identify if the particle is physical, i.e. is stable or decayed.
SG::Decorator< T, ALLOC > Decorator
Helper class to provide type-safe access to aux data, specialized for JaggedVecElt.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
TruthVertex_v1 TruthVertex
Typedef to implementation.
TruthParticle_v1 TruthParticle
Typedef to implementation.