NeutronImagingScripts
This package contains a suite of Python modules and scripts that are critical for the data reduction of Neutron Imaging at Oak Ridge National Laboratory.
Overview
| Component | What it does |
|---|---|
neutronimaging.detector_correction |
MCP detector occupancy (deadtime) correction: shutter metadata parsing, FITS stack loading with NeuNorm-1.x-equivalent gamma filtering, per-shutter-window occupancy correction, optional Timepix chip-geometry correction (gated behind --chipcorrection) |
neutronimaging.preprocess |
CG1D preprocessing: TIFF metadata extraction and measurement-configuration (JSON) generation |
neutronimaging.npmath / neutronimaging.util |
numerical and filesystem helpers (edge binning, EPICS timestamp conversion, folder trees) |
mcp_detector_correction (CLI) |
end-to-end MCP correction: validate input dir, correct, export float32 TIFFs under true source names + sidecar metadata |
generate_config (CLI) |
build the reduction configuration JSON from radiograph/OB/DF directories |
Image I/O is direct astropy (FITS) and tifffile (TIFF) — the NeuNorm dependency was removed in #19.
Installation
General users
Install the package from PyPI with
$ pip install NeutronImaging
NOTE: the current PyPI release (1.2) long predates the NeuNorm removal and the 2026 correctness fixes; install from git until v1.6 is released.
Developers
Development uses pixi to manage the environment. After cloning this repository, run the following at the repo root:
$ pixi install # solve and install the dev environment (editable package included)
$ pixi run test # run the unit tests
$ pixi run pre-commit run --all-files # lint
A plain-pip path also works in any Python >=3.12 environment:
$ pip install -e .
Usage
Use as a Package
Examples of using this package as a Python module are provided as Jupyter Notebooks inside the example folder.
Use as a commandline tool
Generate Configuration File for Data Reduction
To generate the json file that is needed for subsequent data reduction, use
$ generate_config IPTS-20267/raw/radiographs IPTS-20267/raw/ob IPTS-20267/raw/df IPTS-20267.json
where
IPTS-20267/raw/radiographscontains the raw imagesIPTS-20267/raw/obcontains open beam images (white field)IPTS-20267/raw/dfcontains dark field images
If you would like to have multiple experiment configuration files nested in one json file, simply use
$ generate_config IPTS-20267/raw/radiographs,IPTS-20267-2/raw/radiographs IPTS-20267/raw/ob IPTS-20267/raw/df IPTS-20267.json
notice that:
- You can have more than one folder for raw images, but they need to be within the same string separated by
,. - You can have only one folder for open beam directory
- You can have only one folder for dark field directory
The command above will yield a json file with the following structure
{"IPTS-20267": {"CONFIG_DATA"},
"IPTS-20268": {"CONFIG_DATA"}
}
The default tolerance for the categorization with respect to aperture positions is 1mm. However, you can change the default value by specify it as below
$ generate_config \
IPTS-20267/raw/radiographs \
IPTS-20267/raw/ob \
IPTS-20267/raw/df \
IPTS-20267.json --tolerance=2
MCP Detector correction
Installing this package provides the mcp_detector_correction console command
(callers that invoke the repo file by path can keep using scripts/mcp_detector_correction.py,
which is a thin wrapper around the same implementation).
Type mcp_detector_correction -h, you should see the following
$ mcp_detector_correction -h
Usage:
mcp_detector_correction [--skipimg] [--verbose] <input_dir> <output_dir>
mcp_detector_correction (-h | --help)
mcp_detector_correction --version
Therefore, you can process the example data with the following command at the root of this repo
(the data/ tree is not tracked in git — fetch it once with
pixi run python -c 'from neutronimaging.datasets import ensure_repo_data; ensure_repo_data()',
which downloads it into data/):
$ mcp_detector_correction data tmp
and you will see the following in your terminal
$ mcp_detector_correction data tmp
Parsing input
Validating input arguments
Processing metadata
Loading images into memory
Perform correction
corrected image summary
dimension: (916, 512, 512)
type: float64
Writing data to tmp
NOTE: make sure you create a
tmpfolder first.
Developer Notes
Test/example data
The ~570 MB IPTS-20267 dataset is not tracked in git. It is published as the
data-v1
release asset (nis-test-data-v1.tar.gz) and fetched on demand with pooch:
neutronimaging.datasets.example_data_dir()returns the data root, downloading it into the pooch cache on first use (resolution order:$NEUTRONIMAGING_DATA_DIR→ a populated localdata/→ download). The test suite uses this and skips if the data is unreachable.neutronimaging.datasets.ensure_repo_data()materializes it atdata/so the example notebooks'../datarelative paths resolve.pixi run fetch-datapre-downloads it (CI runs this before the tests).
Contents: OB_1_005_*.fits (916 frames) + OB_1_005_{ShutterCount,ShutterTimes,Spectra}.txt
(an MCP open-beam measurement for the detector-correction tests/notebook); IPTS-20267/ (CG1D
directory trees exercising generate_config); and the golden profiles ref_pop_prof.npz /
ref_img_mean_prof.npz for the occupancy correction. Regenerate the goldens ONLY after an
intentional, reviewed behavior change with pixi run python scripts/regenerate_test_refs.py,
then re-tar and bump the tag + sha256 in neutronimaging/datasets.py. (No LFS — deliberately
abandoned in ef81aed.)
Releasing
- Tag
vX.Yonmain(versioningit derives versions from tags). - Build and upload manually (
python -m build,twine upload dist/*) — by decision there is no publish automation for this repo (no known downstream pip consumers).
The package is MIT-licensed (team decision 2026-06-12, the NDP standard), which settled the historical GPLv3/BSD/LGPLv2 metadata contradiction.
Branch model
main only (decided 2026-06-10): work lands on main via PRs; the historical
next/qa promotion branches are frozen relics of the pre-2026 flow.
Metadata
Release files for NeutronImaging 1.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| neutronimaging-1.6.tar.gz | 26.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| neutronimaging-1.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 46.9 kB
Release files / neutronimaging-1.6.tar.gz
| Download URL | neutronimaging-1.6.tar.gz |
|---|---|
| Size | 26.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
52c242a5888e23bc391f274185e67c5c7e4e016ce6d4f8ee6a843f73deacb50b
|
|
BLAKE2b-256 checksum How to use checksums |
9b8e7c8224f24ff21855e6881771445f6ebd2617a37b7e761762ef2f03698b06
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 16, 2026.
Transparency logRelease files / neutronimaging-1.6-py3-none-any.whl
| Download URL | neutronimaging-1.6-py3-none-any.whl |
|---|---|
| Size | 20.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
05306bb3ea14934d59bb317651bfaac97fca0b010c37b0659d0f12861fcc30bf
|
|
BLAKE2b-256 checksum How to use checksums |
d232331cae1dd153797b294b16a28b59bdac2a0436c5d9dc647e1743da46b42e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 16, 2026.
Transparency log