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