Skip to content

Commit 9092656

Browse files
authored
[PWGJE Validation] Include track check for leading tracks in jetTrackCollisionQa and fix overcounting of jets in mcJetTrackCollisionQa (#2750)
* Fix MC jet bug via collision association and add track filter; Include trackSelection for leading tracks and change abs to fabs in jetTrackCollisionQa * clang formatting for PR
1 parent 0c9bdce commit 9092656

1 file changed

Lines changed: 64 additions & 76 deletions

File tree

PWGJE/Tasks/jetvalidationqa.cxx

Lines changed: 64 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,9 @@
1212
// \author
1313
// Johanna Lömker
1414
// \since Dec 2022
15-
// Examples for configurations and run macros (https://github.com/jloemker/PWGJE/tree/master/O2Physics/config_run)
16-
// 1)Configuration for run2 validation on ESD:
17-
// Use run2ESD.sh with configRun2ESD.json
18-
// 2)Configuration for run3 validation on AOD: NOT YET WORKING - see comment in run3AOD.sh
19-
// Use run3AOD.sh with configRun3AOD.json
20-
// 3)Configuration for MC validation on converted run2 AOD:
21-
// Use runMC2.sh with configMC2Jet.json
22-
// 4) Configuration for MC validation on run3 AOD:
23-
// Use runMC3.sh with configMC3Jet.json
24-
2515
////////////////=============================================////////////////
2616
// TODO's:
2717
//============== 1)template in mcJetTrackCollisionQa to validate JetMatching !
28-
// look at matching https://github.com/AliceO2Group/O2Physics/blob/723d78931b446e7b5f6e0673c0345fcef584e796/Tutorials/src/mcHistograms.cxx#L154
2918
// loop over matched jets
3019
// make additional TH2F's for matched jets in pt, phi, eta (just what i did for the ones for tracks and collisions)
3120
// i) with mcrec vs mcpart
@@ -37,9 +26,6 @@
3726
//
3827
//============== 3) prepare plotting macros for Run3 and MCrun2, MCrun3 !
3928
//
40-
//============== 4) improve binning - also in AliPhysics !
41-
//
42-
//============== 3) add explicit filters for collision and tracks to mc and make use in run3
4329
////////////////=============================================////////////////
4430

4531
#include "Framework/runDataProcessing.h"
@@ -59,10 +45,6 @@ using namespace o2;
5945
using namespace o2::framework;
6046
using namespace o2::framework::expressions;
6147

62-
// tracks for 1) validation on ESD 2) Run2 MC validatio on AO2D's 3) Run2 MC validation on AO2D's
63-
using MCTracksRun3JE = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::TrackSelection, aod::McTrackLabels>;
64-
using MCTracksRun2JE = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::TrackSelection, aod::McTrackLabels>; // for now the same
65-
6648
// struct for jetfinder validation on run2 ESD's and run3 data
6749
struct jetTrackCollisionQa {
6850
// Track filter configs
@@ -125,15 +107,11 @@ struct jetTrackCollisionQa {
125107
template <typename validationTracks>
126108
void fillTrackQA(validationTracks const& track)
127109
{
128-
if (!selectTrack(track, trackSelection)) {
129-
return;
130-
}
131110
mHistManager.fill(HIST("selectedTrackPt"), track.pt());
132111
mHistManager.fill(HIST("selectedTrackPhi"), track.phi());
133112
mHistManager.fill(HIST("selectedTrackEta"), track.eta());
134113
} // end of fillTrackQA template
135114

136-
// template <typename validationTracks>
137115
void fillLeadingTrackQA(double leadingTrackPt, double leadingTrackPhi, double leadingTrackEta)
138116
{
139117
mHistManager.fill(HIST("leadTrackPt"), leadingTrackPt);
@@ -149,7 +127,6 @@ struct jetTrackCollisionQa {
149127
mHistManager.fill(HIST("jetEta"), jet.eta());
150128
} // end of fillJetQA template
151129

152-
// template <typename validationTracks>
153130
void fillLeadingJetQA(double leadingJetPt, double leadingJetPhi, double leadingJetEta)
154131
{
155132
mHistManager.fill(HIST("leadJetPt"), leadingJetPt);
@@ -165,7 +142,6 @@ struct jetTrackCollisionQa {
165142
mHistManager.fill(HIST("jetConstTrackEta"), jct.eta());
166143
} // end of mcDetJetConstituent template
167144

168-
// template <typename validationTracks>
169145
void fillLeadingJetConstQA(double leadingConstTrackPt, double leadingConstTrackPhi, double leadingConstTrackEta)
170146
{
171147
mHistManager.fill(HIST("leadJetConstPt"), leadingConstTrackPt);
@@ -175,12 +151,11 @@ struct jetTrackCollisionQa {
175151

176152
Filter etafilter = (aod::track::eta < etaup) && (aod::track::eta > etalow);
177153
Filter ptfilter = (aod::track::pt < ptUp) && (aod::track::pt > ptLow);
178-
179154
using TracksJE = soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::TrackSelection>>;
180155

181156
void processESD(soa::Join<aod::Collisions, aod::EvSels>::iterator const& collision, soa::Join<aod::ChargedJets, aod::ChargedJetConstituents> const& jets, TracksJE const& tracks)
182157
{
183-
if (!collision.sel7() || abs(collision.posZ()) > 10) {
158+
if (!collision.sel7() || fabs(collision.posZ()) > 10) {
184159
return;
185160
}
186161
mHistManager.fill(HIST("collisionVtxZ"), collision.posZ());
@@ -189,10 +164,8 @@ struct jetTrackCollisionQa {
189164
double leadingTrackPhi = -1;
190165
double leadingTrackEta = -1;
191166
// qa histograms for selected tracks in collision
192-
// Partition<aod::Tracks> groupedTracks = aod::track::collisionId == collision.globalIndex();//could be Tracks instead of TracksJE
193-
// groupedTracks.bindTable(tracks);
194167
for (const auto& t : tracks) {
195-
if (t.collisionId() == collision.globalIndex()) {
168+
if (t.collisionId() == collision.globalIndex() & selectTrack(t, trackSelection) == true) {
196169
fillTrackQA(t);
197170
if (t.pt() > leadingTrackPt) {
198171
leadingTrackPt = t.pt();
@@ -238,7 +211,7 @@ struct jetTrackCollisionQa {
238211
// process for run3 AOD's
239212
void processRun3AOD(soa::Join<aod::Collisions, aod::EvSels>::iterator const& collision, soa::Join<aod::ChargedJets, aod::ChargedJetConstituents> const& jets, TracksJE const& tracks)
240213
{
241-
if (!collision.sel8() || abs(collision.posZ()) > 10) {
214+
if (!collision.sel8() || fabs(collision.posZ()) > 10) {
242215
return;
243216
}
244217
mHistManager.fill(HIST("collisionVtxZ"), collision.posZ());
@@ -247,11 +220,13 @@ struct jetTrackCollisionQa {
247220
double leadingTrackEta = -1;
248221
// qa histograms for selected tracks in collision
249222
for (const auto& t : tracks) {
250-
fillTrackQA(t);
251-
if (t.pt() > leadingTrackPt) {
252-
leadingTrackPt = t.pt();
253-
leadingTrackPhi = t.phi();
254-
leadingTrackEta = t.eta();
223+
if (t.collisionId() == collision.globalIndex() & selectTrack(t, trackSelection) == true) {
224+
fillTrackQA(t);
225+
if (t.pt() > leadingTrackPt) {
226+
leadingTrackPt = t.pt();
227+
leadingTrackPhi = t.phi();
228+
leadingTrackEta = t.eta();
229+
}
255230
}
256231
} // end of tracks loop
257232
// fill leading track
@@ -297,6 +272,11 @@ struct jetTrackCollisionQa {
297272

298273
// MC validation for run2 and run3 on AO2D's
299274
struct mcJetTrackCollisionQa {
275+
// Track filter configs
276+
Configurable<float> ptLow{"ptLow", 0.15f, "lowest pt"};
277+
Configurable<float> ptUp{"ptUp", 10e10f, "highest pt"};
278+
Configurable<float> etalow{"etaLow", -0.9f, "lowest eta"};
279+
Configurable<float> etaup{"etaUp", 0.9f, "highest eta"};
300280

301281
HistogramRegistry mHistManager{"JetCollisionQAHistograms"};
302282
Configurable<int> nBins{"nBins", 200, "N bins in histos"}; // keep nBins for vertex and special 2D's
@@ -384,17 +364,17 @@ struct mcJetTrackCollisionQa {
384364
mHistManager.fill(HIST("collResolutionPt"), collision.mcCollision().posZ(), (collision.posZ() - collision.mcCollision().posZ()) / collision.mcCollision().posZ());
385365
} // end of collision template
386366

387-
// fill qa histograms for selected tracks in collision - bool for if .has_mcCollision()
388-
template <class ValidationTracks>
389-
void fillMcTrackHistos(ValidationTracks const& mct, bool mc) // could give collision as argument for additional association
367+
// fill qa histograms for selected tracks in collision
368+
template <class ValidationTracks, typename coll>
369+
void fillMcTrackHistos(ValidationTracks const& mct, coll collision, bool mc) // could give collision as argument for additional association
390370
{
391371
for (const auto& track : mct) {
392-
if (!selectTrack(track, trackSelection)) {
372+
if (!selectTrack(track, trackSelection) || track.collisionId() == collision.globalIndex()) {
393373
return;
394374
}
395375
if (mc == true) {
396376
if (track.has_mcParticle()) {
397-
auto mcParticle = track.mcParticle(); // t.mcParticle_as<aod::McParticles>();
377+
auto mcParticle = track.mcParticle();
398378
mHistManager.fill(HIST("genMCselectedTrackPt"), mcParticle.pt());
399379
mHistManager.fill(HIST("genMCselectedTrackPhi"), mcParticle.phi());
400380
mHistManager.fill(HIST("genMCselectedTrackEta"), mcParticle.eta());
@@ -452,68 +432,76 @@ struct mcJetTrackCollisionQa {
452432
mHistManager.fill(HIST("genMCjetConstTrackEta"), mcpJConst.eta());
453433
} // end of mcPartJetConstituent template
454434

435+
Filter etafilter = (aod::track::eta < etaup) && (aod::track::eta > etalow);
436+
Filter ptfilter = (aod::track::pt < ptUp) && (aod::track::pt > ptLow);
437+
using MCTracksJE = soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::TrackSelection, aod::McTrackLabels>>;
438+
455439
void processMcRun2(soa::Join<aod::Collisions, aod::McCollisionLabels>::iterator const& collision,
456440
soa::Join<aod::ChargedMCParticleLevelJets, aod::ChargedMCParticleLevelJetConstituents> const& mcPartJets,
457441
soa::Join<aod::ChargedMCDetectorLevelJets, aod::ChargedMCDetectorLevelJetConstituents> const& mcDetJets,
458442
aod::McParticles const& mcParticles, aod::McCollisions const& mcCollisions,
459-
MCTracksRun2JE const& tracks)
443+
MCTracksJE const& tracks)
460444
{
461-
if (abs(collision.posZ()) > 10) { // sel7 for run2: !collision.sel7()
445+
if (fabs(collision.posZ()) > 10) {
462446
return;
463447
}
464448
mHistManager.fill(HIST("collisionVtxZ"), collision.posZ());
465449
if (collision.has_mcCollision()) {
466450
fillMcCollisionHistos(collision);
467-
fillMcTrackHistos(tracks, true);
451+
fillMcTrackHistos(tracks, collision, true);
452+
for (const auto& genJet : mcPartJets) {
453+
if (genJet.mcCollisionId() == collision.globalIndex()) {
454+
fillMcPartJets(genJet);
455+
for (auto& mcParticle : genJet.tracks_as<aod::McParticles>()) {
456+
fillMcPartJetConstituents(mcParticle);
457+
}
458+
}
459+
} // end of loop particle level jets
468460
} // end if has mc collision
469-
fillMcTrackHistos(tracks, false);
470-
461+
fillMcTrackHistos(tracks, collision, false);
471462
for (const auto& detJet : mcDetJets) {
472-
fillMcDetJets(detJet);
473-
for (auto& detConst : detJet.tracks_as<MCTracksRun2JE>()) {
474-
fillMcDetJetConstituents(detConst);
475-
} // end of loop detector level constituents
476-
} // end of loop detector level jets
477-
478-
for (const auto& genJet : mcPartJets) {
479-
fillMcPartJets(genJet);
480-
for (auto& mcParticle : genJet.tracks_as<aod::McParticles>()) {
481-
fillMcPartJetConstituents(mcParticle);
482-
} // end of jet constituent loop
483-
} // end of loop particle level jets
484-
} // end processMcRun2
463+
if (detJet.collisionId() == collision.globalIndex()) {
464+
fillMcDetJets(detJet);
465+
for (auto& detConst : detJet.tracks_as<MCTracksJE>()) {
466+
fillMcDetJetConstituents(detConst);
467+
}
468+
}
469+
} // end of loop detector level jets
470+
} // end processMcRun2
485471
PROCESS_SWITCH(mcJetTrackCollisionQa, processMcRun2, "validate jet-finder output on converted run2 mc AOD's", false);
486472

487473
void processMcRun3(soa::Join<aod::Collisions, aod::McCollisionLabels>::iterator const& collision,
488474
soa::Join<aod::ChargedMCParticleLevelJets, aod::ChargedMCParticleLevelJetConstituents> const& mcPartJets,
489475
soa::Join<aod::ChargedMCDetectorLevelJets, aod::ChargedMCDetectorLevelJetConstituents> const& mcDetJets,
490476
aod::McParticles const& mcParticles, aod::McCollisions const& mcCollisions,
491-
MCTracksRun3JE const& tracks)
477+
MCTracksJE const& tracks)
492478
{
493-
if (abs(collision.posZ()) > 10) { // sel8 for run3: !collision.sel8() -> only on run3 data with EvSels in process function !
479+
if (fabs(collision.posZ()) > 10) {
494480
return;
495481
}
496482
mHistManager.fill(HIST("collisionVtxZ"), collision.posZ());
497483
if (collision.has_mcCollision()) {
498484
fillMcCollisionHistos(collision);
499-
fillMcTrackHistos(tracks, true);
485+
fillMcTrackHistos(tracks, collision, true);
486+
for (const auto& genJet : mcPartJets) {
487+
if (genJet.mcCollisionId() == collision.globalIndex()) {
488+
fillMcPartJets(genJet);
489+
for (auto& mcParticle : genJet.tracks_as<aod::McParticles>()) {
490+
fillMcPartJetConstituents(mcParticle);
491+
}
492+
}
493+
} // end of loop particle level jets
500494
} // end of loop if mc collision
501-
fillMcTrackHistos(tracks, false);
502-
495+
fillMcTrackHistos(tracks, collision, false);
503496
for (const auto& detJet : mcDetJets) {
504-
fillMcDetJets(detJet);
505-
for (auto& detConst : detJet.tracks_as<MCTracksRun3JE>()) {
506-
fillMcDetJetConstituents(detConst);
507-
} // end of loop detector level constituents
508-
} // end of loop detector level jets
509-
510-
for (const auto& genJet : mcPartJets) {
511-
fillMcPartJets(genJet);
512-
for (auto& mcParticle : genJet.tracks_as<aod::McParticles>()) {
513-
fillMcPartJetConstituents(mcParticle);
514-
} // end of jet constituent loop
515-
} // end of loop particle level jets
516-
} // end processMcRun3
497+
if (detJet.collisionId() == collision.globalIndex()) {
498+
fillMcDetJets(detJet);
499+
for (auto& detConst : detJet.tracks_as<MCTracksJE>()) {
500+
fillMcDetJetConstituents(detConst);
501+
}
502+
}
503+
} // end of loop detector level jets
504+
} // end processMcRun3
517505
PROCESS_SWITCH(mcJetTrackCollisionQa, processMcRun3, "validate jet-finder output on run3 mc AOD's", false);
518506

519507
// dummy process to run jetfinder validation code on AO2D's, but MC validation for run3 on hyperloop

0 commit comments

Comments
 (0)