From f7564de7e399f2deea6ea0c23eace8804a1a52b1 Mon Sep 17 00:00:00 2001 From: David Dobrigkeit Chinellato Date: Thu, 18 Sep 2025 15:41:01 +0200 Subject: [PATCH 1/6] Optimize de-duplication and DCAtoPV calculation --- PWGLF/Utils/strangenessBuilderHelper.h | 56 ++++++++++++++++---------- PWGLF/Utils/strangenessBuilderModule.h | 5 ++- 2 files changed, 37 insertions(+), 24 deletions(-) diff --git a/PWGLF/Utils/strangenessBuilderHelper.h b/PWGLF/Utils/strangenessBuilderHelper.h index c4adf1c2874..926e9554845 100644 --- a/PWGLF/Utils/strangenessBuilderHelper.h +++ b/PWGLF/Utils/strangenessBuilderHelper.h @@ -266,7 +266,10 @@ class strangenessBuilderHelper //_______________________________________________________________________ // standard build V0 function. Populates ::v0 object // ::v0 will be initialized to defaults if build fails - template + // --- useSelections: meant to maximize recovery, but beware high cost in CPU + // --- calculateProngDCAtoPV: optionally don't propagate prongs to PV, saves + // CPU, of interest when dealing with de-duplication (variable not checked) + template bool buildV0Candidate(int collisionIndex, float pvX, float pvY, float pvZ, TTrack const& positiveTrack, @@ -306,31 +309,38 @@ class strangenessBuilderHelper } } - // Calculate DCA with respect to the collision associated to the V0 - std::array dcaInfo; + if constexpr (calculateProngDCAtoPV) { + // Calculate DCA with respect to the collision associated to the V0 + std::array dcaInfo; - // do DCA to PV on copies instead of originals - auto positiveTrackParamCopy = positiveTrackParam; - auto negativeTrackParamCopy = negativeTrackParam; + // do DCA to PV on TrackPar copies and not TrackParCov + // TrackPar preferred: don't calculate multiple scattering / CovMat changes + // Spares CPU since variables not checked + o2::track::TrackPar positiveTrackParamCopy(positiveTrackParam); + o2::track::TrackPar negativeTrackParamCopy(negativeTrackParam); - o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, positiveTrackParamCopy, 2.f, fitter.getMatCorrType(), &dcaInfo); - v0.positiveDCAxy = dcaInfo[0]; + o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, positiveTrackParamCopy, 2.f, fitter.getMatCorrType(), &dcaInfo); + v0.positiveDCAxy = dcaInfo[0]; - if constexpr (useSelections) { - if (std::fabs(v0.positiveDCAxy) < v0selections.dcanegtopv) { - v0 = {}; - return false; + if constexpr (useSelections) { + if (std::fabs(v0.positiveDCAxy) < v0selections.dcanegtopv) { + v0 = {}; + return false; + } } - } - o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, negativeTrackParamCopy, 2.f, fitter.getMatCorrType(), &dcaInfo); - v0.negativeDCAxy = dcaInfo[0]; + o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, negativeTrackParamCopy, 2.f, fitter.getMatCorrType(), &dcaInfo); + v0.negativeDCAxy = dcaInfo[0]; - if constexpr (useSelections) { - if (std::fabs(v0.negativeDCAxy) < v0selections.dcanegtopv) { - v0 = {}; - return false; + if constexpr (useSelections) { + if (std::fabs(v0.negativeDCAxy) < v0selections.dcanegtopv) { + v0 = {}; + return false; + } } + }else{ + v0.positiveDCAxy = 0.0f; // default invalid + v0.negativeDCAxy = 0.0f; // default invalid } // Perform DCA fit @@ -499,9 +509,11 @@ class strangenessBuilderHelper // Calculate DCA with respect to the collision associated to the V0 std::array dcaInfo; - // do DCA to PV on copies instead of originals - auto positiveTrackParamCopy = positiveTrackParam; - auto negativeTrackParamCopy = negativeTrackParam; + // do DCA to PV on TrackPar copies and not TrackParCov + // TrackPar preferred: don't calculate multiple scattering / CovMat changes + // Spares CPU since variables not checked + o2::track::TrackPar positiveTrackParamCopy(positiveTrackParam); + o2::track::TrackPar negativeTrackParamCopy(negativeTrackParam); o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, positiveTrackParamCopy, 2.f, fitter.getMatCorrType(), &dcaInfo); v0.positiveDCAxy = dcaInfo[0]; diff --git a/PWGLF/Utils/strangenessBuilderModule.h b/PWGLF/Utils/strangenessBuilderModule.h index e49ed71f14b..5b9dc2533d9 100644 --- a/PWGLF/Utils/strangenessBuilderModule.h +++ b/PWGLF/Utils/strangenessBuilderModule.h @@ -914,9 +914,10 @@ class BuilderModule } // end TPC drift treatment // process candidate with helper, generate properties for consulting - // : do not apply selections: do as much as possible to preserve + // first 'false' : do not apply selections: do as much as possible to preserve + // second 'false': do not calculate prong DCA to PV, unnecessary, costly if XIU = 83.1f // candidate at this level and do not select with topo selections - if (straHelper.buildV0Candidate(v0tableGrouped[iV0].collisionIds[ic], collision.posX(), collision.posY(), collision.posZ(), pTrack, nTrack, posTrackPar, negTrackPar, true, false, true)) { + if (straHelper.buildV0Candidate(v0tableGrouped[iV0].collisionIds[ic], collision.posX(), collision.posY(), collision.posZ(), pTrack, nTrack, posTrackPar, negTrackPar, true, false, true)) { // candidate built, check pointing angle if (straHelper.v0.pointingAngle < bestPointingAngle) { bestPointingAngle = straHelper.v0.pointingAngle; From dbc7ff4bf1aa5ac6bccca60157c254bdd0e297c5 Mon Sep 17 00:00:00 2001 From: ALICE Builder Date: Thu, 18 Sep 2025 16:02:59 +0200 Subject: [PATCH 2/6] Please consider the following formatting changes (#484) --- PWGLF/Utils/strangenessBuilderHelper.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/PWGLF/Utils/strangenessBuilderHelper.h b/PWGLF/Utils/strangenessBuilderHelper.h index 926e9554845..6a8df19e71f 100644 --- a/PWGLF/Utils/strangenessBuilderHelper.h +++ b/PWGLF/Utils/strangenessBuilderHelper.h @@ -266,8 +266,8 @@ class strangenessBuilderHelper //_______________________________________________________________________ // standard build V0 function. Populates ::v0 object // ::v0 will be initialized to defaults if build fails - // --- useSelections: meant to maximize recovery, but beware high cost in CPU - // --- calculateProngDCAtoPV: optionally don't propagate prongs to PV, saves + // --- useSelections: meant to maximize recovery, but beware high cost in CPU + // --- calculateProngDCAtoPV: optionally don't propagate prongs to PV, saves // CPU, of interest when dealing with de-duplication (variable not checked) template bool buildV0Candidate(int collisionIndex, @@ -314,8 +314,8 @@ class strangenessBuilderHelper std::array dcaInfo; // do DCA to PV on TrackPar copies and not TrackParCov - // TrackPar preferred: don't calculate multiple scattering / CovMat changes - // Spares CPU since variables not checked + // TrackPar preferred: don't calculate multiple scattering / CovMat changes + // Spares CPU since variables not checked o2::track::TrackPar positiveTrackParamCopy(positiveTrackParam); o2::track::TrackPar negativeTrackParamCopy(negativeTrackParam); @@ -338,7 +338,7 @@ class strangenessBuilderHelper return false; } } - }else{ + } else { v0.positiveDCAxy = 0.0f; // default invalid v0.negativeDCAxy = 0.0f; // default invalid } @@ -510,8 +510,8 @@ class strangenessBuilderHelper std::array dcaInfo; // do DCA to PV on TrackPar copies and not TrackParCov - // TrackPar preferred: don't calculate multiple scattering / CovMat changes - // Spares CPU since variables not checked + // TrackPar preferred: don't calculate multiple scattering / CovMat changes + // Spares CPU since variables not checked o2::track::TrackPar positiveTrackParamCopy(positiveTrackParam); o2::track::TrackPar negativeTrackParamCopy(negativeTrackParam); From 4f3d4536cbedc18b2591124bb49ddafc068ce0dc Mon Sep 17 00:00:00 2001 From: David Dobrigkeit Chinellato Date: Fri, 26 Sep 2025 16:44:05 +0200 Subject: [PATCH 3/6] Cleanup and safety features --- PWGLF/Utils/strangenessBuilderHelper.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/PWGLF/Utils/strangenessBuilderHelper.h b/PWGLF/Utils/strangenessBuilderHelper.h index 6a8df19e71f..3eb89cabc8c 100644 --- a/PWGLF/Utils/strangenessBuilderHelper.h +++ b/PWGLF/Utils/strangenessBuilderHelper.h @@ -280,6 +280,8 @@ class strangenessBuilderHelper bool calculateCovariance = false, bool acceptTPCOnly = false) { + v0 = {}; // safe initialization: start new + if constexpr (useSelections) { // verify track quality if (positiveTrack.tpcNClsCrossedRows() < v0selections.minCrossedRows) { @@ -312,6 +314,7 @@ class strangenessBuilderHelper if constexpr (calculateProngDCAtoPV) { // Calculate DCA with respect to the collision associated to the V0 std::array dcaInfo; + dcaInfo[0] = dcaInfo[1] = 0.0f; // invalid // do DCA to PV on TrackPar copies and not TrackParCov // TrackPar preferred: don't calculate multiple scattering / CovMat changes @@ -350,10 +353,12 @@ class strangenessBuilderHelper nCand = fitter.process(positiveTrackParam, negativeTrackParam); } catch (...) { v0 = {}; + fitter.setCollinear(false); // even if returned, reset return false; } if (nCand == 0) { v0 = {}; + fitter.setCollinear(false); // even if returned, reset return false; } fitter.setCollinear(false); // proper cleaning: when exiting this loop, always reset to not collinear @@ -508,6 +513,7 @@ class strangenessBuilderHelper // Calculate DCA with respect to the collision associated to the V0 std::array dcaInfo; + dcaInfo[0] = dcaInfo[1] = 0.0f; // invalid // do DCA to PV on TrackPar copies and not TrackParCov // TrackPar preferred: don't calculate multiple scattering / CovMat changes @@ -738,6 +744,7 @@ class strangenessBuilderHelper // bachelor DCA track to PV // Calculate DCA with respect to the collision associated to the V0, not individual tracks std::array dcaInfo; + dcaInfo[0] = dcaInfo[1] = 0.0f; // invalid auto bachTrackPar = getTrackPar(bachelorTrack); o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, bachTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); From 0d49d9129d7b930f6ea5967d2a8117aec84a1816 Mon Sep 17 00:00:00 2001 From: David Dobrigkeit Chinellato Date: Fri, 26 Sep 2025 17:12:48 +0200 Subject: [PATCH 4/6] Minor adjustments --- PWGLF/Utils/strangenessBuilderHelper.h | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/PWGLF/Utils/strangenessBuilderHelper.h b/PWGLF/Utils/strangenessBuilderHelper.h index 3eb89cabc8c..6c96f0c23d2 100644 --- a/PWGLF/Utils/strangenessBuilderHelper.h +++ b/PWGLF/Utils/strangenessBuilderHelper.h @@ -314,7 +314,6 @@ class strangenessBuilderHelper if constexpr (calculateProngDCAtoPV) { // Calculate DCA with respect to the collision associated to the V0 std::array dcaInfo; - dcaInfo[0] = dcaInfo[1] = 0.0f; // invalid // do DCA to PV on TrackPar copies and not TrackParCov // TrackPar preferred: don't calculate multiple scattering / CovMat changes @@ -322,16 +321,18 @@ class strangenessBuilderHelper o2::track::TrackPar positiveTrackParamCopy(positiveTrackParam); o2::track::TrackPar negativeTrackParamCopy(negativeTrackParam); + dcaInfo[0] = dcaInfo[1] = 999.0f; // by default, take large value to make sure candidate accepted o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, positiveTrackParamCopy, 2.f, fitter.getMatCorrType(), &dcaInfo); v0.positiveDCAxy = dcaInfo[0]; if constexpr (useSelections) { - if (std::fabs(v0.positiveDCAxy) < v0selections.dcanegtopv) { + if (std::fabs(v0.positiveDCAxy) < v0selections.dcapostopv) { v0 = {}; return false; } } + dcaInfo[0] = dcaInfo[1] = 999.0f; // by default, take large value to make sure candidate accepted o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, negativeTrackParamCopy, 2.f, fitter.getMatCorrType(), &dcaInfo); v0.negativeDCAxy = dcaInfo[0]; @@ -369,6 +370,7 @@ class strangenessBuilderHelper std::array dcaV0Info; // propagate to collision vertex + dcaV0Info[0] = dcaV0Info[1] = 999.0f; // default DCA: large, use with care if propagation fails o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, V0Temp, 2.f, fitter.getMatCorrType(), &dcaV0Info); v0.v0DCAToPVxy = dcaV0Info[0]; v0.v0DCAToPVz = dcaV0Info[1]; @@ -513,7 +515,6 @@ class strangenessBuilderHelper // Calculate DCA with respect to the collision associated to the V0 std::array dcaInfo; - dcaInfo[0] = dcaInfo[1] = 0.0f; // invalid // do DCA to PV on TrackPar copies and not TrackParCov // TrackPar preferred: don't calculate multiple scattering / CovMat changes @@ -521,6 +522,7 @@ class strangenessBuilderHelper o2::track::TrackPar positiveTrackParamCopy(positiveTrackParam); o2::track::TrackPar negativeTrackParamCopy(negativeTrackParam); + dcaInfo[0] = dcaInfo[1] = 999.0f; // by default, take large value to make sure candidate accepted o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, positiveTrackParamCopy, 2.f, fitter.getMatCorrType(), &dcaInfo); v0.positiveDCAxy = dcaInfo[0]; @@ -529,6 +531,7 @@ class strangenessBuilderHelper return false; } + dcaInfo[0] = dcaInfo[1] = 999.0f; // reset to default value o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, negativeTrackParamCopy, 2.f, fitter.getMatCorrType(), &dcaInfo); v0.negativeDCAxy = dcaInfo[0]; @@ -744,7 +747,7 @@ class strangenessBuilderHelper // bachelor DCA track to PV // Calculate DCA with respect to the collision associated to the V0, not individual tracks std::array dcaInfo; - dcaInfo[0] = dcaInfo[1] = 0.0f; // invalid + dcaInfo[0] = dcaInfo[1] = 999.0f; // by default, take large value to make sure candidate accepted auto bachTrackPar = getTrackPar(bachelorTrack); o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, bachTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); @@ -969,13 +972,18 @@ class strangenessBuilderHelper // bachelor DCA track to PV // Calculate DCA with respect to the collision associated to the V0, not individual tracks std::array dcaInfo; + dcaInfo[0] = dcaInfo[1] = 999.0f; // by default, take large value to make sure candidate accepted auto bachTrackPar = getTrackPar(bachelorTrack); o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, bachTrackPar, 2.f, fitter.getMatCorrType(), &dcaInfo); cascade.bachelorDCAxy = dcaInfo[0]; + + dcaInfo[0] = dcaInfo[1] = 999.0f; // by default, take large value to make sure candidate accepted o2::track::TrackParCov posTrackParCovForDCA = getTrackParCov(positiveTrack); o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, posTrackParCovForDCA, 2.f, fitter.getMatCorrType(), &dcaInfo); cascade.positiveDCAxy = dcaInfo[0]; + + dcaInfo[0] = dcaInfo[1] = 999.0f; // by default, take large value to make sure candidate accepted o2::track::TrackParCov negTrackParCovForDCA = getTrackParCov(negativeTrack); o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, negTrackParCovForDCA, 2.f, fitter.getMatCorrType(), &dcaInfo); cascade.negativeDCAxy = dcaInfo[0]; @@ -1291,8 +1299,7 @@ class strangenessBuilderHelper o2::track::TrackPar wrongV0 = fitter.createParentTrackPar(); wrongV0.setAbsCharge(0); // charge zero std::array dcaInfo; - dcaInfo[0] = 999; - dcaInfo[1] = 999; + dcaInfo[0] = dcaInfo[1] = 999.0f; // by default, take large value // bachelor-baryon DCAxy to PV o2::base::Propagator::Instance()->propagateToDCABxByBz({pvX, pvY, pvZ}, wrongV0, 2.f, fitter.getMatCorrType(), &dcaInfo); From f114be6924844607806cffff166eda420ef35805 Mon Sep 17 00:00:00 2001 From: David Dobrigkeit Chinellato Date: Fri, 26 Sep 2025 23:22:09 +0200 Subject: [PATCH 5/6] Minor extras --- PWGLF/Utils/strangenessBuilderHelper.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PWGLF/Utils/strangenessBuilderHelper.h b/PWGLF/Utils/strangenessBuilderHelper.h index 6c96f0c23d2..b86b7c19b1d 100644 --- a/PWGLF/Utils/strangenessBuilderHelper.h +++ b/PWGLF/Utils/strangenessBuilderHelper.h @@ -693,6 +693,8 @@ class strangenessBuilderHelper bool useCascadeMomentumAtPV = false, bool processCovariances = false) { + cascade = {}; // initialize / empty (extra safety) + // verify track quality if (positiveTrack.tpcNClsCrossedRows() < cascadeselections.minCrossedRows) { cascade = {}; @@ -924,6 +926,8 @@ class strangenessBuilderHelper bool kfDoDCAFitterPreMinimV0 = false, bool kfDoDCAFitterPreMinimCasc = false) { + cascade = {}; // initialize / empty (extra safety) + //*>~<*>~<*>~<*>~<*>~<*>~<*>~<*>~<*>~<* // KF particle based rebuilding // dispenses prior V0 generation, uses constrained (re-)fit based on bachelor charge From 88eb9bbfe6eb61e51b95c7ba8c0ebba9839192c7 Mon Sep 17 00:00:00 2001 From: ddobrigk Date: Sat, 27 Sep 2025 11:22:08 +0200 Subject: [PATCH 6/6] Adjust TPC-only skip test --- PWGLF/Utils/strangenessBuilderHelper.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGLF/Utils/strangenessBuilderHelper.h b/PWGLF/Utils/strangenessBuilderHelper.h index b86b7c19b1d..23be7279c56 100644 --- a/PWGLF/Utils/strangenessBuilderHelper.h +++ b/PWGLF/Utils/strangenessBuilderHelper.h @@ -301,11 +301,11 @@ class strangenessBuilderHelper v0 = {}; return false; } - if (!acceptTPCOnly && !positiveTrack.hasITS()) { + if (!acceptTPCOnly && !positiveTrack.hasITS() && !negativeTrack.hasTRD() && !negativeTrack.hasTOF()) { v0 = {}; return false; } - if (!acceptTPCOnly && !negativeTrack.hasITS()) { + if (!acceptTPCOnly && !negativeTrack.hasITS() && !negativeTrack.hasTRD() && !negativeTrack.hasTOF()) { v0 = {}; return false; }