From 0bf1e4f8b83274784639c6cfb466e3a8719fda8d Mon Sep 17 00:00:00 2001 From: Fabrizio Grosa Date: Mon, 15 Jun 2026 15:54:12 +0200 Subject: [PATCH 1/6] Reserve memory before filling charm femto tables --- .../producerCharmHadronsTrackFemtoDream.cxx | 8 ++++++++ .../HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx | 18 ++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/PWGHF/HFC/TableProducer/producerCharmHadronsTrackFemtoDream.cxx b/PWGHF/HFC/TableProducer/producerCharmHadronsTrackFemtoDream.cxx index e2e0ab680d4..e926a6a7b78 100644 --- a/PWGHF/HFC/TableProducer/producerCharmHadronsTrackFemtoDream.cxx +++ b/PWGHF/HFC/TableProducer/producerCharmHadronsTrackFemtoDream.cxx @@ -621,6 +621,14 @@ struct HfProducerCharmHadronsTrackFemtoDream { bool isSelectedMlD0barToKPi = true; bool isSelectedMlDstarToD0Pi = true; + if constexpr (Channel == DecayChannel::DplusToPiKPi || Channel == DecayChannel::LcToPKPi) { + rowCandCharm3Prong.reserve(candidates.size()); + } else if constexpr (Channel == DecayChannel::D0ToPiK) { + rowCandCharm2Prong.reserve(candidates.size()); + } else if constexpr (Channel == DecayChannel::DstarToD0Pi) { + rowCandCharmDstar.reserve(candidates.size()); + } + for (const auto& candidate : candidates) { outputMlD0 = {-1.0f, -1.0f, -1.0f}; outputMlD0bar = {-1.0f, -1.0f, -1.0f}; diff --git a/PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx b/PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx index 9c320059605..cbec1a4fc59 100644 --- a/PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx +++ b/PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx @@ -752,8 +752,11 @@ struct HfTaskCharmHadronsV0FemtoDream { void processDataLcV0(FilteredCollisions const& cols, FDV0Particles const& parts, - FilteredCharmCand3Prongs const&) + FilteredCharmCand3Prongs const& candidates) { + + rowFemtoResultCharm3Prong.reserve(candidates.size()); + for (const auto& col : cols) { eventHisto.fillQA(col); auto sliceCharmHad = partitionCharmHadron3Prong->sliceByCached(aod::femtodreamparticle::fdCollisionId, col.globalIndex(), cache); @@ -784,8 +787,10 @@ struct HfTaskCharmHadronsV0FemtoDream { void processDataDplusV0(FilteredCollisions const& cols, FDV0Particles const& parts, - FilteredCharmCand3Prongs const&) + FilteredCharmCand3Prongs const& candidates) { + rowFemtoResultCharm3Prong.reserve(candidates.size()); + for (const auto& col : cols) { eventHisto.fillQA(col); auto sliceCharmHad = partitionCharmHadron3Prong->sliceByCached(aod::femtodreamparticle::fdCollisionId, col.globalIndex(), cache); @@ -816,8 +821,10 @@ struct HfTaskCharmHadronsV0FemtoDream { void processDataD0V0(FilteredCollisions const& cols, FDV0Particles const& parts, - FilteredCharmCand2Prongs const&) + FilteredCharmCand2Prongs const& candidates) { + rowFemtoResultCharm2Prong.reserve(candidates.size()); + for (const auto& col : cols) { eventHisto.fillQA(col); auto sliceCharmHad = partitionCharmHadron2Prong->sliceByCached(aod::femtodreamparticle::fdCollisionId, col.globalIndex(), cache); @@ -848,8 +855,11 @@ struct HfTaskCharmHadronsV0FemtoDream { void processDataDstarV0(FilteredCollisions const& cols, FDV0Particles const& parts, - FilteredCharmCandDstars const&) + FilteredCharmCandDstars const& candidates) { + + rowFemtoResultCharmDstar.reserve(candidates.size()); + for (const auto& col : cols) { eventHisto.fillQA(col); auto sliceCharmHad = partitionCharmHadronDstar->sliceByCached(aod::femtodreamparticle::fdCollisionId, col.globalIndex(), cache); From 6a34853ac0ef0305264f750221853527112f56ad Mon Sep 17 00:00:00 2001 From: Fabrizio Grosa Date: Wed, 17 Jun 2026 09:40:06 +0200 Subject: [PATCH 2/6] Set proper size in reserve --- .../TableProducer/producerCharmHadronsTrackFemtoDream.cxx | 6 +++--- .../HFC/TableProducer/producerCharmHadronsV0FemtoDream.cxx | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGHF/HFC/TableProducer/producerCharmHadronsTrackFemtoDream.cxx b/PWGHF/HFC/TableProducer/producerCharmHadronsTrackFemtoDream.cxx index e926a6a7b78..bd5f421233c 100644 --- a/PWGHF/HFC/TableProducer/producerCharmHadronsTrackFemtoDream.cxx +++ b/PWGHF/HFC/TableProducer/producerCharmHadronsTrackFemtoDream.cxx @@ -622,11 +622,11 @@ struct HfProducerCharmHadronsTrackFemtoDream { bool isSelectedMlDstarToD0Pi = true; if constexpr (Channel == DecayChannel::DplusToPiKPi || Channel == DecayChannel::LcToPKPi) { - rowCandCharm3Prong.reserve(candidates.size()); + rowCandCharm3Prong.reserve(rowCandCharm3Prong.lastIndex() + sizeCand + 1); } else if constexpr (Channel == DecayChannel::D0ToPiK) { - rowCandCharm2Prong.reserve(candidates.size()); + rowCandCharm2Prong.reserve(rowCandCharm2Prong.lastIndex() + sizeCand + 1); } else if constexpr (Channel == DecayChannel::DstarToD0Pi) { - rowCandCharmDstar.reserve(candidates.size()); + rowCandCharmDstar.reserve(rowCandCharmDstar.lastIndex() + sizeCand + 1); } for (const auto& candidate : candidates) { diff --git a/PWGHF/HFC/TableProducer/producerCharmHadronsV0FemtoDream.cxx b/PWGHF/HFC/TableProducer/producerCharmHadronsV0FemtoDream.cxx index fa7304877ff..f795b353acc 100644 --- a/PWGHF/HFC/TableProducer/producerCharmHadronsV0FemtoDream.cxx +++ b/PWGHF/HFC/TableProducer/producerCharmHadronsV0FemtoDream.cxx @@ -1124,7 +1124,7 @@ struct HfProducerCharmHadronsV0FemtoDream { void fillCharmHadMcGen(ParticleType particles) { // Filling particle properties - rowCandCharmHadGen.reserve(particles.size()); + rowCandCharmHadGen.reserve(rowCandCharmHadGen.lastIndex() + particles.size() + 1); if constexpr (Channel == DecayChannel::DplusToPiKPi) { for (const auto& particle : particles) { if (std::abs(particle.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) { From 05954fcbbd7b07139c393202c78d5b277a2bb4d6 Mon Sep 17 00:00:00 2001 From: Fabrizio Grosa Date: Wed, 17 Jun 2026 09:45:19 +0200 Subject: [PATCH 3/6] Leftover --- PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx b/PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx index cbec1a4fc59..c9119487fda 100644 --- a/PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx +++ b/PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx @@ -755,7 +755,7 @@ struct HfTaskCharmHadronsV0FemtoDream { FilteredCharmCand3Prongs const& candidates) { - rowFemtoResultCharm3Prong.reserve(candidates.size()); + rowFemtoResultCharm3Prong.reserve(rowFemtoResultCharm3Prong.lastIndex() + candidates.size() + 1); for (const auto& col : cols) { eventHisto.fillQA(col); @@ -789,7 +789,7 @@ struct HfTaskCharmHadronsV0FemtoDream { FDV0Particles const& parts, FilteredCharmCand3Prongs const& candidates) { - rowFemtoResultCharm3Prong.reserve(candidates.size()); + rowFemtoResultCharm3Prong.reserve(rowFemtoResultCharm3Prong.lastIndex() + candidates.size() + 1); for (const auto& col : cols) { eventHisto.fillQA(col); @@ -823,7 +823,7 @@ struct HfTaskCharmHadronsV0FemtoDream { FDV0Particles const& parts, FilteredCharmCand2Prongs const& candidates) { - rowFemtoResultCharm2Prong.reserve(candidates.size()); + rowFemtoResultCharm2Prong.reserve(rowFemtoResultCharm2Prong.lastIndex() + candidates.size() + 1); for (const auto& col : cols) { eventHisto.fillQA(col); @@ -858,7 +858,7 @@ struct HfTaskCharmHadronsV0FemtoDream { FilteredCharmCandDstars const& candidates) { - rowFemtoResultCharmDstar.reserve(candidates.size()); + rowFemtoResultCharmDstar.reserve(rowFemtoResultCharmDstar.lastIndex() + candidates.size() + 1); for (const auto& col : cols) { eventHisto.fillQA(col); From 9cb18ac245fb311692b7028545d1069a8f817287 Mon Sep 17 00:00:00 2001 From: Fabrizio Grosa Date: Wed, 17 Jun 2026 10:03:36 +0200 Subject: [PATCH 4/6] Revert last commit --- PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx b/PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx index c9119487fda..b696c6b6412 100644 --- a/PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx +++ b/PWGHF/HFC/Tasks/taskCharmHadronsV0FemtoDream.cxx @@ -755,7 +755,7 @@ struct HfTaskCharmHadronsV0FemtoDream { FilteredCharmCand3Prongs const& candidates) { - rowFemtoResultCharm3Prong.reserve(rowFemtoResultCharm3Prong.lastIndex() + candidates.size() + 1); + rowFemtoResultCharm3Prong.reserve(candidates.size() + 1); for (const auto& col : cols) { eventHisto.fillQA(col); @@ -789,7 +789,7 @@ struct HfTaskCharmHadronsV0FemtoDream { FDV0Particles const& parts, FilteredCharmCand3Prongs const& candidates) { - rowFemtoResultCharm3Prong.reserve(rowFemtoResultCharm3Prong.lastIndex() + candidates.size() + 1); + rowFemtoResultCharm3Prong.reserve(candidates.size() + 1); for (const auto& col : cols) { eventHisto.fillQA(col); @@ -823,7 +823,7 @@ struct HfTaskCharmHadronsV0FemtoDream { FDV0Particles const& parts, FilteredCharmCand2Prongs const& candidates) { - rowFemtoResultCharm2Prong.reserve(rowFemtoResultCharm2Prong.lastIndex() + candidates.size() + 1); + rowFemtoResultCharm2Prong.reserve(candidates.size() + 1); for (const auto& col : cols) { eventHisto.fillQA(col); @@ -858,7 +858,7 @@ struct HfTaskCharmHadronsV0FemtoDream { FilteredCharmCandDstars const& candidates) { - rowFemtoResultCharmDstar.reserve(rowFemtoResultCharmDstar.lastIndex() + candidates.size() + 1); + rowFemtoResultCharmDstar.reserve(candidates.size() + 1); for (const auto& col : cols) { eventHisto.fillQA(col); From cb0a91c1092284ffe3d083f7a2bb41a8efdb21dc Mon Sep 17 00:00:00 2001 From: Fabrizio Grosa Date: Wed, 17 Jun 2026 10:19:32 +0200 Subject: [PATCH 5/6] Account for possible double filling due to double mass hypo --- .../producerCharmHadronsTrackFemtoDream.cxx | 12 +++++++++--- .../producerCharmHadronsV0FemtoDream.cxx | 10 +++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/PWGHF/HFC/TableProducer/producerCharmHadronsTrackFemtoDream.cxx b/PWGHF/HFC/TableProducer/producerCharmHadronsTrackFemtoDream.cxx index bd5f421233c..74e5d481914 100644 --- a/PWGHF/HFC/TableProducer/producerCharmHadronsTrackFemtoDream.cxx +++ b/PWGHF/HFC/TableProducer/producerCharmHadronsTrackFemtoDream.cxx @@ -622,13 +622,17 @@ struct HfProducerCharmHadronsTrackFemtoDream { bool isSelectedMlDstarToD0Pi = true; if constexpr (Channel == DecayChannel::DplusToPiKPi || Channel == DecayChannel::LcToPKPi) { - rowCandCharm3Prong.reserve(rowCandCharm3Prong.lastIndex() + sizeCand + 1); + rowCandCharm3Prong.reserve(rowCandCharm3Prong.lastIndex() + sizeCand * 2 + 1); } else if constexpr (Channel == DecayChannel::D0ToPiK) { - rowCandCharm2Prong.reserve(rowCandCharm2Prong.lastIndex() + sizeCand + 1); + rowCandCharm2Prong.reserve(rowCandCharm2Prong.lastIndex() + sizeCand * 2 + 1); } else if constexpr (Channel == DecayChannel::DstarToD0Pi) { rowCandCharmDstar.reserve(rowCandCharmDstar.lastIndex() + sizeCand + 1); } + if (sizeCand > 0) { + LOGP(info, "Last index {} candidate size {}, reserved memory {}", rowCandCharm3Prong.lastIndex(), sizeCand, rowCandCharm3Prong.lastIndex() + sizeCand + 1); + } + int iCand{0}; for (const auto& candidate : candidates) { outputMlD0 = {-1.0f, -1.0f, -1.0f}; outputMlD0bar = {-1.0f, -1.0f, -1.0f}; @@ -638,6 +642,7 @@ struct HfProducerCharmHadronsTrackFemtoDream { outputMlPiKP = {-1.0f, -1.0f, -1.0f}; auto trackPos1 = candidate.template prong0_as(); // positive daughter (negative for the antiparticles) auto trackNeg = candidate.template prong1_as(); // negative daughter (positive for the antiparticles) + LOGP(info, "Filling candidate number {}", iCand); auto bc = col.template bc_as(); int64_t timeStamp = bc.timestamp(); @@ -858,6 +863,7 @@ struct HfProducerCharmHadronsTrackFemtoDream { } fillTable(2, candidate.isSelDstarToD0Pi(), outputMlDstar.at(0), outputMlDstar.at(1), outputMlDstar.at(2)); } + iCand++; } isTrackFilled = fillTracksForCharmHadron(col, tracks); @@ -902,7 +908,7 @@ struct HfProducerCharmHadronsTrackFemtoDream { void fillCharmHadMcGen(ParticleType particles) { // Filling particle properties - rowCandCharmHadGen.reserve(particles.size()); + rowCandCharmHadGen.reserve(particles.size() + 1); if constexpr (Channel == DecayChannel::DplusToPiKPi) { for (const auto& particle : particles) { if (std::abs(particle.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) { diff --git a/PWGHF/HFC/TableProducer/producerCharmHadronsV0FemtoDream.cxx b/PWGHF/HFC/TableProducer/producerCharmHadronsV0FemtoDream.cxx index f795b353acc..0fdbfec790e 100644 --- a/PWGHF/HFC/TableProducer/producerCharmHadronsV0FemtoDream.cxx +++ b/PWGHF/HFC/TableProducer/producerCharmHadronsV0FemtoDream.cxx @@ -722,6 +722,14 @@ struct HfProducerCharmHadronsV0FemtoDream { return; } + if constexpr (Channel == DecayChannel::DplusToPiKPi || Channel == DecayChannel::LcToPKPi) { + rowCandCharm3Prong.reserve(rowCandCharm3Prong.lastIndex() + sizeCand * 2 + 1); + } else if constexpr (Channel == DecayChannel::D0ToPiK) { + rowCandCharm2Prong.reserve(rowCandCharm2Prong.lastIndex() + sizeCand * 2 + 1); + } else if constexpr (Channel == DecayChannel::DstarToD0Pi) { + rowCandCharmDstar.reserve(rowCandCharmDstar.lastIndex() + sizeCand + 1); + } + outputCollision(vtxZ, mult, multNtr, spher, magField); if constexpr (IsMc) { fillMcCollision(col); @@ -1124,7 +1132,7 @@ struct HfProducerCharmHadronsV0FemtoDream { void fillCharmHadMcGen(ParticleType particles) { // Filling particle properties - rowCandCharmHadGen.reserve(rowCandCharmHadGen.lastIndex() + particles.size() + 1); + rowCandCharmHadGen.reserve(particles.size() + 1); if constexpr (Channel == DecayChannel::DplusToPiKPi) { for (const auto& particle : particles) { if (std::abs(particle.flagMcMatchGen()) == hf_decay::hf_cand_3prong::DecayChannelMain::DplusToPiKPi) { From a7c6458b37ced9758f34a34179d3f31afe1e1d5d Mon Sep 17 00:00:00 2001 From: Fabrizio Grosa Date: Wed, 17 Jun 2026 10:23:48 +0200 Subject: [PATCH 6/6] Remove debug logs --- .../TableProducer/producerCharmHadronsTrackFemtoDream.cxx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/PWGHF/HFC/TableProducer/producerCharmHadronsTrackFemtoDream.cxx b/PWGHF/HFC/TableProducer/producerCharmHadronsTrackFemtoDream.cxx index 74e5d481914..8a75dbfecb9 100644 --- a/PWGHF/HFC/TableProducer/producerCharmHadronsTrackFemtoDream.cxx +++ b/PWGHF/HFC/TableProducer/producerCharmHadronsTrackFemtoDream.cxx @@ -628,11 +628,7 @@ struct HfProducerCharmHadronsTrackFemtoDream { } else if constexpr (Channel == DecayChannel::DstarToD0Pi) { rowCandCharmDstar.reserve(rowCandCharmDstar.lastIndex() + sizeCand + 1); } - if (sizeCand > 0) { - LOGP(info, "Last index {} candidate size {}, reserved memory {}", rowCandCharm3Prong.lastIndex(), sizeCand, rowCandCharm3Prong.lastIndex() + sizeCand + 1); - } - int iCand{0}; for (const auto& candidate : candidates) { outputMlD0 = {-1.0f, -1.0f, -1.0f}; outputMlD0bar = {-1.0f, -1.0f, -1.0f}; @@ -642,7 +638,6 @@ struct HfProducerCharmHadronsTrackFemtoDream { outputMlPiKP = {-1.0f, -1.0f, -1.0f}; auto trackPos1 = candidate.template prong0_as(); // positive daughter (negative for the antiparticles) auto trackNeg = candidate.template prong1_as(); // negative daughter (positive for the antiparticles) - LOGP(info, "Filling candidate number {}", iCand); auto bc = col.template bc_as(); int64_t timeStamp = bc.timestamp(); @@ -863,7 +858,6 @@ struct HfProducerCharmHadronsTrackFemtoDream { } fillTable(2, candidate.isSelDstarToD0Pi(), outputMlDstar.at(0), outputMlDstar.at(1), outputMlDstar.at(2)); } - iCand++; } isTrackFilled = fillTracksForCharmHadron(col, tracks);