11 #include "AthLinks/ElementLink.h"
27 BuildTruthTaus::BuildTruthTaus(
const std::string&
name )
28 : AsgMetadataTool(
name)
29 , m_tMCTruthClassifier(
"MCTruthClassifier", this)
53 ATH_MSG_WARNING(
"Truth electron container is not available, won't perform matching to truth electrons");
56 ATH_MSG_WARNING(
"Truth muon container is not available, won't perform matching to truth muons");
59 ATH_MSG_WARNING(
"Truth jet container is not available, won't perform matching to truth jets");
78 return StatusCode::SUCCESS;
96 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();
151 ATH_CHECK(writeHandle.record(std::move(truthTausOutput), std::move(truthTausOutputAux)));
154 return StatusCode::SUCCESS;
165 bool copyDressedPhotons =
false;
167 for (
auto xTruthParticle : *truthTausEvent.m_xTruthParticleContainer)
169 if ( xTruthParticle->isTau() )
171 auto xTruthTau = std::make_unique<xAOD::TruthParticle>();
172 xTruthTau->makePrivateStore( *xTruthParticle );
186 if (truthTausEvent.m_xTruthTauContainer->empty() &&
187 dressedPhotonAcc.
isAvailable ( *xTruthParticle ) &&
190 copyDressedPhotons =
true;
192 if (copyDressedPhotons)
194 dressedPhotonAcc( *xTruthTau ) = dressedPhotonAcc( *xTruthParticle );
201 decClassifierParticleType(*xTruthTau) = pClassification.first;
202 decClassifierParticleOrigin(*xTruthTau) = pClassification.second;
207 accOriginalTruthParticle(*xTruthTau) = lTruthParticleLink;
209 truthTausEvent.m_xTruthTauContainer->push_back(std::move(xTruthTau));
212 return StatusCode::SUCCESS;
220 return StatusCode::FAILURE;
227 if (xDecayVertex ==
nullptr)
228 return StatusCode::FAILURE;
229 for (
size_t iOutgoingParticle = 0; iOutgoingParticle < xDecayVertex->
nOutgoingParticles(); ++iOutgoingParticle )
232 if (xTruthDaughter ==
nullptr)
234 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.");
235 return StatusCode::FAILURE;
239 if ( xTruthDaughter->
isTau() )
242 return StatusCode::FAILURE;
283 TLorentzVector vTruthInvisTLV = xTruthParticle.
p4() - truthInfo.
m_vTruthVisTLV;
288 decPtInvis(xTruthParticle) = vTruthInvisTLV.Pt();
289 decEtaInvis(xTruthParticle) = vTruthInvisTLV.Eta();
290 decPhiInvis(xTruthParticle) = vTruthInvisTLV.Phi();
291 decMInvis(xTruthParticle) = vTruthInvisTLV.M();
321 decDecayModeVector(xTruthParticle) = truthInfo.
m_vDecayMode;
340 decProdVertexX(xTruthParticle) = truthInfo.
m_vProdVertex.X();
341 decProdVertexY(xTruthParticle) = truthInfo.
m_vProdVertex.Y();
342 decProdVertexZ(xTruthParticle) = truthInfo.
m_vProdVertex.Z();
345 return StatusCode::SUCCESS;
355 return StatusCode::SUCCESS;
357 truthInfo.
m_vDecayVertex.SetXYZ(xDecayVertex->
x(),xDecayVertex->
y(),xDecayVertex->
z());
361 truthInfo.
m_vProdVertex.SetXYZ(xProdVertex->
x(),xProdVertex->
y(),xProdVertex->
z());
366 for (
size_t iOutgoingParticle = 0; iOutgoingParticle < xDecayVertex->
nOutgoingParticles(); ++iOutgoingParticle )
369 if (xTruthDaughter ==
nullptr)
371 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.");
372 return StatusCode::FAILURE;
375 int iAbsPdgId = xTruthDaughter->
absPdgId();
376 int iPdgId = xTruthDaughter->
pdgId();
381 if ( iAbsPdgId != 111 && iAbsPdgId != 311 && iAbsPdgId != 310 && iAbsPdgId != 130 )
433 return StatusCode::SUCCESS;
441 if (xDecayVertex ==
nullptr)
444 for (
size_t iOutgoingParticle = 0; iOutgoingParticle < xDecayVertex->
nOutgoingParticles(); ++iOutgoingParticle )
447 if (xTruthDaughter ==
nullptr)
449 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.");
453 <<
" e "<<xTruthDaughter->
e()
454 <<
" eta "<<xTruthDaughter->
p4().Eta()
455 <<
" phi "<<xTruthDaughter->
p4().Phi()
456 <<
" pdgid "<<xTruthDaughter->
pdgId()
457 <<
" status "<<xTruthDaughter->
status()