Skip to content

Commit 535bb8e

Browse files
committed
[Common] Fix stale Q/Pt values in TrackTuner graph-based smearing
When qOverPtMC and qOverPtData are configured as negative sentinels (requesting graph-based evaluation), the original code overwrites the member variables on the first track call. All subsequent tracks then skip graph evaluation and reuse stale values from the first track's pT, applying incorrect smearing. Fix: use local variables (currentQOverPtMC, currentQOverPtData) so each track evaluates the graphs at its own pT. The member variable sentinels remain negative, ensuring graph evaluation on every call.
1 parent 33057d7 commit 535bb8e

File tree

1 file changed

+35
-30
lines changed

1 file changed

+35
-30
lines changed

Common/Tools/TrackTuner.h

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -735,19 +735,24 @@ struct TrackTuner : o2::framework::ConfigurableGroup {
735735
dcaZResMC = evalGraph(ptMC, grDcaZResVsPtPionMC[phiBin].get());
736736
dcaZResData = evalGraph(ptMC, grDcaZResVsPtPionData[phiBin].get());
737737

738-
// For Q/Pt corrections, files on CCDB will be used if both qOverPtMC and qOverPtData are null
738+
// Local Q/Pt resolution: either the constant configurable value, or evaluated per-track from graphs
739+
double currentQOverPtMC = qOverPtMC;
740+
double currentQOverPtData = qOverPtData;
739741
if (updateCurvature || updateCurvatureIU) {
740-
if ((qOverPtMC < 0) || (qOverPtData < 0)) {
741-
if (debugInfo) {
742-
LOG(info) << "### q/pt smearing: qOverPtMC=" << qOverPtMC << ", qOverPtData=" << qOverPtData << ". One of them is negative. Retrieving then values from graphs from input .root file";
743-
}
742+
if ((currentQOverPtMC < 0) || (currentQOverPtData < 0)) {
744743
/// check that input graphs for q/pt smearing are correctly retrieved
745744
if (!grOneOverPtPionData.get() || !grOneOverPtPionMC.get()) {
746745
LOG(fatal) << "### q/pt smearing: input graphs not correctly retrieved. Aborting.";
747746
}
748-
qOverPtMC = std::max(0.0, evalGraph(ptMC, grOneOverPtPionMC.get()));
749-
qOverPtData = std::max(0.0, evalGraph(ptMC, grOneOverPtPionData.get()));
750-
} // qOverPtMC, qOverPtData block ends here
747+
currentQOverPtMC = std::max(0.0, evalGraph(ptMC, grOneOverPtPionMC.get()));
748+
currentQOverPtData = std::max(0.0, evalGraph(ptMC, grOneOverPtPionData.get()));
749+
if (debugInfo) {
750+
LOG(info) << "### q/pt graph-based smearing: pT=" << ptMC
751+
<< " sigma(1/pT)_MC=" << currentQOverPtMC
752+
<< " sigma(1/pT)_Data=" << currentQOverPtData
753+
<< " ratio(Data/MC)=" << (currentQOverPtMC > 0. ? currentQOverPtData / currentQOverPtMC : -1.);
754+
}
755+
} // currentQOverPtMC, currentQOverPtData block ends here
751756
} // updateCurvature, updateCurvatureIU block ends here
752757

753758
if (updateTrackDCAs) {
@@ -816,44 +821,44 @@ struct TrackTuner : o2::framework::ConfigurableGroup {
816821
// double dpt1o =pt1o-pt1mc;
817822
deltaQpt = trackParQPtMCRec - trackParQPtMC;
818823
// double dpt1n =dpt1o *(spt1o >0. ? (spt1n /spt1o ) : 1.);
819-
deltaQptTuned = deltaQpt * (qOverPtMC > 0. ? (qOverPtData / qOverPtMC) : 1.);
824+
deltaQptTuned = deltaQpt * (currentQOverPtMC > 0. ? (currentQOverPtData / currentQOverPtMC) : 1.);
820825
// double pt1n = pt1mc+dpt1n;
821826
trackParQPtTuned = trackParQPtMC + deltaQptTuned;
822827
trackParCov.setQ2Pt(trackParQPtTuned);
823828

824829
// updating track cov matrix elements for 1/Pt at innermost update point
825830
// if(sd0rpo>0. && spt1o>0.)covar[10]*=(sd0rpn/sd0rpo)*(spt1n/spt1o);//ypt
826831
sigma1PtY = trackParCov.getSigma1PtY();
827-
if (dcaXYResMC > 0. && qOverPtMC > 0.) {
828-
sigma1PtY *= ((dcaXYResData / dcaXYResMC) * (qOverPtData / qOverPtMC));
832+
if (dcaXYResMC > 0. && currentQOverPtMC > 0.) {
833+
sigma1PtY *= ((dcaXYResData / dcaXYResMC) * (currentQOverPtData / currentQOverPtMC));
829834
trackParCov.setCov(sigma1PtY, 10);
830835
}
831836

832837
// if(sd0zo>0. && spt1o>0.) covar[11]*=(sd0zn/sd0zo)*(spt1n/spt1o);//zpt
833838
sigma1PtZ = trackParCov.getSigma1PtZ();
834-
if (dcaZResMC > 0. && qOverPtMC > 0.) {
835-
sigma1PtZ *= ((dcaZResData / dcaZResMC) * (qOverPtData / qOverPtMC));
839+
if (dcaZResMC > 0. && currentQOverPtMC > 0.) {
840+
sigma1PtZ *= ((dcaZResData / dcaZResMC) * (currentQOverPtData / currentQOverPtMC));
836841
trackParCov.setCov(sigma1PtZ, 11);
837842
}
838843

839844
// if(spt1o>0.) covar[12]*=(spt1n/spt1o);//sinPhipt
840845
sigma1PtSnp = trackParCov.getSigma1PtSnp();
841-
if (qOverPtMC > 0.) {
842-
sigma1PtSnp *= (qOverPtData / qOverPtMC);
846+
if (currentQOverPtMC > 0.) {
847+
sigma1PtSnp *= (currentQOverPtData / currentQOverPtMC);
843848
trackParCov.setCov(sigma1PtSnp, 12);
844849
}
845850

846851
// if(spt1o>0.) covar[13]*=(spt1n/spt1o);//tanTpt
847852
sigma1PtTgl = trackParCov.getSigma1PtTgl();
848-
if (qOverPtMC > 0.) {
849-
sigma1PtTgl *= (qOverPtData / qOverPtMC);
853+
if (currentQOverPtMC > 0.) {
854+
sigma1PtTgl *= (currentQOverPtData / currentQOverPtMC);
850855
trackParCov.setCov(sigma1PtTgl, 13);
851856
}
852857

853858
// if(spt1o>0.) covar[14]*=(spt1n/spt1o)*(spt1n/spt1o);//ptpt
854859
sigma1Pt2 = trackParCov.getSigma1Pt2();
855-
if (qOverPtMC > 0.) {
856-
sigma1Pt2 *= (qOverPtData / qOverPtMC) * (qOverPtData / qOverPtMC);
860+
if (currentQOverPtMC > 0.) {
861+
sigma1Pt2 *= (currentQOverPtData / currentQOverPtMC) * (currentQOverPtData / currentQOverPtMC);
857862
trackParCov.setCov(sigma1Pt2, 14);
858863
}
859864
} // updateCurvatureIU block ends here
@@ -949,7 +954,7 @@ struct TrackTuner : o2::framework::ConfigurableGroup {
949954
}
950955
deltaQpt = trackParQPtMCRec - trackParQPtMC;
951956
// double dpt1n =dpt1o *(spt1o >0. ? (spt1n /spt1o ) : 1.);
952-
deltaQptTuned = deltaQpt * (qOverPtMC > 0. ? (qOverPtData / qOverPtMC) : 1.);
957+
deltaQptTuned = deltaQpt * (currentQOverPtMC > 0. ? (currentQOverPtData / currentQOverPtMC) : 1.);
953958
// double pt1n = pt1mc+dpt1n;
954959
trackParQPtTuned = trackParQPtMC + deltaQptTuned;
955960
trackParCov.setQ2Pt(trackParQPtTuned);
@@ -1010,36 +1015,36 @@ struct TrackTuner : o2::framework::ConfigurableGroup {
10101015
if ((updateCurvature) && (!updateCurvatureIU)) {
10111016
// if(sd0rpo>0. && spt1o>0.)covar[10]*=(sd0rpn/sd0rpo)*(spt1n/spt1o);//ypt
10121017
sigma1PtY = trackParCov.getSigma1PtY();
1013-
if (dcaXYResMC > 0. && qOverPtMC > 0.) {
1014-
sigma1PtY *= ((dcaXYResData / dcaXYResMC) * (qOverPtData / qOverPtMC));
1018+
if (dcaXYResMC > 0. && currentQOverPtMC > 0.) {
1019+
sigma1PtY *= ((dcaXYResData / dcaXYResMC) * (currentQOverPtData / currentQOverPtMC));
10151020
trackParCov.setCov(sigma1PtY, 10);
10161021
}
10171022

10181023
// if(sd0zo>0. && spt1o>0.) covar[11]*=(sd0zn/sd0zo)*(spt1n/spt1o);//zpt
10191024
sigma1PtZ = trackParCov.getSigma1PtZ();
1020-
if (dcaZResMC > 0. && qOverPtMC > 0.) {
1021-
sigma1PtZ *= ((dcaZResData / dcaZResMC) * (qOverPtData / qOverPtMC));
1025+
if (dcaZResMC > 0. && currentQOverPtMC > 0.) {
1026+
sigma1PtZ *= ((dcaZResData / dcaZResMC) * (currentQOverPtData / currentQOverPtMC));
10221027
trackParCov.setCov(sigma1PtZ, 11);
10231028
}
10241029

10251030
// if(spt1o>0.) covar[12]*=(spt1n/spt1o);//sinPhipt
10261031
sigma1PtSnp = trackParCov.getSigma1PtSnp();
1027-
if (qOverPtMC > 0.) {
1028-
sigma1PtSnp *= (qOverPtData / qOverPtMC);
1032+
if (currentQOverPtMC > 0.) {
1033+
sigma1PtSnp *= (currentQOverPtData / currentQOverPtMC);
10291034
trackParCov.setCov(sigma1PtSnp, 12);
10301035
}
10311036

10321037
// if(spt1o>0.) covar[13]*=(spt1n/spt1o);//tanTpt
10331038
sigma1PtTgl = trackParCov.getSigma1PtTgl();
1034-
if (qOverPtMC > 0.) {
1035-
sigma1PtTgl *= (qOverPtData / qOverPtMC);
1039+
if (currentQOverPtMC > 0.) {
1040+
sigma1PtTgl *= (currentQOverPtData / currentQOverPtMC);
10361041
trackParCov.setCov(sigma1PtTgl, 13);
10371042
}
10381043

10391044
// if(spt1o>0.) covar[14]*=(spt1n/spt1o)*(spt1n/spt1o);//ptpt
10401045
sigma1Pt2 = trackParCov.getSigma1Pt2();
1041-
if (qOverPtMC > 0.) {
1042-
sigma1Pt2 *= (qOverPtData / qOverPtMC) * (qOverPtData / qOverPtMC);
1046+
if (currentQOverPtMC > 0.) {
1047+
sigma1Pt2 *= (currentQOverPtData / currentQOverPtMC) * (currentQOverPtData / currentQOverPtMC);
10431048
trackParCov.setCov(sigma1Pt2, 14);
10441049
}
10451050
} // ---> track cov matrix elements for 1/Pt ends here

0 commit comments

Comments
 (0)