261 size_t iNumPi0PFO = xTau->
nPi0PFOs();
267 Error(
"TauAnalysisTools::createPi0Vectors",
"Failed to retrieve panTauDetail decay mode.");
279 vPi0s.push_back(xPfo1->
p4() + xPfo2->
p4());
282 double dNewMomentum = std::sqrt(vPi0s[0].E() * vPi0s[0].E() - fMassPi0Squared);
283 vPi0s[0].SetPxPyPzE(vPi0s[0].Vect().Unit().Px() * dNewMomentum,
284 vPi0s[0].Vect().Unit().Py() * dNewMomentum,
285 vPi0s[0].Vect().Unit().Pz() * dNewMomentum,
293 vPi0s.push_back(xPfo->
p4());
296 double dNewMomentum = std::sqrt(vPi0s[0].E() / 2 * vPi0s[0].E() / 2 - vPi0s[0].M() / 2. * vPi0s[0].M() / 2.);
297 vPi0s[0].SetVectM(vPi0s[0].Vect() * (dNewMomentum / vPi0s[0].
P()), vPi0s[0].M() / 2.);
300 vPi0s.push_back(vPi0s[0]);
305 for (
size_t iPFO = 0; iPFO < iNumPi0PFO; iPFO++)
307 vPi0s.push_back(xTau->
pi0PFO(iPFO)->
p4());
316 correctedPi0s.clear();
322 Error(
"TauAnalysisTools::correctedPi0Vectors",
"Failed to retrieve panTauDetail decay mode.");
327 std::vector<TLorentzVector> vPi0s;
332 TLorentzVector Sum_vPi0s;
333 for(
unsigned int i = 0; i < vPi0s.size() ; i++){
334 Sum_vPi0s += vPi0s[i];
338 TLorentzVector Sum_ChrgPFOP4;
340 Sum_ChrgPFOP4 += track->track()->p4();
344 TLorentzVector FinalCalibP4 = xTau->
p4();
347 double px = FinalCalibP4.Px() - Sum_ChrgPFOP4.Px();
348 double py = FinalCalibP4.Py() - Sum_ChrgPFOP4.Py();
349 double pz = FinalCalibP4.Pz() - Sum_ChrgPFOP4.Pz();
351 double p_correctedPi0s = std::sqrt( std::pow(px,2.) + std::pow(py,2.) + std::pow(pz,2.) );
352 double p_vPi0s = Sum_vPi0s.P();
355 double X = p_correctedPi0s/p_vPi0s;
358 double px_scaled, py_scaled, pz_scaled, e;
360 for(
unsigned int i = 0; i < vPi0s.size() ; i++){
361 px_scaled = vPi0s[i].Px() * X;
362 py_scaled = vPi0s[i].Py() * X;
363 pz_scaled = vPi0s[i].Pz() * X;
364 e = std::sqrt( std::pow(px_scaled,2.) + std::pow(py_scaled,2.) + std::pow(pz_scaled,2.) + std::pow(mPi0,2.) );
367 TLorentzVector P4_correctedPi0s;
368 P4_correctedPi0s.SetPxPyPzE(px_scaled,py_scaled,pz_scaled,e);
369 correctedPi0s.push_back(P4_correctedPi0s);
372 correctedPi0s = std::move(vPi0s);
379 TF1 DeltaRdist(
"DeltaRdist",
"pol3", 0, 67500);
380 DeltaRdist.SetParameter(0, 0.07924);
381 DeltaRdist.SetParameter(1, -2.078/1000000.);
382 DeltaRdist.SetParameter(2, 2.619/100000000000.);
383 DeltaRdist.SetParameter(3, -1.238/10000000000000000.);
386 TLorentzVector SumPi0_P4;
387 for(
unsigned int i = 0 ; i < correctedPi0s.size() ; i++){
388 SumPi0_P4 += correctedPi0s[i];
391 float SumPi0_pt = SumPi0_P4.Pt();
395 if(SumPi0_pt >= 67500){
398 deltaR = DeltaRdist.Eval(SumPi0_pt);
401 TLorentzVector correctedPi0_0, correctedPi0_1;
402 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() );
403 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() );
405 std::vector<TLorentzVector> AngleCorrectedPi0s;
406 AngleCorrectedPi0s.push_back(correctedPi0_0);
407 AngleCorrectedPi0s.push_back(correctedPi0_1);
410 TLorentzVector PionCluster_angleCorrected = AngleCorrectedPi0s[0]+AngleCorrectedPi0s[1];
412 double dNewMomentum = std::sqrt(PionCluster_angleCorrected.E()/2. * PionCluster_angleCorrected.E()/2. - PionCluster_angleCorrected.M() / 2. * PionCluster_angleCorrected.M() / 2.);
413 correctedPi0s[0].SetVectM(PionCluster_angleCorrected.Vect() * (dNewMomentum / PionCluster_angleCorrected.P()), PionCluster_angleCorrected.M() / 2.);
414 correctedPi0s[1] = correctedPi0s[0];
419 TauP4 += track->track()->p4();
422 for(
unsigned int iPi0=0; iPi0 < correctedPi0s.size(); iPi0++) {
423 TauP4 += correctedPi0s[iPi0];
483 std::vector<const xAOD::TauJet*> taus_murm_vec(taus_muonRM->
begin(), taus_muonRM->
end());
484 std::vector<const xAOD::TauJet*> taus_combined;
486 originalTauJetAcc (
"originalTauJet");
488 auto replacement_itr = std::find_if(taus_murm_vec.begin(), taus_murm_vec.end(),
490 auto link_to_ori_tau = originalTauJetAcc (*tau_murm);
491 if (!link_to_ori_tau.isValid()) { return false; }
492 if (*link_to_ori_tau == tau_std){
return true; }
496 if (replacement_itr == taus_murm_vec.end()) { taus_combined.push_back(tau_std); }
500 taus_combined.push_back(*replacement_itr);
501 taus_murm_vec.erase(replacement_itr);
507 assert(taus_murm_vec.empty());
508 return taus_combined;
A number of constexpr particle constants to avoid hardcoding them directly in various places.
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).
constexpr double piZeroMassInMeV
the mass of the pi zero (in MeV)