Skip to content

Commit 9ac983f

Browse files
committed
fix handling of neutral particles in decayer
1 parent 1c6d714 commit 9ac983f

3 files changed

Lines changed: 263 additions & 78 deletions

File tree

ALICE3/Core/Decayer.h

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include <TDecayChannel.h> // IWYU pragma: keep
2929
#include <TGenPhaseSpace.h>
3030
#include <TLorentzVector.h>
31+
#include <TPDGCode.h>
3132
#include <TRandom3.h>
3233

3334
#include <array>
@@ -47,46 +48,49 @@ class Decayer
4748
Decayer() = default;
4849

4950
template <typename TDatabase>
50-
std::vector<o2::upgrade::OTFParticle> decayParticle(const TDatabase& pdgDB, const o2::track::TrackParCov& track, const int pdgCode)
51+
std::vector<o2::upgrade::OTFParticle> decayParticle(const TDatabase& pdgDB, const OTFParticle& particle)
5152
{
52-
const auto& particleInfo = pdgDB->GetParticle(pdgCode);
53+
const auto& particleInfo = pdgDB->GetParticle(particle.pdgCode());
54+
if (!particleInfo) {
55+
return {};
56+
}
57+
5358
const int charge = particleInfo->Charge() / 3;
5459
const double mass = particleInfo->Mass();
55-
std::array<float, 3> mom;
56-
std::array<float, 3> pos;
57-
track.getPxPyPzGlo(mom);
58-
track.getXYZGlo(pos);
5960

60-
const double u = mRand3.Uniform(0, 1);
61+
const double u = mRand3.Uniform(0.001, 0.999);
6162
const double ctau = o2::constants::physics::LightSpeedCm2S * particleInfo->Lifetime(); // cm
62-
const double betaGamma = track.getP() / mass;
63+
const double betaGamma = particle.p() / mass;
6364
const double rxyz = -betaGamma * ctau * std::log(1 - u);
6465
double vx, vy, vz;
6566
double px, py, e;
6667

6768
if (!charge) {
68-
vx = pos[0] + rxyz * (mom[0] / track.getP());
69-
vy = pos[1] + rxyz * (mom[1] / track.getP());
70-
vz = pos[2] + rxyz * (mom[2] / track.getP());
71-
px = mom[0];
72-
py = mom[1];
69+
vx = particle.vx() + rxyz * (particle.px() / particle.p());
70+
vy = particle.vy() + rxyz * (particle.py() / particle.p());
71+
vz = particle.vz() + rxyz * (particle.pz() / particle.p());
72+
px = particle.px();
73+
py = particle.py();
7374
} else {
74-
float sna, csa;
75+
o2::track::TrackParCov track;
7576
o2::math_utils::CircleXYf_t circle;
77+
o2::upgrade::convertOTFParticleToO2Track(particle, track, pdgDB);
78+
79+
float sna, csa;
7680
track.getCircleParams(mBz, circle, sna, csa);
7781
const double rxy = rxyz / std::sqrt(1. + track.getTgl() * track.getTgl());
7882
const double theta = rxy / circle.rC;
7983

80-
vx = ((pos[0] - circle.xC) * std::cos(theta) - (pos[1] - circle.yC) * std::sin(theta)) + circle.xC;
81-
vy = ((pos[1] - circle.yC) * std::cos(theta) + (pos[0] - circle.xC) * std::sin(theta)) + circle.yC;
82-
vz = mom[2] + rxyz * (mom[2] / track.getP());
84+
vx = ((particle.vx() - circle.xC) * std::cos(theta) - (particle.vy() - circle.yC) * std::sin(theta)) + circle.xC;
85+
vy = ((particle.vy() - circle.yC) * std::cos(theta) + (particle.vx() - circle.xC) * std::sin(theta)) + circle.yC;
86+
vz = particle.vz() + rxyz * (particle.pz() / track.getP());
8387

84-
px = mom[0] * std::cos(theta) - mom[1] * std::sin(theta);
85-
py = mom[1] * std::cos(theta) + mom[0] * std::sin(theta);
88+
px = particle.px() * std::cos(theta) - particle.py() * std::sin(theta);
89+
py = particle.py() * std::cos(theta) + particle.px() * std::sin(theta);
8690
}
8791

8892
double brTotal = 0.;
89-
e = std::sqrt(mass * mass + px * px + py * py + mom[2] * mom[2]);
93+
e = std::sqrt(mass * mass + px * px + py * py + particle.pz() * particle.pz());
9094
for (int ch = 0; ch < particleInfo->NDecayChannels(); ++ch) {
9195
brTotal += particleInfo->DecayChannel(ch)->BranchingRatio();
9296
}
@@ -108,7 +112,11 @@ class Decayer
108112
}
109113
}
110114

111-
TLorentzVector tlv(px, py, mom[2], e);
115+
if (dauMasses.empty()) {
116+
return {};
117+
}
118+
119+
TLorentzVector tlv(px, py, particle.pz(), e);
112120
TGenPhaseSpace decay;
113121
decay.SetDecay(tlv, dauMasses.size(), dauMasses.data());
114122
decay.Generate();

ALICE3/Core/TrackUtilities.h

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,20 @@ namespace o2::upgrade
2929

3030
/// Struct to store mc info for the otf decayer
3131
struct OTFParticle {
32-
int mPdgCode;
33-
float mE;
34-
float mVx, mVy, mVz;
35-
float mPx, mPy, mPz;
36-
bool mIsAlive;
32+
OTFParticle() = default;
33+
34+
template <typename TParticle>
35+
OTFParticle(const TParticle& particle)
36+
{
37+
mPdgCode = particle.pdgCode();
38+
mPx = particle.px();
39+
mPy = particle.py();
40+
mPz = particle.pz();
41+
mE = particle.e();
42+
mVx = particle.vx();
43+
mVy = particle.vy();
44+
mVz = particle.vz();
45+
}
3746

3847
// Setters
3948
void setIsAlive(bool isAlive) { mIsAlive = isAlive; }
@@ -62,6 +71,16 @@ struct OTFParticle {
6271
float py() const { return mPy; }
6372
float pz() const { return mPz; }
6473
float e() const { return mE; }
74+
float radius() const { return std::hypot(mVx, mVy); }
75+
float pt() const { return std::hypot(mPx, mPy); }
76+
float p() const { return std::hypot(mPx, mPy, mPz); }
77+
78+
private:
79+
int mPdgCode{};
80+
float mE{};
81+
float mVx{}, mVy{}, mVz{};
82+
float mPx{}, mPy{}, mPz{};
83+
bool mIsAlive{};
6584
};
6685

6786
/// Function to convert a TLorentzVector into a perfect Track

0 commit comments

Comments
 (0)