Skip to content

QBnd: sample the boundary texture with POINT filtering#344

Open
ggalgoczi wants to merge 2 commits into
mainfrom
qbnd-point-filter
Open

QBnd: sample the boundary texture with POINT filtering#344
ggalgoczi wants to merge 2 commits into
mainfrom
qbnd-point-filter

Conversation

@ggalgoczi
Copy link
Copy Markdown
Contributor

cudaFilterModeLinear blends ~0.4% from the adjacent (categorically distinct) material/surface row on large (>5000-row) bnd tables, corrupting every per-photon material/surface lookup. Add a POINT-mode path selected by QBND_FILTER_POINT (run with QBND_FILTER_POINT=1).

@ggalgoczi ggalgoczi self-assigned this May 29, 2026
@ggalgoczi ggalgoczi added the bug Something isn't working label May 29, 2026
@ggalgoczi ggalgoczi marked this pull request as draft May 29, 2026 13:45
@ggalgoczi ggalgoczi force-pushed the qbnd-point-filter branch from 760b0cb to d4311d7 Compare May 29, 2026 14:03
The boundary QTex was sampled with cudaFilterModeLinear, blending ~0.4% from the adjacent (categorically distinct) material/surface row on large (>5000-row) bnd tables, corrupting every per-photon material/surface lookup. Switch to POINT filtering (QBND_FILTER_POINT; run with =1). POINT also makes the wavelength axis nearest-bin, so qbnd::boundary_lookup recovers G4-style per-wavelength linear interpolation via a manual 2-tap lerp (material axis stays POINT). The two go together -- nearest-bin wavelength sampling alone is ~2.3% low on the dRICH count.
Copy link
Copy Markdown
Member

@plexoos plexoos left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that boundary_lookup likely needs a correction here. As described, cudaFilterModeLinear appears to introduce cross-row blending on sufficiently large boundary textures, and that is a correctness issue because the y axis indexes categorical material/surface rows.

A few follow-ups would make the change easier to review:

  • Please expand the PR description in plain English. It would help to explain that the boundary table is packed into a 2D texture, x is wavelength, y is the material/surface row, why linear filtering was attractive originally, and why cross-row blending is a problem here.
  • Please add a reproducer that demonstrates the impact at the physics level if possible, for example wavelength distribution, hit counts, or another observable using one of the existing test geometries. At minimum, a focused regression test showing the cross-row contamination on a tall bnd table would help.
  • Please route the toggle through the existing Config machinery rather than introducing a raw env var as the primary interface. An env var override is fine, but the default should preserve the current behavior for now.
  • If this remains configurable, the configuration should gate the full lookup strategy consistently. Right now the manual interpolation path changes in qbnd.h, while the texture filter mode only changes when the env var is set.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants