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
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;
5945using namespace o2 ::framework;
6046using 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
6749struct 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
299274struct 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