@@ -293,6 +293,12 @@ struct TwoParticleCorrelationsMpi {
293293 float weight;
294294 };
295295
296+ struct DetectorClosureResponseCoordinates {
297+ float trueMultiplicity;
298+ float rawMultiplicity;
299+ float correctedMultiplicity;
300+ };
301+
296302 std::vector<YieldTemplate> yieldTemplates;
297303 std::vector<std::unique_ptr<TH3D >> pairAcceptanceMaps;
298304 std::vector<std::unique_ptr<TH2D >> pairAcceptanceEtaVertexMaps;
@@ -466,6 +472,10 @@ struct TwoParticleCorrelationsMpi {
466472 if (doprocessMCDetectorClosure) {
467473 registry.add (" detectorClosure/rawMultiplicityVsTrue" , " raw reconstructed versus true charged multiplicity;N_{ch}^{true};N_{ch}^{raw,reco}" , {HistType::kTH2F , {axisMultiplicity, axisMultiplicity}});
468474 registry.add (" detectorClosure/correctedMultiplicityVsTrue" , " corrected reconstructed versus true charged multiplicity;N_{ch}^{true};N_{ch}^{corr,reco}" , {HistType::kTH2F , {axisMultiplicity, axisMultiplicity}});
475+ registry.add (" detectorClosure/triggerResponseRaw" , " efficiency-weighted trigger response versus raw reconstructed multiplicity" , {HistType::kTHnSparseF , {{axisMultiplicity, " N_{ch}^{true}" }, {axisMultiplicity, " N_{ch}^{raw,reco}" }, {axisPtTrigger, " p_{T,trig}" }}});
476+ registry.add (" detectorClosure/triggerResponseCorrected" , " efficiency-weighted trigger response versus corrected reconstructed multiplicity" , {HistType::kTHnSparseF , {{axisMultiplicity, " N_{ch}^{true}" }, {axisMultiplicity, " N_{ch}^{corr,reco}" }, {axisPtTrigger, " p_{T,trig}" }}});
477+ registry.add (" detectorClosure/pairResponseRaw" , " efficiency-weighted pair response versus raw reconstructed multiplicity" , {HistType::kTHnSparseF , {{axisMultiplicity, " N_{ch}^{true}" }, {axisMultiplicity, " N_{ch}^{raw,reco}" }, {axisDeltaEta, " #Delta#eta" }, {axisPtAssoc, " p_{T,assoc}" }, {axisPtTrigger, " p_{T,trig}" }, {axisDeltaPhi, " #Delta#varphi" }}});
478+ registry.add (" detectorClosure/pairResponseCorrected" , " efficiency-weighted pair response versus corrected reconstructed multiplicity" , {HistType::kTHnSparseF , {{axisMultiplicity, " N_{ch}^{true}" }, {axisMultiplicity, " N_{ch}^{corr,reco}" }, {axisDeltaEta, " #Delta#eta" }, {axisPtAssoc, " p_{T,assoc}" }, {axisPtTrigger, " p_{T,trig}" }, {axisDeltaPhi, " #Delta#varphi" }}});
469479 registry.add (" detectorClosure/profileCorrectedMultiplicityVsTrue" , " mean corrected reconstructed multiplicity versus true multiplicity;N_{ch}^{true};#LT N_{ch}^{corr,reco} #GT" , {HistType::kTProfile , {axisMultiplicity}});
470480 registry.add (" detectorClosure/profileTrueMultiplicityVsCorrected" , " mean true multiplicity versus corrected reconstructed multiplicity;N_{ch}^{corr,reco};#LT N_{ch}^{true} #GT" , {HistType::kTProfile , {axisMultiplicity}});
471481 registry.add (" detectorClosure/recoCollisionsPerMCCollision" , " accepted reconstructed collisions per MC collision;N_{coll}^{reco};events" , {HistType::kTH1F , {{11 , -0.5 , 10.5 }}});
@@ -1774,7 +1784,7 @@ struct TwoParticleCorrelationsMpi {
17741784 }
17751785
17761786 template <CorrelationContainer::CFStep step, typename TTarget, typename TTracks1, typename TTracks2>
1777- void fillCorrelations (TTarget target, TTracks1& tracks1, TTracks2& tracks2, float multiplicity, float posZ, int magField, float eventWeight, EventSeedEstimate* seedEstimate = nullptr , std::vector<PendingSeedTriggerFill>* pendingTriggerFills = nullptr , std::vector<PendingSeedPairFill>* pendingPairFills = nullptr , double userAxisValue = -1.0 , bool fillEstimatorAcceptanceQA = true , bool fillLoopQA = true , float efficiencyMultiplicity = -1 .f)
1787+ void fillCorrelations (TTarget target, TTracks1& tracks1, TTracks2& tracks2, float multiplicity, float posZ, int magField, float eventWeight, EventSeedEstimate* seedEstimate = nullptr , std::vector<PendingSeedTriggerFill>* pendingTriggerFills = nullptr , std::vector<PendingSeedPairFill>* pendingPairFills = nullptr , double userAxisValue = -1.0 , bool fillEstimatorAcceptanceQA = true , bool fillLoopQA = true , float efficiencyMultiplicity = -1 .f, const DetectorClosureResponseCoordinates* detectorClosureResponse = nullptr )
17781788 {
17791789 if (multiplicity < 0 .f ) {
17801790 return ;
@@ -1851,6 +1861,10 @@ struct TwoParticleCorrelationsMpi {
18511861 if (cfg.mEfficiencyTrigger ) {
18521862 triggerWeight *= getEfficiencyCorrection (cfg.mEfficiencyTrigger , track1.eta (), track1.pt (), efficiencyLookupMultiplicity, posZ);
18531863 }
1864+ if (detectorClosureResponse) {
1865+ registry.fill (HIST (" detectorClosure/triggerResponseRaw" ), detectorClosureResponse->trueMultiplicity , detectorClosureResponse->rawMultiplicity , track1.pt (), triggerWeight);
1866+ registry.fill (HIST (" detectorClosure/triggerResponseCorrected" ), detectorClosureResponse->trueMultiplicity , detectorClosureResponse->correctedMultiplicity , track1.pt (), triggerWeight);
1867+ }
18541868 }
18551869
18561870 if (cfgUserAxis == EventSeedAxis) {
@@ -1975,6 +1989,13 @@ struct TwoParticleCorrelationsMpi {
19751989 float deltaPhi = RecoDecay::constrainAngle (track1.phi () - track2.phi (), -o2::constants::math::PIHalf);
19761990 const float deltaEta = track1.eta () - track2.eta ();
19771991
1992+ if constexpr (step == CorrelationContainer::kCFStepCorrected ) {
1993+ if (detectorClosureResponse) {
1994+ registry.fill (HIST (" detectorClosure/pairResponseRaw" ), detectorClosureResponse->trueMultiplicity , detectorClosureResponse->rawMultiplicity , deltaEta, track2.pt (), track1.pt (), deltaPhi, associatedWeight);
1995+ registry.fill (HIST (" detectorClosure/pairResponseCorrected" ), detectorClosureResponse->trueMultiplicity , detectorClosureResponse->correctedMultiplicity , deltaEta, track2.pt (), track1.pt (), deltaPhi, associatedWeight);
1996+ }
1997+ }
1998+
19781999 if (triggerHasTemplate) {
19792000 ++seedEstimate->nCandidatePairs ;
19802001 if (const auto * yieldTemplate = findYieldTemplate (multiplicity, track1.pt (), track2.pt ())) {
@@ -2187,7 +2208,7 @@ struct TwoParticleCorrelationsMpi {
21872208 PROCESS_SWITCH (TwoParticleCorrelationsMpi, processSameGenMC, " Process generated MC events from derived data and validate against the stored HepMC N MPI" , false );
21882209
21892210 template <class CollType , class TTracks1 , class TTracks2 >
2190- void processSameDerivedT (CollType const & collision, TTracks1 const & tracks1, TTracks2 const & tracks2, const int * trueNMPI = nullptr , const float * outputMultiplicityOverride = nullptr , const float * efficiencyMultiplicityOverride = nullptr )
2211+ void processSameDerivedT (CollType const & collision, TTracks1 const & tracks1, TTracks2 const & tracks2, const int * trueNMPI = nullptr , const float * outputMultiplicityOverride = nullptr , const float * efficiencyMultiplicityOverride = nullptr , const DetectorClosureResponseCoordinates* detectorClosureResponse = nullptr )
21912212 {
21922213 auto getMultiplicity = [](const auto & col) {
21932214 return getAnalysisMultiplicity (col);
@@ -2248,14 +2269,14 @@ struct TwoParticleCorrelationsMpi {
22482269 flushSeedAxisFills<CorrelationContainer::kCFStepReconstructed >(same, pendingTriggerFills, pendingPairFills, seedEstimate.nuncSeeds ());
22492270 } else if (hasEfficiency) {
22502271 fillContainerEvent (same, multiplicity, CorrelationContainer::kCFStepCorrected );
2251- fillCorrelations<CorrelationContainer::kCFStepCorrected >(same, tracks1, tracks2, multiplicity, collision.posZ (), field, 1 .0f , &seedEstimate, &pendingTriggerFills, &pendingPairFills, -1.0 , true , true , efficiencyMultiplicity);
2272+ fillCorrelations<CorrelationContainer::kCFStepCorrected >(same, tracks1, tracks2, multiplicity, collision.posZ (), field, 1 .0f , &seedEstimate, &pendingTriggerFills, &pendingPairFills, -1.0 , true , true , efficiencyMultiplicity, detectorClosureResponse );
22522273 finalizeEventSeedEstimate (seedEstimate);
22532274 flushSeedAxisFills<CorrelationContainer::kCFStepCorrected >(same, pendingTriggerFills, pendingPairFills, seedEstimate.nuncSeeds ());
22542275 }
22552276
22562277 if (fillReco && hasEfficiency) {
22572278 fillContainerEvent (same, multiplicity, CorrelationContainer::kCFStepCorrected );
2258- fillCorrelations<CorrelationContainer::kCFStepCorrected >(same, tracks1, tracks2, multiplicity, collision.posZ (), field, 1 .0f , nullptr , nullptr , nullptr , getEventSeedUserAxisValue (multiplicity, seedEstimate.nuncSeeds ()), true , true , efficiencyMultiplicity);
2279+ fillCorrelations<CorrelationContainer::kCFStepCorrected >(same, tracks1, tracks2, multiplicity, collision.posZ (), field, 1 .0f , nullptr , nullptr , nullptr , getEventSeedUserAxisValue (multiplicity, seedEstimate.nuncSeeds ()), true , true , efficiencyMultiplicity, detectorClosureResponse );
22592280 }
22602281 const auto seedClass = getEventSeedClass (multiplicity, seedEstimate.nuncSeeds ());
22612282 fillOutputContainers<Reco>(multiplicity, fRndm ->Rndm (), seedClass);
@@ -2272,7 +2293,7 @@ struct TwoParticleCorrelationsMpi {
22722293 }
22732294 if (hasEfficiency) {
22742295 fillContainerEvent (same, multiplicity, CorrelationContainer::kCFStepCorrected );
2275- fillCorrelations<CorrelationContainer::kCFStepCorrected >(same, tracks1, tracks2, multiplicity, collision.posZ (), field, 1 .0f , fillReco ? nullptr : &seedEstimate, nullptr , nullptr , -1.0 , true , true , efficiencyMultiplicity);
2296+ fillCorrelations<CorrelationContainer::kCFStepCorrected >(same, tracks1, tracks2, multiplicity, collision.posZ (), field, 1 .0f , fillReco ? nullptr : &seedEstimate, nullptr , nullptr , -1.0 , true , true , efficiencyMultiplicity, detectorClosureResponse );
22762297 }
22772298 finalizeEventSeedEstimate (seedEstimate);
22782299 fillOutputContainers<Reco>(multiplicity, fRndm ->Rndm ());
@@ -2605,9 +2626,10 @@ struct TwoParticleCorrelationsMpi {
26052626 registry.fill (HIST (" detectorClosure/profileTrueMultiplicityVsCorrected" ), correctedMultiplicity, trueMultiplicity);
26062627
26072628 auto collisionTracks = tracks.sliceBy (derivedTracksPerCollision, collision.globalIndex ());
2629+ const DetectorClosureResponseCoordinates responseCoordinates{trueMultiplicity, rawMultiplicity, correctedMultiplicity};
26082630 // Physics histograms use true multiplicity, while efficiency weights use
26092631 // the reconstructed multiplicity coordinate for which the map was made.
2610- processSameDerivedT (collision, collisionTracks, collisionTracks, &trueNMPI, &trueMultiplicity, &rawMultiplicity);
2632+ processSameDerivedT (collision, collisionTracks, collisionTracks, &trueNMPI, &trueMultiplicity, &rawMultiplicity, &responseCoordinates );
26112633 }
26122634 }
26132635 PROCESS_SWITCH (TwoParticleCorrelationsMpi, processMCDetectorClosure, " Fill generated, raw reconstructed, and efficiency-corrected MC correlations versus true charged multiplicity" , false );
0 commit comments