2424#include " Common/DataModel/Multiplicity.h"
2525#include " Common/Core/RecoDecay.h"
2626#include " Common/Core/trackUtilities.h"
27+ #include " DetectorsVertexing/PVertexer.h"
28+ #include " ReconstructionDataFormats/Vertex.h"
2729#include " DataFormatsParameters/GRPMagField.h"
2830#include " DataFormatsParameters/GRPObject.h"
2931#include " DataFormatsTPC/BetheBlochAleph.h"
@@ -171,8 +173,12 @@ struct NonPromptCascadeTask {
171173 using CollisionCandidatesRun3 = soa::Join<aod::Collisions, aod::EvSels, aod::FT0Mults>;
172174 using CollisionCandidatesRun3MC = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels, aod::FT0Mults>;
173175
176+ Preslice<TracksExtData> perCollision = aod::track::collisionId;
177+ Preslice<TracksExtMC> perCollisionMC = aod::track::collisionId;
178+
174179 Configurable<std::string> ccdbUrl{" ccdbUrl" , " http://alice-ccdb.cern.ch" , " url of the ccdb repository" };
175180 Configurable<bool > cfgPropToPCA{" cfgPropToPCA" , true , " create tracks version propagated to PCA" };
181+ Configurable<bool > cfgRedoPV{" cfgRedoPV" , true , " redo PV" };
176182 Configurable<bool > cfgUseAbsDCA{" cfgUseAbsDCA" , true , " Minimise abs. distance rather than chi2" };
177183 Configurable<double > cfgMaxR{" cfgMaxR" , 200 ., " reject PCA's above this radius" };
178184 Configurable<double > cfgMaxDZIni{" cfgMaxDZIni" , 4 ., " reject (if>0) PCA candidate if tracks DZ exceeds threshold" };
@@ -189,6 +195,7 @@ struct NonPromptCascadeTask {
189195
190196 Zorro mZorro ;
191197 OutputObj<ZorroSummary> mZorroSummary {" ZorroSummary" };
198+ SliceCache cache;
192199
193200 Service<o2::ccdb::BasicCCDBManager> mCCDB ;
194201 int mRunNumber = 0 ;
@@ -212,7 +219,7 @@ struct NonPromptCascadeTask {
212219
213220 if (static_cast <o2::base::Propagator::MatCorrType>(cfgMaterialCorrection.value ) == o2::base::Propagator::MatCorrType::USEMatCorrLUT) {
214221 auto * lut = o2::base::MatLayerCylSet::rectifyPtrFromFile (mCCDB ->getForRun <o2::base::MatLayerCylSet>(" GLO/Param/MatLUT" , mRunNumber ));
215- o2::base::Propagator::Instance (true )->setMatLUT (lut);
222+ o2::base::Propagator::Instance ()->setMatLUT (lut);
216223 }
217224 }
218225
@@ -244,6 +251,38 @@ struct NonPromptCascadeTask {
244251 }
245252 }
246253
254+ template <typename CollisionType, typename TrackType>
255+ bool recalculatePV (CollisionType const & collision, TrackType const & tracks, int idToRemove, o2::dataformats::VertexBase& primaryVertex)
256+ {
257+ // slice tracks by collision
258+ o2::vertexing::PVertexer vertexer;
259+ std::vector<o2::track::TrackParCov> pvContributors = {};
260+ std::vector<bool > pvContributorsMask = {};
261+
262+ auto tracksInCollision = doprocessTrackedCascadesMC ? tracks.sliceBy (perCollisionMC, collision.globalIndex ()) : tracks.sliceBy (perCollision, collision.globalIndex ());
263+ // loop over tracks
264+ for (auto const & trkInColl : tracksInCollision) { // Loop on tracks
265+ if (trkInColl.isPVContributor ()) {
266+ pvContributors.push_back (getTrackParCov (trkInColl));
267+ idToRemove == trkInColl.globalIndex () ? pvContributorsMask.push_back (false ) : pvContributorsMask.push_back (true );
268+ }
269+ }
270+ LOG (debug) << " Tracks pushed to the vector: " << pvContributors.size ();
271+ vertexer.init ();
272+ bool canRefit = vertexer.prepareVertexRefit (pvContributors, primaryVertex);
273+ if (!canRefit) {
274+ return false ;
275+ }
276+ // refit the vertex
277+ auto newPV = vertexer.refitVertex (pvContributorsMask, primaryVertex);
278+ // set the new vertex to primaryVertex
279+ primaryVertex.setX (newPV.getX ());
280+ primaryVertex.setY (newPV.getY ());
281+ primaryVertex.setZ (newPV.getZ ());
282+ primaryVertex.setCov (newPV.getCov ());
283+ return true ;
284+ }
285+
247286 void zorroAccounting (const auto & collisions)
248287 {
249288 if (cfgSkimmedProcessing) {
@@ -261,7 +300,7 @@ struct NonPromptCascadeTask {
261300 }
262301
263302 template <typename TrackType, typename CollisionType>
264- void fillCandidatesVector (CollisionType const &, auto const & cascades, auto & candidates)
303+ void fillCandidatesVector (CollisionType const &, TrackType const & tracks, auto const & cascades, auto & candidates)
265304 {
266305
267306 const auto & getCascade = [](auto const & candidate) {
@@ -279,7 +318,7 @@ struct NonPromptCascadeTask {
279318 auto bc = collision.template bc_as <aod::BCsWithTimestamps>();
280319 initCCDB (bc);
281320
282- const auto primaryVertex = getPrimaryVertex (collision);
321+ auto primaryVertex = getPrimaryVertex (collision);
283322
284323 const auto & casc = getCascade (candidate);
285324 const auto & bachelor = casc.template bachelor_as <TrackType>();
@@ -435,6 +474,11 @@ struct NonPromptCascadeTask {
435474 if constexpr (requires { candidate.track (); }) {
436475 const auto & track = candidate.template track_as <TrackType>();
437476 const auto & ITStrack = candidate.template itsTrack_as <TrackType>();
477+ if (cfgRedoPV && ITStrack.isPVContributor ()) {
478+ if (!recalculatePV (collision, tracks, ITStrack.globalIndex (), primaryVertex)) {
479+ continue ;
480+ }
481+ }
438482 cascPVContribs |= ITStrack.isPVContributor () << 0 ;
439483 auto trackTrkParCov = getTrackParCov (track);
440484 o2::base::Propagator::Instance ()->propagateToDCA (primaryVertex, trackTrkParCov, mBz , 2 .f , matCorr, &motherDCA);
@@ -555,19 +599,19 @@ struct NonPromptCascadeTask {
555599
556600 void processTrackedCascadesMC (CollisionCandidatesRun3MC const & collisions,
557601 aod::AssignedTrackedCascades const & trackedCascades, aod::Cascades const & /* cascades*/ ,
558- aod::V0s const & /* v0s*/ , TracksExtMC const & /* tracks*/ ,
602+ aod::V0s const & /* v0s*/ , TracksExtMC const & tracks,
559603 aod::McParticles const & mcParticles, aod::McCollisions const &, aod::BCsWithTimestamps const &)
560604 {
561- fillCandidatesVector<TracksExtMC>(collisions, trackedCascades, gCandidates );
605+ fillCandidatesVector<TracksExtMC>(collisions, tracks, trackedCascades, gCandidates );
562606 fillMCtable<aod::AssignedTrackedCascades>(mcParticles, collisions, gCandidates );
563607 }
564608 PROCESS_SWITCH (NonPromptCascadeTask, processTrackedCascadesMC, " process cascades from strangeness tracking: MC analysis" , true );
565609
566610 void processCascadesMC (CollisionCandidatesRun3MC const & collisions, aod::Cascades const & cascades,
567- aod::V0s const & /* v0s*/ , TracksExtMC const & /* tracks*/ ,
611+ aod::V0s const & /* v0s*/ , TracksExtMC const & tracks,
568612 aod::McParticles const & mcParticles, aod::McCollisions const &, aod::BCsWithTimestamps const &)
569613 {
570- fillCandidatesVector<TracksExtMC>(collisions, cascades, gCandidatesNT );
614+ fillCandidatesVector<TracksExtMC>(collisions, tracks, cascades, gCandidatesNT );
571615 fillMCtable<aod::Cascades>(mcParticles, collisions, gCandidatesNT );
572616 }
573617 PROCESS_SWITCH (NonPromptCascadeTask, processCascadesMC, " process cascades: MC analysis" , false );
@@ -603,21 +647,21 @@ struct NonPromptCascadeTask {
603647
604648 void processTrackedCascadesData (CollisionCandidatesRun3 const & collisions,
605649 aod::AssignedTrackedCascades const & trackedCascades, aod::Cascades const & /* cascades*/ ,
606- aod::V0s const & /* v0s*/ , TracksExtData const & /* tracks*/ ,
650+ aod::V0s const & /* v0s*/ , TracksExtData const & tracks,
607651 aod::BCsWithTimestamps const &)
608652 {
609653 zorroAccounting (collisions);
610- fillCandidatesVector<TracksExtData>(collisions, trackedCascades, gCandidates );
654+ fillCandidatesVector<TracksExtData>(collisions, tracks, trackedCascades, gCandidates );
611655 fillDataTable<aod::AssignedTrackedCascades>(gCandidates );
612656 }
613657 PROCESS_SWITCH (NonPromptCascadeTask, processTrackedCascadesData, " process cascades from strangeness tracking: Data analysis" , false );
614658
615659 void processCascadesData (CollisionCandidatesRun3 const & collisions, aod::Cascades const & cascades,
616- aod::V0s const & /* v0s*/ , TracksExtData const & /* tracks*/ ,
660+ aod::V0s const & /* v0s*/ , TracksExtData const & tracks,
617661 aod::BCsWithTimestamps const &)
618662 {
619663 zorroAccounting (collisions);
620- fillCandidatesVector<TracksExtData>(collisions, cascades, gCandidatesNT );
664+ fillCandidatesVector<TracksExtData>(collisions, tracks, cascades, gCandidatesNT );
621665 fillDataTable<aod::Cascades>(gCandidatesNT );
622666 }
623667 PROCESS_SWITCH (NonPromptCascadeTask, processCascadesData, " process cascades: Data analysis" , false );
0 commit comments