Skip to content

Commit 77f3e8a

Browse files
author
jokonig
committed
[PWGEM] PhotonMeson: Fix Preslice and indexing in Dalitz skimmer
- Preslices have to be defined outside process function - Legs are now accessed from V0s and indexing from v0 table fixed
1 parent bcb2527 commit 77f3e8a

1 file changed

Lines changed: 44 additions & 29 deletions

File tree

PWGEM/PhotonMeson/TableProducer/skimmerDalitzEvents.cxx

Lines changed: 44 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,17 @@
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

2729
using namespace o2;
@@ -40,6 +42,12 @@ using MyV0PhotonsLegsMC = o2::soa::Join<o2::aod::V0LegsTmp, aod::V0LegsXYZTmp, a
4042

4143
struct 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

Comments
 (0)