@@ -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