@@ -383,23 +383,24 @@ 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 )
386+ ROOT::Math::PxPyPzEVector getqij (ROOT::Math::PxPyPzEVector const & vi , ROOT::Math::PxPyPzEVector const & vj )
387387 {
388- // Convert to PxPyPzEVector to get proper Lorentz dot product
389- ROOT::Math::PxPyPzEVector vi (pi);
390- ROOT::Math::PxPyPzEVector vj (pj);
391-
392388 auto trackSum = vi + vj;
393389 auto trackDifference = vi - vj;
394- double scaling = trackDifference.Dot (trackSum) / trackSum.Dot (trackSum);
390+ const double s = trackSum.M2 ();
391+ const double scaling = (s != 0.0 ) ? (vi.M2 () - vj.M2 ()) / s : 0.0 ;
395392 return trackDifference - scaling * trackSum;
396393 }
397394
398395 float getQ3 (ROOT::Math::PtEtaPhiMVector const & part1, ROOT::Math::PtEtaPhiMVector const & part2, ROOT::Math::PtEtaPhiMVector const & part3)
399396 {
400- auto q12 = getqij (part1, part2);
401- auto q23 = getqij (part2, part3);
402- auto q31 = getqij (part3, part1);
397+ // upfront conversion to PxPyPzEVector
398+ const ROOT::Math::PxPyPzEVector p1 (part1);
399+ const ROOT::Math::PxPyPzEVector p2 (part2);
400+ const ROOT::Math::PxPyPzEVector p3 (part3);
401+ auto q12 = getqij (p1, p2);
402+ auto q23 = getqij (p2, p3);
403+ auto q31 = getqij (p3, p1);
403404 double q = q12.M2 () + q23.M2 () + q31.M2 ();
404405 return static_cast <float >(std::sqrt (-q));
405406 }
0 commit comments