Separate monolithic beta_spectrum package into:
beta_spectrum — pure theory (components, spectrum, CLI, visualize)
exp_data — experimental data handling (spectrum, calibration,
fitters, corrections)
fitter — analysis framework (model, fit_engine, extractor,
result)
beta_spectrum.visualize — plotting (BetaSpectrumAnalyzer)
Phase 1 — exp_data module:
ExpSpectrum dataclass with metadata, normalization, serialization
EnergyCalibrator (linear/quadratic calibration)
GaussianFitter + PeakFitter for calibration sources
DeadTimeCorrection, PileUpCorrection, BackgroundSubtractor
43 new tests, ruff + mypy clean
Phase 2 — fitter module:
SpectrumModel wraps BetaSpectrum + DetectorResponse with convolution
SpectrumFitter with χ² minimization, covariance, profile likelihood,
confidence intervals, robust loss functions
CWExtractor + GVAExtractor for C(W) and g_V/g_A extraction
AnalysisResult + FitSummary for physics-specific results
CurveFitter general-purpose callable model fitter
34 new tests, ruff + mypy clean
Phase 3 — clean up beta_spectrum:
Remove cw_extractor.py and fitter.py (moved to fitter/)
Clean __init__.py to export only theory classes
Add backward-compat methods to CWExtractor
Fix BetaSpectrumAnalyzer._get_branch_spectrum returning BetaSpectrum
objects instead of numpy arrays (plot fix)
Phase 4 — package structure:
Auto-discovered by setuptools (4 packages)
All imports updated across 26 source files
Black formatting applied
322 tests pass (262 original + 60 new)
ruff + mypy clean on all source files
Bug fixes:
- Fix multi-branch spectrum plotting: universal component keys
(Fermi, Screening, etc.) don't have per-branch prefix; fixed
fallback lookup.
- Fix negative phase space beyond endpoint: BetaSpectrum returns
negative values for W > W0; clamp branch spectra to zero.
71 lines
1.6 KiB
TOML
71 lines
1.6 KiB
TOML
[build-system]
|
|
requires = ["setuptools>=61.0"]
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
[project]
|
|
name = "beta-spectrum"
|
|
version = "0.4.0"
|
|
description = "High-precision beta spectrum calculation for nuclear physics"
|
|
authors = [
|
|
{ name = "Evgeniy Unzhakov" }
|
|
]
|
|
requires-python = ">=3.10"
|
|
|
|
dependencies = [
|
|
"numpy",
|
|
"scipy",
|
|
"matplotlib",
|
|
"pandas"
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
ensdf = ["paceENSDF"]
|
|
dev = [
|
|
"pytest",
|
|
"nbmake",
|
|
"black",
|
|
"ruff",
|
|
"mypy",
|
|
"mdformat",
|
|
"mdformat-frontmatter",
|
|
"mdformat-footnote",
|
|
"mdformat-tables"
|
|
]
|
|
|
|
[project.scripts]
|
|
bs_pnpi = "beta_spectrum.cli:main"
|
|
|
|
[tool.setuptools.packages.find]
|
|
where = ["."]
|
|
|
|
[tool.mypy]
|
|
python_version = "3.10"
|
|
strict = true
|
|
exclude = ["notebooks", "scripts/notebook_plots.py", "tests/"]
|
|
disable_error_code = ["no-untyped-def", "arg-type", "return-value", "assignment", "misc", "import-untyped", "type-arg", "no-any-return", "union-attr", "operator"]
|
|
|
|
[tool.black]
|
|
line-length = 88
|
|
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["tests", "notebooks"]
|
|
markers = [
|
|
"property: Physics property tests (positivity, monotonicity, limits)",
|
|
"physics: Physics behavior tests (energy dependence, Z dependence)",
|
|
"api: API contract tests (signatures, return types, error handling)",
|
|
"quality: Code quality tests (shape, type, NaN, stability)",
|
|
"integration: Full pipeline integration tests",
|
|
"slow: Tests that take >1s to run",
|
|
"requires_ensdf: Tests requiring paceENSDF package",
|
|
]
|
|
timeout = 30
|
|
timeout_method = "thread"
|
|
|
|
[tool.ruff]
|
|
line-length = 88
|
|
|
|
[tool.mdformat]
|
|
line-length = 88
|
|
wrap = false
|
|
number = true
|