Skip to content

Commit c6c4c38

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 2649473 commit c6c4c38

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
@@ -755,19 +755,24 @@ struct TrackTuner : o2::framework::ConfigurableGroup {
755755
dcaZResMC = evalGraph(ptMC, grDcaZResVsPtPionMC[phiBin].get());
756756
dcaZResData = evalGraph(ptMC, grDcaZResVsPtPionData[phiBin].get());
757757

758-
// For Q/Pt corrections, files on CCDB will be used if both qOverPtMC and qOverPtData are null
758+
// Local Q/Pt resolution: either the constant configurable value, or evaluated per-track from graphs
759+
double currentQOverPtMC = qOverPtMC;
760+
double currentQOverPtData = qOverPtData;
759761
if (updateCurvature || updateCurvatureIU) {
760-
if ((qOverPtMC < 0) || (qOverPtData < 0)) {
761-
if (debugInfo) {
762-
LOG(info) << "### q/pt smearing: qOverPtMC=" << qOverPtMC << ", qOverPtData=" << qOverPtData << ". One of them is negative. Retrieving then values from graphs from input .root file";
763-
}
762+
if ((currentQOverPtMC < 0) || (currentQOverPtData < 0)) {
764763
/// check that input graphs for q/pt smearing are correctly retrieved
765764
if (!grOneOverPtPionData.get() || !grOneOverPtPionMC.get()) {
766765
LOG(fatal) << "### q/pt smearing: input graphs not correctly retrieved. Aborting.";
767766
}
768-
qOverPtMC = std::max(0.0, evalGraph(ptMC, grOneOverPtPionMC.get()));
769-
qOverPtData = std::max(0.0, evalGraph(ptMC, grOneOverPtPionData.get()));
770-
} // qOverPtMC, qOverPtData block ends here
767+
currentQOverPtMC = std::max(0.0, evalGraph(ptMC, grOneOverPtPionMC.get()));
768+
currentQOverPtData = std::max(0.0, evalGraph(ptMC, grOneOverPtPionData.get()));
769+
if (debugInfo) {
770+
LOG(info) << "### q/pt graph-based smearing: pT=" << ptMC
771+
<< " sigma(1/pT)_MC=" << currentQOverPtMC
772+
<< " sigma(1/pT)_Data=" << currentQOverPtData
773+
<< " ratio(Data/MC)=" << (currentQOverPtMC > 0. ? currentQOverPtData / currentQOverPtMC : -1.);
774+
}
775+
} // currentQOverPtMC, currentQOverPtData block ends here
771776
} // updateCurvature, updateCurvatureIU block ends here
772777

773778
if (updateTrackDCAs) {
@@ -836,44 +841,44 @@ struct TrackTuner : o2::framework::ConfigurableGroup {
836841
// double dpt1o =pt1o-pt1mc;
837842
deltaQpt = trackParQPtMCRec - trackParQPtMC;
838843
// double dpt1n =dpt1o *(spt1o >0. ? (spt1n /spt1o ) : 1.);
839-
deltaQptTuned = deltaQpt * (qOverPtMC > 0. ? (qOverPtData / qOverPtMC) : 1.);
844+
deltaQptTuned = deltaQpt * (currentQOverPtMC > 0. ? (currentQOverPtData / currentQOverPtMC) : 1.);
840845
// double pt1n = pt1mc+dpt1n;
841846
trackParQPtTuned = trackParQPtMC + deltaQptTuned;
842847
trackParCov.setQ2Pt(trackParQPtTuned);
843848

844849
// updating track cov matrix elements for 1/Pt at innermost update point
845850
// if(sd0rpo>0. && spt1o>0.)covar[10]*=(sd0rpn/sd0rpo)*(spt1n/spt1o);//ypt
846851
sigma1PtY = trackParCov.getSigma1PtY();
847-
if (dcaXYResMC > 0. && qOverPtMC > 0.) {
848-
sigma1PtY *= ((dcaXYResData / dcaXYResMC) * (qOverPtData / qOverPtMC));
852+
if (dcaXYResMC > 0. && currentQOverPtMC > 0.) {
853+
sigma1PtY *= ((dcaXYResData / dcaXYResMC) * (currentQOverPtData / currentQOverPtMC));
849854
trackParCov.setCov(sigma1PtY, 10);
850855
}
851856

852857
// if(sd0zo>0. && spt1o>0.) covar[11]*=(sd0zn/sd0zo)*(spt1n/spt1o);//zpt
853858
sigma1PtZ = trackParCov.getSigma1PtZ();
854-
if (dcaZResMC > 0. && qOverPtMC > 0.) {
855-
sigma1PtZ *= ((dcaZResData / dcaZResMC) * (qOverPtData / qOverPtMC));
859+
if (dcaZResMC > 0. && currentQOverPtMC > 0.) {
860+
sigma1PtZ *= ((dcaZResData / dcaZResMC) * (currentQOverPtData / currentQOverPtMC));
856861
trackParCov.setCov(sigma1PtZ, 11);
857862
}
858863

859864
// if(spt1o>0.) covar[12]*=(spt1n/spt1o);//sinPhipt
860865
sigma1PtSnp = trackParCov.getSigma1PtSnp();
861-
if (qOverPtMC > 0.) {
862-
sigma1PtSnp *= (qOverPtData / qOverPtMC);
866+
if (currentQOverPtMC > 0.) {
867+
sigma1PtSnp *= (currentQOverPtData / currentQOverPtMC);
863868
trackParCov.setCov(sigma1PtSnp, 12);
864869
}
865870

866871
// if(spt1o>0.) covar[13]*=(spt1n/spt1o);//tanTpt
867872
sigma1PtTgl = trackParCov.getSigma1PtTgl();
868-
if (qOverPtMC > 0.) {
869-
sigma1PtTgl *= (qOverPtData / qOverPtMC);
873+
if (currentQOverPtMC > 0.) {
874+
sigma1PtTgl *= (currentQOverPtData / currentQOverPtMC);
870875
trackParCov.setCov(sigma1PtTgl, 13);
871876
}
872877

873878
// if(spt1o>0.) covar[14]*=(spt1n/spt1o)*(spt1n/spt1o);//ptpt
874879
sigma1Pt2 = trackParCov.getSigma1Pt2();
875-
if (qOverPtMC > 0.) {
876-
sigma1Pt2 *= (qOverPtData / qOverPtMC) * (qOverPtData / qOverPtMC);
880+
if (currentQOverPtMC > 0.) {
881+
sigma1Pt2 *= (currentQOverPtData / currentQOverPtMC) * (currentQOverPtData / currentQOverPtMC);
877882
trackParCov.setCov(sigma1Pt2, 14);
878883
}
879884
} // updateCurvatureIU block ends here
@@ -969,7 +974,7 @@ struct TrackTuner : o2::framework::ConfigurableGroup {
969974
}
970975
deltaQpt = trackParQPtMCRec - trackParQPtMC;
971976
// double dpt1n =dpt1o *(spt1o >0. ? (spt1n /spt1o ) : 1.);
972-
deltaQptTuned = deltaQpt * (qOverPtMC > 0. ? (qOverPtData / qOverPtMC) : 1.);
977+
deltaQptTuned = deltaQpt * (currentQOverPtMC > 0. ? (currentQOverPtData / currentQOverPtMC) : 1.);
973978
// double pt1n = pt1mc+dpt1n;
974979
trackParQPtTuned = trackParQPtMC + deltaQptTuned;
975980
trackParCov.setQ2Pt(trackParQPtTuned);
@@ -1030,36 +1035,36 @@ struct TrackTuner : o2::framework::ConfigurableGroup {
10301035
if ((updateCurvature) && (!updateCurvatureIU)) {
10311036
// if(sd0rpo>0. && spt1o>0.)covar[10]*=(sd0rpn/sd0rpo)*(spt1n/spt1o);//ypt
10321037
sigma1PtY = trackParCov.getSigma1PtY();
1033-
if (dcaXYResMC > 0. && qOverPtMC > 0.) {
1034-
sigma1PtY *= ((dcaXYResData / dcaXYResMC) * (qOverPtData / qOverPtMC));
1038+
if (dcaXYResMC > 0. && currentQOverPtMC > 0.) {
1039+
sigma1PtY *= ((dcaXYResData / dcaXYResMC) * (currentQOverPtData / currentQOverPtMC));
10351040
trackParCov.setCov(sigma1PtY, 10);
10361041
}
10371042

10381043
// if(sd0zo>0. && spt1o>0.) covar[11]*=(sd0zn/sd0zo)*(spt1n/spt1o);//zpt
10391044
sigma1PtZ = trackParCov.getSigma1PtZ();
1040-
if (dcaZResMC > 0. && qOverPtMC > 0.) {
1041-
sigma1PtZ *= ((dcaZResData / dcaZResMC) * (qOverPtData / qOverPtMC));
1045+
if (dcaZResMC > 0. && currentQOverPtMC > 0.) {
1046+
sigma1PtZ *= ((dcaZResData / dcaZResMC) * (currentQOverPtData / currentQOverPtMC));
10421047
trackParCov.setCov(sigma1PtZ, 11);
10431048
}
10441049

10451050
// if(spt1o>0.) covar[12]*=(spt1n/spt1o);//sinPhipt
10461051
sigma1PtSnp = trackParCov.getSigma1PtSnp();
1047-
if (qOverPtMC > 0.) {
1048-
sigma1PtSnp *= (qOverPtData / qOverPtMC);
1052+
if (currentQOverPtMC > 0.) {
1053+
sigma1PtSnp *= (currentQOverPtData / currentQOverPtMC);
10491054
trackParCov.setCov(sigma1PtSnp, 12);
10501055
}
10511056

10521057
// if(spt1o>0.) covar[13]*=(spt1n/spt1o);//tanTpt
10531058
sigma1PtTgl = trackParCov.getSigma1PtTgl();
1054-
if (qOverPtMC > 0.) {
1055-
sigma1PtTgl *= (qOverPtData / qOverPtMC);
1059+
if (currentQOverPtMC > 0.) {
1060+
sigma1PtTgl *= (currentQOverPtData / currentQOverPtMC);
10561061
trackParCov.setCov(sigma1PtTgl, 13);
10571062
}
10581063

10591064
// if(spt1o>0.) covar[14]*=(spt1n/spt1o)*(spt1n/spt1o);//ptpt
10601065
sigma1Pt2 = trackParCov.getSigma1Pt2();
1061-
if (qOverPtMC > 0.) {
1062-
sigma1Pt2 *= (qOverPtData / qOverPtMC) * (qOverPtData / qOverPtMC);
1066+
if (currentQOverPtMC > 0.) {
1067+
sigma1Pt2 *= (currentQOverPtData / currentQOverPtMC) * (currentQOverPtData / currentQOverPtMC);
10631068
trackParCov.setCov(sigma1Pt2, 14);
10641069
}
10651070
} // ---> track cov matrix elements for 1/Pt ends here

0 commit comments

Comments
 (0)