Skip to content

Commit 6152593

Browse files
authored
[PWGCF] Add additional MC response histograms in twoParticleCorrelationsMpi.cxx (#18396)
1 parent e0b8ca9 commit 6152593

1 file changed

Lines changed: 28 additions & 6 deletions

File tree

‎PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationsMpi.cxx‎

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

Comments
 (0)