15 #include "CLHEP/Units/SystemOfUnits.h"
26 std::stringstream sSS(sInput);
28 while (std::getline(sSS, sItem, cDelim))
29 vOut.push_back(sItem);
35 std::stringstream sSS(rEnv.GetValue(sKey.c_str(),
""));
37 while (std::getline(sSS, sItem, cDelim))
38 vOut.push_back(sItem);
44 std::stringstream sSS(rEnv.GetValue(sKey.c_str(),
""));
46 while (std::getline(sSS, sItem, cDelim))
47 vOut.push_back(
size_t(stoi(sItem)));
53 std::stringstream sSS(rEnv.GetValue(sKey.c_str(),
""));
55 while (std::getline(sSS, sItem, cDelim))
56 vOut.push_back(stoi(sItem));
62 std::stringstream sSS(rEnv.GetValue(sKey.c_str(),
""));
64 while (std::getline(sSS, sItem, cDelim))
65 vOut.push_back(stoi(sItem));
71 std::stringstream sSS(rEnv.GetValue(sKey.c_str(),
""));
73 while (std::getline(sSS, sItem, cDelim))
74 vOut.push_back(stof(sItem));
80 std::stringstream sSS(rEnv.GetValue(sKey.c_str(),
""));
82 while (std::getline(sSS, sItem, cDelim))
83 vOut.push_back(stod(sItem));
89 return xTau.
pt()/1000.;
96 return xTau.
p4().P()/1000.;
110 return std::abs(xTau.
eta());
145 double dTrackEta = 0.;
146 double dTrackMaxPt = 0.;
147 for(
unsigned int iNumTrack = 0; iNumTrack < xTau.
nTracks(); iNumTrack++)
149 if (xTau.
track(iNumTrack)->
pt() > dTrackMaxPt)
151 dTrackMaxPt = xTau.
track(iNumTrack)->
pt();
152 dTrackEta = xTau.
track(iNumTrack)->
eta();
166 if (xTruthTau!=
nullptr && accIsHadronicTau (*xTruthTau))
167 return xTruthTau->
pt()/
GeV;
180 if (xTruthTau!=
nullptr && accIsHadronicTau (*xTruthTau))
181 return std::abs(xTruthTau->
eta());
191 return static_cast<double>(iDecayMode);
199 if (!accTruthParticleLink(xTau))
201 Error(
"TauAnalysisTools::getTruth",
"No truth match information available. Please run TauTruthMatchingTool first");
204 const Link_t xTruthTauLink = accTruthParticleLink(xTau);
217 if (xTruthTau!=
nullptr && accIsHadronicTau(*xTruthTau))
241 else if (iCharged == 3)
247 if (iCharged == 2 or iCharged == 4 or iCharged == 5)
249 if (iCharged == 0 or iCharged >=6)
263 Warning(
"TauAnalysisTools::getNTauDecayParticles",
"passed truth particle is not a truth tau, return 0");
267 for(
auto iPdgId2 : accDecayModeVector(xTruthTau))
268 if (!bCompareAbsoluteValues)
270 if (iPdgId2 == iPdgId) iNum++;
274 if (std::abs(iPdgId2) == std::abs(iPdgId)) iNum++;
285 std::ifstream fInputFile;
286 fInputFile.open(sFileName);
287 if(!fInputFile.is_open())
290 fInputFile.seekg(-1,fInputFile.end);
292 bool bKeepLooping =
true;
298 if(
static_cast<int>(fInputFile.tellg()) <= 1)
301 bKeepLooping =
false;
304 bKeepLooping =
false;
306 fInputFile.seekg(-2,fInputFile.cur);
309 std::string sLastLine;
310 getline(fInputFile,sLastLine);
313 return (sLastLine.size() == 0 or sLastLine[0] ==
'#');
326 size_t iNumPi0PFO = xTau->
nPi0PFOs();
332 Error(
"TauAnalysisTools::createPi0Vectors",
"Failed to retrieve panTauDetail decay mode.");
344 vPi0s.push_back(xPfo1->
p4() + xPfo2->
p4());
347 double dNewMomentum = std::sqrt(vPi0s[0].
E() * vPi0s[0].
E() - fMassPi0Squared);
348 vPi0s[0].SetPxPyPzE(vPi0s[0].Vect().Unit().Px() * dNewMomentum,
349 vPi0s[0].Vect().Unit().Py() * dNewMomentum,
350 vPi0s[0].Vect().Unit().Pz() * dNewMomentum,
358 vPi0s.push_back(xPfo->
p4());
361 double dNewMomentum = std::sqrt(vPi0s[0].
E() / 2 * vPi0s[0].
E() / 2 - vPi0s[0].M() / 2. * vPi0s[0].M() / 2.);
362 vPi0s[0].SetVectM(vPi0s[0].Vect() * (dNewMomentum / vPi0s[0].
P()), vPi0s[0].M() / 2.);
365 vPi0s.push_back(vPi0s[0]);
370 for (
size_t iPFO = 0; iPFO < iNumPi0PFO; iPFO++)
372 vPi0s.push_back(xTau->
pi0PFO(iPFO)->
p4());
381 correctedPi0s.clear();
387 Error(
"TauAnalysisTools::correctedPi0Vectors",
"Failed to retrieve panTauDetail decay mode.");
392 std::vector<TLorentzVector> vPi0s;
397 TLorentzVector Sum_vPi0s;
398 for(
unsigned int i = 0;
i < vPi0s.size() ;
i++){
399 Sum_vPi0s += vPi0s[
i];
403 TLorentzVector Sum_ChrgPFOP4;
405 Sum_ChrgPFOP4 += track->p4();
409 TLorentzVector FinalCalibP4 = xTau->
p4();
412 double px = FinalCalibP4.Px() - Sum_ChrgPFOP4.Px();
413 double py = FinalCalibP4.Py() - Sum_ChrgPFOP4.Py();
414 double pz = FinalCalibP4.Pz() - Sum_ChrgPFOP4.Pz();
417 double p_vPi0s = Sum_vPi0s.P();
420 double X = p_correctedPi0s/p_vPi0s;
423 double px_scaled, py_scaled, pz_scaled,
e;
425 for(
unsigned int i = 0;
i < vPi0s.size() ;
i++){
426 px_scaled = vPi0s[
i].Px() *
X;
427 py_scaled = vPi0s[
i].Py() *
X;
428 pz_scaled = vPi0s[
i].Pz() *
X;
432 TLorentzVector P4_correctedPi0s;
433 P4_correctedPi0s.SetPxPyPzE(px_scaled,py_scaled,pz_scaled,
e);
434 correctedPi0s.push_back(P4_correctedPi0s);
437 correctedPi0s = vPi0s;
444 TF1 DeltaRdist(
"DeltaRdist",
"pol3", 0, 67500);
445 DeltaRdist.SetParameter(0, 0.07924);
446 DeltaRdist.SetParameter(1, -2.078/1000000.);
447 DeltaRdist.SetParameter(2, 2.619/100000000000.);
448 DeltaRdist.SetParameter(3, -1.238/10000000000000000.);
451 TLorentzVector SumPi0_P4;
452 for(
unsigned int i = 0 ;
i < correctedPi0s.size() ;
i++){
453 SumPi0_P4 += correctedPi0s[
i];
456 float SumPi0_pt = SumPi0_P4.Pt();
460 if(SumPi0_pt >= 67500){
463 deltaR = DeltaRdist.Eval(SumPi0_pt);
466 TLorentzVector correctedPi0_0, correctedPi0_1;
467 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() );
468 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() );
470 std::vector<TLorentzVector> AngleCorrectedPi0s;
471 AngleCorrectedPi0s.push_back(correctedPi0_0);
472 AngleCorrectedPi0s.push_back(correctedPi0_1);
475 TLorentzVector PionCluster_angleCorrected = AngleCorrectedPi0s[0]+AngleCorrectedPi0s[1];
477 double dNewMomentum = std::sqrt(PionCluster_angleCorrected.E()/2. * PionCluster_angleCorrected.E()/2. - PionCluster_angleCorrected.M() / 2. * PionCluster_angleCorrected.M() / 2.);
478 correctedPi0s[0].SetVectM(PionCluster_angleCorrected.Vect() * (dNewMomentum / PionCluster_angleCorrected.P()), PionCluster_angleCorrected.M() / 2.);
479 correctedPi0s[1] = correctedPi0s[0];
484 TauP4 += track->p4();
487 for(
unsigned int iPi0=0; iPi0 < correctedPi0s.size(); iPi0++) {
488 TauP4 += correctedPi0s[iPi0];
499 Error(
"TauAnalysisTools::getTruthParticleType",
"No truth match information available. Please run TauTruthMatchingTool first.");
504 if (xTruthParticle->
isTau())
507 if (
static_cast<bool>(accIsHadronicTau(*xTruthParticle)))
512 if (xTruthParticle->
isMuon())
522 if (lTruthParticleLink.
isValid())
532 Error(
"TauAnalysisTools::getTruthParticleType",
"No truth match information available. Please run DiTauTruthMatchingTool first");
536 if (accIsTruthHadronic(xDiTau))
539 return eTruthMatchedParticleType;
548 std::vector<const xAOD::TauJet*> taus_murm_vec(taus_muonRM->
begin(), taus_muonRM->
end());
549 std::vector<const xAOD::TauJet*> taus_combined;
551 originalTauJetAcc (
"originalTauJet");
553 auto replacement_itr = std::find_if(taus_murm_vec.begin(), taus_murm_vec.end(),
555 auto link_to_ori_tau = originalTauJetAcc (*tau_murm);
556 if (!link_to_ori_tau.isValid()) { return false; }
557 if (*link_to_ori_tau == tau_std){
return true; }
561 if (replacement_itr == taus_murm_vec.end()) { taus_combined.push_back(tau_std); }
565 taus_combined.push_back(*replacement_itr);
566 taus_murm_vec.erase(replacement_itr);
572 assert(taus_murm_vec.empty());
573 return taus_combined;