@@ -383,13 +383,25 @@ class TripletHistManager
383383 float getQ3 () const { return mQ3 ; }
384384
385385 private:
386+ ROOT::Math::PxPyPzEVector getqij (ROOT::Math::PtEtaPhiMVector const & pi, ROOT::Math::PtEtaPhiMVector const & pj)
387+ {
388+ // Convert to PxPyPzEVector to get proper Lorentz dot product
389+ ROOT::Math::PxPyPzEVector vi (pi);
390+ ROOT::Math::PxPyPzEVector vj (pj);
391+
392+ auto trackSum = vi + vj;
393+ auto trackDifference = vi - vj;
394+ double scaling = trackDifference.Dot (trackSum) / trackSum.Dot (trackSum);
395+ return trackDifference - scaling * trackSum;
396+ }
397+
386398 float getQ3 (ROOT::Math::PtEtaPhiMVector const & part1, ROOT::Math::PtEtaPhiMVector const & part2, ROOT::Math::PtEtaPhiMVector const & part3)
387399 {
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
400+ auto q12 = getqij (part1, part2);
401+ auto q23 = getqij (part2, part3);
402+ auto q31 = getqij (part3, part1);
403+ double q = q12. M2 () + q23. M2 () + q31. M2 () ;
404+ return static_cast <float >(std::sqrt (- q));
393405 }
394406
395407 void initAnalysis (std::map<TripletHist, std::vector<o2::framework::AxisSpec>> const & Specs)
0 commit comments