2323// / \author Roberto Preghenella preghenella@bo.infn.it
2424// /
2525
26+ #include " ALICE3/Core/Decayer.h"
2627#include " ALICE3/Core/DetLayer.h"
2728#include " ALICE3/Core/FastTracker.h"
2829#include " ALICE3/Core/FlatTrackSmearer.h"
@@ -378,6 +379,9 @@ struct OnTheFlyTracker {
378379
379380 // Track smearer array, one per geometry
380381 std::vector<std::unique_ptr<o2::delphes::TrackSmearer>> mSmearer ;
382+ // Configuration defined at init time
383+ o2::fastsim::GeometryContainer mGeoContainer ;
384+ float mMagneticField = 0 .0f ;
381385
382386 // For processing and vertexing
383387 std::vector<TrackAlice3> recoPrimaries;
@@ -395,10 +399,8 @@ struct OnTheFlyTracker {
395399 // For TGenPhaseSpace seed
396400 TRandom3 rand;
397401 Service<o2::ccdb::BasicCCDBManager> ccdb{};
402+ o2::upgrade::Decayer decayer;
398403
399- // Configuration defined at init time
400- o2::fastsim::GeometryContainer mGeoContainer ;
401- float mMagneticField = 0 .0f ;
402404 // Time resolution constants
403405 static constexpr float timeResolutionNs = 100 .f; // ns
404406 static constexpr float nsToMus = 1e-3f ;
@@ -438,6 +440,7 @@ struct OnTheFlyTracker {
438440
439441 const int nGeometries = mGeoContainer .getNumberOfConfigurations ();
440442 mMagneticField = mGeoContainer .getFloatValue (0 , " global" , " magneticfield" );
443+ decayer.setBField (mMagneticField );
441444 for (int icfg = 0 ; icfg < nGeometries; ++icfg) {
442445 const std::string histPath = " Configuration_" + std::to_string (icfg) + " /" ;
443446 mSmearer .emplace_back (std::make_unique<o2::delphes::TrackSmearer>());
@@ -1910,7 +1913,6 @@ struct OnTheFlyTracker {
19101913 uint32_t multiplicityCounter = 0 ;
19111914 // Now that the multiplicity is known, we can process the particles to smear them
19121915 for (const auto & mcParticle : mcParticles) {
1913-
19141916 if (!mcParticle.isPhysicalPrimary ()) {
19151917 continue ;
19161918 }
@@ -1950,15 +1952,24 @@ struct OnTheFlyTracker {
19501952 bool reconstructed = true ;
19511953 int nTrkHits = 0 ;
19521954 if (enablePrimarySmearing) {
1953- if (fastPrimaryTrackerSettings.fastTrackPrimaries || fastPrimaryTrackerSettings.fastTrackShortLivedParticles ) {
1954- o2::track::TrackParCov perfectTrackParCov;
1955- o2::upgrade::convertMCParticleToO2Track (mcParticle, perfectTrackParCov, pdgDB);
1955+ if (fastPrimaryTrackerSettings.fastTrackPrimaries && longLivedToBeHandled) {
1956+ o2::track::TrackParCov perfectTrackParCov = o2::upgrade::convertMCParticleToO2Track (mcParticle, pdgDB);
19561957 perfectTrackParCov.setPID (pdgCodeToPID (mcParticle.pdgCode ()));
19571958 computeBremsstrahlungLoss (icfg, mcParticle, perfectTrackParCov);
19581959 nTrkHits = fastTracker[icfg]->FastTrack (perfectTrackParCov, trackParCov, dNdEta);
19591960 if (nTrkHits < fastPrimaryTrackerSettings.minSiliconHits ) {
19601961 reconstructed = false ;
19611962 }
1963+ } else if (fastPrimaryTrackerSettings.fastTrackShortLivedParticles && shortLivedToBeHandled) {
1964+ o2::track::TrackParCov perfectTrackParCov = o2::upgrade::convertMCParticleToO2Track (mcParticle, pdgDB);
1965+ perfectTrackParCov.setPID (pdgCodeToPID (mcParticle.pdgCode ()));
1966+ computeBremsstrahlungLoss (icfg, mcParticle, perfectTrackParCov);
1967+ const std::array<float , 3 > decayVtx = decayer.generateDecayVertex (mcParticle, pdgDB);
1968+ const float decayRadius2D = std::hypot (decayVtx[0 ], decayVtx[1 ]);
1969+ nTrkHits = fastTracker[icfg]->FastTrack (perfectTrackParCov, trackParCov, dNdEta, decayRadius2D);
1970+ if (nTrkHits < fastPrimaryTrackerSettings.minSiliconHits ) {
1971+ reconstructed = false ;
1972+ }
19621973 } else {
19631974 o2::upgrade::convertMCParticleToO2Track (mcParticle, trackParCov, pdgDB);
19641975 computeBremsstrahlungLoss (icfg, mcParticle, trackParCov);
@@ -2155,8 +2166,7 @@ struct OnTheFlyTracker {
21552166 computeBremsstrahlungLoss (icfg, mcParticle, trackParCov);
21562167 reconstructed = mSmearer [icfg]->smearTrack (trackParCov, mcParticle.pdgCode (), dNdEta);
21572168 } else if (shortLivedToBeHandled && fastPrimaryTrackerSettings.fastTrackShortLivedParticles ) {
2158- o2::track::TrackParCov perfectTrackParCov;
2159- o2::upgrade::convertMCParticleToO2Track (mcParticle, perfectTrackParCov, pdgDB);
2169+ o2::track::TrackParCov perfectTrackParCov = o2::upgrade::convertMCParticleToO2Track (mcParticle, pdgDB);
21602170 perfectTrackParCov.setPID (pdgCodeToPID (mcParticle.pdgCode ()));
21612171 computeBremsstrahlungLoss (icfg, mcParticle, perfectTrackParCov);
21622172 nTrkHits = fastTracker[icfg]->FastTrack (perfectTrackParCov, trackParCov, dNdEta, mcParticle.decayRadius ());
0 commit comments