Skip to content

TPC: fix the weight and grid scaling of the spline derivatives in addCorrections - #15994

Merged
alcaliva merged 2 commits into
AliceO2Group:devfrom
matthias-kleiner:tpc-addcorrections-scale
Oct 21, 2026
Merged

alcaliva merged 2 commits into
AliceO2Group:devfrom
matthias-kleiner:tpc-addcorrections-scale

Conversation

@matthias-kleiner

Copy link
Copy Markdown
Contributor

No description provided.

matthias-kleiner and others added 2 commits October 21, 2026 16:33
…ections

TPCFastSpaceChargeCorrectionHelper::addCorrections scaled the 4th parameter of each spline knot (the mixed derivative d2S/dudv)
with the square of the weight: secMainScale * secMainScale for the main correction, ls * ls * ... for the added ones (ls is the
weight times the z fade-out factor, 1 at the knots). A spline is linear in its parameters, so scaling the correction by w scales all
of them by w.

The correction was therefore right at the knots but wrong between them whenever a weight != 1 was used, e.g. the derivative map
added with weight lumiScale in TPCScalerSpec::buildMap. The error is proportional to w - w^2. Measured with a production map and
the derivative map of run 568041 (random points, vs the weighted point-by-point sum of getCorrectionLocal and of the inverse
getters), for map + 0.13 x derivative: rms ~20 um in dx and dz, ~10 um without the first 10 pad rows; deviations above 100 um are
rare (0.4 % of the points) and lie mostly in the first pad rows. At a weight of -0.5 the rms is ~150 um (~60 um without the first
10 pad rows). With the fix the sum is exact to float precision (< 0.1 um) for weights from -1 to 1.5, inverse corrections
included; w = 1 is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A correction added on a different spline grid is sampled at the main grid's knots, and its derivatives must be converted with the
chain rule: with u = (y - y0) * yScale, d/du_main = (yScale_corr / yScale_main) d/du_corr, the same for v. addCorrections used the
inverse ratios, and applied the u factor to the dS/dv parameter and the v factor to dS/du (knot parameters {S, dS/dv, dS/du,
d2S/dudv}).

For identical grids (e.g. the derivative map) the factors are 1 and nothing changes. The M-shape map is created on a 4 x 4 grid in
TPCScalerSpec, with factors of 35-98 with respect to a production map: adding the M-shape map of run 544797 (up to 6 mm) to a map of
run 568041 gave errors of up to 89 cm in dx and up to the kMaxCorrection limit of 100 cm in dy (rms 4 cm and 7 cm), vs the
point-by-point sum. With the fix: rms 1-2 um, max 60 um (resampling of non-nested grids) inside the main map's grid. Outside of it
(|z| > ~1.37 x for production voxel maps) the merged map follows the edge and z fade-out of the main grid, as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@alcaliva
alcaliva merged commit a36f08c into AliceO2Group:dev Oct 21, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

3 participants