From 53761b40cd0e9290ecc8f28202c4ac27d5203255 Mon Sep 17 00:00:00 2001 From: jesgum Date: Tue, 27 Jan 2026 10:11:02 +0100 Subject: [PATCH 1/4] Update multicharm table producer with lutConfigId at collision level --- .../TableProducer/alice3MulticharmFinder.cxx | 59 ++++++------------- 1 file changed, 18 insertions(+), 41 deletions(-) diff --git a/ALICE3/TableProducer/alice3MulticharmFinder.cxx b/ALICE3/TableProducer/alice3MulticharmFinder.cxx index 97e4b3bd214..a493e1dfea4 100644 --- a/ALICE3/TableProducer/alice3MulticharmFinder.cxx +++ b/ALICE3/TableProducer/alice3MulticharmFinder.cxx @@ -68,7 +68,8 @@ using namespace o2::framework::expressions; #define BIT_CHECK(var, nbit) ((var) & (static_cast(1) << (nbit))) #define GET_HIST(type, name) std::get>(histPointers[name]) -using Alice3Tracks = soa::Join; +using Alice3Tracks = soa::Join; +using Alice3Collision = soa::Join; struct Alice3MulticharmFinder { SliceCache cache; @@ -388,12 +389,6 @@ struct Alice3MulticharmFinder { return returnValue; } - template - bool checkSameLUTConf(TTrackType const& track1, const int track2) - { - return track1.lutConfigId() == track2; - } - void init(InitContext&) { // initialize O2 2-prong fitter (only once) @@ -489,7 +484,7 @@ struct Alice3MulticharmFinder { } } - void initConf(const int icfg) + void initDetectorConfiguration(const int icfg) { if (std::find(savedConfigs.begin(), savedConfigs.end(), icfg) != savedConfigs.end()) { return; @@ -498,7 +493,7 @@ struct Alice3MulticharmFinder { savedConfigs.push_back(icfg); // do more plots - std::string histPath = "Configuration_" + std::to_string(icfg) + "/"; + const std::string histPath = "Configuration_" + std::to_string(icfg) + "/"; histPointers.insert({histPath + "hMassXiCC", histos.add((histPath + "hMassXiCC").c_str(), "hMassXiCC", {kTH1D, {{axisXiCCMass}}})}); histPointers.insert({histPath + "hNCollisions", histos.add((histPath + "hNCollisions").c_str(), "hNCollisions", {kTH1D, {{2, 0.5, 2.5}}})}); histPointers.insert({histPath + "hNTracks", histos.add((histPath + "hNTracks").c_str(), "hNTracks", {kTH1D, {{20000, 0, 20000}}})}); @@ -519,19 +514,26 @@ struct Alice3MulticharmFinder { } //*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+* - void processFindXiCC(aod::Collision const& collision, Alice3Tracks const& tracks, aod::McParticles const&, aod::UpgradeCascades const& cascades) + void processFindXiCC(Alice3Collision::iterator const& collision, Alice3Tracks const& tracks, aod::McParticles const&, aod::UpgradeCascades const& cascades) { + const std::string histPath = "Configuration_" + std::to_string(collision.lutConfigId()) + "/"; + initDetectorConfiguration(collision.lutConfigId()); + + GET_HIST(TH1, histPath + "hNCollisions")->Fill(1); + GET_HIST(TH1, histPath + "hNTracks")->Fill(tracks.size()); + std::cout << tracks.size() << std::endl; + if (tracks.size() < minNTracks.value[collision.lutConfigId()]) { + return; + } + GET_HIST(TH1, histPath + "hNCollisions")->Fill(2); + // group with this collision // n.b. cascades do not need to be grouped, being used directly in iterator-grouping auto picTracksGrouped = picTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); auto piccTracksGrouped = piccTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - static constexpr int MaxLUTConfigs = 20; - std::vector nTracks(MaxLUTConfigs); - for (auto const& track : tracks) { - int lutConfigId = track.lutConfigId(); - nTracks[lutConfigId]++; + for (auto const& track : tracks) { if (BIT_CHECK(track.decayMap(), kTruePiFromXiC)) { histos.fill(HIST("h2dDCAxyVsPtPiFromXiC"), track.pt(), track.dcaXY() * 1e+4); } @@ -542,19 +544,6 @@ struct Alice3MulticharmFinder { for (auto const& xiCand : cascades) { auto xi = xiCand.cascadeTrack_as(); // de-reference cascade track - int lutConfigId = xi.lutConfigId(); - initConf(lutConfigId); - if (minNTracks.value.size() < static_cast(lutConfigId)) { - if (nTracks[lutConfigId] < minNTracks.value.front()) { - continue; // fallback to first - } - } else { - if (nTracks[lutConfigId] < minNTracks.value[lutConfigId]) { - continue; - } - } - - std::string histPath = "Configuration_" + std::to_string(lutConfigId) + "/"; histos.fill(HIST("hMassXi"), xiCand.mXi()); histos.fill(HIST("h2dDCAxyVsPtXiFromXiC"), xi.pt(), xi.dcaXY() * 1e+4); if (std::fabs(xiCand.mXi() - o2::constants::physics::MassXiMinus) > xiMassWindow) { @@ -583,10 +572,6 @@ struct Alice3MulticharmFinder { histos.fill(HIST("hMinXiDecayRadius"), xiCand.cascRadius()); for (auto const& pi1c : picTracksGrouped) { - if (!checkSameLUTConf(pi1c, lutConfigId)) { - continue; - } - if (mcSameMotherCheck && !checkSameMother(xi, pi1c)) { continue; } @@ -609,10 +594,6 @@ struct Alice3MulticharmFinder { histos.fill(HIST("hInnerTOFTrackTimeRecoPi1c"), pi1cTOFDiffInner); // second pion from XiC decay for starts here for (auto const& pi2c : picTracksGrouped) { - if (!checkSameLUTConf(pi2c, lutConfigId)) { - continue; - } - if (mcSameMotherCheck && !checkSameMother(xi, pi2c)) { continue; // keep only if same mother } @@ -691,10 +672,6 @@ struct Alice3MulticharmFinder { // attempt XiCC finding uint32_t nCombinationsCC = 0; for (auto const& picc : piccTracksGrouped) { - if (!checkSameLUTConf(picc, lutConfigId)) { - continue; - } - if (mcSameMotherCheck && !checkSameMotherExtra(xi, picc)) { continue; } @@ -823,7 +800,7 @@ struct Alice3MulticharmFinder { xicDecayDistanceFromPV, xiccProperLength, pi1c.pt(), pi2c.pt(), picc.pt(), - lutConfigId); + collision.lutConfigId()); multiCharmPID( pi1cTOFDiffInner, pi1c.nSigmaPionInnerTOF(), From b63b905fb7535c95224329097b69fbd3eb2d8aab Mon Sep 17 00:00:00 2001 From: jesgum Date: Tue, 27 Jan 2026 10:15:06 +0100 Subject: [PATCH 2/4] Remove unused variables --- ALICE3/Tasks/alice3Multicharm.cxx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ALICE3/Tasks/alice3Multicharm.cxx b/ALICE3/Tasks/alice3Multicharm.cxx index 9e8be75ebf5..69c6fce9a5c 100644 --- a/ALICE3/Tasks/alice3Multicharm.cxx +++ b/ALICE3/Tasks/alice3Multicharm.cxx @@ -69,13 +69,9 @@ using MultiCharmTracksFull = soa::Join histPointers; - std::vector savedConfigs; - std::string histPath; std::map pdgToBin; o2::ml::OnnxModel bdtMCharm; - std::map metadata; o2::ccdb::CcdbApi ccdbApi; Service ccdb; @@ -131,6 +127,7 @@ struct Alice3Multicharm { Configurable xiccMinProperLength{"xiccMinProperLength", -1, "Minimum proper length for Xicc decay (cm)"}; Configurable xiccMaxProperLength{"xiccMaxProperLength", 1e+4, "Minimum proper length for Xicc decay (cm)"}; Configurable otfConfig{"otfConfig", 0, "OTF configuration flag"}; + Filter configFilter = (aod::otfmulticharm::lutConfigId == otfConfig); void init(InitContext&) From 6ffa33357de3de90d867b818ecf7b61d9dc79b75 Mon Sep 17 00:00:00 2001 From: jesgum Date: Tue, 27 Jan 2026 10:18:12 +0100 Subject: [PATCH 3/4] Remove debug logging --- ALICE3/TableProducer/alice3MulticharmFinder.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/ALICE3/TableProducer/alice3MulticharmFinder.cxx b/ALICE3/TableProducer/alice3MulticharmFinder.cxx index a493e1dfea4..1607eb135be 100644 --- a/ALICE3/TableProducer/alice3MulticharmFinder.cxx +++ b/ALICE3/TableProducer/alice3MulticharmFinder.cxx @@ -521,7 +521,6 @@ struct Alice3MulticharmFinder { GET_HIST(TH1, histPath + "hNCollisions")->Fill(1); GET_HIST(TH1, histPath + "hNTracks")->Fill(tracks.size()); - std::cout << tracks.size() << std::endl; if (tracks.size() < minNTracks.value[collision.lutConfigId()]) { return; } From 6af3e8a391ae3e23ae38b4ce558b676c08ece531 Mon Sep 17 00:00:00 2001 From: jesgum Date: Tue, 27 Jan 2026 10:18:38 +0100 Subject: [PATCH 4/4] formatting --- ALICE3/TableProducer/alice3MulticharmFinder.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/ALICE3/TableProducer/alice3MulticharmFinder.cxx b/ALICE3/TableProducer/alice3MulticharmFinder.cxx index 1607eb135be..f31add6ab1f 100644 --- a/ALICE3/TableProducer/alice3MulticharmFinder.cxx +++ b/ALICE3/TableProducer/alice3MulticharmFinder.cxx @@ -531,7 +531,6 @@ struct Alice3MulticharmFinder { auto picTracksGrouped = picTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); auto piccTracksGrouped = piccTracks->sliceByCached(aod::track::collisionId, collision.globalIndex(), cache); - for (auto const& track : tracks) { if (BIT_CHECK(track.decayMap(), kTruePiFromXiC)) { histos.fill(HIST("h2dDCAxyVsPtPiFromXiC"), track.pt(), track.dcaXY() * 1e+4);