Skip to content

Commit 650e0f5

Browse files
committed
PWGJE trackeff fix - add track gen qa
1 parent 00eba35 commit 650e0f5

1 file changed

Lines changed: 140 additions & 11 deletions

File tree

PWGJE/Tasks/trackEfficiency.cxx

Lines changed: 140 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

384513
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask<TrackEfficiencyJets>(cfgc, TaskName{"track-efficiency"})}; }

0 commit comments

Comments
 (0)