From c3303833c2c85ea49f4387f611d80406ce00f169 Mon Sep 17 00:00:00 2001 From: Laura Gansbartl Date: Thu, 27 Aug 2026 16:32:39 +0200 Subject: [PATCH 1/2] [PWGEM] Update SkimmerPrimaryElectronFromDalitzEE Update filling options of EMPRIMARYELDA adding mass pre-cut to reduce output size for derived data --- .../skimmerPrimaryElectronFromDalitzEE.cxx | 207 ++++++++++++++---- 1 file changed, 165 insertions(+), 42 deletions(-) diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx index 215f4a29f49..a39f12a98b4 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx @@ -51,6 +51,7 @@ #include #include #include +#include #include #include #include @@ -103,6 +104,12 @@ struct skimmerPrimaryElectronFromDalitzEE { Produces emtofs; + enum class enumFillingMode { + SingleTrack = 1, + EpEmPairs = 2, + EpEmPairsAndPhoton = 3 + }; + // Configurables Configurable ccdburl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; Configurable grpPath{"grpPath", "GLO/GRP/GRP", "Path of the grp file"}; @@ -139,9 +146,13 @@ struct skimmerPrimaryElectronFromDalitzEE { Configurable requireTOF{"requireTOF", false, "require TOF hit"}; Configurable min_pin_for_pion_rejection{"min_pin_for_pion_rejection", 0.0, "pion rejection is applied above this pin"}; // this is used only in TOFreq Configurable max_pin_for_pion_rejection{"max_pin_for_pion_rejection", 0.5, "pion rejection is applied below this pin"}; - Configurable maxMee{"maxMee", 0.04, "max. mee to store dalitz ee pairs"}; + Configurable minMee{"minMee", 0., "min. mee to store dalitz ee pairs"}; + Configurable maxMee{"maxMee", 0.5, "max. mee to store dalitz ee pairs"}; + Configurable minMeegamma{"minMeegamma", 0.3, "min. mee to store eegamma candidates"}; + Configurable maxMeegamma{"maxMeegamma", 0.8, "max. mee to store eegamma candidates"}; Configurable fillLS{"fillLS", true, "flag to fill LS histograms for QA"}; - Configurable fillWithPairs{"fillWithPairs", false, "flag to fill table based on pair information"}; + Configurable fillingMode{"fillingMode", 1, "Filling mode| 1: fill tracks without pair selection, 2: fill tracks from selected pairs, 3: fill tracks from selected pairs that can be combined with a photon"}; + Configurable fillWithEtaMassCut{"fillWithEtaMassCut", true, "only valid for fillingmode 3; true: filling tabled based on eta candidate selection with minMeegamma < M < maxMeegamma, false: fill identical to fillingmode 2"}; Configurable includeITSsa{"includeITSsa", false, "Flag to include ITSsa tracks"}; Configurable maxpt_itssa{"maxpt_itssa", 0.15, "max pt for ITSsa track"}; // o2-linter: disable=name/function-variable (renaming configs would mess up hyperloop) Configurable maxMeanITSClusterSize{"maxMeanITSClusterSize", 16, "max x cos(lambda)"}; @@ -248,6 +259,8 @@ struct skimmerPrimaryElectronFromDalitzEE { return; } + o2::base::Propagator::initFieldFromGRP(&bc.grpMagField()); + auto run3grpTimestamp = bc.timestamp(); dBz = bc.grpMagField().getNominalL3Field(); @@ -538,7 +551,8 @@ struct skimmerPrimaryElectronFromDalitzEE { fRegistry.fill(HIST("Pair/") + HIST(DileptonSigns[pairtype]) + HIST("hMvsPt"), v12.M(), v12.Pt()); fRegistry.fill(HIST("Pair/") + HIST(DileptonSigns[pairtype]) + HIST("hMvsPhiV"), phiv, v12.M()); - if (v12.M() > maxMee) { // don't store + // to do: test if minMee > Mpion show effect on S/B + if (v12.M() < minMee || v12.M() > maxMee) { // don't store //|| v12.M() > maxMee continue; } @@ -713,6 +727,8 @@ struct skimmerPrimaryElectronFromDalitzEE { continue; } + auto varFillingMode = static_cast(fillingMode.value); + const auto& v0photons_per_coll = v0photons.sliceBy(perCol_pcm, collision.globalIndex()); const auto& posTracks_per_coll = posTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); const auto& negTracks_per_coll = negTracks->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); @@ -720,25 +736,79 @@ struct skimmerPrimaryElectronFromDalitzEE { acceptedPosTrackIds_per_collision.reserve(posTracks_per_coll.size()); acceptedNegTrackIds_per_collision.reserve(negTracks_per_coll.size()); - if (!fillWithPairs) { - fillTrackInfo(collision, slicedTracks); - } else { - fillPairInfo(collision, posTracks_per_coll, negTracks_per_coll); // ULS - if (fillLS) { - fillPairInfo(collision, posTracks_per_coll, posTracks_per_coll); // LS++ - fillPairInfo(collision, negTracks_per_coll, negTracks_per_coll); // LS-- - } - - if ((v0photons_per_coll.size() >= 1 && !acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty()) || (acceptedPosTrackIds_per_collision.size() >= 2 && acceptedNegTrackIds_per_collision.size() >= 2)) { - for (const auto& posId : acceptedPosTrackIds_per_collision) { - const auto& pos = tracks.rawIteratorAt(posId); - fillTrackTable(collision, pos); + auto iterEp = tracks.begin(); + auto iterEm = tracks.begin(); + auto iterTrack = tracks.begin(); + auto iterPhoton = v0photons.begin(); + + switch (varFillingMode) { + case enumFillingMode::SingleTrack: + fillTrackInfo(collision, slicedTracks); + break; + case enumFillingMode::EpEmPairs: + fillPairInfo(collision, posTracks_per_coll, negTracks_per_coll); // ULS + if (fillLS) { + fillPairInfo(collision, posTracks_per_coll, posTracks_per_coll); // LS++ + fillPairInfo(collision, negTracks_per_coll, negTracks_per_coll); // LS-- + } + if ((!acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty())) { + for (const auto& posId : acceptedPosTrackIds_per_collision) { + iterEp.setCursor(posId); + fillTrackTable(collision, iterEp); + } + for (const auto& eleId : acceptedNegTrackIds_per_collision) { + iterEm.setCursor(eleId); + fillTrackTable(collision, iterEm); + } } - for (const auto& eleId : acceptedNegTrackIds_per_collision) { - const auto& ele = tracks.rawIteratorAt(eleId); - fillTrackTable(collision, ele); + break; + case enumFillingMode::EpEmPairsAndPhoton: + std::set tracksToFill; + + fillPairInfo(collision, posTracks_per_coll, negTracks_per_coll); // ULS + if (fillLS) { + fillPairInfo(collision, posTracks_per_coll, posTracks_per_coll); // LS++ + fillPairInfo(collision, negTracks_per_coll, negTracks_per_coll); // LS-- } - } + if (v0photons_per_coll.size() >= 1 && ((!acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty()))) { + if (!fillWithEtaMassCut) { + for (const auto& posId : acceptedPosTrackIds_per_collision) { + iterEp.setCursor(posId); + fillTrackTable(collision, iterEp); + } + for (const auto& eleId : acceptedNegTrackIds_per_collision) { + iterEm.setCursor(eleId); + fillTrackTable(collision, iterEm); + } + } else { + for (const auto& posId : acceptedPosTrackIds_per_collision) { + iterEp.setCursor(posId); + ROOT::Math::PtEtaPhiMVector vEp(iterEp.pt(), iterEp.eta(), iterEp.phi(), o2::constants::physics::MassElectron); + for (const auto& eleId : acceptedNegTrackIds_per_collision) { + iterEm.setCursor(eleId); + ROOT::Math::PtEtaPhiMVector vEm(iterEm.pt(), iterEm.eta(), iterEm.phi(), o2::constants::physics::MassElectron); + for (const auto& photonId : v0photons_per_coll) { + iterPhoton.setCursor(photonId.globalIndex()); + ROOT::Math::PtEtaPhiMVector vPhoton(iterPhoton.pt(), iterPhoton.eta(), iterPhoton.phi(), o2::constants::physics::MassPhoton); + ROOT::Math::PtEtaPhiMVector vTotal = vEp + vEm + vPhoton; + + if (vTotal.M() < minMeegamma || vTotal.M() > maxMeegamma) { // don't store + continue; + } + tracksToFill.insert(posId); // store independently + tracksToFill.insert(eleId); + } + } + } + } + } + if (fillWithEtaMassCut) { + for (const auto& trackId : tracksToFill) { + iterTrack.setCursor(trackId); + fillTrackTable(collision, iterTrack); + } + } + break; } acceptedPosTrackIds_per_collision.clear(); @@ -808,7 +878,7 @@ struct skimmerPrimaryElectronFromDalitzEE { Partition posTracksMC = o2::aod::track::signed1Pt > 0.f; Partition negTracksMC = o2::aod::track::signed1Pt < 0.f; // ---------- for MC ---------- - void processMC(MyCollisionsMC const& collisions, aod::McCollisions const&, MyBCs const& bcs, MyTracksMC const& tracks, aod::V0PhotonsKF const& v0photons, aod::TrackAssoc const& trackIndices) + void processMC(MyCollisionsMC const& collisions, aod::McCollisions const&, MyBCs const& bcs, MyTracksMC const& tracks, aod::V0PhotonsKF const& v0photons, aod::TrackAssoc const& trackIndices, aod::McParticles const&) { uint64_t nCollisSel = 0; uint64_t nNoMcColl = 0; @@ -836,6 +906,8 @@ struct skimmerPrimaryElectronFromDalitzEE { } nProcessedCollisions++; + auto varFillingMode = static_cast(fillingMode.value); + const auto& v0photons_per_coll = v0photons.sliceBy(perCol_pcm, collision.globalIndex()); const auto& posTracks_per_coll = posTracksMC->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); const auto& negTracks_per_coll = negTracksMC->sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), cache); @@ -844,25 +916,80 @@ struct skimmerPrimaryElectronFromDalitzEE { acceptedNegTrackIds_per_collision.reserve(negTracks_per_coll.size()); acceptedTrackIds_per_collision.reserve(2 * (negTracks_per_coll.size())); - if (!fillWithPairs) { - fillTrackInfo(collision, slicedTracks); - } else { - fillPairInfo(collision, posTracks_per_coll, negTracks_per_coll); // ULS - if (fillLS) { - fillPairInfo(collision, posTracks_per_coll, posTracks_per_coll); // LS++ - fillPairInfo(collision, negTracks_per_coll, negTracks_per_coll); // LS-- - } - if ((acceptedPosTrackIds_per_collision.empty() && acceptedNegTrackIds_per_collision.empty()) || (acceptedPosTrackIds_per_collision.size() >= 2 && acceptedNegTrackIds_per_collision.size() >= 2)) { // v0photons_per_coll.size() >= 1 && - for (const auto& posId : acceptedPosTrackIds_per_collision) { - const auto& pos = tracks.rawIteratorAt(posId); - fillTrackTable(collision, pos); + auto iterEp = tracks.begin(); + auto iterEm = tracks.begin(); + auto iterTrack = tracks.begin(); + auto iterPhoton = v0photons.begin(); + + switch (varFillingMode) { + case enumFillingMode::SingleTrack: + fillTrackInfo(collision, slicedTracks); + break; + case enumFillingMode::EpEmPairs: + fillPairInfo(collision, posTracks_per_coll, negTracks_per_coll); // ULS + if (fillLS) { + fillPairInfo(collision, posTracks_per_coll, posTracks_per_coll); // LS++ + fillPairInfo(collision, negTracks_per_coll, negTracks_per_coll); // LS-- } - for (const auto& eleId : acceptedNegTrackIds_per_collision) { - const auto& ele = tracks.rawIteratorAt(eleId); - fillTrackTable(collision, ele); + if ((!acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty())) { + for (const auto& posId : acceptedPosTrackIds_per_collision) { + iterEp.setCursor(posId); + fillTrackTable(collision, iterEp); + } + for (const auto& eleId : acceptedNegTrackIds_per_collision) { + iterEm.setCursor(eleId); + fillTrackTable(collision, iterEm); + } } - } - } // end of fill loop + break; + case enumFillingMode::EpEmPairsAndPhoton: + std::set tracksToFill; + + fillPairInfo(collision, posTracks_per_coll, negTracks_per_coll); // ULS + if (fillLS) { + fillPairInfo(collision, posTracks_per_coll, posTracks_per_coll); // LS++ + fillPairInfo(collision, negTracks_per_coll, negTracks_per_coll); // LS-- + } + if (v0photons_per_coll.size() >= 1 && ((!acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty()))) { + if (!fillWithEtaMassCut) { + for (const auto& posId : acceptedPosTrackIds_per_collision) { + iterEp.setCursor(posId); + fillTrackTable(collision, iterEp); + } + for (const auto& eleId : acceptedNegTrackIds_per_collision) { + iterEm.setCursor(eleId); + fillTrackTable(collision, iterEm); + } + } else { + for (const auto& posId : acceptedPosTrackIds_per_collision) { + iterEp.setCursor(posId); + ROOT::Math::PtEtaPhiMVector vEp(iterEp.pt(), iterEp.eta(), iterEp.phi(), o2::constants::physics::MassElectron); + for (const auto& eleId : acceptedNegTrackIds_per_collision) { + iterEm.setCursor(eleId); + ROOT::Math::PtEtaPhiMVector vEm(iterEm.pt(), iterEm.eta(), iterEm.phi(), o2::constants::physics::MassElectron); + for (const auto& photonId : v0photons_per_coll) { + iterPhoton.setCursor(photonId.globalIndex()); + ROOT::Math::PtEtaPhiMVector vPhoton(iterPhoton.pt(), iterPhoton.eta(), iterPhoton.phi(), o2::constants::physics::MassPhoton); + ROOT::Math::PtEtaPhiMVector vTotal = vEp + vEm + vPhoton; + + if (vTotal.M() < minMeegamma || vTotal.M() > maxMeegamma) { // don't store + continue; + } + tracksToFill.insert(posId); // store independently + tracksToFill.insert(eleId); + } + } + } + } + } + if (fillWithEtaMassCut) { + for (const auto& trackId : tracksToFill) { + iterTrack.setCursor(trackId); + fillTrackTable(collision, iterTrack); + } + } + break; + } acceptedPosTrackIds_per_collision.clear(); acceptedNegTrackIds_per_collision.clear(); @@ -878,10 +1005,6 @@ struct skimmerPrimaryElectronFromDalitzEE { PROCESS_SWITCH(skimmerPrimaryElectronFromDalitzEE, processMC, "process reconstructed and MC info ", true); }; -// WorkflowSpec defineDataProcessing(ConfigContext const& context) -// { -// return WorkflowSpec{adaptAnalysisTask(context, TaskName{"skimmer-primary-electron-from-dalitzee"})}; -// } WorkflowSpec defineDataProcessing(ConfigContext const& context) { o2::pid::tof::TOFResponseImpl::metadataInfo.initMetadata(context); From 2fa7e66ffd29ec6260be88688f1c60225a57f2d8 Mon Sep 17 00:00:00 2001 From: Laura Gansbartl Date: Fri, 28 Aug 2026 13:50:06 +0200 Subject: [PATCH 2/2] [PWGEM] Update skimmerPrimaryElectronFromDalitzEE Fix --- .../skimmerPrimaryElectronFromDalitzEE.cxx | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx index a39f12a98b4..1f29b03cf07 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerPrimaryElectronFromDalitzEE.cxx @@ -743,42 +743,42 @@ struct skimmerPrimaryElectronFromDalitzEE { switch (varFillingMode) { case enumFillingMode::SingleTrack: - fillTrackInfo(collision, slicedTracks); + fillTrackInfo(collision, slicedTracks); break; case enumFillingMode::EpEmPairs: - fillPairInfo(collision, posTracks_per_coll, negTracks_per_coll); // ULS + fillPairInfo(collision, posTracks_per_coll, negTracks_per_coll); // ULS if (fillLS) { - fillPairInfo(collision, posTracks_per_coll, posTracks_per_coll); // LS++ - fillPairInfo(collision, negTracks_per_coll, negTracks_per_coll); // LS-- + fillPairInfo(collision, posTracks_per_coll, posTracks_per_coll); // LS++ + fillPairInfo(collision, negTracks_per_coll, negTracks_per_coll); // LS-- } if ((!acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty())) { for (const auto& posId : acceptedPosTrackIds_per_collision) { iterEp.setCursor(posId); - fillTrackTable(collision, iterEp); + fillTrackTable(collision, iterEp); } for (const auto& eleId : acceptedNegTrackIds_per_collision) { iterEm.setCursor(eleId); - fillTrackTable(collision, iterEm); + fillTrackTable(collision, iterEm); } } break; case enumFillingMode::EpEmPairsAndPhoton: std::set tracksToFill; - fillPairInfo(collision, posTracks_per_coll, negTracks_per_coll); // ULS + fillPairInfo(collision, posTracks_per_coll, negTracks_per_coll); // ULS if (fillLS) { - fillPairInfo(collision, posTracks_per_coll, posTracks_per_coll); // LS++ - fillPairInfo(collision, negTracks_per_coll, negTracks_per_coll); // LS-- + fillPairInfo(collision, posTracks_per_coll, posTracks_per_coll); // LS++ + fillPairInfo(collision, negTracks_per_coll, negTracks_per_coll); // LS-- } if (v0photons_per_coll.size() >= 1 && ((!acceptedPosTrackIds_per_collision.empty() && !acceptedNegTrackIds_per_collision.empty()))) { if (!fillWithEtaMassCut) { for (const auto& posId : acceptedPosTrackIds_per_collision) { iterEp.setCursor(posId); - fillTrackTable(collision, iterEp); + fillTrackTable(collision, iterEp); } for (const auto& eleId : acceptedNegTrackIds_per_collision) { iterEm.setCursor(eleId); - fillTrackTable(collision, iterEm); + fillTrackTable(collision, iterEm); } } else { for (const auto& posId : acceptedPosTrackIds_per_collision) { @@ -805,7 +805,7 @@ struct skimmerPrimaryElectronFromDalitzEE { if (fillWithEtaMassCut) { for (const auto& trackId : tracksToFill) { iterTrack.setCursor(trackId); - fillTrackTable(collision, iterTrack); + fillTrackTable(collision, iterTrack); } } break;