Nuclear data as Parquet — queryable with DuckDB
Project description
nucl-parquet
Nuclear data as Parquet files — cross-sections, stopping powers, decay data, and isotopic abundances from all major evaluated libraries. Queryable with DuckDB, Polars, Pandas, or any Arrow-compatible tool.
Installation
pip install nucl-parquet
The pip package is a thin loader (~50 KB). Data files are either cloned from the git repo or downloaded from GitHub Releases:
import nucl_parquet
# Download data to ~/.nucl-parquet/ (first time only)
nucl_parquet.download()
Or clone the repo directly for the full dataset:
git clone https://github.com/exoma-ch/nucl-parquet.git
export NUCL_PARQUET_DATA=/path/to/nucl-parquet
Usage
import nucl_parquet
db = nucl_parquet.connect()
# Cross-section query
db.sql("SELECT * FROM tendl_2024 WHERE target_A=63 AND residual_Z=30")
# Compare all libraries
db.sql("SELECT library, energy_MeV, xs_mb FROM xs WHERE target_A=63 AND residual_Z=30")
# Decay chain
db.sql(nucl_parquet.DECAY_CHAIN_SQL, params={"parent_z": 92, "parent_a": 238})
# Stopping power
nucl_parquet.elemental_dedx(db, "p", 29, 10.0) # protons in Cu at 10 MeV
nucl_parquet.compound_dedx(db, "p", [(29, 0.5), (30, 0.5)], 10.0)
Data resolution
connect() finds data in this order:
- Explicit
data_dirargument $NUCL_PARQUET_DATAenvironment variable- Sibling repo checkout (when running from source)
~/.nucl-parquet/(downloaded vianucl_parquet.download())
Why Parquet instead of ENDF-6?
The ENDF-6 format dates from the 1960s. It was designed for Fortran on punch cards: 80-character fixed-width records, implicit column positions, and a cryptic MF/MT numbering system.
| ENDF-6 | Parquet | |
|---|---|---|
| Format | Fixed-width Fortran text, 80-char cards | Columnar binary, self-describing schema |
| Parsers needed | Specialized (NJOY, PREPRO, FUDGE, endf pkg) |
Any language — Python, R, Julia, Rust, JS, SQL |
| Random access | Sequential parse from start | Predicate pushdown, skip irrelevant row groups |
| Compression | None (or gzip'd text) | zstd columnar compression (5-10x smaller) |
| Cross-library comparison | Convert each library separately first | SELECT * FROM '*/xs/p_Cu.parquet' |
| Browser/WASM | Not feasible | Works natively (DuckDB-WASM, Pyodide) |
Size comparison for the same data:
| Library | ENDF-6 (zipped) | Parquet (zstd) | Reduction |
|---|---|---|---|
| TENDL-2025 neutron | ~800 MB (2850 zip files) | 25 MB | 32x |
| ENDF/B-VIII.1 (all) | ~120 MB | 4.3 MB | 28x |
| JENDL-5 (all) | ~200 MB | 8.6 MB | 23x |
Libraries included
| Library | Projectiles | Source |
|---|---|---|
| TENDL-2024 | n, p, d, t, ³He, α | IAEA/PSI |
| TENDL-2025 | n, p, d, t, ³He, α | PSI |
| ENDF/B-VIII.1 | n, p, d, t, ³He, α | NNDC/BNL |
| JEFF-4.0 | n, p | NEA |
| JENDL-5 | n, p, d, α | JAEA |
| CENDL-3.2 | n | CIAE |
| BROND-3.1 | n | IPPE |
| FENDL-3.2 | n | IAEA |
| EAF-2010 | n | CCFE |
| IRDFF-II | n | IAEA |
| IAEA-Medical | p, d | IAEA |
| EXFOR | n, p, d, t, ³He, α | IAEA NDS (experimental) |
Parquet schemas
Evaluated cross-sections ({library}/xs/*.parquet):
| Column | Type | Description |
|---|---|---|
| target_A | Int32 | Target mass number |
| residual_Z | Int32 | Product atomic number |
| residual_A | Int32 | Product mass number |
| state | Utf8 | Isomer state: "", "g", "m" |
| energy_MeV | Float64 | Projectile energy in MeV |
| xs_mb | Float64 | Cross-section in millibarn |
EXFOR experimental (exfor/*.parquet):
| Column | Type | Description |
|---|---|---|
| exfor_entry | Utf8 | EXFOR accession number |
| target_Z | Int32 | Target atomic number |
| target_A | Int32 | Target mass number (0 = natural) |
| residual_Z | Int32 | Product atomic number |
| residual_A | Int32 | Product mass number |
| state | Utf8 | Isomer state |
| energy_MeV | Float64 | Projectile energy in MeV |
| energy_err_MeV | Float64 | Energy uncertainty (nullable) |
| xs_mb | Float64 | Cross-section in millibarn |
| xs_err_mb | Float64 | Cross-section uncertainty (nullable) |
| author | Utf8 | First author |
| year | Int32 | Publication year |
Stopping powers (stopping/stopping.parquet):
| Column | Type | Description |
|---|---|---|
| source | Utf8 | PSTAR, ASTAR, ICRU73, MSTAR |
| target_Z | Int32 | Target element |
| energy_MeV | Float64 | Projectile energy |
| dedx | Float64 | Stopping power (MeV cm²/g) |
Development
# Install dev dependencies
uv sync --dev
# Run unit tests (no data needed)
uv run pytest tests/test_loader.py -v
# Run full test suite (requires data)
uv run pytest tests/ -v
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nucl_parquet-0.3.0.tar.gz.
File metadata
- Download URL: nucl_parquet-0.3.0.tar.gz
- Upload date:
- Size: 24.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
04e4927817ca0fa48f2c02b1d729e223fd835805dd5150e28a71bce7110d73e1
|
|
| MD5 |
4bb0228f82763099b1c106be8c2719e0
|
|
| BLAKE2b-256 |
48e5d54ce292b7339739acbd993a35f006e2d93a474b23aa49369609feab35a4
|
Provenance
The following attestation bundles were made for nucl_parquet-0.3.0.tar.gz:
Publisher:
release.yml on exoma-ch/nucl-parquet
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nucl_parquet-0.3.0.tar.gz -
Subject digest:
04e4927817ca0fa48f2c02b1d729e223fd835805dd5150e28a71bce7110d73e1 - Sigstore transparency entry: 1096682268
- Sigstore integration time:
-
Permalink:
exoma-ch/nucl-parquet@628e94fbed68648ce0b62a5e4a6f1a1b4ff8cc61 -
Branch / Tag:
refs/tags/py_0.3.0 - Owner: https://github.com/exoma-ch
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@628e94fbed68648ce0b62a5e4a6f1a1b4ff8cc61 -
Trigger Event:
push
-
Statement type:
File details
Details for the file nucl_parquet-0.3.0-py3-none-any.whl.
File metadata
- Download URL: nucl_parquet-0.3.0-py3-none-any.whl
- Upload date:
- Size: 21.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2f3a47bd29835c8171d669eff3db5472e2ec67c55c3662f4612eefc131573afd
|
|
| MD5 |
9f2cad5caaea8b177a45725611fb7cab
|
|
| BLAKE2b-256 |
3f44e91a8007ff8a7bcb7ab1efb1ff4ea9831c2e5418524d9d93b60897498cfd
|
Provenance
The following attestation bundles were made for nucl_parquet-0.3.0-py3-none-any.whl:
Publisher:
release.yml on exoma-ch/nucl-parquet
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nucl_parquet-0.3.0-py3-none-any.whl -
Subject digest:
2f3a47bd29835c8171d669eff3db5472e2ec67c55c3662f4612eefc131573afd - Sigstore transparency entry: 1096682269
- Sigstore integration time:
-
Permalink:
exoma-ch/nucl-parquet@628e94fbed68648ce0b62a5e4a6f1a1b4ff8cc61 -
Branch / Tag:
refs/tags/py_0.3.0 - Owner: https://github.com/exoma-ch
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@628e94fbed68648ce0b62a5e4a6f1a1b4ff8cc61 -
Trigger Event:
push
-
Statement type: