Skip to main content

rexafs for Python

Published user guide · Versioned API reference

Process X-ray absorption spectra with Rust and work with the results as NumPy arrays. Start with Spectrum(energy, mu).fft(); configure only what you need. Energy is in eV, k/q in Å⁻¹, and R in Å.

Install

We recommend uv to manage an analysis project's Python version, dependencies and commands. CPython 3.10–3.14 is supported; start a Python 3.12 project with the stable package:

uv init --python 3.12 rexafs-analysis
cd rexafs-analysis
uv add rexafs==0.2.5 numpy
uv run python -c "import rexafs; print(rexafs.__version__)"

uv add records dependencies in pyproject.toml and resolves their versions in uv.lock. uv run uses the project's .venv automatically; no shell activation is needed. Commit pyproject.toml, .python-version and uv.lock with your analysis, and leave .venv out of version control. NumPy is listed explicitly because the examples import it. See uv's project guide.

PyPI provides platform wheels. Rust is needed only when building rexafs from source.

Version note: keyword constructors, direct configuration setters and XrayFFTR were added in 0.2.5. The basic example also works in 0.2.4.

Load and process a spectrum

Save this as analyze.py inside the project, beside your data file:

import numpy as np
from rexafs import Spectrum

# Two whitespace-delimited columns: energy in eV and absorption mu.
data = np.loadtxt("spectrum.dat")
spectrum = Spectrum(data[:, 0], data[:, 1]).fft()
r, magnitude = spectrum.r(), spectrum.chir_mag()
print(spectrum.e0(), r, magnitude)

Run it with uv run python analyze.py. In your editor, select the Python interpreter from this project's .venv for completion and hover help.

For QAS transmission files, rexafs.io.read_qas_transmission(path) returns a Spectrum using mu = ln(I0 / It), the natural logarithm of incident intensity I0 divided by transmitted intensity It. Both intensities must be positive and in matching units; this produces optical depth rather than an absolute absorption coefficient. The first three whitespace-delimited columns are energy, I0 and It; # starts a comment and additional columns are ignored. Do not use this reader on a file that already contains mu. It accepts str or pathlib.Path:

from rexafs import io
spectrum = io.read_qas_transmission("Ru_QAS.dat").fft()

File/parse failures raise RuntimeError. The reader sorts energy and calculated mu together when needed, retaining duplicate energy rows. It does not enforce positive intensities or finite ratios; processing rejects non-finite data, and duplicates can require cleanup for the selected numerical stage. Check the raw intensities before analysis. The array constructor instead rejects unordered or duplicate energy values.

normalize(), calc_background(), fft() and ifft() return the same spectrum. Missing prerequisite stages run automatically. Results are copied NumPy float64 arrays; a result is None until its stage has run. Check for None when using a result in typed code. Input lists, arrays and strided views are accepted and copied; input energy must be finite and strictly increasing, with matching mu.

Configure only the parameters you need

from rexafs import AUTOBK, PrePostEdge, XrayFFTF, XrayFFTR

spectrum.set_normalization_method(PrePostEdge(pre_edge_end=-30.0))
spectrum.set_background_method(AUTOBK(rbkg=1.0))
spectrum.set_fft(XrayFFTF(kmin=2.0, kmax=12.0, kweight=2.0)).fft()
# Optional: isolate an R range and back-transform it.
spectrum.set_ifft(XrayFFTR(rmin=1.0, rmax=3.0, dr=0.5)).ifft()
q, filtered_chi = spectrum.q(), spectrum.chiq()

These ranges are examples; choose them for your data. Constructors take named arguments, which editors can complete. Fields remain mutable, so existing code such as background = AUTOBK(); background.rbkg = 1.2 still works. BackgroundMethod.AUTOBK(background) and NormalizationMethod.PrePostEdge(parameters) remain available for Rust-style algorithm selection; passing settings directly is the shorter equivalent.

Settings Recommended starting values
PrePostEdge() Automatically choose E0, fit ranges and polynomial order from the spectrum
AUTOBK() rbkg=1.0, kstep=0.05, kweight=1, window="Hanning", solver="LinearDirect", clamp_scale_policy="FixedPenalty", clamp_lambda=0.001
XrayFFTF() kmin=2.0, kmax=15.0, kweight=2.0, dk=1.0, window="KaiserBessel", nfft=2048, grid="Input"
XrayFFTR() rmin=0.0, rmax=20.0, dr=1.0, rweight=0.0, qmax_out=10.0, nfft=2048, automatic kstep

