1313// / \brief write tables for photons and electrons for dalitz decay
1414// / \author josuha.konig@cern.ch
1515
16+ #include " PWGEM/PhotonMeson/DataModel/EventTables.h"
1617#include " PWGEM/PhotonMeson/DataModel/gammaTables.h"
1718
19+ #include " Common/DataModel/EventSelection.h"
20+
1821#include < Framework/ASoA.h>
19- #include < Framework/ASoAHelpers.h>
2022#include < Framework/AnalysisDataModel.h>
2123#include < Framework/AnalysisHelpers.h>
2224#include < Framework/AnalysisTask.h>
25+ #include < Framework/Concepts.h>
2326#include < Framework/Configurable.h>
24- #include < Framework/InitContext.h>
2527#include < Framework/runDataProcessing.h>
2628
2729using namespace o2 ;
@@ -40,6 +42,12 @@ using MyV0PhotonsLegsMC = o2::soa::Join<o2::aod::V0LegsTmp, aod::V0LegsXYZTmp, a
4042
4143struct skimmerDalitzEvents {
4244
45+ SliceCache cache;
46+ PresliceUnsorted<MyElectrons> perCollisionEl = aod::emprimaryelectron::collisionId;
47+ PresliceUnsorted<o2::aod::V0PhotonsKFTmp> perCol_pcm = o2::aod::v0photonkf::collisionId;
48+ PresliceUnsorted<o2::aod::V0LegsTmp> perCol_legs = o2::aod::v0leg::collisionId;
49+ PresliceUnsorted<o2::aod::V0LegsTmp> perId_legs = o2::aod::v0leg::trackId;
50+
4351 Produces<aod::V0PhotonsKF> v0photonskf;
4452 Produces<aod::V0Legs> v0legs;
4553 Produces<aod::V0LegsXYZ> v0legsXYZ;
@@ -53,21 +61,24 @@ struct skimmerDalitzEvents {
5361 Configurable<unsigned int > minNGammaCand{" minNGammaCand" , 1 , " minimum number of V0 photon candidates in one event" };
5462
5563 // ---------- for data ----------
56- template <bool isMC, typename TElectrons, typename TV0Photons, typename TV0Legs>
57- void process (MyCollisions const & collisions, TElectrons const & emPrimaryElecTmp, TV0Photons const & v0photonskfTmp, TV0Legs const & v0LegsTmp)
64+ template <bool isMC, o2::soa::is_table TElectrons, o2::soa::is_table TV0Photons, o2::soa::is_table TV0Legs>
65+ void coreProcess (MyCollisions const & collisions, TElectrons const & emPrimaryElecTmp, TV0Photons const & v0photonskfTmp, TV0Legs const & v0LegsTmp)
5866 {
59- PresliceUnsorted<TElectrons> perCollisionEl = aod::emprimaryelectron::collisionId;
60- Preslice<TV0Photons> perCol_pcm = o2::aod::v0photonkf::collisionId;
61- Preslice<TV0Legs> perCol_legs = o2::aod::v0leg::collisionId;
67+
68+ auto leg = v0LegsTmp.begin ();
6269 for (const auto & collision : collisions) {
63- auto tracks = emPrimaryElecTmp.sliceBy (perCollisionEl, collision.globalIndex ()); // o2::aod::track::collisionId // o2::aod::emprimaryelectronda::pmeventId
70+ // get electrons for current collision
71+ auto tracks = emPrimaryElecTmp.sliceBy (perCollisionEl, collision.globalIndex ());
6472
73+ // check that there are at least minNElecCand in the collision
6574 if (tracks.size () < minNElecCand) {
6675 continue ;
6776 }
6877
78+ // get photons for current collision
6979 auto photonskf = v0photonskfTmp.sliceBy (perCol_pcm, collision.globalIndex ());
7080
81+ // check that there are at least minNGammaCand in the collision
7182 if (photonskf.size () < minNGammaCand) {
7283 continue ;
7384 }
@@ -90,7 +101,7 @@ struct skimmerDalitzEvents {
90101 }
91102
92103 for (const auto & v0 : photonskf) {
93- v0photonskf (v0.collisionId (), v0.v0Id (), v0. posTrack (), v0. negTrack (),
104+ v0photonskf (v0.collisionId (), v0.v0Id (), v0legs. lastIndex () + 1 , v0legs. lastIndex () + 2 , // o2-linter: disable=magic-number (indexing for v0 leg table)
94105 v0.vx (), v0.vy (), v0.vz (),
95106 v0.px (), v0.py (), v0.pz (),
96107 v0.mGamma (),
@@ -101,38 +112,42 @@ struct skimmerDalitzEvents {
101112
102113 v0photonsphivpsi (
103114 v0.phiv (), v0.psipair ());
104- }
105115
106- auto v0LegsTmpPerColl = v0LegsTmp.sliceBy (perCol_legs, collision.globalIndex ());
107- for (const auto & leg : v0LegsTmp) {
108- v0legs (
109- leg.collisionId (), leg.trackId (), leg.sign (),
110- leg.px (), leg.py (), leg.pz (),
111- leg.dcaXY (), leg.dcaZ (),
112- leg.tpcNClsFindable (), leg.tpcNClsFindableMinusFound (), leg.tpcNClsFindableMinusCrossedRows (), leg.tpcNClsShared (),
113- leg.tpcChi2NCl (), leg.tpcInnerParam (),
114- leg.tpcSignal (), leg.tpcNSigmaEl (), leg.tpcNSigmaPi (),
115- leg.itsClusterSizes (), leg.itsChi2NCl (), leg.detectorMap ());
116-
117- v0legsXYZ (
118- leg.x (), leg.y (), leg.z ());
119-
120- if constexpr (isMC) {
121- v0legsDeDxMC (
122- leg.mcTunedTPCSignal ());
116+ for (const auto & legId : {v0.posTrackId (), v0.negTrackId ()}) {
117+ if (legId < 0 || legId >= static_cast <int >(v0LegsTmp.size ())) {
118+ LOG (warning) << " legID " << legId << " is outside of range of v0legs table with size " << static_cast <int >(v0LegsTmp.size ());
119+ continue ;
120+ }
121+ leg.setCursor (legId);
122+ v0legs (
123+ leg.collisionId (), leg.trackId (), leg.sign (),
124+ leg.px (), leg.py (), leg.pz (),
125+ leg.dcaXY (), leg.dcaZ (),
126+ leg.tpcNClsFindable (), leg.tpcNClsFindableMinusFound (), leg.tpcNClsFindableMinusCrossedRows (), leg.tpcNClsShared (),
127+ leg.tpcChi2NCl (), leg.tpcInnerParam (),
128+ leg.tpcSignal (), leg.tpcNSigmaEl (), leg.tpcNSigmaPi (),
129+ leg.itsClusterSizes (), leg.itsChi2NCl (), leg.detectorMap ());
130+
131+ v0legsXYZ (
132+ leg.x (), leg.y (), leg.z ());
133+
134+ if constexpr (isMC) {
135+ v0legsDeDxMC (
136+ leg.mcTunedTPCSignal ());
137+ }
123138 }
124139 }
125140 }
126141 }
127142
128143 void processRec (MyCollisions const & collisions, MyElectrons const & emPrimaryElecTmp, MyV0Photons const & v0photonskfTmp, MyV0PhotonsLegs const & v0LegsTmp)
129144 {
130- process <false , MyElectrons, MyV0Photons, MyV0PhotonsLegs>(collisions, emPrimaryElecTmp, v0photonskfTmp, v0LegsTmp);
145+ coreProcess <false , MyElectrons, MyV0Photons, MyV0PhotonsLegs>(collisions, emPrimaryElecTmp, v0photonskfTmp, v0LegsTmp);
131146 }
132147
133148 void processMC (MyCollisions const & collisions, MyElectronsMC const & emPrimaryElecTmp, MyV0Photons const & v0photonskfTmp, MyV0PhotonsLegsMC const & v0LegsTmp)
134149 {
135- process <true , MyElectronsMC, MyV0Photons, MyV0PhotonsLegsMC>(collisions, emPrimaryElecTmp, v0photonskfTmp, v0LegsTmp);
150+ coreProcess <true , MyElectronsMC, MyV0Photons, MyV0PhotonsLegsMC>(collisions, emPrimaryElecTmp, v0photonskfTmp, v0LegsTmp);
136151 }
137152
138153 PROCESS_SWITCH (skimmerDalitzEvents, processRec, " process reconstructed info only" , false ); // data
0 commit comments