From 3c8667f77ef8ca72787215e82961a134999be7b0 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Mon, 14 Jul 2025 20:16:01 +0200 Subject: [PATCH] PWGEM/Dilepton: update for tpc --- PWGEM/Dilepton/DataModel/dileptonTables.h | 31 +++++++++++++---- .../TableProducer/createEMEventDilepton.cxx | 14 ++++++-- .../TableProducer/skimmerPrimaryElectron.cxx | 33 ++++--------------- 3 files changed, 42 insertions(+), 36 deletions(-) diff --git a/PWGEM/Dilepton/DataModel/dileptonTables.h b/PWGEM/Dilepton/DataModel/dileptonTables.h index 8fc9903b9b8..2a0ba180708 100644 --- a/PWGEM/Dilepton/DataModel/dileptonTables.h +++ b/PWGEM/Dilepton/DataModel/dileptonTables.h @@ -687,9 +687,22 @@ DECLARE_SOA_TABLE(EMGlobalMuonSelfIds, "AOD", "EMGLMUSELFID", emprimarymuon::Glo // iterators using EMGlobalMuonSelfId = EMGlobalMuonSelfIds::iterator; +namespace emprimarytrack +{ +DECLARE_SOA_INDEX_COLUMN(EMEvent, emevent); //! +DECLARE_SOA_COLUMN(CollisionId, collisionId, int); //! +DECLARE_SOA_COLUMN(TrackId, trackId, int); //! +DECLARE_SOA_COLUMN(Sign, sign, int8_t); //! +DECLARE_SOA_DYNAMIC_COLUMN(Signed1Pt, signed1Pt, [](float pt, int8_t sign) -> float { return sign * 1. / pt; }); +DECLARE_SOA_DYNAMIC_COLUMN(P, p, [](float pt, float eta) -> float { return pt * std::cosh(eta); }); +DECLARE_SOA_DYNAMIC_COLUMN(Px, px, [](float pt, float phi) -> float { return pt * std::cos(phi); }); +DECLARE_SOA_DYNAMIC_COLUMN(Py, py, [](float pt, float phi) -> float { return pt * std::sin(phi); }); +DECLARE_SOA_DYNAMIC_COLUMN(Pz, pz, [](float pt, float eta) -> float { return pt * std::sinh(eta); }); +} // namespace emprimarytrack + DECLARE_SOA_TABLE_VERSIONED(EMPrimaryTracks_000, "AOD", "EMPRIMARYTRACK", 0, //! - o2::soa::Index<>, emprimaryelectron::CollisionId, - emprimaryelectron::TrackId, emprimaryelectron::Sign, + o2::soa::Index<>, emprimarytrack::CollisionId, + emprimarytrack::TrackId, emprimarytrack::Sign, track::Pt, track::Eta, track::Phi, track::DcaXY, track::DcaZ, track::TPCNClsFindable, track::TPCNClsFindableMinusFound, track::TPCNClsFindableMinusCrossedRows, track::TPCNClsShared, track::TPCChi2NCl, track::ITSClusterSizes, track::ITSChi2NCl, track::DetectorMap, @@ -702,16 +715,20 @@ DECLARE_SOA_TABLE_VERSIONED(EMPrimaryTracks_000, "AOD", "EMPRIMARYTRACK", 0, //! track::TPCFractionSharedCls, track::v001::ITSClusterMap, track::v001::ITSNCls, track::v001::ITSNClsInnerBarrel, track::HasITS, track::HasTPC, track::HasTRD, track::HasTOF, - emprimaryelectron::Signed1Pt, - emprimaryelectron::P, - emprimaryelectron::Px, - emprimaryelectron::Py, - emprimaryelectron::Pz); + emprimarytrack::Signed1Pt, + emprimarytrack::P, + emprimarytrack::Px, + emprimarytrack::Py, + emprimarytrack::Pz); using EMPrimaryTracks = EMPrimaryTracks_000; // iterators using EMPrimaryTrack = EMPrimaryTracks::iterator; +DECLARE_SOA_TABLE(EMPrimaryTrackEMEventIds, "AOD", "PRMTRACKEMEVENTID", emprimarytrack::EMEventId); // To be joined with EMPrimaryTracks table at analysis level. +// iterators +using EMPrimaryTrackEMEventId = EMPrimaryTrackEMEventIds::iterator; + // Dummy data for MC namespace emdummydata { diff --git a/PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx b/PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx index 94fabdf2b62..9648490bea9 100644 --- a/PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx +++ b/PWGEM/Dilepton/TableProducer/createEMEventDilepton.cxx @@ -298,10 +298,12 @@ struct AssociateDileptonToEMEvent { Produces v0kfeventid; Produces prmeleventid; Produces prmmueventid; + Produces prmtrackeventid; Preslice perCollision_pcm = aod::v0photonkf::collisionId; PresliceUnsorted perCollision_el = aod::emprimaryelectron::collisionId; PresliceUnsorted perCollision_mu = aod::emprimarymuon::collisionId; + PresliceUnsorted perCollision_track = aod::emprimarytrack::collisionId; void init(o2::framework::InitContext&) {} @@ -336,11 +338,17 @@ struct AssociateDileptonToEMEvent { fillEventId(collisions, tracks, prmmueventid, perCollision_mu); } + void processChargedTrack(aod::EMEvents const& collisions, aod::EMPrimaryTracks const& tracks) + { + fillEventId(collisions, tracks, prmtrackeventid, perCollision_track); + } + void processDummy(aod::EMEvents const&) {} - PROCESS_SWITCH(AssociateDileptonToEMEvent, processPCM, "process pcm-event indexing", false); - PROCESS_SWITCH(AssociateDileptonToEMEvent, processElectron, "process dalitzee-event indexing", false); - PROCESS_SWITCH(AssociateDileptonToEMEvent, processFwdMuon, "process forward muon indexing", false); + PROCESS_SWITCH(AssociateDileptonToEMEvent, processPCM, "process indexing for PCM", false); + PROCESS_SWITCH(AssociateDileptonToEMEvent, processElectron, "process indexing for electrons", false); + PROCESS_SWITCH(AssociateDileptonToEMEvent, processFwdMuon, "process indexing for forward muons", false); + PROCESS_SWITCH(AssociateDileptonToEMEvent, processChargedTrack, "process indexing for charged tracks", false); PROCESS_SWITCH(AssociateDileptonToEMEvent, processDummy, "process dummy", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) diff --git a/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx b/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx index 1392255a37f..b4b9db26de5 100644 --- a/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx +++ b/PWGEM/Dilepton/TableProducer/skimmerPrimaryElectron.cxx @@ -174,11 +174,6 @@ struct skimmerPrimaryElectron { fRegistry.add("Track/hMeanClusterSizeITS", "mean cluster size ITS;p_{pv} (GeV/c); #times cos(#lambda)", kTH2F, {{1000, 0, 10}, {150, 0, 15}}, false); fRegistry.add("Track/hMeanClusterSizeITSib", "mean cluster size ITSib;p_{pv} (GeV/c); #times cos(#lambda)", kTH2F, {{1000, 0, 10}, {150, 0, 15}}, false); fRegistry.add("Track/hMeanClusterSizeITSob", "mean cluster size ITSob;p_{pv} (GeV/c); #times cos(#lambda)", kTH2F, {{1000, 0, 10}, {150, 0, 15}}, false); - fRegistry.add("Track/hITSNsigmaEl", "ITS n sigma el;p_{pv} (GeV/c);n #sigma_{e}^{ITS}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); - fRegistry.add("Track/hITSNsigmaMu", "ITS n sigma mu;p_{pv} (GeV/c);n #sigma_{#mu}^{ITS}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); - fRegistry.add("Track/hITSNsigmaPi", "ITS n sigma pi;p_{pv} (GeV/c);n #sigma_{#pi}^{ITS}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); - fRegistry.add("Track/hITSNsigmaKa", "ITS n sigma ka;p_{pv} (GeV/c);n #sigma_{K}^{ITS}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); - fRegistry.add("Track/hITSNsigmaPr", "ITS n sigma pr;p_{pv} (GeV/c);n #sigma_{p}^{ITS}", kTH2F, {{1000, 0, 10}, {100, -5, +5}}, false); } if (usePIDML) { @@ -556,11 +551,6 @@ struct skimmerPrimaryElectron { fRegistry.fill(HIST("Track/hMeanClusterSizeITS"), trackParCov.getP(), static_cast(total_cluster_size) / static_cast(nl) * std::cos(std::atan(trackParCov.getTgl()))); fRegistry.fill(HIST("Track/hMeanClusterSizeITSib"), trackParCov.getP(), static_cast(total_cluster_size_ib) / static_cast(nl_ib) * std::cos(std::atan(trackParCov.getTgl()))); fRegistry.fill(HIST("Track/hMeanClusterSizeITSob"), trackParCov.getP(), static_cast(total_cluster_size_ob) / static_cast(nl_ob) * std::cos(std::atan(trackParCov.getTgl()))); - fRegistry.fill(HIST("Track/hITSNsigmaEl"), trackParCov.getP(), track.itsNSigmaEl()); - fRegistry.fill(HIST("Track/hITSNsigmaMu"), trackParCov.getP(), track.itsNSigmaMu()); - fRegistry.fill(HIST("Track/hITSNsigmaPi"), trackParCov.getP(), track.itsNSigmaPi()); - fRegistry.fill(HIST("Track/hITSNsigmaKa"), trackParCov.getP(), track.itsNSigmaKa()); - fRegistry.fill(HIST("Track/hITSNsigmaPr"), trackParCov.getP(), track.itsNSigmaPr()); } } } @@ -577,7 +567,6 @@ struct skimmerPrimaryElectron { void processRec_SA(MyCollisions const& collisions, aod::BCsWithTimestamps const&, MyFilteredTracks const& tracks) { - auto tracksWithITSPid = soa::Attach(tracks); stored_trackIds.reserve(tracks.size()); for (const auto& collision : collisions) { @@ -588,7 +577,7 @@ struct skimmerPrimaryElectron { continue; } - auto tracks_per_coll = tracksWithITSPid.sliceBy(perCol, collision.globalIndex()); + auto tracks_per_coll = tracks.sliceBy(perCol, collision.globalIndex()); for (const auto& track : tracks_per_coll) { if (!checkTrack(collision, track) || !isElectron(collision, track)) { continue; @@ -605,7 +594,6 @@ struct skimmerPrimaryElectron { void processRec_TTCA(MyCollisions const& collisions, aod::BCsWithTimestamps const&, MyTracks const& tracks, aod::TrackAssoc const& trackIndices) { - auto tracksWithITSPid = soa::Attach(tracks); stored_trackIds.reserve(tracks.size() * 2); for (const auto& collision : collisions) { @@ -619,8 +607,7 @@ struct skimmerPrimaryElectron { auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, collision.globalIndex()); for (const auto& trackId : trackIdsThisCollision) { - // auto track = trackId.template track_as(); - auto track = tracksWithITSPid.rawIteratorAt(trackId.trackId()); + auto track = trackId.template track_as(); if (!checkTrack(collision, track) || !isElectron(collision, track)) { continue; } @@ -635,7 +622,6 @@ struct skimmerPrimaryElectron { void processRec_SA_SWT(MyCollisionsWithSWT const& collisions, aod::BCsWithTimestamps const&, MyFilteredTracks const& tracks) { - auto tracksWithITSPid = soa::Attach(tracks); stored_trackIds.reserve(tracks.size()); for (const auto& collision : collisions) { @@ -650,7 +636,7 @@ struct skimmerPrimaryElectron { continue; } - auto tracks_per_coll = tracksWithITSPid.sliceBy(perCol, collision.globalIndex()); + auto tracks_per_coll = tracks.sliceBy(perCol, collision.globalIndex()); for (const auto& track : tracks_per_coll) { if (!checkTrack(collision, track) || !isElectron(collision, track)) { continue; @@ -667,7 +653,6 @@ struct skimmerPrimaryElectron { void processRec_TTCA_SWT(MyCollisionsWithSWT const& collisions, aod::BCsWithTimestamps const&, MyTracks const& tracks, aod::TrackAssoc const& trackIndices) { - auto tracksWithITSPid = soa::Attach(tracks); stored_trackIds.reserve(tracks.size() * 2); for (const auto& collision : collisions) { @@ -684,8 +669,7 @@ struct skimmerPrimaryElectron { auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, collision.globalIndex()); for (const auto& trackId : trackIdsThisCollision) { - // auto track = trackId.template track_as(); - auto track = tracksWithITSPid.rawIteratorAt(trackId.trackId()); + auto track = trackId.template track_as(); if (!checkTrack(collision, track) || !isElectron(collision, track)) { continue; } @@ -705,7 +689,6 @@ struct skimmerPrimaryElectron { Partition negTracksMC = o2::aod::track::signed1Pt < 0.f; void processMC_SA(soa::Join const& collisions, aod::McCollisions const&, aod::BCsWithTimestamps const&, MyFilteredTracksMC const& tracks, aod::McParticles const&) { - auto tracksWithITSPid = soa::Attach(tracks); stored_trackIds.reserve(tracks.size()); for (const auto& collision : collisions) { @@ -719,7 +702,7 @@ struct skimmerPrimaryElectron { continue; } - auto tracks_per_coll = tracksWithITSPid.sliceBy(perCol, collision.globalIndex()); + auto tracks_per_coll = tracks.sliceBy(perCol, collision.globalIndex()); for (const auto& track : tracks_per_coll) { if (!checkTrack(collision, track) || !isElectron(collision, track)) { continue; @@ -735,7 +718,6 @@ struct skimmerPrimaryElectron { void processMC_TTCA(soa::Join const& collisions, aod::McCollisions const&, aod::BCsWithTimestamps const&, MyTracksMC const& tracks, aod::TrackAssoc const& trackIndices, aod::McParticles const&) { - auto tracksWithITSPid = soa::Attach(tracks); stored_trackIds.reserve(tracks.size() * 2); for (const auto& collision : collisions) { @@ -752,8 +734,7 @@ struct skimmerPrimaryElectron { auto trackIdsThisCollision = trackIndices.sliceBy(trackIndicesPerCollision, collision.globalIndex()); for (const auto& trackId : trackIdsThisCollision) { - // auto track = trackId.template track_as(); - auto track = tracksWithITSPid.rawIteratorAt(trackId.trackId()); + auto track = trackId.template track_as(); if (!checkTrack(collision, track) || !isElectron(collision, track)) { continue; } @@ -771,7 +752,7 @@ struct prefilterPrimaryElectron { Produces ele_pfb; SliceCache cache; - Preslice perCol_track = o2::aod::track::collisionId; + Preslice perCol_track = o2::aod::track::collisionId; PresliceUnsorted perCol_ele = o2::aod::emprimaryelectron::collisionId; // CCDB options