Skip to content

Commit 7ce4a4d

Browse files
committed
Add diagnostic histograms for MC efficiency
1 parent a3fd837 commit 7ce4a4d

1 file changed

Lines changed: 34 additions & 0 deletions

File tree

PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationsMpi.cxx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
#include <string>
7171
#include <tuple>
7272
#include <type_traits>
73+
#include <unordered_map>
7374
#include <utility>
7475
#include <vector>
7576

@@ -373,6 +374,16 @@ struct TwoParticleCorrelationsMpi {
373374
registry.add("multCorrelations", "Multiplicity correlations", {HistType::kTHnSparseF, multAxes});
374375
}
375376
registry.add("multiplicity", "event multiplicity", {HistType::kTH1F, {{1000, 0, 100, "/multiplicity/centrality"}}});
377+
if (doprocessMCEfficiency) {
378+
registry.add("mcEfficiencyDiagnostics/reconstructedTracks", "selected reconstructed tracks per collision;N_{tracks};collisions", {HistType::kTH1F, {{1001, -0.5, 1000.5}}});
379+
registry.add("mcEfficiencyDiagnostics/matchedTracks", "MC-matched reconstructed tracks per collision;N_{matched};collisions", {HistType::kTH1F, {{1001, -0.5, 1000.5}}});
380+
registry.add("mcEfficiencyDiagnostics/uniqueMatchedParticles", "unique matched MC particles per collision;N_{unique labels};collisions", {HistType::kTH1F, {{1001, -0.5, 1000.5}}});
381+
registry.add("mcEfficiencyDiagnostics/duplicateMatchedTracks", "matched tracks beyond one per MC label;N_{matched}-N_{unique labels};collisions", {HistType::kTH1F, {{501, -0.5, 500.5}}});
382+
registry.add("mcEfficiencyDiagnostics/duplicateFraction", "fraction of matched tracks sharing an MC label;(N_{matched}-N_{unique labels})/N_{matched};collisions", {HistType::kTH1F, {{101, -0.005, 1.005}}});
383+
registry.add("mcEfficiencyDiagnostics/tracksPerMcParticle", "reconstructed tracks per matched MC-particle label;tracks per MC label;MC labels", {HistType::kTH1F, {{21, -0.5, 20.5}}});
384+
registry.add("mcEfficiencyDiagnostics/generatedVsUniqueMatchedPrimaries", "generated versus uniquely matched physical primaries;N_{generated primary};N_{unique matched primary}", {HistType::kTH2F, {{501, -0.5, 500.5}, {501, -0.5, 500.5}}});
385+
registry.add("mcEfficiencyDiagnostics/primaryTracksPerMcParticle", "reconstructed tracks per matched physical-primary label;tracks per primary MC label;MC labels", {HistType::kTH1F, {{21, -0.5, 20.5}}});
386+
}
376387
if (eventSeedEstimatorEnabled) {
377388
registry.add("eventSeedEstimator", "event-level template estimator", {HistType::kTHnSparseF, {{100, 0, 100, "multiplicity"}, {100, -0.5, 99.5, "N_{trig}"}, {200, 0, 20, "Y_{near}"}, {200, 0, 20, "Y_{away}"}, {200, 0, 100, "N_{uncorrelated seeds}"}}});
378389
registry.add("eventSeedPairProbabilities", "summed pair probabilities", {HistType::kTH3F, {{200, 0, 200, "#Sigma P_{baseline}"}, {200, 0, 200, "#Sigma P_{near}"}, {200, 0, 200, "#Sigma P_{away}"}}});
@@ -1943,8 +1954,10 @@ struct TwoParticleCorrelationsMpi {
19431954
}
19441955
}
19451956
// Primaries
1957+
int generatedPrimaries = 0;
19461958
for (const auto& mcParticle : mcParticles) {
19471959
if (mcParticle.isPhysicalPrimary() && mcParticle.sign() != 0 && !(std::find(cfgMcTriggerPDGs->begin(), cfgMcTriggerPDGs->end(), mcParticle.pdgCode()) != cfgMcTriggerPDGs->end())) {
1960+
++generatedPrimaries;
19481961
same->getTrackHistEfficiency()->Fill(CorrelationContainer::MC, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), multiplicity, mcCollision.posZ());
19491962
}
19501963
}
@@ -1953,6 +1966,10 @@ struct TwoParticleCorrelationsMpi {
19531966
continue;
19541967
}
19551968
auto groupedTracks = tracks.sliceBy(perCollision, collision.globalIndex());
1969+
int reconstructedTracks = 0;
1970+
int matchedTracks = 0;
1971+
std::unordered_map<int64_t, int> tracksPerMcParticle;
1972+
std::unordered_map<int64_t, int> primaryTracksPerMcParticle;
19561973
if (cfgVerbosity > 0) {
19571974
LOGF(info, " Reconstructed collision at vtx-z = %f", collision.posZ());
19581975
LOGF(info, " which has %d tracks", groupedTracks.size());
@@ -1962,9 +1979,13 @@ struct TwoParticleCorrelationsMpi {
19621979
if (cfgTrackBitMask > 0 && (track.trackType() & (uint8_t)cfgTrackBitMask) != (uint8_t)cfgTrackBitMask) {
19631980
continue;
19641981
}
1982+
++reconstructedTracks;
19651983
if (track.has_cfMCParticle()) {
1984+
++matchedTracks;
1985+
++tracksPerMcParticle[track.cfMCParticleId()];
19661986
const auto& mcParticle = track.cfMCParticle();
19671987
if (mcParticle.isPhysicalPrimary()) {
1988+
++primaryTracksPerMcParticle[track.cfMCParticleId()];
19681989
same->getTrackHistEfficiency()->Fill(CorrelationContainer::RecoPrimaries, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), multiplicity, mcCollision.posZ());
19691990
}
19701991
same->getTrackHistEfficiency()->Fill(CorrelationContainer::RecoAll, mcParticle.eta(), mcParticle.pt(), getSpecies(mcParticle.pdgCode()), multiplicity, mcCollision.posZ());
@@ -1974,6 +1995,19 @@ struct TwoParticleCorrelationsMpi {
19741995
same->getTrackHistEfficiency()->Fill(CorrelationContainer::Fake, track.eta(), track.pt(), 0, multiplicity, mcCollision.posZ());
19751996
}
19761997
}
1998+
const int duplicateMatchedTracks = matchedTracks - static_cast<int>(tracksPerMcParticle.size());
1999+
registry.fill(HIST("mcEfficiencyDiagnostics/reconstructedTracks"), reconstructedTracks);
2000+
registry.fill(HIST("mcEfficiencyDiagnostics/matchedTracks"), matchedTracks);
2001+
registry.fill(HIST("mcEfficiencyDiagnostics/uniqueMatchedParticles"), tracksPerMcParticle.size());
2002+
registry.fill(HIST("mcEfficiencyDiagnostics/duplicateMatchedTracks"), duplicateMatchedTracks);
2003+
registry.fill(HIST("mcEfficiencyDiagnostics/duplicateFraction"), matchedTracks > 0 ? static_cast<float>(duplicateMatchedTracks) / matchedTracks : 0.f);
2004+
for (const auto& entry : tracksPerMcParticle) {
2005+
registry.fill(HIST("mcEfficiencyDiagnostics/tracksPerMcParticle"), entry.second);
2006+
}
2007+
for (const auto& entry : primaryTracksPerMcParticle) {
2008+
registry.fill(HIST("mcEfficiencyDiagnostics/primaryTracksPerMcParticle"), entry.second);
2009+
}
2010+
registry.fill(HIST("mcEfficiencyDiagnostics/generatedVsUniqueMatchedPrimaries"), generatedPrimaries, primaryTracksPerMcParticle.size());
19772011
}
19782012
}
19792013
PROCESS_SWITCH(TwoParticleCorrelationsMpi, processMCEfficiency, "MC: Extract efficiencies", false);

0 commit comments

Comments
 (0)