From 098c3fd636f63061f0e1f6c3461b2ba737d74fc1 Mon Sep 17 00:00:00 2001 From: Anton Riedel Date: Wed, 19 Nov 2025 17:49:51 +0100 Subject: [PATCH 1/2] Feat: only fill non-empty collisions --- PWGCF/Femto/Core/cascadeBuilder.h | 12 ++-- PWGCF/Femto/Core/collisionBuilder.h | 13 ++++ PWGCF/Femto/Core/kinkBuilder.h | 11 +-- PWGCF/Femto/Core/trackBuilder.h | 6 +- PWGCF/Femto/Core/twoTrackResonanceBuilder.h | 13 ++-- PWGCF/Femto/Core/v0Builder.h | 14 ++-- PWGCF/Femto/TableProducer/femtoProducer.cxx | 80 ++++++++++----------- 7 files changed, 87 insertions(+), 62 deletions(-) diff --git a/PWGCF/Femto/Core/cascadeBuilder.h b/PWGCF/Femto/Core/cascadeBuilder.h index ee43cdd319c..0dc0870afed 100644 --- a/PWGCF/Femto/Core/cascadeBuilder.h +++ b/PWGCF/Femto/Core/cascadeBuilder.h @@ -379,8 +379,8 @@ class CascadeBuilder LOG(info) << "Initialization done..."; } - template - void fillCascades(T1& collisionProducts, T2& trackProducts, T3& cascadeProducts, T4 const& fullCascades, T5 const& fullTracks, T6 const& col, T7& trackBuilder, T8& indexMap) + template + void fillCascades(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4& trackProducts, T5& cascadeProducts, T6 const& fullCascades, T7 const& fullTracks, T8& trackBuilder, T9& indexMap) { if (!mFillAnyTable) { return; @@ -396,9 +396,11 @@ class CascadeBuilder mCascadeSelection.applySelections(cascade, fullTracks, col); if (mCascadeSelection.passesAllRequiredSelections()) { - auto bachelor = cascade.template bachelor_as(); - auto posDaughter = cascade.template posTrack_as(); - auto negDaughter = cascade.template negTrack_as(); + auto bachelor = cascade.template bachelor_as(); + auto posDaughter = cascade.template posTrack_as(); + auto negDaughter = cascade.template negTrack_as(); + + collisionBuilder.template fillCollision(collisionProducts, col); bachelorIndex = trackBuilder.template getDaughterIndex(bachelor, trackProducts, collisionProducts, indexMap); posDaughterIndex = trackBuilder.template getDaughterIndex(posDaughter, trackProducts, collisionProducts, indexMap); diff --git a/PWGCF/Femto/Core/collisionBuilder.h b/PWGCF/Femto/Core/collisionBuilder.h index 468a5ac7b0c..412f2cab555 100644 --- a/PWGCF/Femto/Core/collisionBuilder.h +++ b/PWGCF/Femto/Core/collisionBuilder.h @@ -445,6 +445,11 @@ class CollisionBuilder if (!mFillAnyTable) { return; } + + if (mCollisionAleadyFilled) { + return; + } + if (mProducedCollisions) { collisionProducts.producedCollision(col.posZ(), col.multNTracksPV(), @@ -482,10 +487,18 @@ class CollisionBuilder collisionProducts.producedQns(utils::qn(col)); } } + + mCollisionAleadyFilled = true; + } + + void reset() + { + mCollisionAleadyFilled = false; } private: CollisionSelection mCollisionSelection; + bool mCollisionAleadyFilled = false; Zorro mZorro; bool mUseTrigger = false; int mRunNumber = -1; diff --git a/PWGCF/Femto/Core/kinkBuilder.h b/PWGCF/Femto/Core/kinkBuilder.h index 9f95efa3e3a..18deddf60d0 100644 --- a/PWGCF/Femto/Core/kinkBuilder.h +++ b/PWGCF/Femto/Core/kinkBuilder.h @@ -396,8 +396,8 @@ class KinkBuilder LOG(info) << "Initialization done..."; } - template - void fillKinks(T1& collisionProducts, T2& trackProducts, T3& kinkProducts, T4 const& kinks, T5 const& tracks, T6& trackBuilder, T7& indexMap) + template + void fillKinks(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4& trackProducts, T5& kinkProducts, T6 const& kinks, T7 const& tracks, T8& trackBuilder, T9& indexMap) { if (!mFillAnyTable) { return; @@ -420,7 +420,8 @@ class KinkBuilder continue; } - auto daughter = kink.template trackDaug_as(); + auto daughter = kink.template trackDaug_as(); + collisionBuilder.template fillCollision(collisionProducts, col); daughterIndex = trackBuilder.template getDaughterIndex(daughter, trackProducts, collisionProducts, indexMap); if constexpr (modes::isEqual(kinkType, modes::Kink::kSigma)) { fillSigma(collisionProducts, kinkProducts, kink, daughterIndex); @@ -432,7 +433,7 @@ class KinkBuilder } template - void fillSigma(T1& collisionProducts, T2& kinkProducts, T3 const& kink, int daughterIndex) + void fillSigma(T1& collisionProducts, T2& kinkProducts, T3 const& kink, int32_t daughterIndex) { float mass = kink.mSigmaMinus(); @@ -489,7 +490,7 @@ class KinkBuilder } template - void fillSigmaPlus(T1& collisionProducts, T2& kinkProducts, T3 const& kink, int daughterIndex) + void fillSigmaPlus(T1& collisionProducts, T2& kinkProducts, T3 const& kink, int32_t daughterIndex) { float mass = kink.mSigmaPlus(); diff --git a/PWGCF/Femto/Core/trackBuilder.h b/PWGCF/Femto/Core/trackBuilder.h index f744a1a3873..8547847fb86 100644 --- a/PWGCF/Femto/Core/trackBuilder.h +++ b/PWGCF/Femto/Core/trackBuilder.h @@ -586,8 +586,8 @@ class TrackBuilder LOG(info) << "Initialization done..."; } - template - void fillTracks(T1 const& tracks, T2& trackProducts, T3& collisionProducts, T4& indexMap) + template + void fillTracks(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4 const& tracks, T5& trackProducts, T6& indexMap) { if (!mFillAnyTable) { return; @@ -600,6 +600,8 @@ class TrackBuilder if (!mTrackSelection.passesAllRequiredSelections()) { continue; } + + collisionBuilder.template fillCollision(collisionProducts, col); this->fillTrack(track, trackProducts, collisionProducts, indexMap); } } diff --git a/PWGCF/Femto/Core/twoTrackResonanceBuilder.h b/PWGCF/Femto/Core/twoTrackResonanceBuilder.h index defdc4f963a..e5931365ff5 100644 --- a/PWGCF/Femto/Core/twoTrackResonanceBuilder.h +++ b/PWGCF/Femto/Core/twoTrackResonanceBuilder.h @@ -510,19 +510,19 @@ class TwoTrackResonanceBuilder LOG(info) << "Initialization done..."; } - template - void fillResonances(T1& collisionProducts, T2& trackProducts, T3& resonanceProducts, T4& groupPositiveTracks, T5& groupNegativeTracks, T6& trackBuilder, T7& indexMap) + template + void fillResonances(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4& trackProducts, T5& resonanceProducts, T6& groupPositiveTracks, T7& groupNegativeTracks, T8& trackBuilder, T9& indexMap) { if (!mFillAnyTable) { return; } for (auto const& [positiveTrack, negativeTrack] : o2::soa::combinations(o2::soa::CombinationsFullIndexPolicy(groupPositiveTracks, groupNegativeTracks))) { - this->fillResonance(collisionProducts, trackProducts, resonanceProducts, positiveTrack, negativeTrack, trackBuilder, indexMap); + this->fillResonance(col, collisionBuilder, collisionProducts, trackProducts, resonanceProducts, positiveTrack, negativeTrack, trackBuilder, indexMap); } } - template - void fillResonance(T1& collisionProducts, T2& trackProducts, T3& resonanceProducts, T4 const& posDaughter, T4 const& negDaughter, T5& trackBuilder, T6& indexMap) + template + void fillResonance(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4& trackProducts, T5& resonanceProducts, T6 const& posDaughter, T7 const& negDaughter, T8& trackBuilder, T9& indexMap) { mTwoTrackResonanceSelection.reconstructResonance(posDaughter, negDaughter); @@ -532,6 +532,9 @@ class TwoTrackResonanceBuilder mTwoTrackResonanceSelection.applySelections(posDaughter, negDaughter); // for resonances selection are only applied to daughter tracks int64_t posDaughterIndex = 0; int64_t negDaughterIndex = 0; + + collisionBuilder.template fillCollision(collisionProducts, col); + posDaughterIndex = trackBuilder.template getDaughterIndex(posDaughter, trackProducts, collisionProducts, indexMap); negDaughterIndex = trackBuilder.template getDaughterIndex(negDaughter, trackProducts, collisionProducts, indexMap); diff --git a/PWGCF/Femto/Core/v0Builder.h b/PWGCF/Femto/Core/v0Builder.h index d015686dee5..32a944b1ef1 100644 --- a/PWGCF/Femto/Core/v0Builder.h +++ b/PWGCF/Femto/Core/v0Builder.h @@ -371,8 +371,8 @@ class V0Builder LOG(info) << "Initialization done..."; } - template - void fillV0s(T1& collisionProducts, T2& trackProducts, T3& v0products, T4 const& v0s, T5 const& tracks, T6& trackBuilder, T7& indexMap) + template + void fillV0s(T1 const& col, T2& collisionBuilder, T3& collisionProducts, T4& trackProducts, T5& v0products, T6 const& v0s, T7 const& tracks, T8& trackBuilder, T9& indexMap) { if (!mFillAnyTable) { return; @@ -385,10 +385,14 @@ class V0Builder } mV0Selection.applySelections(v0, tracks); if (mV0Selection.passesAllRequiredSelections()) { - auto posDaughter = v0.template posTrack_as(); - auto negDaughter = v0.template negTrack_as(); + auto posDaughter = v0.template posTrack_as(); + auto negDaughter = v0.template negTrack_as(); + + collisionBuilder.template fillCollision(collisionProducts, col); + posDaughterIndex = trackBuilder.template getDaughterIndex(posDaughter, trackProducts, collisionProducts, indexMap); negDaughterIndex = trackBuilder.template getDaughterIndex(negDaughter, trackProducts, collisionProducts, indexMap); + if constexpr (modes::isEqual(v0Type, modes::V0::kLambda)) { fillLambda(collisionProducts, v0products, v0, 1.f, posDaughterIndex, negDaughterIndex); } @@ -439,7 +443,7 @@ class V0Builder } template - void fillK0short(T1& collisionProducts, T2& v0products, T3 const& v0, int posDaughterIndex, int negDaughterIndex) + void fillK0short(T1& collisionProducts, T2& v0products, T3 const& v0, int32_t posDaughterIndex, int32_t negDaughterIndex) { if (mProduceK0shorts) { v0products.producedK0shorts(collisionProducts.producedCollision.lastIndex(), diff --git a/PWGCF/Femto/TableProducer/femtoProducer.cxx b/PWGCF/Femto/TableProducer/femtoProducer.cxx index fa4779369d0..f28a7cc265b 100644 --- a/PWGCF/Femto/TableProducer/femtoProducer.cxx +++ b/PWGCF/Femto/TableProducer/femtoProducer.cxx @@ -211,57 +211,57 @@ struct FemtoProducer { template bool processCollisions(T1 const& col, T2 const& /* bcs*/, T3 const& tracks) { + collisionBuilder.reset(); auto bc = col.template bc_as(); collisionBuilder.initCollision(bc, col, tracks, ccdb, hRegistry); if (!collisionBuilder.checkCollision(col)) { return false; } - collisionBuilder.fillCollision(collisionBuilderProducts, col); return true; } - template - void processTracks(T1 const& tracksWithItsPid) + template + void processTracks(T1 const& col, T2 const& tracksWithItsPid) { - trackBuilder.fillTracks(tracksWithItsPid, trackBuilderProducts, collisionBuilderProducts, indexMapTracks); + trackBuilder.fillTracks(col, collisionBuilder, collisionBuilderProducts, tracksWithItsPid, trackBuilderProducts, indexMapTracks); } - template + template void processResonances(T1 const& col, T2 const& /*tracks*/) { auto groupPositiveTracks = partitionPositiveDaughters->sliceByCached(track::collisionId, col.globalIndex(), cache); auto groupNegativeTracks = partitionNegativeDaughters->sliceByCached(track::collisionId, col.globalIndex(), cache); - rho0Builder.fillResonances(collisionBuilderProducts, trackBuilderProducts, twoTrackResonanceBuilderProducts, groupPositiveTracks, groupNegativeTracks, trackBuilder, indexMapTracks); - phiBuilder.fillResonances(collisionBuilderProducts, trackBuilderProducts, twoTrackResonanceBuilderProducts, groupPositiveTracks, groupNegativeTracks, trackBuilder, indexMapTracks); - kstar0Builder.fillResonances(collisionBuilderProducts, trackBuilderProducts, twoTrackResonanceBuilderProducts, groupPositiveTracks, groupNegativeTracks, trackBuilder, indexMapTracks); - kstar0barBuilder.fillResonances(collisionBuilderProducts, trackBuilderProducts, twoTrackResonanceBuilderProducts, groupPositiveTracks, groupNegativeTracks, trackBuilder, indexMapTracks); + rho0Builder.fillResonances(col, collisionBuilder, collisionBuilderProducts, trackBuilderProducts, twoTrackResonanceBuilderProducts, groupPositiveTracks, groupNegativeTracks, trackBuilder, indexMapTracks); + phiBuilder.fillResonances(col, collisionBuilder, collisionBuilderProducts, trackBuilderProducts, twoTrackResonanceBuilderProducts, groupPositiveTracks, groupNegativeTracks, trackBuilder, indexMapTracks); + kstar0Builder.fillResonances(col, collisionBuilder, collisionBuilderProducts, trackBuilderProducts, twoTrackResonanceBuilderProducts, groupPositiveTracks, groupNegativeTracks, trackBuilder, indexMapTracks); + kstar0barBuilder.fillResonances(col, collisionBuilder, collisionBuilderProducts, trackBuilderProducts, twoTrackResonanceBuilderProducts, groupPositiveTracks, groupNegativeTracks, trackBuilder, indexMapTracks); } // add v0s - template - void processV0s(T1 const& tracks, T2 const& v0s) + template + void processV0s(T1 const& col, T2 const& tracks, T3 const& v0s) { - lambdaBuilder.fillV0s(collisionBuilderProducts, trackBuilderProducts, v0builderProducts, v0s, tracks, trackBuilder, indexMapTracks); - antilambdaBuilder.fillV0s(collisionBuilderProducts, trackBuilderProducts, v0builderProducts, v0s, tracks, trackBuilder, indexMapTracks); - k0shortBuilder.fillV0s(collisionBuilderProducts, trackBuilderProducts, v0builderProducts, v0s, tracks, trackBuilder, indexMapTracks); + lambdaBuilder.fillV0s(col, collisionBuilder, collisionBuilderProducts, trackBuilderProducts, v0builderProducts, v0s, tracks, trackBuilder, indexMapTracks); + antilambdaBuilder.fillV0s(col, collisionBuilder, collisionBuilderProducts, trackBuilderProducts, v0builderProducts, v0s, tracks, trackBuilder, indexMapTracks); + k0shortBuilder.fillV0s(col, collisionBuilder, collisionBuilderProducts, trackBuilderProducts, v0builderProducts, v0s, tracks, trackBuilder, indexMapTracks); } // add kinks - template - void processKinks(T1 const& tracks, T2 const& kinks) + template + void processKinks(T1 const& col, T2 const& tracks, T3 const& kinks) { - sigmaBuilder.fillKinks(collisionBuilderProducts, trackBuilderProducts, kinkBuilderProducts, kinks, tracks, trackBuilder, indexMapTracks); - sigmaPlusBuilder.fillKinks(collisionBuilderProducts, trackBuilderProducts, kinkBuilderProducts, kinks, tracks, trackBuilder, indexMapTracks); + sigmaBuilder.fillKinks(col, collisionBuilder, collisionBuilderProducts, trackBuilderProducts, kinkBuilderProducts, kinks, tracks, trackBuilder, indexMapTracks); + sigmaPlusBuilder.fillKinks(col, collisionBuilder, collisionBuilderProducts, trackBuilderProducts, kinkBuilderProducts, kinks, tracks, trackBuilder, indexMapTracks); } // add cascades - template + template void processCascades(T1 const& col, T2 const& tracks, T3 const& cascades) { - xiBuilder.fillCascades(collisionBuilderProducts, trackBuilderProducts, cascadeBuilderProducts, - cascades, tracks, col, trackBuilder, indexMapTracks); - omegaBuilder.fillCascades(collisionBuilderProducts, trackBuilderProducts, cascadeBuilderProducts, - cascades, tracks, col, trackBuilder, indexMapTracks); + xiBuilder.fillCascades(col, collisionBuilder, collisionBuilderProducts, trackBuilderProducts, cascadeBuilderProducts, + cascades, tracks, trackBuilder, indexMapTracks); + omegaBuilder.fillCascades(col, collisionBuilder, collisionBuilderProducts, trackBuilderProducts, cascadeBuilderProducts, + cascades, tracks, trackBuilder, indexMapTracks); } // proccess functions @@ -275,8 +275,8 @@ struct FemtoProducer { indexMapTracks.clear(); auto tracksWithItsPid = o2::soa::Attach(tracks); - processTracks(tracksWithItsPid); - processResonances(col, tracks); + processTracks(col, tracksWithItsPid); + processResonances(col, tracks); } PROCESS_SWITCH(FemtoProducer, processTracksRun3pp, "Process tracks", true); @@ -292,9 +292,9 @@ struct FemtoProducer { indexMapTracks.clear(); auto tracksWithItsPid = o2::soa::Attach(tracks); - processTracks(tracksWithItsPid); - processResonances(col, tracks); - processV0s(tracks, v0s); + processTracks(col, tracksWithItsPid); + processResonances(col, tracks); + processV0s(col, tracks, v0s); }; PROCESS_SWITCH(FemtoProducer, processTracksV0sRun3pp, "Process tracks and v0s", false); @@ -310,9 +310,9 @@ struct FemtoProducer { indexMapTracks.clear(); auto tracksWithItsPid = o2::soa::Attach(tracks); - processTracks(tracksWithItsPid); - processResonances(col, tracks); - processKinks(tracks, kinks); + processTracks(col, tracksWithItsPid); + processResonances(col, tracks); + processKinks(col, tracks, kinks); } PROCESS_SWITCH(FemtoProducer, processTracksKinksRun3pp, "Process tracks and kinks", false); @@ -329,10 +329,10 @@ struct FemtoProducer { indexMapTracks.clear(); auto tracksWithItsPid = o2::soa::Attach(tracks); - processTracks(tracksWithItsPid); - processResonances(col, tracks); - processV0s(tracks, v0s); - processCascades(col, tracks, cascades); + processTracks(col, tracksWithItsPid); + processResonances(col, tracks); + processV0s(col, tracks, v0s); + processCascades(col, tracks, cascades); } PROCESS_SWITCH(FemtoProducer, processTracksV0sCascadesRun3pp, "Provide Tracks, V0s and Cascades for Run3", false); @@ -350,11 +350,11 @@ struct FemtoProducer { indexMapTracks.clear(); auto tracksWithItsPid = o2::soa::Attach(tracks); - processTracks(tracksWithItsPid); - processResonances(col, tracks); - processV0s(tracks, v0s); - processKinks(tracks, kinks); - processCascades(col, tracks, cascades); + processTracks(col, tracksWithItsPid); + processResonances(col, tracks); + processV0s(col, tracks, v0s); + processKinks(col, tracks, kinks); + processCascades(col, tracks, cascades); } PROCESS_SWITCH(FemtoProducer, processTracksV0sCascadesKinksRun3pp, "Provide Tracks, V0s and Cascades for Run3", false); }; From a98a806cd09acdda69e4ec64737619df79856824 Mon Sep 17 00:00:00 2001 From: Anton Riedel Date: Wed, 19 Nov 2025 17:57:24 +0100 Subject: [PATCH 2/2] Feat: use consistent data type for indices --- PWGCF/Femto/Core/cascadeBuilder.h | 6 +++--- PWGCF/Femto/Core/kinkBuilder.h | 4 ++-- PWGCF/Femto/Core/v0Builder.h | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/PWGCF/Femto/Core/cascadeBuilder.h b/PWGCF/Femto/Core/cascadeBuilder.h index 0dc0870afed..5ef04a91ab7 100644 --- a/PWGCF/Femto/Core/cascadeBuilder.h +++ b/PWGCF/Femto/Core/cascadeBuilder.h @@ -386,9 +386,9 @@ class CascadeBuilder return; } - int32_t bachelorIndex = 0; - int32_t posDaughterIndex = 0; - int32_t negDaughterIndex = 0; + int64_t bachelorIndex = 0; + int64_t posDaughterIndex = 0; + int64_t negDaughterIndex = 0; for (const auto& cascade : fullCascades) { if (!mCascadeSelection.checkCandidate(cascade)) { continue; diff --git a/PWGCF/Femto/Core/kinkBuilder.h b/PWGCF/Femto/Core/kinkBuilder.h index 18deddf60d0..4152d6fcf9a 100644 --- a/PWGCF/Femto/Core/kinkBuilder.h +++ b/PWGCF/Femto/Core/kinkBuilder.h @@ -433,7 +433,7 @@ class KinkBuilder } template - void fillSigma(T1& collisionProducts, T2& kinkProducts, T3 const& kink, int32_t daughterIndex) + void fillSigma(T1& collisionProducts, T2& kinkProducts, T3 const& kink, int64_t daughterIndex) { float mass = kink.mSigmaMinus(); @@ -490,7 +490,7 @@ class KinkBuilder } template - void fillSigmaPlus(T1& collisionProducts, T2& kinkProducts, T3 const& kink, int32_t daughterIndex) + void fillSigmaPlus(T1& collisionProducts, T2& kinkProducts, T3 const& kink, int64_t daughterIndex) { float mass = kink.mSigmaPlus(); diff --git a/PWGCF/Femto/Core/v0Builder.h b/PWGCF/Femto/Core/v0Builder.h index 32a944b1ef1..38f71a51e0b 100644 --- a/PWGCF/Femto/Core/v0Builder.h +++ b/PWGCF/Femto/Core/v0Builder.h @@ -407,7 +407,7 @@ class V0Builder } template - void fillLambda(T1& collisionProducts, T2& v0products, T3 const& v0, float sign, int32_t posDaughterIndex, int32_t negDaughterIndex) + void fillLambda(T1& collisionProducts, T2& v0products, T3 const& v0, float sign, int64_t posDaughterIndex, int64_t negDaughterIndex) { float mass, massAnti; if (sign > 0.f) { @@ -443,7 +443,7 @@ class V0Builder } template - void fillK0short(T1& collisionProducts, T2& v0products, T3 const& v0, int32_t posDaughterIndex, int32_t negDaughterIndex) + void fillK0short(T1& collisionProducts, T2& v0products, T3 const& v0, int64_t posDaughterIndex, int64_t negDaughterIndex) { if (mProduceK0shorts) { v0products.producedK0shorts(collisionProducts.producedCollision.lastIndex(),