2727#include < Math/GenVector/Boost.h>
2828#include < Math/Vector4D.h>
2929
30+ #include < algorithm>
3031#include < array>
3132#include < cmath>
3233#include < map>
@@ -273,9 +274,9 @@ class TripletHistManager
273274 mParticle3 = ROOT::Math::PtEtaPhiMVector (mAbsCharge3 * particle3.pt (), particle3.eta (), particle3.phi (), mPdgMass3 );
274275
275276 // set mT
276- mMt = getMt (mParticle1 , mPdgMass1 , mParticle2 , mPdgMass2 , mParticle3 , mPdgMass3 );
277+ mMt = getMt (mParticle1 , mParticle2 , mParticle3 );
277278 // set Q3
278- mQ3 = getQ3 (mParticle1 , mPdgMass1 , mParticle2 , mPdgMass2 , mParticle3 , mPdgMass3 );
279+ mQ3 = getQ3 (mParticle1 , mParticle2 , mParticle3 );
279280
280281 // if one of the particles has a mass getter, we cache the value for the filling later
281282 if constexpr (modes::hasMass (particleType1)) {
@@ -323,9 +324,9 @@ class TripletHistManager
323324 mTrueParticle3 = ROOT::Math::PtEtaPhiMVector (mAbsCharge3 * mcParticle3.pt (), mcParticle3.eta (), mcParticle3.phi (), mPdgMass3 );
324325
325326 // set true mT
326- mTrueMt = getMt (mTrueParticle1 , mPdgMass1 , mTrueParticle2 , mPdgMass2 , mTrueParticle3 , mPdgMass3 );
327+ mTrueMt = getMt (mTrueParticle1 , mTrueParticle2 , mTrueParticle3 );
327328 // set true Q3
328- mTrueQ3 = getQ3 (mTrueParticle1 , mPdgMass1 , mTrueParticle2 , mPdgMass2 , mTrueParticle3 , mPdgMass3 );
329+ mTrueQ3 = getQ3 (mTrueParticle1 , mTrueParticle2 , mTrueParticle3 );
329330 }
330331
331332 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
@@ -382,26 +383,13 @@ class TripletHistManager
382383 float getQ3 () const { return mQ3 ; }
383384
384385 private:
385- template <typename T>
386- T getqij (const T& vecparti, const T& vecpartj)
386+ float getQ3 (ROOT::Math::PtEtaPhiMVector const & part1, ROOT::Math::PtEtaPhiMVector const & part2, ROOT::Math::PtEtaPhiMVector const & part3)
387387 {
388- T trackSum = vecparti + vecpartj;
389- T trackDifference = vecparti - vecpartj;
390- float scaling = trackDifference.Dot (trackSum) / trackSum.Dot (trackSum);
391- return trackDifference - scaling * trackSum;
392- }
393-
394- template <typename T>
395- float getQ3 (const T& part1, const float mass1, const T& part2, const float mass2, const T& part3, const float mass3)
396- {
397- ROOT::Math::PtEtaPhiMVector vecpart1 (part1.pt (), part1.eta (), part1.phi (), mass1);
398- ROOT::Math::PtEtaPhiMVector vecpart2 (part2.pt (), part2.eta (), part2.phi (), mass2);
399- ROOT::Math::PtEtaPhiMVector vecpart3 (part3.pt (), part3.eta (), part3.phi (), mass3);
400- auto q12 = getqij (vecpart1, vecpart2);
401- auto q23 = getqij (vecpart2, vecpart3);
402- auto q31 = getqij (vecpart3, vecpart1);
403- float q = q12.M2 () + q23.M2 () + q31.M2 ();
404- return std::sqrt (-q);
388+ double q12 = -(part1 - part2).M2 ();
389+ double q23 = -(part2 - part3).M2 ();
390+ double q31 = -(part3 - part1).M2 ();
391+ double q = q12 + q23 + q31;
392+ return static_cast <float >(std::sqrt (std::max (0 ., q))); // protection if rounding error give a value below 0
405393 }
406394
407395 void initAnalysis (std::map<TripletHist, std::vector<o2::framework::AxisSpec>> const & Specs)
@@ -497,22 +485,19 @@ class TripletHistManager
497485 }
498486 }
499487
500- float getMt (ROOT::Math::PtEtaPhiMVector const & part1,
501- float pdgMass1,
502- ROOT::Math::PtEtaPhiMVector const & part2,
503- float pdgMass2)
488+ double getMt (ROOT::Math::PtEtaPhiMVector const & part1, ROOT::Math::PtEtaPhiMVector const & part2)
504489 {
505490 auto sum = part1 + part2;
506- float mt = 0 ;
507- float averageMass = 0 ;
508- float reducedMass = 0 ;
491+ double mt = 0 . ;
492+ double averageMass = 0 . ;
493+ double reducedMass = 0 . ;
509494 switch (mMtType ) {
510495 case modes::TransverseMassType::kAveragePdgMass :
511- averageMass = 0.5 * (pdgMass1 + pdgMass2 );
496+ averageMass = 0.5 * (part1. M () + part2. M () );
512497 mt = std::hypot (0.5 * sum.Pt (), averageMass);
513498 break ;
514499 case modes::TransverseMassType::kReducedPdgMass :
515- reducedMass = 2 .f * (pdgMass1 * pdgMass2 / (pdgMass1 + pdgMass2 ));
500+ reducedMass = 2 . * (part1. M () * part2. M () / (part1. M () + part2. M () ));
516501 mt = std::hypot (0.5 * sum.Pt (), reducedMass);
517502 break ;
518503 case modes::TransverseMassType::kMt4Vector :
@@ -524,20 +509,15 @@ class TripletHistManager
524509 return mt;
525510 }
526511
527- float getMt (ROOT::Math::PtEtaPhiMVector const & part1,
528- float mass1,
529- ROOT::Math::PtEtaPhiMVector const & part2,
530- float mass2,
531- ROOT::Math::PtEtaPhiMVector const & part3,
532- float mass3)
512+ float getMt (ROOT::Math::PtEtaPhiMVector const & part1, ROOT::Math::PtEtaPhiMVector const & part2, ROOT::Math::PtEtaPhiMVector const & part3)
533513 {
534- return ( getMt (part1, mass1, part2, mass2 ) + getMt (part2, mass2, part3, mass3 ) + getMt (part1, mass1, part3, mass3 )) / 3 .;
514+ return static_cast < float >(( getMt (part1, part2) + getMt (part2, part3) + getMt (part1, part3)) / 3 .) ;
535515 }
536516
537517 o2::framework::HistogramRegistry* mHistogramRegistry = nullptr ;
538- float mPdgMass1 = 0 .f;
539- float mPdgMass2 = 0 .f;
540- float mPdgMass3 = 0 .f;
518+ double mPdgMass1 = 0 .f;
519+ double mPdgMass2 = 0 .f;
520+ double mPdgMass3 = 0 .f;
541521
542522 modes::TransverseMassType mMtType = modes::TransverseMassType::kAveragePdgMass ;
543523
0 commit comments