From 4e78a5dc4b8d1f0e1b006f50398dc55d4d3a107b Mon Sep 17 00:00:00 2001 From: Emil Gorm Nielsen Date: Fri, 21 Aug 2026 11:20:23 +0200 Subject: [PATCH 1/2] Added support for 2D acceptance corrections to improve sparse pair corrections --- .../Tasks/twoParticleCorrelationsMpi.cxx | 76 +++++++++++++------ 1 file changed, 51 insertions(+), 25 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationsMpi.cxx b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationsMpi.cxx index 2efd190d28b..93a880ae97a 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationsMpi.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationsMpi.cxx @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -238,6 +239,8 @@ struct TwoParticleCorrelationsMpi { std::vector yieldTemplates; std::vector> pairAcceptanceMaps; + std::vector> pairAcceptanceEtaVertexMaps; + int pairAcceptanceSchemaVersion = 0; const TList* loadedCcdbYieldTemplateObject = nullptr; bool eventSeedEstimatorEnabled = false; @@ -726,31 +729,45 @@ struct TwoParticleCorrelationsMpi { const auto* schemaVersion = dynamic_cast(findObject("pairAcceptanceSchemaVersion")); const auto* normalization = dynamic_cast(findObject("pairAcceptanceNormalization")); const auto* axes = dynamic_cast(findObject("pairAcceptanceAxes")); - if (schemaVersion == nullptr || TString(schemaVersion->GetTitle()) != "2" || normalization == nullptr || axes == nullptr) { - LOGF(fatal, "Unsupported or missing multiplicity-only pair-acceptance metadata in %s", source.c_str()); + const TString schema = schemaVersion != nullptr ? schemaVersion->GetTitle() : ""; + if (schemaVersion == nullptr || (schema != "2" && schema != "3") || normalization == nullptr || axes == nullptr) { + LOGF(fatal, "Unsupported or missing pair-acceptance metadata in %s", source.c_str()); return; } const int nMultiplicityBins = AxisSpec(axisMultiplicity).getNbins(); pairAcceptanceMaps.clear(); - pairAcceptanceMaps.resize(nMultiplicityBins); + pairAcceptanceEtaVertexMaps.clear(); + pairAcceptanceSchemaVersion = schema.Atoi(); + if (pairAcceptanceSchemaVersion == 2) { + pairAcceptanceMaps.resize(nMultiplicityBins); + } else { + pairAcceptanceEtaVertexMaps.resize(nMultiplicityBins); + } for (int multBin = 0; multBin < nMultiplicityBins; ++multBin) { - auto* inputMap = dynamic_cast(findObject(Form("pairAcceptance_mult_%d", multBin))); - if (inputMap == nullptr) { - LOGF(fatal, "Missing pairAcceptance_mult_%d in %s", multBin, source.c_str()); - pairAcceptanceMaps.clear(); - return; - } - auto* clone = dynamic_cast(inputMap->Clone(Form("loadedPairAcceptance_mult_%d", multBin))); - if (clone == nullptr) { - LOGF(fatal, "Could not clone pairAcceptance_mult_%d from %s as TH3D", multBin, source.c_str()); - pairAcceptanceMaps.clear(); - return; + if (pairAcceptanceSchemaVersion == 2) { + auto* inputMap = dynamic_cast(findObject(Form("pairAcceptance_mult_%d", multBin))); + auto* clone = inputMap != nullptr ? dynamic_cast(inputMap->Clone(Form("loadedPairAcceptance_mult_%d", multBin))) : nullptr; + if (clone == nullptr) { + LOGF(fatal, "Missing or invalid pairAcceptance_mult_%d in %s", multBin, source.c_str()); + pairAcceptanceMaps.clear(); + return; + } + clone->SetDirectory(nullptr); + pairAcceptanceMaps[multBin].reset(clone); + } else { + auto* inputMap = dynamic_cast(findObject(Form("pairAcceptanceEtaVertex_mult_%d", multBin))); + auto* clone = inputMap != nullptr ? dynamic_cast(inputMap->Clone(Form("loadedPairAcceptanceEtaVertex_mult_%d", multBin))) : nullptr; + if (clone == nullptr) { + LOGF(fatal, "Missing or invalid pairAcceptanceEtaVertex_mult_%d in %s", multBin, source.c_str()); + pairAcceptanceEtaVertexMaps.clear(); + return; + } + clone->SetDirectory(nullptr); + pairAcceptanceEtaVertexMaps[multBin].reset(clone); } - clone->SetDirectory(nullptr); - pairAcceptanceMaps[multBin].reset(clone); } - LOGF(info, "Loaded %zu multiplicity-only pair-acceptance maps from %s", pairAcceptanceMaps.size(), source.c_str()); + LOGF(info, "Loaded %d schema-%d pair-acceptance maps from %s", nMultiplicityBins, pairAcceptanceSchemaVersion, source.c_str()); } void loadLocalYieldTemplates() @@ -871,23 +888,32 @@ struct TwoParticleCorrelationsMpi { } } - const TH3D* findPairAcceptanceMap(double multiplicity) const + int findPairAcceptanceMultiplicityBin(double multiplicity) const { const auto& edges = AxisSpec(axisMultiplicity).binEdges; const auto upper = std::upper_bound(edges.begin(), edges.end(), multiplicity); - const int multBin = static_cast(std::distance(edges.begin(), upper)) - 1; - if (multBin < 0 || multBin >= static_cast(pairAcceptanceMaps.size())) { - return nullptr; - } - return pairAcceptanceMaps[multBin].get(); + return static_cast(std::distance(edges.begin(), upper)) - 1; } double getPairAcceptance(double multiplicity, double deltaPhi, double deltaEta, double posZ) const { - const auto* map = findPairAcceptanceMap(multiplicity); - if (!map) { + const int multBin = findPairAcceptanceMultiplicityBin(multiplicity); + if (pairAcceptanceSchemaVersion == 3) { + if (multBin < 0 || multBin >= static_cast(pairAcceptanceEtaVertexMaps.size()) || pairAcceptanceEtaVertexMaps[multBin] == nullptr) { + return 0.0; + } + const auto* map = pairAcceptanceEtaVertexMaps[multBin].get(); + const int etaBin = map->GetXaxis()->FindFixBin(deltaEta); + const int vertexBin = map->GetYaxis()->FindFixBin(posZ); + if (etaBin < 1 || etaBin > map->GetNbinsX() || vertexBin < 1 || vertexBin > map->GetNbinsY()) { + return 0.0; + } + return map->GetBinContent(etaBin, vertexBin); + } + if (multBin < 0 || multBin >= static_cast(pairAcceptanceMaps.size()) || pairAcceptanceMaps[multBin] == nullptr) { return 0.0; } + const auto* map = pairAcceptanceMaps[multBin].get(); const int phiBin = map->GetXaxis()->FindFixBin(deltaPhi); const int etaBin = map->GetYaxis()->FindFixBin(deltaEta); const int vertexBin = map->GetZaxis()->FindFixBin(posZ); From 6c33eabc9175faf915784eac248cdcaf8762790a Mon Sep 17 00:00:00 2001 From: Emil Gorm Nielsen Date: Sat, 22 Aug 2026 16:04:25 +0200 Subject: [PATCH 2/2] linter --- .../Tasks/twoParticleCorrelationsMpi.cxx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationsMpi.cxx b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationsMpi.cxx index 93a880ae97a..6c8ca4262a4 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationsMpi.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationsMpi.cxx @@ -739,13 +739,14 @@ struct TwoParticleCorrelationsMpi { pairAcceptanceMaps.clear(); pairAcceptanceEtaVertexMaps.clear(); pairAcceptanceSchemaVersion = schema.Atoi(); - if (pairAcceptanceSchemaVersion == 2) { + int multiplicityDependentOnly = 2; + if (pairAcceptanceSchemaVersion == multiplicityDependentOnly) { pairAcceptanceMaps.resize(nMultiplicityBins); } else { pairAcceptanceEtaVertexMaps.resize(nMultiplicityBins); } for (int multBin = 0; multBin < nMultiplicityBins; ++multBin) { - if (pairAcceptanceSchemaVersion == 2) { + if (pairAcceptanceSchemaVersion == multiplicityDependentOnly) { auto* inputMap = dynamic_cast(findObject(Form("pairAcceptance_mult_%d", multBin))); auto* clone = inputMap != nullptr ? dynamic_cast(inputMap->Clone(Form("loadedPairAcceptance_mult_%d", multBin))) : nullptr; if (clone == nullptr) { @@ -898,7 +899,8 @@ struct TwoParticleCorrelationsMpi { double getPairAcceptance(double multiplicity, double deltaPhi, double deltaEta, double posZ) const { const int multBin = findPairAcceptanceMultiplicityBin(multiplicity); - if (pairAcceptanceSchemaVersion == 3) { + int etaVertexMultiplicityDependentOnly = 3; + if (pairAcceptanceSchemaVersion == etaVertexMultiplicityDependentOnly) { if (multBin < 0 || multBin >= static_cast(pairAcceptanceEtaVertexMaps.size()) || pairAcceptanceEtaVertexMaps[multBin] == nullptr) { return 0.0; }