Omitting an argument preserves its constructor default. None requests automatic resolution for optional fields; this can differ from the constructor default (for example, XrayFFTF(kmax=None) uses the measured upper k limit). PrePostEdge() follows Rust PrePostEdge::new(), whose ranges are automatic, rather than the fixed ranges in Rust PrePostEdge::default().

Setters copy settings and clear affected results. Editing the original settings later requires calling the setter again. set_e0(eV) clears normalization and all later results; set_fft() preserves chi(k); set_ifft() preserves chi(R). Calling a stage explicitly recomputes it. See the shared API guide.

Some automatic values, including fit ranges and FFT spacings, are retained inside the spectrum on subsequent calls; clearing results does not reset them to None. AUTOBK's automatic kmax and nknots are instead calculated from each input. The original settings object remains unchanged. For example, after changing the background k spacing, reassign forward and inverse settings so their automatic spacings are inferred again:

# Requires 0.2.5 or later; continue with the spectrum above.
spectrum.set_background_method(AUTOBK(kstep=0.1))
spectrum.set_fft(XrayFFTF(kstep=None))
spectrum.set_ifft(XrayFFTR(kstep=None)).ifft()

Apply the same principle to a new scan with a different normalization range: reassign fresh automatic normalization settings instead of retaining the prior scan's resolved bounds. The generated member help explains these choices.

What the calculations mean

Normalization subtracts a fitted pre-edge baseline and divides absorption by its edge step. AUTOBK estimates the smooth background to obtain the EXAFS oscillations, chi(k). The Fourier transform weights and windows those oscillations to display them against R; its peaks are not automatically phase-corrected bond lengths. An inverse transform filters selected R contributions back into q space.

The forward code multiplies an unnormalized, negative-exponent FFT by kstep / sqrt(pi), with no extra division by FFT length. For dimensionless chi and forward exponent w, chi(R) has units Å⁻⁽ʷ⁺¹⁾; the default w=2 gives Å⁻³. The real inverse retains the forward weighting and window, so with default inverse rweight=0, its signal has units Å⁻ʷ and is generally not the original unweighted chi(k).

The processing theory guide explains the equations, symbols, units, assumptions and implementation choices, with scientific references. Use the fitting-statistics guide when interpreting structural fits and uncertainties.

Completion, hover help and errors

The installed package includes py.typed, annotated .pyi files and native runtime docstrings. Select the project's .venv interpreter in your editor (Pylance/Pyright, for example). Hover over parameters for units, defaults and behavior; help(AUTOBK) and help(Spectrum.fft) also work in a terminal. FTWindow, FFTGrid, AUTOBKSolver and AUTOBKClampScalePolicy are Literal type aliases, so editors suggest supported strings and flag invalid choices.

Invalid inputs/normalization raise ValueError; background/FFT failures raise RuntimeError. Stages release the GIL during Rust computation. The public API is rexafs; _core is an implementation detail.

Build from source

Packaging since 0.2.6: the Python binding enables PyO3's abi3-py310 feature, sharing one wheel per platform across GIL-enabled CPython 3.10–3.14. The published 0.2.5 wheels remain unchanged. The release workflow tests the same wheel on every supported interpreter with its minimum available NumPy wheel and the latest compatible NumPy. Free-threaded Python is not qualified. See the release checks and PyO3's stable ABI guide.

From the repository root, with the pinned Rust toolchain installed, use an isolated build environment. This development workflow uses uv venv and uv run --no-project so installing the local extension does not change the library's dependency manifest with analysis-project dependencies:

uv venv --python 3.14
uv pip install maturin numpy
uv run --no-project maturin develop --release --locked
uv run --no-project python py-rexafs/tests/test_api.py

Fitting, groups, structures, plotting and direct ReFEFF calculation remain Rust/desktop APIs. MBack and ILPBkg selectors are unimplemented placeholders and raise errors when processed. See AUTOBK defaults and FFT grid compatibility. Licensed under MIT OR Apache-2.0.

Universal measurement reader (since 0.2.6)

Version 0.2.6 adds content-detected beamline text, CSV, Athena, XTUNES and HDF5 import through the shared Rust reader. Read a document, inspect its scans, columns, units and warnings, then select a signal mapping. Ambiguous channels require explicit selection; detector images require reduction before creating an absorption spectrum. Reading performs no processing or corrections. See the reader guide for language examples, unit conversions, dataset selection, fixture coverage and limits. This API is not included in the published 0.2.5 packages.

