@@ -60,13 +60,13 @@ struct TrackEfficiencyJets {
6060 Configurable<float > centralityMax{" centralityMax" , 999 , " " };
6161 Configurable<float > vertexZCut{" vertexZCut" , 10 .0f , " Accepted z-vertex range" };
6262 Configurable<float > trackDcaZmax{" trackDcaZmax" , 99 , " additional cut on dcaZ to PV for tracks; uniformTracks in particular don't cut on this at all" };
63- Configurable<int > nBinsLowPt{" nBinsLowPt" , 200 , " number of pt bins for low pt efficiency histograms" };
63+ Configurable<int > nBinsLowPt{" nBinsLowPt" , 200 , " number of pt bins for low pt (below 10GeV) efficiency histograms" };
6464
6565 // Track QA process function configurables:
66- Configurable<float > trackQAEtaMin{" trackEtaMin " , -0.9 , " minimum eta acceptance for tracks in the processTracks QA" };
67- Configurable<float > trackQAEtaMax{" trackEtaMax " , 0.9 , " maximum eta acceptance for tracks in the processTracks QA" };
68- Configurable<float > trackQAPtMin{" trackPtMin " , 0.15 , " minimum pT acceptance for tracks in the processTracks QA" };
69- Configurable<float > trackQAPtMax{" trackPtMax " , 100.0 , " maximum pT acceptance for tracks in the processTracks QA" };
66+ Configurable<float > trackQAEtaMin{" trackQAEtaMin " , -0.9 , " minimum eta acceptance for tracks in the processTracks QA" };
67+ Configurable<float > trackQAEtaMax{" trackQAEtaMax " , 0.9 , " maximum eta acceptance for tracks in the processTracks QA" };
68+ Configurable<float > trackQAPtMin{" trackQAPtMin " , 0.15 , " minimum pT acceptance for tracks in the processTracks QA" };
69+ Configurable<float > trackQAPtMax{" trackQAPtMax " , 100.0 , " maximum pT acceptance for tracks in the processTracks QA" };
7070
7171 int eventSelection = -1 ;
7272 int trackSelection = -1 ;
@@ -99,6 +99,17 @@ struct TrackEfficiencyJets {
9999 }
100100 }
101101
102+ template <typename T, typename U>
103+ void fillTrackGenHistograms (T const & collision, U const & mcparticles, float weight = 1.0 )
104+ {
105+ for (auto const & mcparticle : mcparticles) {
106+ registry.fill (HIST (" h2_centrality_particle_pt" ), collision.centrality (), mcparticle.pt (), weight);
107+ registry.fill (HIST (" h2_centrality_particle_eta" ), collision.centrality (), mcparticle.eta (), weight);
108+ registry.fill (HIST (" h2_centrality_particle_phi" ), collision.centrality (), mcparticle.phi (), weight);
109+ registry.fill (HIST (" h2_centrality_particle_energy" ), collision.centrality (), mcparticle.energy (), weight);
110+ }
111+ }
112+
102113 void init (o2::framework::InitContext&)
103114 {
104115 eventSelection = jetderiveddatautilities::initialiseEventSelection (static_cast <std::string>(eventSelections));
@@ -167,9 +178,7 @@ struct TrackEfficiencyJets {
167178 }
168179
169180 if (doprocessTracks || doprocessTracksWeighted) {
170- AxisSpec centAxis = {101 , 0 ., 101 ., " centrality (%)" };
171- registry.add (" h_collisions" , " event status;event status;entries" , {HistType::kTH1F , {{4 , 0.0 , 4.0 }}});
172- registry.add (" h2_centrality_collisions" , " centrality vs collisions; centrality; collisions" , {HistType::kTH2F , {centAxis, {4 , 0.0 , 4.0 }}});
181+ AxisSpec centAxis = {121 , -10 ., 111 ., " centrality (%)" };
173182 registry.add (" h2_centrality_track_pt" , " centrality vs track pT; centrality; #it{p}_{T,track} (GeV/#it{c})" , {HistType::kTH2F , {centAxis, {200 , 0 ., 200 .}}});
174183 registry.add (" h2_centrality_track_eta" , " centrality vs track #eta; centrality; #eta_{track}" , {HistType::kTH2F , {centAxis, {100 , -1.0 , 1.0 }}});
175184 registry.add (" h2_centrality_track_phi" , " centrality vs track #varphi; centrality; #varphi_{track}" , {HistType::kTH2F , {centAxis, {160 , -1.0 , 7 .}}});
@@ -178,16 +187,37 @@ struct TrackEfficiencyJets {
178187 registry.add (" h2_track_pt_high_track_sigmapt" , " #sigma(#it{p}_{T})/#it{p}_{T}; #it{p}_{T,track} (GeV/#it{c})" , {HistType::kTH2F , {{90 , 10 ., 100 .}, {100000 , 0.0 , 100.0 }}});
179188 registry.add (" h2_track_pt_track_sigma1overpt" , " #sigma(1/#it{p}_{T}); #it{p}_{T,track} (GeV/#it{c})" , {HistType::kTH2F , {{100 , 0 ., 10 .}, {1000 , 0.0 , 10.0 }}});
180189 registry.add (" h2_track_pt_high_track_sigma1overpt" , " #sigma(1/#it{p}_{T}); #it{p}_{T,track} (GeV/#it{c})" , {HistType::kTH2F , {{90 , 10 ., 100 .}, {1000 , 0.0 , 10.0 }}});
181- if (doprocessTracksWeighted) {
182- registry.add (" h_collisions_weighted" , " event status;event status;entries" , {HistType::kTH1F , {{4 , 0.0 , 4.0 }}});
183- }
190+ }
191+
192+ if (doprocessTracksGen || doprocessTracksGenWeighted) {
193+ AxisSpec centAxis = {121 , -10 ., 111 ., " centrality (%)" };
194+ registry.add (" h2_centrality_particle_pt" , " centrality vs track pT; centrality; #it{p}_{T,track} (GeV/#it{c})" , {HistType::kTH2F , {centAxis, {200 , 0 ., 200 .}}});
195+ registry.add (" h2_centrality_particle_eta" , " centrality vs track #eta; centrality; #eta_{track}" , {HistType::kTH2F , {centAxis, {100 , -1.0 , 1.0 }}});
196+ registry.add (" h2_centrality_particle_phi" , " centrality vs track #varphi; centrality; #varphi_{track}" , {HistType::kTH2F , {centAxis, {160 , -1.0 , 7 .}}});
197+ registry.add (" h2_centrality_particle_energy" , " centrality vs track energy; centrality; Energy GeV" , {HistType::kTH2F , {centAxis, {100 , 0.0 , 100.0 }}});
198+ }
199+
200+ if (doprocessTracks || doprocessTracksWeighted) {
201+ AxisSpec centAxis = {121 , -10 ., 111 ., " centrality (%)" };
202+ registry.add (" h_collisions" , " event status;event status;entries" , {HistType::kTH1F , {{4 , 0.0 , 4.0 }}});
203+ registry.add (" h2_centrality_collisions" , " centrality vs collisions; centrality; collisions" , {HistType::kTH2F , {centAxis, {4 , 0.0 , 4.0 }}});
204+ }
205+ if (doprocessTracksGen || doprocessTracksGenWeighted) {
206+ registry.add (" h_mccollisions" , " event status;event status;entries" , {HistType::kTH1F , {{4 , 0.0 , 4.0 }}});
207+ }
208+ if (doprocessTracksWeighted) {
209+ registry.add (" h_collisions_weighted" , " event status;event status;entries" , {HistType::kTH1F , {{4 , 0.0 , 4.0 }}});
210+ }
211+ if (doprocessTracksGenWeighted) {
212+ registry.add (" h_mccollisions_weighted" , " event status;event status;entries" , {HistType::kTH1F , {{4 , 0.0 , 4.0 }}});
184213 }
185214 }
186215
187216 Preslice<JetTracksMCD> tracksPerJCollision = o2::aod::jtrack::collisionId;
188217
189218 // filters for processTracks QA functions only:
190219 Filter trackCuts = (aod::jtrack::pt >= trackQAPtMin && aod::jtrack::pt < trackQAPtMax && aod::jtrack::eta > trackQAEtaMin && aod::jtrack::eta < trackQAEtaMax);
220+ Filter particleCuts = (aod::jmcparticle::pt >= trackQAPtMin && aod::jmcparticle::pt < trackQAPtMax && aod::jmcparticle::eta > trackQAEtaMin && aod::jmcparticle::eta < trackQAEtaMax);
191221 Filter eventCuts = (nabs(aod::jcollision::posZ) < vertexZCut && aod::jcollision::centrality >= centralityMin && aod::jcollision::centrality < centralityMax);
192222
193223 void processEFficiencyPurity (JetMcCollision const & mcCollision,
@@ -379,6 +409,105 @@ struct TrackEfficiencyJets {
379409 fillTrackHistograms (collision, tracks, eventWeight);
380410 }
381411 PROCESS_SWITCH (TrackEfficiencyJets, processTracksWeighted, " QA for charged tracks weighted" , false );
412+
413+ void processTracksGen (JetMcCollision const & mcCollision,
414+ soa::SmallGroups<JetCollisionsMCD> const & collisions,
415+ soa::Filtered<JetParticles> const & mcparticles)
416+ {
417+ registry.fill (HIST (" h_mccollisions" ), 0.5 );
418+ registry.fill (HIST (" h2_centrality_mccollisions" ), collisions.begin ().centrality (), 0.5 );
419+
420+ if (!(abs (mcCollision.posZ ()) < vertexZCut)) {
421+ return ;
422+ }
423+ if (collisions.size () < 1 ) {
424+ return ;
425+ }
426+ if (acceptSplitCollisions == 0 && collisions.size () > 1 ) {
427+ return ;
428+ }
429+
430+ bool hasSel8Coll = false ;
431+ bool centralityCheck = false ;
432+ if (acceptSplitCollisions == 2 ) { // check only that the first reconstructed collision passes the check
433+ if (jetderiveddatautilities::selectCollision (collisions.begin (), eventSelection)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split
434+ hasSel8Coll = true ;
435+ }
436+ if (!checkCentrality || ((centralityMin < collisions.begin ().centrality ()) && (collisions.begin ().centrality () < centralityMax))) { // effect unclear if mcColl is split
437+ centralityCheck = true ;
438+ }
439+ } else { // check that at least one of the reconstructed collisions passes the checks
440+ for (auto & collision : collisions) {
441+ if (jetderiveddatautilities::selectCollision (collision, eventSelection)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split
442+ hasSel8Coll = true ;
443+ }
444+ if (!checkCentrality || ((centralityMin < collision.centrality ()) && (collision.centrality () < centralityMax))) { // effect unclear if mcColl is split
445+ centralityCheck = true ;
446+ }
447+ }
448+ }
449+ if (!hasSel8Coll) {
450+ return ;
451+ }
452+ if (!centralityCheck) {
453+ return ;
454+ }
455+
456+ registry.fill (HIST (" h_mccollisions" ), 1.5 );
457+ registry.fill (HIST (" h2_centrality_mccollisions" ), collisions.begin ().centrality (), 1.5 );
458+ fillTrackGenHistograms (collisions.begin (), mcparticles);
459+ }
460+ PROCESS_SWITCH (TrackEfficiencyJets, processTracksGen, " QA for charged particles" , false );
461+
462+ void processTracksGenWeighted (JetMcCollision const & mcCollision,
463+ soa::SmallGroups<JetCollisionsMCD> const & collisions,
464+ soa::Filtered<JetParticles> const & mcparticles)
465+ {
466+ float eventWeight = mcCollision.weight ();
467+ registry.fill (HIST (" h_mccollisions" ), 0.5 );
468+ registry.fill (HIST (" h_mccollisions_weighted" ), 0.5 , eventWeight);
469+
470+ if (!(abs (mcCollision.posZ ()) < vertexZCut)) {
471+ return ;
472+ }
473+ if (collisions.size () < 1 ) {
474+ return ;
475+ }
476+ if (acceptSplitCollisions == 0 && collisions.size () > 1 ) {
477+ return ;
478+ }
479+
480+ bool hasSel8Coll = false ;
481+ bool centralityCheck = false ;
482+ if (acceptSplitCollisions == 2 ) { // check only that the first reconstructed collision passes the check
483+ if (jetderiveddatautilities::selectCollision (collisions.begin (), eventSelection)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split
484+ hasSel8Coll = true ;
485+ }
486+ if (!checkCentrality || ((centralityMin < collisions.begin ().centrality ()) && (collisions.begin ().centrality () < centralityMax))) { // effect unclear if mcColl is split
487+ centralityCheck = true ;
488+ }
489+ } else { // check that at least one of the reconstructed collisions passes the checks
490+ for (auto & collision : collisions) {
491+ if (jetderiveddatautilities::selectCollision (collision, eventSelection)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split
492+ hasSel8Coll = true ;
493+ }
494+ if (!checkCentrality || ((centralityMin < collision.centrality ()) && (collision.centrality () < centralityMax))) { // effect unclear if mcColl is split
495+ centralityCheck = true ;
496+ }
497+ }
498+ }
499+ if (!hasSel8Coll) {
500+ return ;
501+ }
502+ if (!centralityCheck) {
503+ return ;
504+ }
505+
506+ registry.fill (HIST (" h_mccollisions" ), 1.5 );
507+ registry.fill (HIST (" h_mccollisions_weighted" ), 1.5 , eventWeight);
508+ fillTrackGenHistograms (collisions.begin (), mcparticles, eventWeight);
509+ }
510+ PROCESS_SWITCH (TrackEfficiencyJets, processTracksGenWeighted, " QA for charged particles weighted" , false );
382511};
383512
384513WorkflowSpec defineDataProcessing (ConfigContext const & cfgc) { return WorkflowSpec{adaptAnalysisTask<TrackEfficiencyJets>(cfgc, TaskName{" track-efficiency" })}; }
0 commit comments