14#include "CLHEP/Units/SystemOfUnits.h"
31 std::stringstream sSS(sInput);
33 while (std::getline(sSS, sItem, cDelim))
34 vOut.push_back(sItem);
40 std::stringstream sSS(rEnv.GetValue(sKey.c_str(),
""));
42 while (std::getline(sSS, sItem, cDelim))
43 vOut.push_back(sItem);
49 std::stringstream sSS(rEnv.GetValue(sKey.c_str(),
""));
51 while (std::getline(sSS, sItem, cDelim))
52 vOut.push_back(
size_t(stoi(sItem)));
58 std::stringstream sSS(rEnv.GetValue(sKey.c_str(),
""));
60 while (std::getline(sSS, sItem, cDelim))
61 vOut.push_back(stoi(sItem));
67 std::stringstream sSS(rEnv.GetValue(sKey.c_str(),
""));
69 while (std::getline(sSS, sItem, cDelim))
70 vOut.push_back(stoi(sItem));
76 std::stringstream sSS(rEnv.GetValue(sKey.c_str(),
""));
78 while (std::getline(sSS, sItem, cDelim))
79 vOut.push_back(stof(sItem));
85 std::stringstream sSS(rEnv.GetValue(sKey.c_str(),
""));
87 while (std::getline(sSS, sItem, cDelim))
88 vOut.push_back(stod(sItem));
95 return xTau.ptFinalCalib()/
GeV;
102 return xTau.etaFinalCalib();
109 return std::abs(xTau.etaFinalCalib());
121 if (xTruthTau!=
nullptr && accIsHadronicTau (*xTruthTau))
122 return (accPtVis(*xTruthTau)/
GeV);
134 if (xTruthTau!=
nullptr && accIsHadronicTau (*xTruthTau))
135 return std::abs(xTruthTau->
eta());
144 int iDecayMode = getTruthDecayMode(xTau);
145 return static_cast<double>(iDecayMode);
154 if (xTruthTau!=
nullptr && accIsHadronicTau(*xTruthTau))
155 return getTruthDecayMode(*xTruthTau);
164 if (!(accNumCharged.isAvailable(xTruthTau)))
170 int iCharged = getNTauDecayParticles(xTruthTau,
MC::PIPLUS,
true) + getNTauDecayParticles(xTruthTau,
MC::KPLUS,
true);
171 int iNeutral = getNTauDecayParticles(xTruthTau,
MC::PI0,
true);
178 else if (iCharged == 3)
184 if (iCharged == 2 or iCharged == 4 or iCharged == 5)
186 if (iCharged == 0 or iCharged >=6)
198 if (!accDecayModeVector.isAvailable(xTruthTau))
200 Warning(
"TauAnalysisTools::getNTauDecayParticles",
"passed truth particle is not a truth tau, return 0");
204 for(
auto iPdgId2 : accDecayModeVector(xTruthTau))
205 if (!bCompareAbsoluteValues)
207 if (iPdgId2 == iPdgId) iNum++;
211 if (std::abs(iPdgId2) == std::abs(iPdgId)) iNum++;
222 std::ifstream fInputFile;
223 fInputFile.open(sFileName);
224 if(!fInputFile.is_open())
227 fInputFile.seekg(-1,fInputFile.end);
229 bool bKeepLooping =
true;
235 if(static_cast<int>(fInputFile.tellg()) <= 1)
238 bKeepLooping = false;
241 bKeepLooping =
false;
243 fInputFile.seekg(-2,fInputFile.cur);
246 std::string sLastLine;
247 getline(fInputFile,sLastLine);
250 return (sLastLine.size() == 0 or sLastLine[0] ==
'#');
263 size_t iNumPi0PFO = xTau->nPi0PFOs();
269 Error(
"TauAnalysisTools::createPi0Vectors",
"Failed to retrieve panTauDetail decay mode.");
279 const xAOD::PFO* xPfo1 = xTau->pi0PFO(0);
280 const xAOD::PFO* xPfo2 = xTau->pi0PFO(1);
281 vPi0s.push_back(xPfo1->
p4() + xPfo2->
p4());
284 double dNewMomentum = std::sqrt(vPi0s[0].
E() * vPi0s[0].
E() - fMassPi0Squared);
285 vPi0s[0].SetPxPyPzE(vPi0s[0].Vect().Unit().Px() * dNewMomentum,
286 vPi0s[0].Vect().Unit().Py() * dNewMomentum,
287 vPi0s[0].Vect().Unit().Pz() * dNewMomentum,
295 vPi0s.push_back(xPfo->
p4());
298 double dNewMomentum = std::sqrt(vPi0s[0].
E() / 2 * vPi0s[0].
E() / 2 - vPi0s[0].M() / 2. * vPi0s[0].M() / 2.);
299 vPi0s[0].SetVectM(vPi0s[0].Vect() * (dNewMomentum / vPi0s[0].
P()), vPi0s[0].M() / 2.);
302 vPi0s.push_back(vPi0s[0]);
307 for (
size_t iPFO = 0; iPFO < iNumPi0PFO; iPFO++)
309 vPi0s.push_back(xTau->pi0PFO(iPFO)->p4());
318 correctedPi0s.clear();
324 Error(
"TauAnalysisTools::correctedPi0Vectors",
"Failed to retrieve panTauDetail decay mode.");
329 std::vector<TLorentzVector> vPi0s;
330 createPi0Vectors(xTau,vPi0s);
334 TLorentzVector Sum_vPi0s;
335 for(
unsigned int i = 0;
i < vPi0s.size() ;
i++){
336 Sum_vPi0s += vPi0s[
i];
340 TLorentzVector Sum_ChrgPFOP4;
342 Sum_ChrgPFOP4 +=
track->track()->p4();
346 TLorentzVector FinalCalibP4 = xTau->p4();
349 double px = FinalCalibP4.Px() - Sum_ChrgPFOP4.Px();
350 double py = FinalCalibP4.Py() - Sum_ChrgPFOP4.Py();
351 double pz = FinalCalibP4.Pz() - Sum_ChrgPFOP4.Pz();
353 double p_correctedPi0s = std::sqrt( std::pow(px,2.) + std::pow(py,2.) + std::pow(pz,2.) );
354 double p_vPi0s = Sum_vPi0s.P();
357 double X = p_correctedPi0s/p_vPi0s;
360 double px_scaled, py_scaled, pz_scaled,
e;
362 for(
unsigned int i = 0;
i < vPi0s.size() ;
i++){
363 px_scaled = vPi0s[
i].Px() *
X;
364 py_scaled = vPi0s[
i].Py() *
X;
365 pz_scaled = vPi0s[
i].Pz() *
X;
366 e = std::sqrt( std::pow(px_scaled,2.) + std::pow(py_scaled,2.) + std::pow(pz_scaled,2.) + std::pow(mPi0,2.) );
369 TLorentzVector P4_correctedPi0s;
370 P4_correctedPi0s.SetPxPyPzE(px_scaled,py_scaled,pz_scaled,e);
371 correctedPi0s.push_back(P4_correctedPi0s);
374 correctedPi0s = std::move(vPi0s);
381 TF1 DeltaRdist(
"DeltaRdist",
"pol3", 0, 67500);
382 DeltaRdist.SetParameter(0, 0.07924);
383 DeltaRdist.SetParameter(1, -2.078/1000000.);
384 DeltaRdist.SetParameter(2, 2.619/100000000000.);
385 DeltaRdist.SetParameter(3, -1.238/10000000000000000.);
388 TLorentzVector SumPi0_P4;
389 for( unsigned int i = 0 ; i < correctedPi0s.size() ; i++){
390 SumPi0_P4 += correctedPi0s[i];
393 float SumPi0_pt = SumPi0_P4.Pt();
397 if(SumPi0_pt >= 67500){
400 deltaR = DeltaRdist.Eval(SumPi0_pt);
403 TLorentzVector correctedPi0_0, correctedPi0_1;
404 correctedPi0_0.SetPtEtaPhiM( correctedPi0s[0].Pt()/
cos(0.5*
deltaR/std::sqrt(2.0)), correctedPi0s[0].
Eta()+0.5*
deltaR/std::sqrt(2.0), correctedPi0s[0].
Phi()+0.5*
deltaR/std::sqrt(2.0), correctedPi0s[0].M() );
405 correctedPi0_1.SetPtEtaPhiM( correctedPi0s[1].Pt()/
cos(0.5*
deltaR/std::sqrt(2.0)), correctedPi0s[1].
Eta()-0.5*
deltaR/std::sqrt(2.0), correctedPi0s[1].
Phi()-0.5*
deltaR/std::sqrt(2.0), correctedPi0s[1].M() );
407 std::vector<TLorentzVector> AngleCorrectedPi0s;
408 AngleCorrectedPi0s.push_back(correctedPi0_0);
409 AngleCorrectedPi0s.push_back(correctedPi0_1);
412 TLorentzVector PionCluster_angleCorrected = AngleCorrectedPi0s[0]+AngleCorrectedPi0s[1];
414 double dNewMomentum = std::sqrt(PionCluster_angleCorrected.E()/2. * PionCluster_angleCorrected.E()/2. - PionCluster_angleCorrected.M() / 2. * PionCluster_angleCorrected.M() / 2.);
415 correctedPi0s[0].SetVectM(PionCluster_angleCorrected.Vect() * (dNewMomentum / PionCluster_angleCorrected.P()), PionCluster_angleCorrected.M() / 2.);
416 correctedPi0s[1] = correctedPi0s[0];
421 TauP4 +=
track->track()->p4();
424 for(
unsigned int iPi0=0; iPi0 < correctedPi0s.size(); iPi0++) {
425 TauP4 += correctedPi0s[iPi0];
435 if (!accTruthParticleLink.isAvailable(xTau))
436 Error(
"TauAnalysisTools::getTruthParticleType",
"No truth match information available. Please run TauTruthMatchingTool first.");
441 if (xTruthParticle->
isTau())
444 if (
static_cast<bool>(accIsHadronicTau(*xTruthParticle)))
449 if (xTruthParticle->
isMuon())
459 if (lTruthParticleLink.
isValid())
468 if (!accIsTruthHadronic.isAvailable(xDiTau))
469 Error(
"TauAnalysisTools::getTruthParticleType",
"No truth match information available. Please run DiTauTruthMatchingTool first");
473 if (accIsTruthHadronic(xDiTau))
476 return eTruthMatchedParticleType;
485int classifyAncestor(
const xAOD::TruthParticle* particle, std::set<const xAOD::TruthParticle *>& visited)
487 if (!particle || visited.count(particle))
489 visited.insert(particle);
506 int bestClass = thisClass;
512 int ancClass = classifyAncestor(grandparent, visited);
514 if (ancClass > 0 && (bestClass == 0 || ancClass <= bestClass))
515 bestClass = ancClass;
526 if (!accTruthParticleLink.isAvailable(xTau))
527 Error(
"TauAnalysisTools::tauOrigin",
"No truth match information available. Please run TauTruthMatchingTool first.");
538 std::set<const xAOD::TruthParticle *> seen;
539 while (seen.insert(xTruthCandidate).second)
554 std::set<const xAOD::TruthParticle *> visited;
555 return classifyAncestor(xTruthCandidate, visited);
564 std::vector<const xAOD::TauJet*> taus_murm_vec(taus_muonRM->begin(), taus_muonRM->end());
565 std::vector<const xAOD::TauJet*> taus_combined;
567 originalTauJetAcc (
"originalTauJet");
569 auto replacement_itr = std::find_if(taus_murm_vec.begin(), taus_murm_vec.end(),
571 auto link_to_ori_tau = originalTauJetAcc (*tau_murm);
572 if (!link_to_ori_tau.isValid()) { return false; }
573 if (*link_to_ori_tau == tau_std){
return true; }
577 if (replacement_itr == taus_murm_vec.end()) { taus_combined.push_back(tau_std); }
581 taus_combined.push_back(*replacement_itr);
582 taus_murm_vec.erase(replacement_itr);
588 assert(taus_murm_vec.empty());
589 return taus_combined;
Scalar deltaR(const MatrixBase< Derived > &vec) const
ATLAS-specific HepMC functions.
ElementLink< xAOD::TruthParticleContainer > Link_t
A number of constexpr particle constants to avoid hardcoding them directly in various places.
bool isValid() const
Check if the element can be found.
Helper class to provide constant type-safe access to aux data.
(HepMC) Monte Carlo particle.
virtual FourMom_t p4() const
The full 4-momentum of the particle.
int pdgId() const
PDG ID code.
const TruthParticle_v1 * parent(size_t i) const
Retrieve the i-th mother (TruthParticle) of this TruthParticle.
bool isElectron() const
Whether the particle is an electron (or positron).
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
bool isTau() const
Whether the particle is a tau (or antitau).
bool isMuon() const
Whether the particle is a muon (or antimuon).
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Error
The different types of error that can be flagged in the L1TopoRDO.
constexpr double piZeroMassInMeV
the mass of the pi zero (in MeV)
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
const xAOD::TruthParticle * getTruthParticle(const xAOD::IParticle *, bool debug=false)
return the truthParticle associated to the given IParticle (if any)
ICaloAffectedTool is abstract interface for tools checking if 4 mom is in calo affected region.
PFO_v1 PFO
Definition of the current "pfo version".
TauTrack_v1 TauTrack
Definition of the current version.
TauJet_v3 TauJet
Definition of the current "tau version".
TruthParticle_v1 TruthParticle
Typedef to implementation.
setBGCode setTAP setLVL2ErrorBits bool
DiTauJet_v1 DiTauJet
Definition of the current version.
TauJetContainer_v3 TauJetContainer
Definition of the current "taujet container version".