Larix 1.0 session import is available in the shared reader since 0.2.6, including stored absorption, complex saved arrays and inert session metadata. See the Larix import guide.

Column selections accept exact, case-sensitive names as well as zero-based indices. For a QAS file, use measurement.arrays(energy="energy", i0="i0", it="it") for transmission, iff="iff" instead of it for fluorescence, or i0="it", it="ir" for the reference. The same keywords work with .spectrum(). Duplicate names require indices. Omit energy_unit to preserve detected axis calibration, or explicitly override it with "eV" or "keV".

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rexafs-0.2.7.tar.gz (3.6 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rexafs-0.2.7-cp310-abi3-win_amd64.whl (4.4 MB view details)

Uploaded CPython 3.10+Windows x86-64

rexafs-0.2.7-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.0 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

rexafs-0.2.7-cp310-abi3-macosx_11_0_arm64.whl (3.0 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

rexafs-0.2.7-cp310-abi3-macosx_10_12_x86_64.whl (3.4 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file rexafs-0.2.7.tar.gz.

File metadata

  • Download URL: rexafs-0.2.7.tar.gz
  • Upload date:
  • Size: 3.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for rexafs-0.2.7.tar.gz
Algorithm Hash digest
SHA256 530af5e8013266df52b99056a9280e6d78884417887179b2a11b647609555cee
MD5 832d1fa154b65a07fd5a77aaecf13b54
BLAKE2b-256 4e2c75dba770b0ea558760d23c6d8eb43a0c9c60096e163e2d1206f8a704af73

See more details on using hashes here.

Provenance

The following attestation bundles were made for rexafs-0.2.7.tar.gz:

Publisher: publish.yml on Ameyanagi/rexafs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rexafs-0.2.7-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: rexafs-0.2.7-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 4.4 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for rexafs-0.2.7-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 428ce202dbb4e23616c5adc7f65e0dc45e51a27a3d1a1ddf63ac8744aff4cfd1
MD5 2553e3a046698faf1126b32a8dd7f449
BLAKE2b-256 fbb474260f3d31d443754c1522e2abc3d8db81a3a73dd90974e74703ef5a2f73

See more details on using hashes here.

Provenance

The following attestation bundles were made for rexafs-0.2.7-cp310-abi3-win_amd64.whl:

Publisher: publish.yml on Ameyanagi/rexafs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rexafs-0.2.7-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rexafs-0.2.7-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2e6e1428ced5b46e4a458fa1a870f0bdd1acf5c5d807e02bf4bd786568cd75d6
MD5 793781df739fac237af36886ed033b45
BLAKE2b-256 465a4eea40f43466870425cc683aec290d39be1e21a22095f6f8ad07fa8db79e

See more details on using hashes here.

Provenance

The following attestation bundles were made for rexafs-0.2.7-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on Ameyanagi/rexafs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rexafs-0.2.7-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rexafs-0.2.7-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 88feaa56aa799f47160eaf20ea75777e5b9c9a7be5241e7b128cadd13f9de644
MD5 d17680749f91760b1cfbe4cf41c7ea53
BLAKE2b-256 ff5ac2835bc2345e432369634d64a9ea4a2316968c8e4e5358c829bb2af305e7

See more details on using hashes here.

Provenance

The following attestation bundles were made for rexafs-0.2.7-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: publish.yml on Ameyanagi/rexafs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rexafs-0.2.7-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rexafs-0.2.7-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5f6d598ecb3413ae0511a5c89d3b49ebb75611f64d2462dc5a5980ef04d11d72
MD5 2fff30b9ab03a91a79a3b76d8d311aa6
BLAKE2b-256 787d90effdacbba4c8287b7651d5997e5009380082ac4b89c3ba46470820e7b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for rexafs-0.2.7-cp310-abi3-macosx_10_12_x86_64.whl:

Publisher: publish.yml on Ameyanagi/rexafs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.2.7 This release

5 files

0.2.6

5 files

0.2.5

21 files

0.2.4

21 files

0.2.3

21 files

0.2.1

21 files

0.2.0

21 files

0.1.4

21 files

0.1.3

21 files

0.1.2

21 files

0.1.1

21 files

0.1.0

21 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page