v0.6.0 — full electron cascade
v0.6.0 — full electron cascade
The secondary shader now tracks the full electron cascade (tertiary / gen3+), instead of absorbing tertiary electrons in place. This resolves the long-standing cascade-ion deficit and is a clean win on every axis:
| metric | v0.5.0 | v0.6.0 |
|---|---|---|
| cascade ions @10 keV vs Geant4 | 0.766× | 0.931× |
| chemistry RMS vs chem6 | 19.7% | 7.6% |
| G(H₂) vs chem6 | 0.74× | 0.99× |
| G(H₂O₂) vs chem6 | 0.69× | 0.93× |
| SSB indirect/direct | 2.32 | 2.53 (band 2–3) |
- The chem6 1 µs gap — the H₂/H₂O₂ deficits that stood through the entire project history — is largely closed.
- Primary track is bit-exact vs Geant4 (195.4 ionisations/primary vs 195.6, by trackID in the 6.8 GB ntuple).
- Validated across all 8 ESTAR energies; the browser build is bit-identical to the native runtime; energy conserved (99.9%).
How
secondary.wgsl emits tertiary electrons into sec_buf (G4DNABornAngle direction sampling, OH+H₃O⁺ products, deferred eaq); dispatch.ts grows the Phase B wavefront in chunks so they get tracked.
Honest note
The investigation included a self-caught error: a normalization bug in the analysis (run_irt invoked with the wrong n_therm) briefly made the fix look like it broke chemistry, and two experiments (E23–E24) chased a phantom before verify-before-asserting caught it (E25). The fix was always a clean win.
Full details in CHANGELOG.md.