@@ -211,6 +211,7 @@ struct OnTheFlyTracker {
211211
212212 struct : ConfigurableGroup {
213213 std::string prefix = " fastPrimaryTrackerSettings" ;
214+ Configurable<bool > fastTrackShortLivedParticles{" fastTrackShortLivedParticles" , false , " Use fasttracker for short lived tracks" };
214215 Configurable<bool > fastTrackPrimaries{" fastTrackPrimaries" , false , " Use fasttracker for primary tracks. Enable with care" };
215216 Configurable<int > minSiliconHits{" minSiliconHits" , 4 , " minimum number of silicon hits to accept track" };
216217 Configurable<bool > applyZacceptance{" applyZacceptance" , false , " apply z limits to detector layers or not" };
@@ -348,15 +349,20 @@ struct OnTheFlyTracker {
348349 v0candidate thisV0;
349350 // Constants
350351 static constexpr int kv0Prongs = 2 ;
351- static constexpr std::array<int , 3 > v0PDGs = {kK0Short ,
352- kLambda0 ,
353- kLambda0Bar };
352+ static constexpr std::array<int , 3 > v0PDGs = {PDG_t:: kK0Short ,
353+ PDG_t:: kLambda0 ,
354+ PDG_t:: kLambda0Bar };
354355
355- static constexpr std::array<int , 5 > longLivedHandledPDGs = {kElectron ,
356- kMuonMinus ,
357- kPiPlus ,
358- kKPlus ,
359- kProton };
356+ static constexpr std::array<int , 5 > longLivedHandledPDGs = {PDG_t::kElectron ,
357+ PDG_t::kMuonMinus ,
358+ PDG_t::kPiPlus ,
359+ PDG_t::kKPlus ,
360+ PDG_t::kProton };
361+
362+ static constexpr std::array<int , 5 > shortLivedHandledPDGs = {PDG_t::kSigmaPlus ,
363+ PDG_t::kSigmaMinus ,
364+ PDG_t::kXiMinus ,
365+ PDG_t::kOmegaMinus };
360366
361367 static constexpr std::array<int , 4 > nucleiPDGs = {o2::constants::physics::kDeuteron ,
362368 o2::constants::physics::kTriton ,
@@ -760,6 +766,10 @@ struct OnTheFlyTracker {
760766 return o2::track::PID ::Proton;
761767 } else if (std::abs (pdgCode) == PDG_t::kLambda0 ) {
762768 return o2::track::PID ::Lambda;
769+ } else if (std::abs (pdgCode) == PDG_t::kSigmaPlus ) {
770+ return o2::track::PID ::XiMinus; // Close enough
771+ } else if (std::abs (pdgCode) == PDG_t::kSigmaMinus ) {
772+ return o2::track::PID ::XiMinus; // Close enough
763773 } else if (std::abs (pdgCode) == PDG_t::kXiMinus ) {
764774 return o2::track::PID ::XiMinus;
765775 } else if (std::abs (pdgCode) == PDG_t::kOmegaMinus ) {
@@ -1875,12 +1885,14 @@ struct OnTheFlyTracker {
18751885
18761886 const bool isCascadeToDecay = (mcParticle.pdgCode () == kXiMinus ) && cascadeDecaySettings.decayXi ;
18771887 const bool isV0ToDecay = std::find (v0PDGs.begin (), v0PDGs.end (), mcParticle.pdgCode ()) != v0PDGs.end () && v0DecaySettings.decayV0 ;
1878-
18791888 const bool longLivedToBeHandled = std::find (longLivedHandledPDGs.begin (), longLivedHandledPDGs.end (), std::abs (mcParticle.pdgCode ())) != longLivedHandledPDGs.end ();
1889+ const bool shortLivedToBeHandled = std::find (shortLivedHandledPDGs.begin (), shortLivedHandledPDGs.end (), std::abs (mcParticle.pdgCode ())) != shortLivedHandledPDGs.end ();
18801890 const bool nucleiToBeHandled = std::find (nucleiPDGs.begin (), nucleiPDGs.end (), std::abs (mcParticle.pdgCode ())) != nucleiPDGs.end ();
18811891 const bool pdgsToBeHandled = longLivedToBeHandled ||
18821892 (enableNucleiSmearing && nucleiToBeHandled) ||
1883- (isCascadeToDecay) || (isV0ToDecay);
1893+ (isCascadeToDecay) || (isV0ToDecay) ||
1894+ (shortLivedToBeHandled && fastPrimaryTrackerSettings.fastTrackShortLivedParticles );
1895+
18841896 if (!pdgsToBeHandled) {
18851897 continue ;
18861898 }
@@ -1902,7 +1914,7 @@ struct OnTheFlyTracker {
19021914 bool reconstructed = true ;
19031915 int nTrkHits = 0 ;
19041916 if (enablePrimarySmearing) {
1905- if (fastPrimaryTrackerSettings.fastTrackPrimaries ) {
1917+ if (fastPrimaryTrackerSettings.fastTrackPrimaries || fastPrimaryTrackerSettings. fastTrackShortLivedParticles ) {
19061918 o2::track::TrackParCov perfectTrackParCov;
19071919 o2::upgrade::convertMCParticleToO2Track (mcParticle, perfectTrackParCov, pdgDB);
19081920 perfectTrackParCov.setPID (pdgCodeToPID (mcParticle.pdgCode ()));
@@ -2052,8 +2064,10 @@ struct OnTheFlyTracker {
20522064 // Now that the multiplicity is known, we can process the particles to smear them
20532065 for (const auto & mcParticle : mcParticles) {
20542066 const bool longLivedToBeHandled = std::find (longLivedHandledPDGs.begin (), longLivedHandledPDGs.end (), std::abs (mcParticle.pdgCode ())) != longLivedHandledPDGs.end ();
2067+ const bool shortLivedToBeHandled = std::find (shortLivedHandledPDGs.begin (), shortLivedHandledPDGs.end (), std::abs (mcParticle.pdgCode ())) != shortLivedHandledPDGs.end ();
20552068 const bool nucleiToBeHandled = std::find (nucleiPDGs.begin (), nucleiPDGs.end (), std::abs (mcParticle.pdgCode ())) != nucleiPDGs.end ();
2056- const bool pdgsToBeHandled = longLivedToBeHandled || (enableNucleiSmearing && nucleiToBeHandled);
2069+ const bool pdgsToBeHandled = longLivedToBeHandled || (enableNucleiSmearing && nucleiToBeHandled) ||
2070+ (shortLivedToBeHandled && fastPrimaryTrackerSettings.fastTrackShortLivedParticles );
20572071
20582072 o2::upgrade::OTFParticle otfParticle (mcParticle);
20592073 otfParticle.setBits (mcParticle.decayerBits_raw ());
@@ -2099,10 +2113,21 @@ struct OnTheFlyTracker {
20992113 bool reconstructed = false ;
21002114 int nTrkHits = 0 ;
21012115 const bool isSecondary = !otfParticle.isPrimary () && otfParticle.checkBit (o2::upgrade::DecayerBits::ProducedByDecayer) && otfParticle.isAlive ();
2102- if (enablePrimarySmearing && otfParticle.isPrimary ()) {
2116+ if (enablePrimarySmearing && longLivedToBeHandled && otfParticle.isPrimary ()) {
21032117 o2::upgrade::convertMCParticleToO2Track (mcParticle, trackParCov, pdgDB);
21042118 computeBremsstrahlungLoss (icfg, mcParticle, trackParCov);
21052119 reconstructed = mSmearer [icfg]->smearTrack (trackParCov, mcParticle.pdgCode (), dNdEta);
2120+ } else if (shortLivedToBeHandled && fastPrimaryTrackerSettings.fastTrackShortLivedParticles ) {
2121+ o2::track::TrackParCov perfectTrackParCov;
2122+ o2::upgrade::convertMCParticleToO2Track (mcParticle, perfectTrackParCov, pdgDB);
2123+ perfectTrackParCov.setPID (pdgCodeToPID (mcParticle.pdgCode ()));
2124+ computeBremsstrahlungLoss (icfg, mcParticle, perfectTrackParCov);
2125+ nTrkHits = fastTracker[icfg]->FastTrack (perfectTrackParCov, trackParCov, dNdEta);
2126+ if (nTrkHits < fastPrimaryTrackerSettings.minSiliconHits ) {
2127+ reconstructed = false ;
2128+ } else {
2129+ reconstructed = true ;
2130+ }
21062131 } else if (enableSecondarySmearing && isSecondary) {
21072132 o2::track::TrackParCov perfectTrackParCov;
21082133 o2::upgrade::convertMCParticleToO2Track (mcParticle, perfectTrackParCov, pdgDB);
0 commit comments