feat(cli): separate-branches rename, short aliases, clean dry-run
- --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)
This commit is contained in:
@@ -313,8 +313,8 @@ class TestCSVExportCoreSemantics:
|
||||
assert "phase_space" in core_line[0]
|
||||
assert "fermi" in core_line[0]
|
||||
|
||||
def test_normalize_to_one_per_branch_unit_area(self, tmp_path: Any) -> None:
|
||||
config = make_multi_config(normalize_to_one=True)
|
||||
def test_separate_branches_per_branch_unit_area(self, tmp_path: Any) -> None:
|
||||
config = make_multi_config(separate_branches=True)
|
||||
spectrum = BetaSpectrum.from_config(config)
|
||||
analyzer = BetaSpectrumAnalyzer(spectrum, config)
|
||||
_, df = export_and_read(analyzer, tmp_path)
|
||||
@@ -334,12 +334,12 @@ class TestCSVExportCoreSemantics:
|
||||
analyzer.export_to_csv(path)
|
||||
assert not (tmp_path / "degenerate.csv").exists()
|
||||
|
||||
def test_degenerate_export_raises_in_normalize_to_one_mode(
|
||||
def test_degenerate_export_raises_in_separate_branches_mode(
|
||||
self, tmp_path: Any
|
||||
) -> None:
|
||||
"""The positive-integral guard must apply in to_one mode too:
|
||||
"""The positive-integral guard must apply in separate-branches mode too:
|
||||
no all-zero CSV may be written for a degenerate spectrum."""
|
||||
config = make_degenerate_config(normalize_to_one=True)
|
||||
config = make_degenerate_config(separate_branches=True)
|
||||
spectrum = BetaSpectrum.from_config(config)
|
||||
analyzer = BetaSpectrumAnalyzer(spectrum, config)
|
||||
path = str(tmp_path / "degenerate_to_one.csv")
|
||||
@@ -567,13 +567,13 @@ class TestAnalyzerUniversalFactor:
|
||||
|
||||
|
||||
class TestNormalizationModeMatrix:
|
||||
"""to_one and intensity modes must behave consistently across CSV
|
||||
"""separate_branches and intensity modes must behave consistently across CSV
|
||||
verbosity, branch count and the CSV-driven visualizer."""
|
||||
|
||||
def test_to_one_concise_multi_unit_area_no_total_no_components(
|
||||
def test_separate_branches_concise_multi_unit_area_no_total_no_components(
|
||||
self, tmp_path: Any
|
||||
) -> None:
|
||||
config = make_multi_config(normalize_to_one=True)
|
||||
config = make_multi_config(separate_branches=True)
|
||||
spectrum = BetaSpectrum.from_config(config)
|
||||
analyzer = BetaSpectrumAnalyzer(spectrum, config)
|
||||
path, df = export_and_read(
|
||||
@@ -587,14 +587,14 @@ class TestNormalizationModeMatrix:
|
||||
"branch_3",
|
||||
}
|
||||
header = header_lines_of(path)
|
||||
assert any("branch normalization: to_one" in h for h in header)
|
||||
assert any("branch normalization: separate" in h for h in header)
|
||||
energies = df["energy_MeV"].to_numpy()
|
||||
for col in ("branch_1", "branch_2", "branch_3"):
|
||||
area = np.trapezoid(df[col].to_numpy(), energies)
|
||||
assert np.isclose(area, 1.0, rtol=5e-4)
|
||||
|
||||
def test_to_one_single_mode_unit_area(self, tmp_path: Any) -> None:
|
||||
config = make_single_config(normalize_to_one=True)
|
||||
def test_separate_branches_single_mode_unit_area(self, tmp_path: Any) -> None:
|
||||
config = make_single_config(separate_branches=True)
|
||||
spectrum = BetaSpectrum.from_config(config)
|
||||
analyzer = BetaSpectrumAnalyzer(spectrum, config)
|
||||
_path, df = export_and_read(analyzer, tmp_path, "to_one_single.csv")
|
||||
@@ -622,10 +622,10 @@ class TestNormalizationModeMatrix:
|
||||
nonzero = total > 1e-12
|
||||
assert np.all(np.abs(summed[nonzero] - total[nonzero]) <= total[nonzero] * 5e-4)
|
||||
|
||||
def test_plot_from_csv_to_one_plots_branches_without_total(
|
||||
def test_plot_from_csv_separate_branches_plots_branches_without_total(
|
||||
self, tmp_path: Any
|
||||
) -> None:
|
||||
config = make_multi_config(normalize_to_one=True)
|
||||
config = make_multi_config(separate_branches=True)
|
||||
spectrum = BetaSpectrum.from_config(config)
|
||||
analyzer = BetaSpectrumAnalyzer(spectrum, config)
|
||||
path, df = export_and_read(analyzer, tmp_path, "to_one_plot.csv")
|
||||
@@ -633,7 +633,7 @@ class TestNormalizationModeMatrix:
|
||||
fig = Visualizer.plot_from_csv(path, save_path=None, show_components=True)
|
||||
assert len(fig.axes) == 4
|
||||
# Panel 1 has exactly the 3 branch curves — no total spectrum
|
||||
# exists in to_one mode.
|
||||
# exists in separate-branches mode.
|
||||
panel = fig.axes[0]
|
||||
curves = [np.asarray(ln.get_xydata()) for ln in panel.lines]
|
||||
assert len(curves) == 3
|
||||
@@ -641,8 +641,10 @@ class TestNormalizationModeMatrix:
|
||||
assert np.allclose(curves[0][:, 0], energies)
|
||||
assert np.allclose(curves[0][:, 1], df["branch_1_spectrum"].to_numpy())
|
||||
|
||||
def test_plot_analysis_to_one_returns_figure(self, tmp_path: Any) -> None:
|
||||
config = make_multi_config(normalize_to_one=True)
|
||||
def test_plot_analysis_separate_branches_returns_figure(
|
||||
self, tmp_path: Any
|
||||
) -> None:
|
||||
config = make_multi_config(separate_branches=True)
|
||||
spectrum = BetaSpectrum.from_config(config)
|
||||
analyzer = BetaSpectrumAnalyzer(spectrum, config)
|
||||
save = str(tmp_path / "analysis.png")
|
||||
@@ -650,10 +652,10 @@ class TestNormalizationModeMatrix:
|
||||
assert len(fig.axes) == 4
|
||||
assert (tmp_path / "analysis.png").exists()
|
||||
|
||||
def test_plot_from_csv_to_one_concise_warns_and_falls_back(
|
||||
def test_plot_from_csv_separate_branches_concise_warns_and_falls_back(
|
||||
self, tmp_path: Any, capsys: Any
|
||||
) -> None:
|
||||
config = make_multi_config(normalize_to_one=True)
|
||||
config = make_multi_config(separate_branches=True)
|
||||
spectrum = BetaSpectrum.from_config(config)
|
||||
analyzer = BetaSpectrumAnalyzer(spectrum, config)
|
||||
path, df = export_and_read(
|
||||
|
||||
Reference in New Issue
Block a user