diff --git a/PWGEM/PhotonMeson/TableProducer/skimmerDalitzEvents.cxx b/PWGEM/PhotonMeson/TableProducer/skimmerDalitzEvents.cxx index 7401382c1a5..e038b916848 100644 --- a/PWGEM/PhotonMeson/TableProducer/skimmerDalitzEvents.cxx +++ b/PWGEM/PhotonMeson/TableProducer/skimmerDalitzEvents.cxx @@ -13,15 +13,17 @@ /// \brief write tables for photons and electrons for dalitz decay /// \author josuha.konig@cern.ch +#include "PWGEM/PhotonMeson/DataModel/EventTables.h" #include "PWGEM/PhotonMeson/DataModel/gammaTables.h" +#include "Common/DataModel/EventSelection.h" + #include -#include #include #include #include +#include #include -#include #include using namespace o2; @@ -40,6 +42,12 @@ using MyV0PhotonsLegsMC = o2::soa::Join perCollisionEl = aod::emprimaryelectron::collisionId; + PresliceUnsorted perCol_pcm = o2::aod::v0photonkf::collisionId; + PresliceUnsorted perCol_legs = o2::aod::v0leg::collisionId; + PresliceUnsorted perId_legs = o2::aod::v0leg::trackId; + Produces v0photonskf; Produces v0legs; Produces v0legsXYZ; @@ -53,21 +61,24 @@ struct skimmerDalitzEvents { Configurable minNGammaCand{"minNGammaCand", 1, "minimum number of V0 photon candidates in one event"}; // ---------- for data ---------- - template - void process(MyCollisions const& collisions, TElectrons const& emPrimaryElecTmp, TV0Photons const& v0photonskfTmp, TV0Legs const& v0LegsTmp) + template + void coreProcess(MyCollisions const& collisions, TElectrons const& emPrimaryElecTmp, TV0Photons const& v0photonskfTmp, TV0Legs const& v0LegsTmp) { - PresliceUnsorted perCollisionEl = aod::emprimaryelectron::collisionId; - Preslice perCol_pcm = o2::aod::v0photonkf::collisionId; - Preslice perCol_legs = o2::aod::v0leg::collisionId; + + auto leg = v0LegsTmp.begin(); for (const auto& collision : collisions) { - auto tracks = emPrimaryElecTmp.sliceBy(perCollisionEl, collision.globalIndex()); // o2::aod::track::collisionId // o2::aod::emprimaryelectronda::pmeventId + // get electrons for current collision + auto tracks = emPrimaryElecTmp.sliceBy(perCollisionEl, collision.globalIndex()); + // check that there are at least minNElecCand in the collision if (tracks.size() < minNElecCand) { continue; } + // get photons for current collision auto photonskf = v0photonskfTmp.sliceBy(perCol_pcm, collision.globalIndex()); + // check that there are at least minNGammaCand in the collision if (photonskf.size() < minNGammaCand) { continue; } @@ -90,7 +101,7 @@ struct skimmerDalitzEvents { } for (const auto& v0 : photonskf) { - v0photonskf(v0.collisionId(), v0.v0Id(), v0.posTrack(), v0.negTrack(), + v0photonskf(v0.collisionId(), v0.v0Id(), v0legs.lastIndex() + 1, v0legs.lastIndex() + 2, // o2-linter: disable=magic-number (indexing for v0 leg table) v0.vx(), v0.vy(), v0.vz(), v0.px(), v0.py(), v0.pz(), v0.mGamma(), @@ -101,25 +112,29 @@ struct skimmerDalitzEvents { v0photonsphivpsi( v0.phiv(), v0.psipair()); - } - auto v0LegsTmpPerColl = v0LegsTmp.sliceBy(perCol_legs, collision.globalIndex()); - for (const auto& leg : v0LegsTmp) { - v0legs( - leg.collisionId(), leg.trackId(), leg.sign(), - leg.px(), leg.py(), leg.pz(), - leg.dcaXY(), leg.dcaZ(), - leg.tpcNClsFindable(), leg.tpcNClsFindableMinusFound(), leg.tpcNClsFindableMinusCrossedRows(), leg.tpcNClsShared(), - leg.tpcChi2NCl(), leg.tpcInnerParam(), - leg.tpcSignal(), leg.tpcNSigmaEl(), leg.tpcNSigmaPi(), - leg.itsClusterSizes(), leg.itsChi2NCl(), leg.detectorMap()); - - v0legsXYZ( - leg.x(), leg.y(), leg.z()); - - if constexpr (isMC) { - v0legsDeDxMC( - leg.mcTunedTPCSignal()); + for (const auto& legId : {v0.posTrackId(), v0.negTrackId()}) { + if (legId < 0 || legId >= static_cast(v0LegsTmp.size())) { + LOG(warning) << "legID " << legId << " is outside of range of v0legs table with size " << static_cast(v0LegsTmp.size()); + continue; + } + leg.setCursor(legId); + v0legs( + leg.collisionId(), leg.trackId(), leg.sign(), + leg.px(), leg.py(), leg.pz(), + leg.dcaXY(), leg.dcaZ(), + leg.tpcNClsFindable(), leg.tpcNClsFindableMinusFound(), leg.tpcNClsFindableMinusCrossedRows(), leg.tpcNClsShared(), + leg.tpcChi2NCl(), leg.tpcInnerParam(), + leg.tpcSignal(), leg.tpcNSigmaEl(), leg.tpcNSigmaPi(), + leg.itsClusterSizes(), leg.itsChi2NCl(), leg.detectorMap()); + + v0legsXYZ( + leg.x(), leg.y(), leg.z()); + + if constexpr (isMC) { + v0legsDeDxMC( + leg.mcTunedTPCSignal()); + } } } } @@ -127,12 +142,12 @@ struct skimmerDalitzEvents { void processRec(MyCollisions const& collisions, MyElectrons const& emPrimaryElecTmp, MyV0Photons const& v0photonskfTmp, MyV0PhotonsLegs const& v0LegsTmp) { - process(collisions, emPrimaryElecTmp, v0photonskfTmp, v0LegsTmp); + coreProcess(collisions, emPrimaryElecTmp, v0photonskfTmp, v0LegsTmp); } void processMC(MyCollisions const& collisions, MyElectronsMC const& emPrimaryElecTmp, MyV0Photons const& v0photonskfTmp, MyV0PhotonsLegsMC const& v0LegsTmp) { - process(collisions, emPrimaryElecTmp, v0photonskfTmp, v0LegsTmp); + coreProcess(collisions, emPrimaryElecTmp, v0photonskfTmp, v0LegsTmp); } PROCESS_SWITCH(skimmerDalitzEvents, processRec, "process reconstructed info only", false); // data