- --normalize-to-one renamed to --separate-branches (no alias; the
name now describes the output choice: total spectrum with
intensity-normalized branches vs separate branches, each
normalized to unit area with intensities left to the data user).
SpectrumConfig.normalize_to_one -> separate_branches, CSV header
word to_one -> separate.
- every long option gains a single-letter alias: -N -i -s -m -o -p
-L -d -c -V -S -b (only -v/-q existed before)
- dry-run drops the top-level Transition: line — the per-branch
list below already reports each branch's transition type
- version bumped to 0.4.1 (pyproject, __version__, CSV semantics
docstring, TODO roadmap entry)
- DEFAULT_JSON_SCHEMA: drop the 8 detector_* keys left over from the
removed detector_response module; CLI dry-run drops the dead
'Detector: not configured (Phase 4)' line
- CSV export: single-mode no longer writes branch_1_PhaseSpace /
branch_1_Radiative duplicates next to the bare PhaseSpace/Radiative
columns; per-branch core factors only in multi-branch mode
- Visualizer: debug panels fall back to the unprefixed core-factor
columns for single-mode CSVs instead of skipping them
- Spectrum ylabel now states the actual units: normalized spectrum
[MeV^-1], not 'Normalized Counts / keV'
- tests: defaults assert detector keys gone; column layout pinned for
single vs multi; panel and ylabel assertions
CSVEmitter.export_to_csv raised ValueError only in intensity mode;
degenerate exports with --normalize-to-one silently wrote all-zero
CSV files. The guard now runs before the mode split and no file is
written in either mode.
When config.branches carries exactly one branch (e.g. after
--intensity-cutoff filtering), the branch endpoint/transition define
the spectrum, energy grid, analyzer unified branch view and CSV
header. The stale top-level endpoint inherited from the parent decay
no longer leaks into physics (proven wrong on Cs137: spectrum
extended to 1176 keV while the lone survivor ends at 514 keV).