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 ();
0 commit comments