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,14 +61,13 @@ 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+ auto tracks = emPrimaryElecTmp.sliceBy (perCollisionEl, collision.globalIndex ());
6471
6572 if (tracks.size () < minNElecCand) {
6673 continue ;
@@ -90,7 +97,7 @@ struct skimmerDalitzEvents {
9097 }
9198
9299 for (const auto & v0 : photonskf) {
93- v0photonskf (v0.collisionId (), v0.v0Id (), v0. posTrack (), v0. negTrack (),
100+ v0photonskf (v0.collisionId (), v0.v0Id (), v0legs. lastIndex () + 1 , v0legs. lastIndex () + 2 , // o2-linter: disable=magic-number (indexing for v0 leg table)
94101 v0.vx (), v0.vy (), v0.vz (),
95102 v0.px (), v0.py (), v0.pz (),
96103 v0.mGamma (),
@@ -101,38 +108,42 @@ struct skimmerDalitzEvents {
101108
102109 v0photonsphivpsi (
103110 v0.phiv (), v0.psipair ());
104- }
105111
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 ());
112+ for (const auto & legId : {v0.posTrackId (), v0.negTrackId ()}) {
113+ if (legId < 0 || legId >= static_cast <int >(v0LegsTmp.size ())) {
114+ LOG (warning) << " legID " << legId << " is outside of range of v0legs table with size " << static_cast <int >(v0LegsTmp.size ());
115+ continue ;
116+ }
117+ leg.setCursor (legId);
118+ v0legs (
119+ leg.collisionId (), leg.trackId (), leg.sign (),
120+ leg.px (), leg.py (), leg.pz (),
121+ leg.dcaXY (), leg.dcaZ (),
122+ leg.tpcNClsFindable (), leg.tpcNClsFindableMinusFound (), leg.tpcNClsFindableMinusCrossedRows (), leg.tpcNClsShared (),
123+ leg.tpcChi2NCl (), leg.tpcInnerParam (),
124+ leg.tpcSignal (), leg.tpcNSigmaEl (), leg.tpcNSigmaPi (),
125+ leg.itsClusterSizes (), leg.itsChi2NCl (), leg.detectorMap ());
126+
127+ v0legsXYZ (
128+ leg.x (), leg.y (), leg.z ());
129+
130+ if constexpr (isMC) {
131+ v0legsDeDxMC (
132+ leg.mcTunedTPCSignal ());
133+ }
123134 }
124135 }
125136 }
126137 }
127138
128139 void processRec (MyCollisions const & collisions, MyElectrons const & emPrimaryElecTmp, MyV0Photons const & v0photonskfTmp, MyV0PhotonsLegs const & v0LegsTmp)
129140 {
130- process <false , MyElectrons, MyV0Photons, MyV0PhotonsLegs>(collisions, emPrimaryElecTmp, v0photonskfTmp, v0LegsTmp);
141+ coreProcess <false , MyElectrons, MyV0Photons, MyV0PhotonsLegs>(collisions, emPrimaryElecTmp, v0photonskfTmp, v0LegsTmp);
131142 }
132143
133144 void processMC (MyCollisions const & collisions, MyElectronsMC const & emPrimaryElecTmp, MyV0Photons const & v0photonskfTmp, MyV0PhotonsLegsMC const & v0LegsTmp)
134145 {
135- process <true , MyElectronsMC, MyV0Photons, MyV0PhotonsLegsMC>(collisions, emPrimaryElecTmp, v0photonskfTmp, v0LegsTmp);
146+ coreProcess <true , MyElectronsMC, MyV0Photons, MyV0PhotonsLegsMC>(collisions, emPrimaryElecTmp, v0photonskfTmp, v0LegsTmp);
136147 }
137148
138149 PROCESS_SWITCH (skimmerDalitzEvents, processRec, " process reconstructed info only" , false ); // data
0 commit comments