Skip to content

Commit b9df2b4

Browse files
abgnydnclaude
andcommitted
docs(v0.6.1): correct open-items (E28 refuted E26's sigma_exc-floor) + disclosure/finding#5/site sigma_exc=0.39
The 'Ongoing physics work' section cited E26's 'residual is the sigma_exc floor' conclusion that E28 refuted (lowering sigma_exc IMPROVED the cascade). Rewrote it: the residual cause is re-opened (not the floor), G(H) overshoot reduced to 1.055x. Disclosure + finding #5 note the v0.6.1 sigma_exc=0.39 follow-up; index.html excitation row -> 0.39. Dated E6c/E7b ledger rows kept as history. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent c711d54 commit b9df2b4

2 files changed

Lines changed: 14 additions & 17 deletions

File tree

README.md

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ All Geant4-side numbers were produced by a freshly-built **Geant4 11.4.1 / G4EML
108108

109109
Reference snapshot for the WebGPU side: `N = 4096` primaries at 10 keV unless otherwise stated, DNA_Opt2 physics list, 30 μm cube, **v0.6.0 full electron cascade**, shader constants `SIGMA_EXC_SCALE = 0.39`, `RECOMB_BOOST = 1.0` (**parameter-free** in that knob), `SSB_R_DAMAGE_NM = 0.29`, `SSB_R_DAMAGE_INDIRECT_NM = 1.0`, `SSB_P_INDIRECT = 0.05`.
110110

111-
> **The pipeline is parameter-free in `RECOMB_BOOST`, and v0.6.0 tracks the full electron cascade.** `RECOMB_BOOST` was `2.0` (a tuning scalar with no Geant4 physical basis — the H₂O⁺ refutation); E10r showed it was not load-bearing and the RECOMB→1.0 flip (v0.5.0) removed it. **Then v0.6.0 tracks the full tertiary (gen3+) electron cascade** — previously the secondary shader absorbed tertiary electrons in place — which resolves the cascade-ion deficit (ions **0.766→0.931×**, [E25]) *and* closes the long-standing chem6 1 µs chemistry gap (5-species RMS **19.7→7.6%**; H₂/H₂O₂ deficits closed), with SSB holding in PARTRAC's 2–3 band at **2.53**. The primary track is bit-exact vs Geant4 (E20). README §Numbers, the paper, and the shipped demo all report v0.6.0. The only remaining non-unity scalar is `SIGMA_EXC_SCALE = 0.39` (v0.6.1, ≈ Born), a small documented physics-data divergence, not a tuning fudge — see [GEANT4_DIVERGENCES.md](./GEANT4_DIVERGENCES.md).
111+
> **The pipeline is parameter-free in `RECOMB_BOOST`, and v0.6.0 tracks the full electron cascade.** `RECOMB_BOOST` was `2.0` (a tuning scalar with no Geant4 physical basis — the H₂O⁺ refutation); E10r showed it was not load-bearing and the RECOMB→1.0 flip (v0.5.0) removed it. **Then v0.6.0 tracks the full tertiary (gen3+) electron cascade** — previously the secondary shader absorbed tertiary electrons in place — which resolves the cascade-ion deficit (ions **0.766→0.931×**, [E25]) *and* closes the long-standing chem6 1 µs chemistry gap (5-species RMS **19.7→7.6%**; H₂/H₂O₂ deficits closed). **v0.6.1 then lowered `SIGMA_EXC_SCALE` 0.5→0.39 (≈Born)** — the full cascade unlocked it, nudging every axis better still (cascade **0.937×**, RMS **6.8%**, SSB **2.72**, E28). The primary track is bit-exact vs Geant4 (E20). README §Numbers, the paper, and the shipped demo all report v0.6.1. The only remaining non-unity scalar is `SIGMA_EXC_SCALE = 0.39` (v0.6.1, ≈ Born), a small documented physics-data divergence, not a tuning fudge — see [GEANT4_DIVERGENCES.md](./GEANT4_DIVERGENCES.md).
112112

113113
**Reproducibility caveat:** fp32 `atomicAdd` reductions on the dose grid and `rad_buf` counters are not order-deterministic across GPU vendors — same WGSL on different hardware (Apple Metal vs Nvidia Vulkan vs Intel iGPU) yields **statistically equivalent results within MC noise, NOT bit-exact**. The same machine + same seed + same shader hash IS bit-exact across re-runs. Every artifact emits `env.shaderHashes.{helpers,primary,secondary,chemistry}_wgsl` (added 2026-05-12) so you can group rows by shader version when the joint-fix scales or other shader-side tunables shift the baseline.
114114

@@ -240,7 +240,7 @@ Each is a falsifiable claim only visible because of the protocol — not from re
240240
2. **G(e⁻aq) is non-monotonic between 1 and 3 keV at z = 126σ** (1.163 → 1.026 → 1.147 — 12.5% drop, real track-end / spur-structure physics; chem6 independently reproduces it). [E10, E10b, E10d]
241241
3. **MFP is consistently 5-11% lower than Geant4** across all 6 energy bins (median 0.941). [E6]
242242
4. **σ_ion is 6.1% high and σ_el is 5.7% high vs Geant4 11.4.1.** Per E6b decomposition, the MFP shortfall is ~49% from σ_ion, ~31% from σ_el, ~20% from intentional σ_exc inflation. [E6b]
243-
5. **The cascade-ion deficit is RESOLVED in v0.6.0 by tracking the full electron cascade — and it was a clean win on every axis.** The primary track is **bit-exact** (195.4 ionisations/primary vs Geant4 195.6, by trackID in the 6.8 GB ntuple — E20). The old 23% deficit was **80% the untracked tertiary (gen3+) cascade**: our secondary shader absorbed tertiary electrons in place rather than tracking them (E21). Tracking them recovers cascade ions **0.766→0.931×** *and* improves chemistry (RMS vs chem6 **19.7→7.6%**, closing the long-standing H₂/H₂O₂ gap) with SSB holding in-band — a clean win (E25). The investigation also caught a normalization bug in my own analysis (E22–E24 chased a phantom "over-recombination" that was a `n_therm` units error; corrected in E25) — verify-before-asserting rescuing a real result. [E20, E21, E25]
243+
5. **The cascade-ion deficit is RESOLVED in v0.6.0 by tracking the full electron cascade — and it was a clean win on every axis.** The primary track is **bit-exact** (195.4 ionisations/primary vs Geant4 195.6, by trackID in the 6.8 GB ntuple — E20). The old 23% deficit was **80% the untracked tertiary (gen3+) cascade**: our secondary shader absorbed tertiary electrons in place rather than tracking them (E21). Tracking them recovers cascade ions **0.766→0.931×** *and* improves chemistry (RMS vs chem6 **19.7→7.6%**, closing the long-standing H₂/H₂O₂ gap) with SSB holding in-band — a clean win (E25). **v0.6.1 then lowered σ_exc 0.5→0.39, which the full cascade unlocked: every axis improved again (cascade 0.937×, RMS 6.8%, E28).** The investigation also caught a normalization bug in my own analysis (E22–E24 chased a phantom "over-recombination" that was a `n_therm` units error; corrected in E25) — verify-before-asserting rescuing a real result. [E20, E21, E25]
244244
6. **WebGPU tracking is ~241× faster than Geant4 11.4.1 single-thread (v0.6.0, full cascade); the honest like-for-like figure is 1.48× end-to-end.** *Update (v0.6.0):* tracking the full electron cascade roughly doubled Phase A+B (635 ms→~1.2 s, E15d), so the tracking speedup is now ~241×/~148× — **lower than the v0.5.0 455×/280×, but a fair both-full-cascade comparison** (the old figure compared our *truncated* cascade to Geant4's full one). The end-to-end 1.48× and the methodology notes below are unaffected. Two earlier corrections, the first of which I *over*-corrected once and then measured: (a) **The init confound is NOT material — measured.** E15-fair: a 16-primary init-probe runs in 3.2 s, so Geant4 process init + DNA physics-table construction is only **~2.1 s** (0.7% of the 289 s) — the 289 s is ~99% genuine event-loop. (An earlier draft of this note claimed ~160 s of serial overhead / ~200× pure-tracking from a 2-point Amdahl read of the MT-8 1.62× scaling; that estimate was **wrong and is retracted** — init is negligible, so event-loop-only the speedup is **452×**, statistically the same as 455×.) The one *real* residual asymmetry is **per-event ntuple I/O**: Geant4 writes **6.8 GB** to `dna.root` for the full run — *measured* (16→256-primary probes give 1.65 MB/primary, ~0.1 MB fixed, near-perfectly linear), and the likely cause of the poor MT-8 scaling via row-wise merge — while the WGSL 635 ms excludes its ~87 MB dump write. (A 256-primary run also lands at 19.7 s vs the model's 20.0 s, independently confirming the ~2 s init + 0.070 s/primary.) A no-ntuple Geant4 build (E15-fairer) would isolate how much wall-time the I/O adds; so 452× is a mild over-estimate of a compute-only comparison, but nowhere near as low as the retracted ~200×. (b) **Kernel fusion contributes ~2× to the pipeline, NOT 40×.** The fused phase (Phase A) is 14.4 ms = 2% of the 635 ms; Phase B is an *un-fused* 2000-dispatch wavefront (620 ms). The earlier "455× = 10× GPU × 40× fusion (multiplicative)" claim was wrong — you cannot multiply a Phase-A-only 40× through a 98%-un-fused pipeline. Fused-vs-naive on the *same GPU* is 1324 ms → 635 ms = 2.08× (E16's 40× is Phase-A-only). [E15b, E15c, E16, E15-fair]
245245
7. **The G(OH) deficit vs Karamitros 2011 confounds two effects**: ~70% is real LET physics (chem6 reproduces the same trend); ~30% is a real WGSL-vs-chem6 implementation gap. G(H₂)/G(H₂O₂) are the biggest implementation gaps. [E10c, E10d]
246246
8. **The chem6 1 µs gap was the untracked tertiary electron cascade — closed in v0.6.0 (E20–E25), superseding the earlier "inter-track partitioning" attribution.** E10f measured that cross-primary pooling adds ΔG(H₂)=+0.149 and read it as "96% of the 1 μs gap"; that was looking at H₂ alone. E17 later showed cross-primary pooling is a *coupled tradeoff* (it boosts H₂ but over-recombines OH/eaq — no density matches chem6), and v0.6.0 showed the real cause was the **untracked gen3+ cascade**: tracking it closes the gap browser-native (RMS 19.7→7.6%, H₂ 0.74→0.99×). The chem6 gap did **not** require the native runtime. [E10f, E17, E20, E21, E25]
@@ -254,17 +254,14 @@ v0.6.0** by tracking the full electron cascade (E20–E25), and `RECOMB_BOOST` w
254254
removed in v0.5.0, so the project is parameter-free in that knob. Remaining open
255255
items:
256256

257-
- **Residual ~6.4 % cascade-ion deficit** (ion events 476.5 vs Geant4 509.2 = 0.936×;
258-
0.931× on the H₃O⁺ metric). **Characterised (E26): it is *entirely* the secondary
259-
cascade** (gen2+gen3+ 281.1 vs 313.6, 0.90×; the primary is bit-exact). It is the
260-
σ_exc=0.5 Emfietzoglou over-excitation acting in the **low-energy secondary tail**
261-
(where excitation is a bigger energy-loss fraction than at the 10 keV primary — why
262-
E7e saw σ_exc barely move the primary). The **honest floor**: lowering σ_exc would
263-
close it but break the initial G(H)/G(H₂) Emfietzoglou is chosen for. Not a fixable bug.
264-
- **Slight G(H) overshoot** (1.085× vs chem6) — likely the *same* σ_exc=0.5
265-
Emfietzoglou root as the cascade residual (E26): over-excitation produces more
266-
A¹B₁ dissociation (OH+H) → more H. So the two residuals are one knob in opposite
267-
directions — lowering σ_exc would close the cascade deficit *and* tame the H
268-
overshoot, but break the initial G(H₂); the chosen Emfietzoglou config trades a
269-
small H overshoot for correct molecular yields. Small and characterised.
270-
- **E14 vs molecularDNA** (~1 day — full chromatin geometry comparison; deferred).
257+
- **Residual ~6 % cascade-ion deficit** (ion events ~0.937× vs Geant4; *entirely*
258+
the secondary cascade — the primary is bit-exact, E26). E26 had attributed this to
259+
a σ_exc "floor," but **E28 refuted that**: lowering σ_exc 0.5→0.39 *improved* the
260+
cascade (and CSDA, chemistry, SSB) instead of being blocked by it. The exact cause
261+
of the small remaining secondary-cascade gap is therefore **re-opened** (not the
262+
σ_exc floor it was thought to be) — a well-bounded ~6 % open question.
263+
- **Slight G(H) overshoot** (now **1.055×** vs chem6, reduced from 1.085× by the
264+
v0.6.1 σ_exc=0.39, E28). Small; the same change that improved everything else also
265+
tamed it.
266+
- **E14 vs molecularDNA** (~1 day — full chromatin geometry comparison; needs the
267+
molecularDNA example built; deferred).

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,7 @@ <h2>Feature scope: what we ported, and what we didn't</h2>
582582
<tr>
583583
<td class="aspect">Excitation (e⁻)</td>
584584
<td class="old">Born, Emfietzoglou, CPA100, Dingfelder, Miller-Green, Quinn plasmon, Dirac-RMatrix, RPWBA</td>
585-
<td class="new"><strong>Emfietzoglou</strong> (5 levels: A¹B₁, B¹A₁, Ryd A+B, Ryd C+D, Diffuse) with data-driven branching · σ_exc partially scaled (joint fix SIGMA_EXC_SCALE = 0.5) <a href="https://github.com/abgnydn/webgpu-dna#numbers" style="color:inherit;text-decoration:underline">[E2, E2b]</a></td>
585+
<td class="new"><strong>Emfietzoglou</strong> (5 levels: A¹B₁, B¹A₁, Ryd A+B, Ryd C+D, Diffuse) with data-driven branching · σ_exc scaled to ≈ Born (SIGMA_EXC_SCALE = 0.39, v0.6.1) <a href="https://github.com/abgnydn/webgpu-dna#numbers" style="color:inherit;text-decoration:underline">[E2, E2b]</a></td>
586586
</tr>
587587
<tr>
588588
<td class="aspect">Elastic scattering (e⁻)</td>

0 commit comments

Comments
 (0)