Skip to content

Commit f2e355c

Browse files
[PWGJE] trackEfficiency: add weights to eff. and purity plots
1 parent a839831 commit f2e355c

File tree

1 file changed

+168
-4
lines changed

1 file changed

+168
-4
lines changed

PWGJE/Tasks/trackEfficiency.cxx

Lines changed: 168 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ struct TrackEfficiencyJets {
7676
Configurable<std::vector<double>> centralityBinning{"centralityBinning", {0., 10., 50., 70.}, "binning of centrality histograms"};
7777
Configurable<int> intRateNBins{"intRateNBins", 50, "number of bins for interaction rate axis"};
7878
Configurable<float> intRateMax{"intRateMax", 50000.0, "maximum value of interaction rate axis"};
79+
Configurable<int> phiEffNBins{"phiEffNBins", 200, "number of bins for phi axis in efficiency plots"};
80+
Configurable<int> etaEffNBins{"etaEffNBins", 200, "number of bins for eta axis in efficiency plots"};
7981

8082
std::vector<int> eventSelectionBits;
8183
int trackSelection = -1;
@@ -126,7 +128,7 @@ struct TrackEfficiencyJets {
126128
eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(static_cast<std::string>(eventSelections));
127129
trackSelection = jetderiveddatautilities::initialiseTrackSelection(static_cast<std::string>(trackSelections));
128130

129-
if (doprocessEFficiencyPurity) {
131+
if (doprocessEFficiencyPurity || doprocessEFficiencyPurityWeighted) {
130132

131133
registry.add("hMcCollCutsCounts", "McColl cuts count checks", {HistType::kTH1F, {{10, 0., 10.}}});
132134
registry.get<TH1>(HIST("hMcCollCutsCounts"))->GetXaxis()->SetBinLabel(1, "allMcColl");
@@ -151,8 +153,8 @@ struct TrackEfficiencyJets {
151153

152154
AxisSpec ptAxis_eff = {nBinsLowPt, 0., 10., "#it{p}_{T} (GeV/#it{c})"};
153155
AxisSpec ptAxisHigh_eff = {18, 10., 100., "#it{p}_{T} (GeV/#it{c})"};
154-
AxisSpec etaAxis_eff = {100, -1.0, 1.0, "#eta"};
155-
AxisSpec phiAxis_eff = {200, -1.0, 7., "#phi"};
156+
AxisSpec etaAxis_eff = {etaEffNBins, -1.0, 1.0, "#eta"};
157+
AxisSpec phiAxis_eff = {phiEffNBins, -1.0, 7., "#phi"};
156158

157159
// ptAxisLow
158160
registry.add("h3_particle_pt_particle_eta_particle_phi_mcpartofinterest", "#it{p}_{T, mcpart} (GeV/#it{c}); #eta_{mcpart}; #phi_{mcpart}", {HistType::kTH3F, {ptAxis_eff, etaAxis_eff, phiAxis_eff}});
@@ -398,6 +400,168 @@ struct TrackEfficiencyJets {
398400
}
399401
PROCESS_SWITCH(TrackEfficiencyJets, processEFficiencyPurity, "Histograms for efficiency and purity quantities", true);
400402

403+
void processEFficiencyPurityWeighted(aod::JetMcCollision const& mcCollision,
404+
soa::SmallGroups<aod::JetCollisionsMCD> const& collisions, // smallgroups gives only the collisions associated to the current mccollision, thanks to the mccollisionlabel pre-integrated in jetcollisionsmcd
405+
soa::Join<aod::JetTracksMCD, aod::JTrackExtras> const& jetTracks,
406+
JetParticlesWithOriginal const& jMcParticles)
407+
{
408+
// missing:
409+
// * constexpr auto hasCentrality = CollisionMCRecTableCentFT0C::template contains<aod::CentFT0Cs>();
410+
// if constexpr (hasCentrality) {
411+
// * dividing in centrality bins
412+
// I should maybe introduce the sel8 cuts on the collisoins (reco, but what about mccoll? maybe not htat way included in efficiency)
413+
414+
registry.fill(HIST("hMcCollCutsCounts"), 0.5); // all mcCollisions
415+
416+
if (!(abs(mcCollision.posZ()) < vertexZCut)) {
417+
return;
418+
}
419+
registry.fill(HIST("hMcCollCutsCounts"), 1.5); // mcCollision.posZ() condition
420+
421+
if (collisions.size() < 1) {
422+
return;
423+
}
424+
registry.fill(HIST("hMcCollCutsCounts"), 2.5); // mcCollisions with at least one reconstructed collision
425+
426+
if (acceptSplitCollisions == 0 && collisions.size() > 1) {
427+
return;
428+
}
429+
registry.fill(HIST("hMcCollCutsCounts"), 3.5); // split mcCollisions condition
430+
431+
bool hasSel8Coll = false;
432+
bool centralityCheck = false;
433+
if (acceptSplitCollisions == 2) { // check only that the first reconstructed collision passes the check
434+
if (jetderiveddatautilities::selectCollision(collisions.begin(), eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split
435+
hasSel8Coll = true;
436+
}
437+
if (!checkCentrality || ((centralityMin < collisions.begin().centrality()) && (collisions.begin().centrality() < centralityMax))) { // effect unclear if mcColl is split
438+
centralityCheck = true;
439+
}
440+
} else { // check that at least one of the reconstructed collisions passes the checks
441+
for (auto& collision : collisions) {
442+
if (jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents)) { // Skipping MC events that have not a single selected reconstructed collision ; effect unclear if mcColl is split
443+
hasSel8Coll = true;
444+
}
445+
if (!checkCentrality || ((centralityMin < collision.centrality()) && (collision.centrality() < centralityMax))) { // effect unclear if mcColl is split
446+
centralityCheck = true;
447+
}
448+
}
449+
}
450+
if (!hasSel8Coll) {
451+
return;
452+
}
453+
registry.fill(HIST("hMcCollCutsCounts"), 4.5); // at least one of the reconstructed collisions associated with this mcCollision is selected
454+
455+
if (!centralityCheck) {
456+
return;
457+
}
458+
registry.fill(HIST("hMcCollCutsCounts"), 5.5); // at least one of the reconstructed collisions associated with this mcCollision is selected with regard to centrality
459+
460+
float eventWeight = mcCollision.weight();
461+
462+
for (auto& jMcParticle : jMcParticles) {
463+
registry.fill(HIST("hMcPartCutsCounts"), 0.5); // allPartsInSelMcColl
464+
465+
if (!isChargedParticle(jMcParticle.pdgCode())) {
466+
continue;
467+
}
468+
registry.fill(HIST("hMcPartCutsCounts"), 1.5); // isCharged
469+
470+
registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_mcpart_nonprimary"), jMcParticle.pt(), jMcParticle.eta(), jMcParticle.phi(), eventWeight);
471+
472+
if (checkPrimaryPart && !jMcParticle.isPhysicalPrimary()) { // global tracks should be mostly primaries
473+
continue;
474+
}
475+
registry.fill(HIST("hMcPartCutsCounts"), 2.5); // isPrimary
476+
477+
registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_mcpartofinterest"), jMcParticle.pt(), jMcParticle.eta(), jMcParticle.phi(), eventWeight);
478+
479+
registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_mcpartofinterest"), jMcParticle.pt(), jMcParticle.eta(), jMcParticle.phi(), eventWeight);
480+
481+
if ((abs(jMcParticle.eta()) < trackEtaAcceptanceCountQA)) { // removed from actual cuts for now because all the histograms have an eta axis
482+
registry.fill(HIST("hMcPartCutsCounts"), 3.5); // etaAccept // not actually applied here but it will give an idea of what will be done in the post processing
483+
}
484+
}
485+
486+
std::vector<int> seenMcParticlesVector; // is reset every mc collision
487+
488+
int splitCollCounter = 0;
489+
for (auto& collision : collisions) {
490+
splitCollCounter++;
491+
if (acceptSplitCollisions == 2 && splitCollCounter > 1) {
492+
return;
493+
}
494+
495+
if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents) || !(abs(collision.posZ()) < vertexZCut)) {
496+
continue;
497+
}
498+
499+
auto collTracks = jetTracks.sliceBy(tracksPerJCollision, collision.globalIndex());
500+
for (auto& track : collTracks) {
501+
registry.fill(HIST("hTrackCutsCounts"), 0.5);
502+
503+
if (!(jetderiveddatautilities::selectTrack(track, trackSelection) && jetderiveddatautilities::selectTrackDcaZ(track, trackDcaZmax))) { // if track selection is uniformTrack, dcaZ cuts need to be added as they aren't in the selection so that they can be studied here
504+
continue;
505+
}
506+
registry.fill(HIST("hTrackCutsCounts"), 1.5);
507+
508+
if (!track.has_mcParticle()) {
509+
registry.fill(HIST("h3_track_pt_track_eta_track_phi_nonassociatedtrack"), track.pt(), track.eta(), track.phi(), eventWeight);
510+
511+
registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_nonassociatedtrack"), track.pt(), track.eta(), track.phi(), eventWeight);
512+
continue;
513+
}
514+
registry.fill(HIST("hTrackCutsCounts"), 2.5);
515+
516+
auto jMcParticleFromTrack = track.mcParticle_as<JetParticlesWithOriginal>();
517+
if (!jMcParticleFromTrack.isPhysicalPrimary()) {
518+
registry.fill(HIST("h3_track_pt_track_eta_track_phi_associatedtrack_nonprimary"), track.pt(), track.eta(), track.phi(), eventWeight);
519+
registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_associatedtrack_nonprimary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight);
520+
521+
registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_associatedtrack_nonprimary"), track.pt(), track.eta(), track.phi(), eventWeight);
522+
registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_nonprimary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight);
523+
524+
if (std::find(seenMcParticlesVector.begin(), seenMcParticlesVector.end(), jMcParticleFromTrack.globalIndex()) != seenMcParticlesVector.end()) {
525+
registry.fill(HIST("h3_track_pt_track_eta_track_phi_associatedtrack_split_nonprimary"), track.pt(), track.eta(), track.phi(), eventWeight);
526+
registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_associatedtrack_split_nonprimary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight);
527+
528+
registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_associatedtrack_split_nonprimary"), track.pt(), track.eta(), track.phi(), eventWeight);
529+
registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_split_nonprimary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight);
530+
} else {
531+
seenMcParticlesVector.push_back(jMcParticleFromTrack.globalIndex());
532+
}
533+
534+
continue;
535+
}
536+
537+
registry.fill(HIST("hTrackCutsCounts"), 3.5);
538+
539+
registry.fill(HIST("h3_track_pt_track_eta_track_phi_associatedtrack_primary"), track.pt(), track.eta(), track.phi(), eventWeight);
540+
registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_associatedtrack_primary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight);
541+
registry.fill(HIST("h2_particle_pt_track_pt_residual_associatedtrack_primary"), jMcParticleFromTrack.pt(), (jMcParticleFromTrack.pt() - track.pt()) / jMcParticleFromTrack.pt(), eventWeight);
542+
543+
registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_associatedtrack_primary"), track.pt(), track.eta(), track.phi(), eventWeight);
544+
registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_primary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight);
545+
registry.fill(HIST("h2_particle_pt_high_track_pt_high_residual_associatedtrack_primary"), jMcParticleFromTrack.pt(), (jMcParticleFromTrack.pt() - track.pt()) / jMcParticleFromTrack.pt(), eventWeight);
546+
547+
if (std::find(seenMcParticlesVector.begin(), seenMcParticlesVector.end(), jMcParticleFromTrack.globalIndex()) != seenMcParticlesVector.end()) {
548+
registry.fill(HIST("h3_track_pt_track_eta_track_phi_associatedtrack_split_primary"), track.pt(), track.eta(), track.phi(), eventWeight);
549+
registry.fill(HIST("h3_particle_pt_particle_eta_particle_phi_associatedtrack_split_primary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight);
550+
551+
registry.fill(HIST("h3_track_pt_high_track_eta_track_phi_associatedtrack_split_primary"), track.pt(), track.eta(), track.phi(), eventWeight);
552+
registry.fill(HIST("h3_particle_pt_high_particle_eta_particle_phi_associatedtrack_split_primary"), jMcParticleFromTrack.pt(), jMcParticleFromTrack.eta(), jMcParticleFromTrack.phi(), eventWeight);
553+
} else {
554+
seenMcParticlesVector.push_back(jMcParticleFromTrack.globalIndex());
555+
}
556+
557+
if (abs(jMcParticleFromTrack.eta()) < trackEtaAcceptanceCountQA) { // not actually applied here but it will give an idea of what will be done in the post processing
558+
registry.fill(HIST("hTrackCutsCounts"), 4.5);
559+
}
560+
}
561+
}
562+
}
563+
PROCESS_SWITCH(TrackEfficiencyJets, processEFficiencyPurityWeighted, "Histograms for efficiency and purity quantities for weighted simulations", false);
564+
401565
void processTracks(soa::Filtered<aod::JetCollisions>::iterator const& collision,
402566
soa::Filtered<soa::Join<aod::JetTracks, aod::JTrackExtras>> const& tracks)
403567
{
@@ -499,7 +663,7 @@ struct TrackEfficiencyJets {
499663
return;
500664
}
501665

502-
float eventWeight = mcCollision.weight();
666+
float eventWeight = eventWeight;
503667
registry.fill(HIST("h_mccollisions"), 0.5);
504668
registry.fill(HIST("h_mccollisions_weighted"), 0.5, eventWeight);
505669

0 commit comments

Comments
 (0)