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")
39 DiTauTruthMatchingTool::~DiTauTruthMatchingTool( )
50 DiTauTruthMatchingTool::BuildTruthTaus::setTruthMatchingMode();
55 return StatusCode::FAILURE;
57 return StatusCode::SUCCESS;
63 if (retrieveTruthTaus().isFailure())
66 if (findTruthTau(xDiTau).isFailure())
67 ATH_MSG_WARNING(
"There was a failure in finding the matched truth tau");
75 for (
auto xDiTau : vDiTaus)
89 if (!m_bIsTruthMatchedAvailable.isValid()) {
91 m_bIsTruthMatchedAvailable.set (accIsTruthMatched.
isAvailable(xDiTau));
93 if (*m_bIsTruthMatchedAvailable.ptr())
94 return StatusCode::SUCCESS;
96 if (m_bTruthTauAvailable)
97 return checkTruthMatch(xDiTau, *m_truthTausEvent.m_xTruthTauContainerConst);
99 return checkTruthMatch(xDiTau, *m_truthTausEvent.m_xTruthTauContainer);
105 std::vector<const xAOD::TruthParticle*> vTruthMatch;
106 std::vector<TruthMatchedParticleType> vTruthMatchedParticleType;
118 for (
int i = 0;
i < accNSubjets(xDiTau); ++
i)
123 vTruthMatch.push_back(xTruthMatch);
124 vTruthMatchedParticleType.push_back(eTruthMatchedParticleType);
128 for (
int i = 0;
i < accNSubjets(xDiTau); ++
i)
130 TLorentzVector vSubjetTLV;
131 vSubjetTLV.SetPtEtaPhiE(xDiTau.
subjetPt(
i),
135 if ( truthMatch(vSubjetTLV,
138 vTruthMatchedParticleType.at(
i)).isFailure() )
140 ATH_MSG_WARNING(
"There was a failure in matching truth taus with subjet " <<
i);
141 return StatusCode::FAILURE;
146 xRemainingTruthTaus.
end(),
147 vTruthMatch.at(
i)) );
151 bool bTruthMatched =
true;
154 std::vector< ElementLink < xAOD::TruthParticleContainer > > vTruthLinks;
155 for (
int i = 0;
i < accNSubjets(xDiTau); ++
i)
164 vTruthLinks.push_back(lTruthParticleLink);
166 else if (eTruthMatchedParticleType ==
TruthMuon)
169 vTruthLinks.push_back(lTruthParticleLink);
174 vTruthLinks.push_back(lTruthParticleLink);
180 vTruthLinks.push_back(lTruthParticleLink);
183 if (
i == 0 ||
i == 1) bTruthMatched =
false;
188 decTruthParticleLinks (
"truthParticleLinks");
189 decTruthParticleLinks(xDiTau) = vTruthLinks;
190 if (!m_bTruthTauAvailable)
193 decTruthTaus (
"TruthTaus");
194 decTruthTaus(xDiTau) = vTruthLinks;
209 ATH_MSG_ERROR(
"Links to reco electron and reco muon available for one ditau candidate.");
214 mcTruthType = accTruthType(*pElectron);
215 mcTruthOrigin = accTruthOrigin(*pElectron);
217 lTruthLeptonLink = checkTruthLepton(pElectron);
223 mcTruthType = accTruthType(*pMuon);
224 mcTruthOrigin = accTruthOrigin(*pMuon);
226 lTruthLeptonLink = checkTruthLepton(pMuon);
231 decClassifierParticleType(xDiTau) = mcTruthType;
232 decClassifierParticleOrigin(xDiTau) = mcTruthOrigin;
233 decTruthLeptonLink(xDiTau) = lTruthLeptonLink;
249 if ( accNSubjets(xDiTau) < 2) {
250 decIsTruthMatched(xDiTau) = (
char)
false;
251 decIsTruthHadronic(xDiTau) = (
char)
false;
252 decTruthLeadPt(xDiTau) = -1234.;
253 decTruthLeadEta(xDiTau) = -1234.;
254 decTruthLeadPhi(xDiTau) = -1234.;
255 decTruthLeadM(xDiTau) = -1234.;
256 decTruthLeadPdgID(xDiTau) = -1234.;
257 decTruthSubleadPt(xDiTau) = -1234.;
258 decTruthSubleadEta(xDiTau) = -1234.;
259 decTruthSubleadPhi(xDiTau) = -1234.;
260 decTruthSubleadM(xDiTau) = -1234.;
261 decTruthSubleadPdgID(xDiTau) = -1234.;
262 decTruthDeltaR(xDiTau) = -1234.;
263 decTruthMass(xDiTau) = -1234.;
264 return StatusCode::SUCCESS;
267 decIsTruthMatched(xDiTau) = (
char)bTruthMatched;
275 decIsTruthHadronic(xDiTau) = (
char)
false;
277 if (accIsTruthHadronic(xDiTau))
279 TLorentzVector tlvTruthTau1;
280 TLorentzVector tlvTruthTau2;
281 tlvTruthTau1.SetPtEtaPhiM(m_accPtVis(*(*vTruthLinks.at(0))),
282 m_accEtaVis(*(*vTruthLinks.at(0))),
283 m_accPhiVis(*(*vTruthLinks.at(0))),
284 m_accMVis(*(*vTruthLinks.at(0))));
285 tlvTruthTau2.SetPtEtaPhiM(m_accPtVis(*(*vTruthLinks.at(1))),
286 m_accEtaVis(*(*vTruthLinks.at(1))),
287 m_accPhiVis(*(*vTruthLinks.at(1))),
288 m_accMVis(*(*vTruthLinks.at(1))));
290 decTruthLeadPt(xDiTau) =
std::max(tlvTruthTau1.Pt(), tlvTruthTau2.Pt());
291 decTruthLeadEta(xDiTau) = (tlvTruthTau1.Pt() > tlvTruthTau2.Pt()) ? tlvTruthTau1.Eta() : tlvTruthTau2.Eta();
292 decTruthLeadPhi(xDiTau) = (tlvTruthTau1.Pt() > tlvTruthTau2.Pt()) ? tlvTruthTau1.Phi() : tlvTruthTau2.Phi();
293 decTruthLeadM(xDiTau) = (tlvTruthTau1.Pt() > tlvTruthTau2.Pt()) ? tlvTruthTau1.M() : tlvTruthTau2.M();
294 decTruthLeadPdgID(xDiTau) = (*vTruthLinks.at(0))->pdgId();
295 decTruthSubleadPt(xDiTau) =
std::min(tlvTruthTau1.Pt(), tlvTruthTau2.Pt());
296 decTruthSubleadEta(xDiTau) = (tlvTruthTau1.Pt() > tlvTruthTau2.Pt()) ? tlvTruthTau2.Eta() : tlvTruthTau1.Eta();
297 decTruthSubleadPhi(xDiTau) = (tlvTruthTau1.Pt() > tlvTruthTau2.Pt()) ? tlvTruthTau2.Phi() : tlvTruthTau1.Phi();
298 decTruthSubleadM(xDiTau) = (tlvTruthTau1.Pt() > tlvTruthTau2.Pt()) ? tlvTruthTau2.M() : tlvTruthTau1.M();
299 decTruthSubleadPdgID(xDiTau) = (*vTruthLinks.at(1))->pdgId();
300 decTruthDeltaR(xDiTau) = tlvTruthTau1.DeltaR(tlvTruthTau2);
301 decTruthMass(xDiTau) = (tlvTruthTau1 + tlvTruthTau2).M();
305 decTruthLeadPt(xDiTau) = -1234.;
306 decTruthLeadEta(xDiTau) = -1234.;
307 decTruthLeadPhi(xDiTau) = -1234.;
308 decTruthLeadM(xDiTau) = -1234.;
309 decTruthLeadPdgID(xDiTau) = -1234.;
310 decTruthSubleadPt(xDiTau) = -1234.;
311 decTruthSubleadEta(xDiTau) = -1234.;
312 decTruthSubleadPhi(xDiTau) = -1234.;
313 decTruthSubleadM(xDiTau) = -1234.;
314 decTruthSubleadPdgID(xDiTau) = -1234.;
315 decTruthDeltaR(xDiTau) = -1234.;
316 decTruthMass(xDiTau) = -1234.;
319 return StatusCode::SUCCESS;
327 return truthParticleLink;
329 truthParticleLink = accTruthParticleLink(*pLepton);
330 return truthParticleLink;
334 StatusCode DiTauTruthMatchingTool::truthMatch(
const TLorentzVector& vSubjetTLV,
339 for (
auto xTruthTauIt : xTruthTauContainer)
341 TLorentzVector vTruthVisTLV;
342 vTruthVisTLV.SetPtEtaPhiM(m_accPtVis(*xTruthTauIt),
343 m_accEtaVis(*xTruthTauIt),
344 m_accPhiVis(*xTruthTauIt),
345 m_accMVis(*xTruthTauIt));
346 if (vSubjetTLV.DeltaR(vTruthVisTLV) <= m_dMaxDeltaR)
349 if ((
bool)accIsHadronicTau(*xTruthTauIt))
354 xTruthMatch = xTruthTauIt;
359 if (!xTruthMatch and m_truthTausEvent.m_xTruthMuonContainerConst)
362 for (
auto xTruthMuonIt : *m_truthTausEvent.m_xTruthMuonContainerConst)
364 if (vSubjetTLV.DeltaR(xTruthMuonIt->p4()) <= m_dMaxDeltaR)
366 if (xTruthMuonIt->pt()<dPtMax)
370 xTruthMatch = xTruthMuonIt;
371 dPtMax = xTruthMuonIt->
pt();
376 if (!xTruthMatch and m_truthTausEvent.m_xTruthElectronContainerConst)
379 for (
auto xTruthElectronIt : *m_truthTausEvent.m_xTruthElectronContainerConst)
381 if (vSubjetTLV.DeltaR(xTruthElectronIt->p4()) <= m_dMaxDeltaR)
383 if (xTruthElectronIt->pt()<dPtMax)
386 xTruthMatch = xTruthElectronIt;
387 dPtMax = xTruthElectronIt->
pt();
392 return StatusCode::SUCCESS;