unzhakov
1b4d418b5f
feat: change CSV output format to use tab delimiters instead of comma delimiters
2026-07-03 18:01:39 +03:00
unzhakov
643e035c54
feat: update CSV headers and plot titles to show active/excluded branches and intensity cutoff exclusions
2026-07-03 17:45:35 +03:00
unzhakov
c6aaf3b76a
fix: use underscores in branch names for CSV headers in concise mode
2026-07-03 15:21:44 +03:00
unzhakov
c2795bf86e
fix: use underscores in branch names for CSV headers
2026-07-03 15:10:10 +03:00
unzhakov
a7eef7bc20
feat: polish CSV header format with improved metadata and column naming
2026-07-03 14:58:19 +03:00
unzhakov
876e1e3ab8
Add massive neutrino support and improve CSV/CLI output
...
- Add neutrino mass parameter to SpectrumConfig and CLI interface
- Update PhaseSpace component to handle neutrino mass effects properly
- Update CSV headers to show basic endpoint and all transition types
- Add --csv-verbosity option to CLI with 'full' and 'concise' options
- Fix comparison plots to properly show linear scale variations
- Add comprehensive tests for neutrino mass functionality
2026-07-02 10:33:28 +03:00
unzhakov
406fd57bcd
chore: add .pi-lens/ to .gitignore
2026-05-26 15:01:17 +03:00
unzhakov
8b0ced4b65
fix: resolve 4 fatal bugs — json_to_config, create_config_from_source, Am-241 constant, CLI positional args
2026-05-26 14:57:35 +03:00
unzhakov
38e97213c5
Remove root output
2026-05-22 18:25:57 +03:00
unzhakov
8599574723
docs: fix stale file references in TODO.md structure and completions
2026-05-22 15:18:17 +03:00
unzhakov
2fedd03d92
fix: bump __version__ to 0.4.0 to match pyproject.toml
2026-05-22 15:18:09 +03:00
unzhakov
fd76eff109
docs: add docs_check.py to quality gates, add bs_exp CLI, document pytest markers
2026-05-22 15:18:00 +03:00
unzhakov
5dd9c7977a
feat: add docs_check.py for automated documentation consistency checks
2026-05-22 15:17:52 +03:00
unzhakov
d8838d19f4
chore: remove obsolete notebooks and add uv.lock
2026-05-22 12:20:36 +03:00
unzhakov
ab164fbf98
fix: robust Am-241 calibration with width-constrained peak detection
...
- Use find_peaks width=(5,50) to reject noise bumps
- Simplify peak matching: find two strongest peaks with largest
channel separation, assign min/max known energies
- Require absolute threshold of 400 counts to avoid noise peaks
- Calibration now correctly maps: ch 97→13.0 keV, ch 537→59.54 keV
- Tc-99 endpoint at ch 2750 → 293.6 keV (expected ~294)
- Add .rpiv/ to .gitignore
2026-05-21 18:21:51 +03:00
unzhakov
8952d0f789
fix: robust Am-241 peak detection for energy calibration
...
- Search full spectrum (exclude pulser region) instead of just low-energy
- Include 59.54 keV line in known Am-241 energies
- Brute-force peak-to-energy matching with physical gain constraint
(3-40 ch/keV) to reject spurious fits
- Fixed find_peaks parameters: height=100, distance=5 for accurate
peak detection
- Calibration now correctly maps: ch 97→13 keV, ch 134→17.4 keV,
ch 537→59.6 keV, giving Tc-99 endpoint at ch 2750→291.6 keV
- Add .rpiv/ to .gitignore
2026-05-21 16:43:10 +03:00
unzhakov
5ec6305e09
fix: conditional matplotlib backend for interactive + headless use
2026-05-21 16:05:58 +03:00
unzhakov
fa4e61a9f6
chore: add .rpiv/ to .gitignore
2026-05-21 16:03:20 +03:00
unzhakov
5c2b12c0e6
feat: experimental data calibration pipeline with ROOT I/O
...
- Fix chi2 calculation bug in calibration.py (remove incorrect
coeffs[::-1] reversal in np.polyval)
- Fix broken beta_spectrum/cli.py (remove orphaned detector response
add_argument calls and unused imports)
- Add ExpSpectrum.apply_calibration() and EnergyCalibrator.from_am241_spectrum()
- Add LivetimeDetermination class for pulser-based livetime
- Add SpectrumPipeline orchestration (read→subtract→calibrate→livetime→validate)
- Add ROOT I/O with PyROOT primary + uproot fallback
- Add bs_exp CLI with process, livetime, export subcommands
- Add exp_calibration notebook with pre-calibration visualization
- Add comprehensive tests (73 passing)
- Add bs_exp console script and [root] extra to pyproject.toml
- Remove obsolete detector_response module and unused notebooks
2026-05-21 16:01:25 +03:00
unzhakov
caa4a77ebd
fix: correct energy calibration from Am-241 peaks
...
- Am-241 peaks at ch 134=13.8, ch 163=17.8, ch 218=26.3 keV
- Calibration: E = 0.397 + 0.0995 × ch (previously wrong)
- Kurie fit endpoint 425 keV vs Q=297.5 keV — spectrum extends
beyond MCA range (407 keV), simple extrapolation unreliable
- Proper endpoint extraction requires theory model + detector
convolution (fitter module), not simple Kurie plot
2026-05-18 00:01:28 +03:00
unzhakov
42dcad56a2
fix: add data/raw/ to .gitignore
2026-05-17 22:57:19 +03:00
unzhakov
5f70e3a15a
feat: add raw binary spectrum reader and data quality analysis
...
- exp_data/raw_reader.py: read binary MCA spectra (128-byte header,
int32 counts), subtract cumulative spectra, Am-241 calibration
- exp_data/spectrum.py: allow negative counts for difference spectra
- scripts/analyze_raw.py: analyze 236 individual runs from cumulative
data, compute rates and endpoint drift
- Am-241 calibration: E = -0.96 + 0.451 * ch (CAM1),
E = 0.75 + 0.442 * ch (CAM2)
- Results: stable rate ~2M counts/run, stable endpoint ~374 keV
(smeared Q-value), spike at runs 214-219 (acquisition glitch)
2026-05-17 22:55:52 +03:00
unzhakov
3c0a43ad4d
docs: update TODO and AGENTS for v0.4.0 completion
...
- Mark v0.4.0 as complete in TODO.md with all phases checked
- Update Phase 4 items with actual outcomes
- Next step: Track A 99Tc spectrum-shape analysis
- Add AGENTS instruction to update project metadata on significant
structural changes (package additions, version bumps, etc.)
2026-05-17 19:31:39 +03:00
Evgeniy Unzhakov
27a6993419
Merge pull request #3 from unzhakov/dev/phase2-fitter
...
AreDev/phase2 fitter
2026-05-17 19:21:14 +03:00
unzhakov
38b44b56e6
feat: v0.4.0 package restructuring — split into 4 modules
...
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.
2026-05-17 18:58:04 +03:00
unzhakov
745bbae4cd
refactor: rename 'analyzer' to 'visualize' — analysis belongs to fitter module
2026-05-17 01:33:13 +03:00
unzhakov
10ad3a867b
docs: restructure TODO.md with v0.4.0 package architecture plan
2026-05-17 00:34:16 +03:00
Evgeniy Unzhakov
0d51c68bcb
Merge pull request #2 from unzhakov/dev/move-analyzer-to-separate-file
...
Dev/move analyzer to separate file
2026-05-16 23:59:41 +03:00
unzhakov
64785f4aa9
style: remove transition type from plot header — shown in branch legends instead
2026-05-16 23:24:33 +03:00
unzhakov
55cfb30b2b
refactor: unify plotting — single-branch treated as multi-branch with one branch; remove old single-branch methods
2026-05-16 22:59:48 +03:00
unzhakov
b3d6abb4d5
polish: unify plot output — external headers, compact legends, consistent titles
2026-05-16 21:21:28 +03:00
unzhakov
f05a2de1b8
refactor: move BetaSpectrumAnalyzer to separate analyzer module
2026-05-16 20:41:58 +03:00
unzhakov
8314cee29c
refactor: restructure metadata files for context efficiency
...
- Shrink global AGENTS.md: 153 → 56 lines (−63%)
Removed: git workflow, TDD, overthinking guards, code style, reasoning protocol
Kept: personality, git basics, thinking levels, general principles, backend
- Create project AGENTS.md: 71 lines
Added: stack/commands, GitHub Flow git workflow, Conventional Commits,
TDD (Python-specific), quality gates, debug verification
- Trim CONVENTIONS.md: 161 → 68 lines (−58%)
Removed: verbose examples, redundant unit convention section,
lengthy SpectrumComponent code example
- Delete DEVELOPMENT.md: 238 lines → 0 (migrated to AGENTS.md)
Setup/release checklist removed (not agent concerns)
Git workflow, TDD, quality gates, notebook QC, debug verification
all migrated to AGENTS.md
- Update README.md project structure
Total per-session metadata: 552 → 195 lines (−65%)
2026-05-16 19:51:37 +03:00
unzhakov
1a23283cf1
fix: decay_info_to_config() now passes branches to SpectrumConfig; update docs for paceENSDF completion
...
- Fixed bug: decay_info_to_config() was dropping branches, causing
create_config_from_source('paceENSDF') to return single-branch config
- Added BranchConfig import to nuclear_data.py
- Marked B1 (paceENSDF integration) as complete in TODO.md
- Updated README.md with paceENSDF details in Implementation Status
- Updated TODO.md Current Status with v0.3.1 notes
2026-05-16 18:50:06 +03:00
unzhakov
5276dcc851
docs: mark all migration phases complete in TODO
2026-05-15 16:54:45 +03:00
unzhakov
76d183b913
test: Phase 5 — advanced improvements
...
1. pytest-timeout (30s, thread-based) added to pyproject.toml
- Prevents hangs in CI
- timeout_method='thread' for clean cancellation
2. hypothesis added for property-based edge case discovery
- tests/common/test_hypothesis_tests.py: 5 tests
- Fermi: random Z, A, W — checks stability, monotonicity
- Phase space: random W0, W — checks threshold/endpoint properties
- Hypothesis already found real bugs:
* Fermi monotonicity fails for Z < 10 (expected — finite-size dominates)
* Phase space negative when W > W0 (test constrains W < W0)
3. pytest.mark.requires_ensdf marker added to TestPaceENSDFIntegration
- Replaces bare @pytest.mark.skipif with documented marker
- Allows running only ENSDF tests: pytest -m requires_ensdf
4. Updated test-migration-todo.md: Phase 5 complete
Final state: 256 tests passing (250 regular + 6 hypothesis + 6 skipped ENSDF)
2026-05-15 16:48:46 +03:00
unzhakov
c96fb6175a
test: add .gitkeep files and update TODO with phase 1-4 complete
...
- Add .gitkeep to tests/common/ and tests/integration/ directories
- Mark phases 1-4 as complete in test-migration-todo.md
- All migration work done: 251 tests passing
- Final structure:
- tests/common/ — 3 files (shared helpers)
- tests/physics/ — 10 files (physics behavior)
- tests/quality/ — 8 files (API contracts)
- tests/integration/ — 2 files (end-to-end)
2026-05-15 15:56:28 +03:00
unzhakov
c78d0655a0
test: complete migration to structured test suite
...
Phase 1: Removed 6 duplicate old test files (fermi, finite_size, screening,
exchange, radiative, phase_space) — their tests are now in physics/ and quality/
using shared helpers from common/.
Phase 2: Migrated remaining 7 old test files:
- test_spectrum.py → integration/test_spectrum_pipeline.py (integration tests)
- test_fitter.py → physics/test_fitter.py (fit quality tests)
- test_cw_extractor.py → physics/test_cw_extractor.py (extraction accuracy)
- test_multi_branch.py → physics/test_multi_branch.py (branching physics)
- test_detector_response.py → physics/ + quality/ (split into physics + API)
- test_nuclear_data.py → quality/test_nuclear_data.py (parsing/API)
- test_logging_utils.py → quality/test_logging_utils.py (API tests)
Removed 12 old flat files, created 4 new files.
Total: 251 tests passing (6 skipped), down from 230 → 251 (net +21
from better coverage, not duplicates).
Test structure:
- tests/common/ — shared property/API helpers (eliminates ~18 duplicates)
- tests/physics/ — 10 files, unique physics behavior tests
- tests/quality/ — 8 files, API contract + parsing tests
- tests/integration/ — 1 file, end-to-end pipeline tests
2026-05-15 15:52:50 +03:00
unzhakov
fea151d8d7
docs: add test migration TODO with 5-phase plan
...
- Phase 1: Remove duplicate old tests (6 files)
- Phase 2: Migrate remaining 7 old test files to new structure
- Phase 3: Create integration tests
- Phase 4: Clean up and verify
- Phase 5: Advanced improvements (slow markers, hypothesis, CI)
- Total: from 230 flat tests → ~240 organized tests in 3 directories
2026-05-15 15:09:13 +03:00
unzhakov
4b08df3873
test: create new test architecture with shared property/API tests
...
- Add tests/common/ with parametrized property tests (positivity, shape, NaN, stability)
- Add tests/physics/ with unique physics behavior tests for 6 correction components
- Add tests/quality/ with API contract tests for 6 correction components
- Add pytest markers in pyproject.toml: property, physics, api, quality, integration
- New tests: 94 tests passing (physics + quality + common helpers)
- Old tests in tests/ root still present — migration in progress
- Total: 261 tests collected (230 old + 94 new - 63 duplicates removed)
The shared helpers eliminate 18 duplicate test patterns across correction
components. Each component now has:
- tests/physics/test_<name>.py — unique physics behavior
- tests/quality/test_api_<name>.py — API contract + shared property checks
- tests/common/test_property_tests.py — shared helpers (imported, not duplicated)
2026-05-15 15:04:52 +03:00
unzhakov
bd14e3bb7a
docs: add test architecture documentation
...
- Document current test suite state (230 tests, 79 CQT + 151 PT)
- Propose new directory structure: tests/{common,physics,quality,integration}
- Identify 18 duplicate test patterns across correction components
- Define pytest markers for test categorization
- Create implementation plan with 5 phases
2026-05-15 14:29:53 +03:00
unzhakov
4fb52fce2f
docs/refs: flatten directory structure — move summary.md to parent folder
...
- Rename all summary.md files to YEAR_Author_Title.md in their parent folder
- Remove 2017_Hayen_analytical_beta_shape/references.bib
- Remove 2024_Paulsen_T99_beta_spectrum/img/ directory
- Eliminate one level of directory nesting for cleaner refs layout
2026-05-15 13:55:16 +03:00
unzhakov
030ae3e4b9
docs: restructure knowledge base into tree layout + gA extraction module
...
- Organize into tree structure: corrections/, nuclear-structure/, gA-extraction/, refs/
- Move all correction notes to corrections/ (01-09)
- Move nuclear structure to nuclear-structure/ with index
- Add gA-extraction/ with SSM algorithm, sNME/ESSM formalism, Tc99 case study, and implementation TODO
- Reorganize refs by topic (electromagnetic/, forbidden-decay/)
- Update all wikilinks to new paths
- Remove radiative_spec.md (code algorithm, not reference)
- Lint: all wikilinks verified valid
- Comprehensive gA extraction research based on Paulsen et al. (2024) and Song et al. (2025)
2026-05-14 19:46:39 +03:00
Evgeniy Unzhakov
efcd6a524a
Merge pull request #1 from unzhakov/pi-dev/gA-shape-factor-parameterization
...
docs: add gA-driven shape factor parameterization (SSM) note
2026-05-13 15:03:25 +03:00
unzhakov
3acb23987a
docs: add gA-driven shape factor parameterization (SSM) note
...
Comprehensive documentation on parameterizing the shape factor C(Z,W)
via g_A for forbidden nonunique beta decays, based on:
- Kostensalo et al. PRC 95, 044313 (2017) - SSM introduction
- Kostensalo & Suhonen PRC 96, 024317 (2017) - gA-driven evolution
- Paulsen et al. PRC 110, 055503 (2024) - 99Tc high-precision MMC measurement
Covers: shape factor decomposition, fitting algorithm, uncertainty budget,
implementation plan for ShapeFactorGA module, and literature summary.
2026-05-13 14:46:58 +03:00
unzhakov
984c4f6884
Add regression test for Tc99 ENSDF intensity values
2026-05-08 16:11:06 +03:00
unzhakov
620488860b
Fix Tc99 branch intensity from paceENSDF
...
paceENSDF returns intensity at state[9] (percent), not state[8] (ENSDF
normalization field, ~1.0 for all branches). This was causing ~50/50
split for Tc99 instead of the correct 99.9984%/0.0016%.
2026-05-08 16:08:41 +03:00
unzhakov
c404d83418
Remove 'universal_' prefix from CSV column names in multi-branch mode
...
Universal components (Fermi, Screening, etc.) are exported under their
plain names — no redundant prefix needed.
2026-05-08 15:54:13 +03:00
unzhakov
a5144f2c33
Merge branch 'pi-dev/csv-branch-info-in-header'
2026-05-08 15:41:16 +03:00
unzhakov
b02159ba5c
Remove repeated per-branch metadata columns from CSV export
...
Branch intensity, endpoint, and transition are constant per branch and
already documented in the CSV header. No need to repeat them as columns
for every energy row.
2026-05-08 15:41:10 +03:00