Skip to content

Commit d5b6d3e

Browse files
authored
[PWGLF] ZDC correlation and improved recentering (#18142)
1 parent 15c66ee commit d5b6d3e

1 file changed

Lines changed: 43 additions & 0 deletions

File tree

‎PWGLF/TableProducer/Common/zdc2stagecalibration.cxx‎

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@ struct zdc2stagecalibration {
108108
static constexpr int kQRecenteringMultidimNFeatures = 35;
109109
static constexpr int kQRecenteringMultidimNMatrixMoments = kQRecenteringMultidimNFeatures * (kQRecenteringMultidimNFeatures + 1) / 2;
110110
static constexpr int kQRecenteringMultidimNMoments = kQRecenteringMultidimNMatrixMoments + kQRecenteringNComponents * kQRecenteringMultidimNFeatures;
111+
// Additional sufficient statistics for the flatness-constrained multidimensional fit.
112+
// Per conditioning bin store 35 sums of the cubic features followed by
113+
// 4 sums of QxA,QyA,QxC,QyC. Feature 0 is unity, so its sum is N.
114+
static constexpr int kQRecenteringFlatnessNMoments = kQRecenteringMultidimNFeatures + kQRecenteringNComponents;
111115

112116
void init(o2::framework::InitContext&)
113117
{
@@ -128,7 +132,9 @@ struct zdc2stagecalibration {
128132
AxisSpec ratioAxis = {240, 0.0, 2.4, "#Sigma tower/common"};
129133
AxisSpec qRecenteringMomentAxis = {kQRecenteringNMoments, 0.0, static_cast<double>(kQRecenteringNMoments), "regression moment"};
130134
AxisSpec qRecenteringMultidimMomentAxis = {kQRecenteringMultidimNMoments, 0.0, static_cast<double>(kQRecenteringMultidimNMoments), "multidimensional regression moment"};
135+
AxisSpec qRecenteringFlatnessMomentAxis = {kQRecenteringFlatnessNMoments, 0.0, static_cast<double>(kQRecenteringFlatnessNMoments), "flatness sufficient-statistic index"};
131136
AxisSpec centralityAxis = {80, 0.0, 80.0, "centrality (%)"};
137+
AxisSpec resolutionCentralityAxis = {50, 0.0, 50.0, "centrality (%)"};
132138
AxisSpec vertexXYAxis = {100, -0.5, 0.5, "vertex x/y (cm)"};
133139
AxisSpec vertexZAxis = {100, -10.0, 10.0, "vertex z (cm)"};
134140
AxisSpec qComponentAxis = {4, 0.0, 4.0, "Q component"};
@@ -198,6 +204,17 @@ struct zdc2stagecalibration {
198204
histos.add("QRecenteringCalibration/hRegressionMoments", "Q recentering regression moments;centrality (%);moment index", kTH2D, {centralityAxis, qRecenteringMomentAxis});
199205
histos.add("QRecenteringCalibration/hRegressionMomentsMultidim", "Multidimensional cubic Q recentering regression moments;centrality (%);moment index", kTH2D, {centralityAxis, qRecenteringMultidimMomentAxis});
200206

207+
// Sufficient statistics used only when deriving the multidimensional map with
208+
// an additional flatness penalty. They do not alter the 35-feature model or
209+
// the application-side CCDB format. For each (centrality,conditioning) bin:
210+
// indices 0..34 = sum(X_i), indices 35..38 = sum(QxA,QyA,QxC,QyC).
211+
if (deriveQRecentering.value && qRecenteringMethod.value == 1) {
212+
histos.add("QRecenteringCalibration/hFlatnessMomentsTime", "Flatness sufficient statistics vs time;centrality (%);time from SOR (h);statistic index", kTH3D, {centralityAxis, timeAxis, qRecenteringFlatnessMomentAxis});
213+
histos.add("QRecenteringCalibration/hFlatnessMomentsVx", "Flatness sufficient statistics vs v_{x};centrality (%);v_{x} (cm);statistic index", kTH3D, {centralityAxis, vertexXYAxis, qRecenteringFlatnessMomentAxis});
214+
histos.add("QRecenteringCalibration/hFlatnessMomentsVy", "Flatness sufficient statistics vs v_{y};centrality (%);v_{y} (cm);statistic index", kTH3D, {centralityAxis, vertexXYAxis, qRecenteringFlatnessMomentAxis});
215+
histos.add("QRecenteringCalibration/hFlatnessMomentsVz", "Flatness sufficient statistics vs v_{z};centrality (%);v_{z} (cm);statistic index", kTH3D, {centralityAxis, vertexZAxis, qRecenteringFlatnessMomentAxis});
216+
}
217+
201218
histos.add("QRecenteringQA/pQBeforeVsCentrality", "Q before recentering vs centrality;centrality (%);Q component;<Q>", kTProfile2D, {centralityAxis, qComponentAxis});
202219
histos.add("QRecenteringQA/pQBeforeVsTime", "Q before recentering vs time;time from SOR (h);Q component;<Q>", kTProfile2D, {timeAxis, qComponentAxis});
203220
histos.add("QRecenteringQA/pQBeforeVsVx", "Q before recentering vs v_{x};v_{x} (cm);Q component;<Q>", kTProfile2D, {vertexXYAxis, qComponentAxis});
@@ -208,6 +225,7 @@ struct zdc2stagecalibration {
208225
histos.add("QRecenteringQA/pQAfterVsVx", "Q after recentering vs v_{x};v_{x} (cm);Q component;<Q>", kTProfile2D, {vertexXYAxis, qComponentAxis});
209226
histos.add("QRecenteringQA/pQAfterVsVy", "Q after recentering vs v_{y};v_{y} (cm);Q component;<Q>", kTProfile2D, {vertexXYAxis, qComponentAxis});
210227
histos.add("QRecenteringQA/pQAfterVsVz", "Q after recentering vs v_{z};v_{z} (cm);Q component;<Q>", kTProfile2D, {vertexZAxis, qComponentAxis});
228+
histos.add("ResolutionQA/pCosPsiAPsiCVsCentrality", "ZDC A-C spectator-plane correlation;centrality (%);<#cos(#Psi_{A}-#Psi_{C})>", kTProfile, {resolutionCentralityAxis});
211229
histos.add("QRecentering2DQA/pQxAAfterVsCentralityTime", "QxA after recentering;centrality (%);time from SOR (h);<Q_{x}^{A}>", kTProfile2D, {centralityAxis, timeAxis});
212230
histos.add("QRecentering2DQA/pQyAAfterVsCentralityTime", "QyA after recentering;centrality (%);time from SOR (h);<Q_{y}^{A}>", kTProfile2D, {centralityAxis, timeAxis});
213231
histos.add("QRecentering2DQA/pQxCAfterVsCentralityTime", "QxC after recentering;centrality (%);time from SOR (h);<Q_{x}^{C}>", kTProfile2D, {centralityAxis, timeAxis});
@@ -732,6 +750,25 @@ struct zdc2stagecalibration {
732750
histos.fill(HIST("QRecenteringCalibration/hRegressionMomentsMultidim"), centrality, index + 0.5, qFeatures[i] * qValues[component]);
733751
}
734752
}
753+
754+
// Store only the compact per-bin sums needed to add conditional-mean
755+
// flatness penalties in the post-processing builder. The first feature
756+
// is 1, therefore sum(X_0) is the number of events in that bin.
757+
for (int i = 0; i < kQRecenteringMultidimNFeatures; ++i) {
758+
const double value = qFeatures[i];
759+
histos.fill(HIST("QRecenteringCalibration/hFlatnessMomentsTime"), centrality, timeFromSOR, i + 0.5, value);
760+
histos.fill(HIST("QRecenteringCalibration/hFlatnessMomentsVx"), centrality, vx, i + 0.5, value);
761+
histos.fill(HIST("QRecenteringCalibration/hFlatnessMomentsVy"), centrality, vy, i + 0.5, value);
762+
histos.fill(HIST("QRecenteringCalibration/hFlatnessMomentsVz"), centrality, vz, i + 0.5, value);
763+
}
764+
for (int component = 0; component < kQRecenteringNComponents; ++component) {
765+
const int index = kQRecenteringMultidimNFeatures + component;
766+
const double value = qValues[component];
767+
histos.fill(HIST("QRecenteringCalibration/hFlatnessMomentsTime"), centrality, timeFromSOR, index + 0.5, value);
768+
histos.fill(HIST("QRecenteringCalibration/hFlatnessMomentsVx"), centrality, vx, index + 0.5, value);
769+
histos.fill(HIST("QRecenteringCalibration/hFlatnessMomentsVy"), centrality, vy, index + 0.5, value);
770+
histos.fill(HIST("QRecenteringCalibration/hFlatnessMomentsVz"), centrality, vz, index + 0.5, value);
771+
}
735772
}
736773
}
737774

@@ -818,6 +855,12 @@ struct zdc2stagecalibration {
818855

819856
const double phiRecenteringA = std::atan2(qValues[1], qValues[0]);
820857
const double phiRecenteringC = std::atan2(qValues[3], qValues[2]);
858+
// ZDC resolution
859+
const double qMagA = std::hypot(qValues[0], qValues[1]);
860+
const double qMagC = std::hypot(qValues[2], qValues[3]);
861+
if (centrality >= 0.f && centrality < 50.f && qMagA > 0. && qMagC > 0.) {
862+
histos.fill(HIST("ResolutionQA/pCosPsiAPsiCVsCentrality"), centrality, std::cos(phiRecenteringA - phiRecenteringC));
863+
}
821864
histos.fill(HIST("PhiQA/hPhiAfterRecenteringZNA"), phiRecenteringA);
822865
histos.fill(HIST("PhiQA/hPhiAfterRecenteringZNC"), phiRecenteringC);
823866
histos.fill(HIST("PhiQA/hPhiAfterRecenteringVsCentralityZNA"), centrality, phiRecenteringA);

0 commit comments

Comments
 (0)