SkillAgentSearch skills...

Powerxrd

A Python package build to analyze powder XRD (and XRD) data. The only known open-source Github project with a Rietveld refinement method in development.

Install / Use

/learn @andrewrgarcia/Powerxrd
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

powerxrd

Minimal, extensible Python tools for powder XRD analysis with a lightweight Rietveld refinement engine.


✨ Overview

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

🧱 Architecture

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.


📦 Installation

From PyPI (for users)

pip install powerxrd

🛠 Development Setup (recommended: uv)

PowerXRD uses uv for fast, reproducible dependency management.

Install uv:

pip install uv

Then inside the repository:

uv sync --group dev

This 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.py

🚀 Quick Example

from 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.py

🧪 Development

Run tests:

make test

Lint:

make lint

Format:

make format

Type check:

make type

Build package:

make build

🧠 Philosophy

This 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.


📚 References

See RIETVELD_CLASSIC.md for foundational Rietveld literature and background resources.


License

MIT License © Andrew Garcia

View on GitHub
GitHub Stars69
CategoryDevelopment
Updated12d ago
Forks10

Languages

Python

Security Score

100/100

Audited on Mar 9, 2026

No findings