14 #include "AthLinks/ElementLink.h"
29 DiTauTruthMatchingTool::DiTauTruthMatchingTool(
const std::string&
name )
31 , m_accPtVis(
"pt_vis")
32 , m_accEtaVis(
"eta_vis")
33 , m_accPhiVis(
"phi_vis")
40 DiTauTruthMatchingTool::~DiTauTruthMatchingTool( )
51 DiTauTruthMatchingTool::BuildTruthTaus::setTruthMatchingMode();
56 return StatusCode::FAILURE;
58 return StatusCode::SUCCESS;
64 if (retrieveTruthTaus().isFailure())
67 if (findTruthTau(xDiTau).isFailure())
68 ATH_MSG_WARNING(
"There was a failure in finding the matched truth tau");
76 for (
auto xDiTau : vDiTaus)
90 if (!m_bIsTruthMatchedAvailable.isValid()) {
92 m_bIsTruthMatchedAvailable.set (accIsTruthMatched.
isAvailable(xDiTau));
94 if (*m_bIsTruthMatchedAvailable.ptr())
95 return StatusCode::SUCCESS;
97 if (m_bTruthTauAvailable)
98 return checkTruthMatch(xDiTau, *m_truthTausEvent.m_xTruthTauContainerConst);
100 return checkTruthMatch(xDiTau, *m_truthTausEvent.m_xTruthTauContainer);
106 std::vector<const xAOD::TruthParticle*> vTruthMatch;
107 std::vector<TruthMatchedParticleType> vTruthMatchedParticleType;
119 for (
int i = 0;
i < accNSubjets(xDiTau); ++
i)
124 vTruthMatch.push_back(xTruthMatch);
125 vTruthMatchedParticleType.push_back(eTruthMatchedParticleType);
129 for (
int i = 0;
i < accNSubjets(xDiTau); ++
i)
131 TLorentzVector vSubjetTLV;
132 vSubjetTLV.SetPtEtaPhiE(xDiTau.
subjetPt(
i),
136 if ( truthMatch(vSubjetTLV,
139 vTruthMatchedParticleType.at(
i)).isFailure() )
141 ATH_MSG_WARNING(
"There was a failure in matching truth taus with subjet " <<
i);
142 return StatusCode::FAILURE;
147 xRemainingTruthTaus.
end(),
148 vTruthMatch.at(
i)) );
152 bool bTruthMatched =
true;
155 std::vector< ElementLink < xAOD::TruthParticleContainer > > vTruthLinks;
156 for (
int i = 0;
i < accNSubjets(xDiTau); ++
i)
165 vTruthLinks.push_back(lTruthParticleLink);
167 else if (eTruthMatchedParticleType ==
TruthMuon)
170 vTruthLinks.push_back(lTruthParticleLink);
175 vTruthLinks.push_back(lTruthParticleLink);
181 vTruthLinks.push_back(lTruthParticleLink);
184 if (
i == 0 ||
i == 1) bTruthMatched =
false;
189 decTruthParticleLinks (
"truthParticleLinks");
190 decTruthParticleLinks(xDiTau) = vTruthLinks;
191 if (!m_bTruthTauAvailable)
194 decTruthTaus (
"TruthTaus");
195 decTruthTaus(xDiTau) = vTruthLinks;
210 ATH_MSG_ERROR(
"Links to reco electron and reco muon available for one ditau candidate.");
215 mcTruthType = accTruthType(*pElectron);
216 mcTruthOrigin = accTruthOrigin(*pElectron);
218 lTruthLeptonLink = checkTruthLepton(pElectron);
224 mcTruthType = accTruthType(*pMuon);
225 mcTruthOrigin = accTruthOrigin(*pMuon);
227 lTruthLeptonLink = checkTruthLepton(pMuon);
232 decClassifierParticleType(xDiTau) = mcTruthType;
233 decClassifierParticleOrigin(xDiTau) = mcTruthOrigin;
234 decTruthLeptonLink(xDiTau) = lTruthLeptonLink;
237 if ( accNSubjets(xDiTau) < 2) {
238 decIsTruthMatched(xDiTau) = (
char)
false;
239 decIsTruthHadronic(xDiTau) = (
char)
false;
240 return StatusCode::SUCCESS;
243 decIsTruthMatched(xDiTau) = (
char)bTruthMatched;
251 decIsTruthHadronic(xDiTau) = (
char)
false;
265 if (accIsTruthHadronic(xDiTau))
267 TLorentzVector tlvTruthTau1;
268 TLorentzVector tlvTruthTau2;
269 tlvTruthTau1.SetPtEtaPhiM(m_accPtVis(*(*vTruthLinks.at(0))),
270 m_accEtaVis(*(*vTruthLinks.at(0))),
271 m_accPhiVis(*(*vTruthLinks.at(0))),
272 m_accMVis(*(*vTruthLinks.at(0))));
273 tlvTruthTau2.SetPtEtaPhiM(m_accPtVis(*(*vTruthLinks.at(1))),
274 m_accEtaVis(*(*vTruthLinks.at(1))),
275 m_accPhiVis(*(*vTruthLinks.at(1))),
276 m_accMVis(*(*vTruthLinks.at(1))));
278 decTruthLeadPt(xDiTau) =
std::max(tlvTruthTau1.Pt(), tlvTruthTau2.Pt());
279 decTruthLeadEta(xDiTau) = (tlvTruthTau1.Pt() > tlvTruthTau2.Pt()) ? tlvTruthTau1.Eta() : tlvTruthTau2.Eta();
280 decTruthLeadPhi(xDiTau) = (tlvTruthTau1.Pt() > tlvTruthTau2.Pt()) ? tlvTruthTau1.Phi() : tlvTruthTau2.Phi();
281 decTruthLeadM(xDiTau) = (tlvTruthTau1.Pt() > tlvTruthTau2.Pt()) ? tlvTruthTau1.M() : tlvTruthTau2.M();
282 decTruthSubleadPt(xDiTau) =
std::min(tlvTruthTau1.Pt(), tlvTruthTau2.Pt());
283 decTruthSubleadEta(xDiTau) = (tlvTruthTau1.Pt() > tlvTruthTau2.Pt()) ? tlvTruthTau2.Eta() : tlvTruthTau1.Eta();
284 decTruthSubleadPhi(xDiTau) = (tlvTruthTau1.Pt() > tlvTruthTau2.Pt()) ? tlvTruthTau2.Phi() : tlvTruthTau1.Phi();
285 decTruthSubleadM(xDiTau) = (tlvTruthTau1.Pt() > tlvTruthTau2.Pt()) ? tlvTruthTau2.M() : tlvTruthTau1.M();
286 decTruthDeltaR(xDiTau) = tlvTruthTau1.DeltaR(tlvTruthTau2);
287 decTruthMass(xDiTau) = (tlvTruthTau1 + tlvTruthTau2).M();
291 decTruthLeadPt(xDiTau) = -1234.;
292 decTruthLeadEta(xDiTau) = -1234.;
293 decTruthLeadPhi(xDiTau) = -1234.;
294 decTruthLeadM(xDiTau) = -1234.;
295 decTruthSubleadPt(xDiTau) = -1234.;
296 decTruthSubleadEta(xDiTau) = -1234.;
297 decTruthSubleadPhi(xDiTau) = -1234.;
298 decTruthSubleadM(xDiTau) = -1234.;
299 decTruthDeltaR(xDiTau) = -1234.;
300 decTruthMass(xDiTau) = -1234.;
303 return StatusCode::SUCCESS;
311 return truthParticleLink;
313 truthParticleLink = accTruthParticleLink(*pLepton);
314 return truthParticleLink;
318 StatusCode DiTauTruthMatchingTool::truthMatch(
const TLorentzVector& vSubjetTLV,
323 for (
auto xTruthTauIt : xTruthTauContainer)
325 TLorentzVector vTruthVisTLV;
326 vTruthVisTLV.SetPtEtaPhiM(m_accPtVis(*xTruthTauIt),
327 m_accEtaVis(*xTruthTauIt),
328 m_accPhiVis(*xTruthTauIt),
329 m_accMVis(*xTruthTauIt));
330 if (vSubjetTLV.DeltaR(vTruthVisTLV) <= m_dMaxDeltaR)
333 if ((
bool)accIsHadronicTau(*xTruthTauIt))
338 xTruthMatch = xTruthTauIt;
343 if (!xTruthMatch and m_truthTausEvent.m_xTruthMuonContainerConst)
346 for (
auto xTruthMuonIt : *m_truthTausEvent.m_xTruthMuonContainerConst)
348 if (vSubjetTLV.DeltaR(xTruthMuonIt->p4()) <= m_dMaxDeltaR)
350 if (xTruthMuonIt->pt()<dPtMax)
354 xTruthMatch = xTruthMuonIt;
355 dPtMax = xTruthMuonIt->
pt();
360 if (!xTruthMatch and m_truthTausEvent.m_xTruthElectronContainerConst)
363 for (
auto xTruthElectronIt : *m_truthTausEvent.m_xTruthElectronContainerConst)
365 if (vSubjetTLV.DeltaR(xTruthElectronIt->p4()) <= m_dMaxDeltaR)
367 if (xTruthElectronIt->pt()<dPtMax)
370 xTruthMatch = xTruthElectronIt;
371 dPtMax = xTruthElectronIt->
pt();
376 return StatusCode::SUCCESS;