Skip to content

Commit 86bdf7a

Browse files
committed
Fix: fix Q3 computation
1 parent a58e5c0 commit 86bdf7a

File tree

1 file changed

+22
-42
lines changed

1 file changed

+22
-42
lines changed

PWGCF/Femto/Core/tripletHistManager.h

Lines changed: 22 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
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

Comments
 (0)