Bragg integration: do not let the radial correction outlive its kernel table
The kernel table is sized and built only where the correction can ever run - explicitly on, or auto, which is the same condition the GPU allocates its radial buffers under. BackgroundRadial(true) on any other engine therefore asked the CPU to correct with a single CIRCULAR kernel for rings that may be elongated, while the GPU, having no buffers, did not correct at all: a wrong kernel on one engine and silence on the other, from the same call. Only the auto path calls it today, so it was unreachable, but the setter is public and the invariant it depends on is not local to it. Remember whether the table was built and refuse to raise the flag otherwise. Also treat a zero stencil cap as "uncapped" rather than "no growth". The engine always sets max_grow, so this changes nothing that runs; it makes a caller that forgets it fail loudly instead of silently disabling the feature. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -109,9 +109,9 @@ BraggIntegrationEngine::BraggIntegrationEngine(const DiffractionExperiment &expe
|
||||
// n_kern is the largest row BraggStencilKernelIndex can select, plus one.
|
||||
r_max = std::hypot(std::max<double>(beam_x, static_cast<double>(xpixel) - beam_x),
|
||||
std::max<double>(beam_y, static_cast<double>(ypixel) - beam_y));
|
||||
const float grow_max = (bkg_radial || bkg_radial_auto)
|
||||
? BraggStencilGrow_px(static_cast<float>(r_max), stencil)
|
||||
: 0.0f;
|
||||
bkg_radial_built = bkg_radial || bkg_radial_auto;
|
||||
const float grow_max = bkg_radial_built ? BraggStencilGrow_px(static_cast<float>(r_max), stencil)
|
||||
: 0.0f;
|
||||
n_kern = static_cast<int>(std::lround(grow_max)) + 1;
|
||||
// Every row must fit: the last one is built at grow = n_kern - 1, which rounding can put just
|
||||
// above grow_max.
|
||||
|
||||
Reference in New Issue
Block a user