Minimal, extensible Python tools for powder XRD analysis with a lightweight Rietveld refinement engine.
powerxrd is a modular framework for:
- Parsing powder XRD data
- Background subtraction and smoothing
- Peak analysis
- Lightweight Rietveld refinement
- Extensible lattice definitions
It is not a replacement for FullProf or GSAS.
It is a compact, inspectable refinement engine designed for:
- Teaching
- Prototyping
- Research exploration
- Algorithm experimentation
- Rapid lattice model development
The package is organized into clear layers:
Lattice → geometry only (d-spacing, HKL generation)
Model → profile + background + peak physics
Refine → least-squares optimization
Workflow → staged refinement orchestration
Chart/Data → preprocessing utilities
This separation allows you to extend:
- New lattice systems (tetragonal, hexagonal, etc.)
- Alternative peak shapes
- Custom refinement strategies
- Structure factor implementations
The lattice layer is fully abstracted through BaseLattice, enabling clean geometric extensions.
pip install powerxrdPowerXRD uses uv for fast, reproducible dependency management.
Install uv:
pip install uvThen inside the repository:
uv sync --group devThis will:
- Create a virtual environment automatically
- Install runtime dependencies
- Install development tools (pytest, ruff, mypy)
No manual venv activation required.
To run anything inside the project environment:
uv run python script.pyfrom powerxrd.lattice import CubicLattice
from powerxrd.model import PhaseModel
import powerxrd.refine as rr
# Define lattice
model = PhaseModel(lattice=CubicLattice(a=4.0))
# Load experimental data (example)
x_exp, y_exp = rr.load_data()
# Staged refinement
rr.refine(model, x_exp, y_exp, ["scale"])
rr.refine(model, x_exp, y_exp, ["bkg_intercept", "bkg_slope"])
rr.refine(model, x_exp, y_exp, ["a"])
# Plot final fit
rr.plot_fit(model, x_exp, y_exp, model.pattern(x_exp))Full examples are available in:
examples/
Including extended hello_rietveld workflows.
Run them via:
uv run python examples/hello_rietveld_long.pyRun tests:
make testLint:
make lintFormat:
make formatType check:
make typeBuild package:
make buildThis project prioritizes:
- Clarity over feature bloat
- Extensibility over monolithic design
- Numerical transparency
- Minimal abstraction overhead
- Inspectable scientific computation
It is intentionally small.
The goal is not to compete with large crystallographic suites — but to provide a clean, programmable refinement core.
See RIETVELD_CLASSIC.md for foundational Rietveld literature and background resources.
MIT License © Andrew Garcia