Differentiable forward + inverse for Dark-Field X-ray Microscopy (DFXM): deformation-gradient field imaging through a magnifying objective, and per-dislocation defect-type discrimination, on top of midas-stress / midas-hkls / midas-defect.
Project description
midas-dfxm
Differentiable forward + inverse for Dark-Field X-ray Microscopy (DFXM).
DFXM images a bulk grain through a magnifying objective (CRL / MLL) placed on one diffracted beam. The objective is a reciprocal-space bandpass: a sample voxel contributes intensity to its magnified detector pixel only if its local scattering vector falls inside the instrument's resolution function for the current goniometer setting. Rocking the sample (a mosaicity scan) maps local orientation; scanning 2θ / energy (a strain scan) maps local d-spacing; weak-beam settings image individual dislocations.
This package models that signal from a voxelised deformation-gradient field
F(r), and (later phases) inverts a DFXM image stack back to F(r) and to
per-dislocation defect types (edge/screw, Burgers vector, slip system).
Reuse-first, no re-porting. Built on the MIDAS differentiable stack:
midas-stress (orientation/strain), midas-hkls (structure factors, form
factors, DWF), midas-2d (continuous-q structure factor, resolution
convolution), midas-defect (Stroh anisotropic-elasticity contrast solver, slip
systems, GND, planar-defect rods), midas-invert (fit / UQ / experiment design),
midas-distortion (detector model). Everything is torch-differentiable and
device-portable (CPU / CUDA / MPS).
See implementation_plan.md for the full roadmap,
physics reuse map, phase gates, and honest scope/novelty gates.
Status
Pre-alpha (v0.0.1a0). Phases 0,1,3,4,5 + a simulation-anchored roadmap implemented and tested — 64 tests pass (CPU + MPS; 3 CUDA-skipped), ~2400 LOC.
Highlights:
- Phase 4 (defect typing): anisotropic-elasticity (Stroh) per-dislocation forward;
g·binvisibility; edge/screw character; Burgers-vector recovery. - Phase 5 (inverse typing):
identify_dislocationrecovers slip system, character, core position, and the Burgers-vector sign (the gap Borgi 2025 leaves open) from multi-reflection weak-beam images. - Phase 3 (field inverse): full strain-tensor recovery + identifiability + UQ; honest finding — regularisation helps at low SNR, ~neutral at high SNR.
- #1 physics coupling: recover a GND density end-to-end through the forward
(Nye
κ = ρb) — the DFXM↔DDD/CP interface, differentiably. - #2 credibility anchor: independent numpy oracle agrees bit-for-bit (~1e-16).
- Borbély-ready:
field_from_deformation_gradientconsumes an externalF(r)with zero rework.
See SIMULATION_CATALOG.md and examples/ (figures land in
dev/paper/figures/).
Earlier milestone note
Phases 0–1 implemented and tested (30 passing, CPU + MPS):
- Phase 0 — conventions + field.
conventions.py(lab/sample/imaging frames, goniometer),field.py(DeformationField, the kinematic deform operatorQ = F⁻ᵀ G0, polar decompositionF = R·U),io.py(synthetic-field generators: perfect crystal, orientation gradient, uniform strain, isotropic screw dislocation; plus a stub loader for Borbély's field). - Phase 1 — geometrical-optics forward.
resolution.py(anisotropic-Gaussian reciprocal-space acceptance),optics.py(magnifying inclined projection + bilinear detector splat),scan.py(mosaicity / rocking / strain scan builders, Bragg-angle helpers),forward.py(dfxm_image,dfxm_stack,mosaicity_curve).
Validated analytic limits: rocking-curve FWHM = 2√(2ln2)·σ⊥ / |axis×q|, FCC
forbidden reflection is dark, uniaxial strain shifts |Q| correctly; plus
gradcheck on the deform operator and end-to-end autograd to F and the instrument
widths.
Next: Phase 2 (field forward on Borbély's realistic F(r) when it lands),
Phase 3 (field inverse + identifiability study), Phase 4 (per-dislocation
forward via the Stroh solver + g·b defect typing), Phase 5 (inverse defect
discovery).
Quickstart
import torch
from midas_dfxm import (
make_uniform_field, with_orientation_gradient,
GoniometerSetting, reference_q_nom, aligned_resolution,
ObjectiveOptics, bragg_two_theta_deg, dfxm_image,
)
# A curved crystal grain (smooth lattice rotation across x).
field = make_uniform_field(shape=(64, 64, 1), spacing_um=0.5)
field = with_orientation_gradient(field, axis=(0, 0, 1), deg_per_um=0.01, along=0)
hkl, center = (1, 1, 1), GoniometerSetting()
q_nom = reference_q_nom(field, hkl, center)
res = aligned_resolution(q_nom, sigma_par=5e-3, sigma_perp=5e-3)
tt = bragg_two_theta_deg(float(torch.linalg.vector_norm(q_nom)), wavelength_A=0.172979)
optics = ObjectiveOptics(two_theta_deg=tt, magnification=10.0, detector_shape=(256, 256))
image = dfxm_image(field, hkl, center, res, optics) # (256, 256), differentiable
Tests
# macOS: work around the duplicate-OpenMP-runtime abort (torch + MIDAS siblings).
export KMP_DUPLICATE_LIB_OK=TRUE
python -m pytest tests/ -q
Markers: unit (analytic correctness), autograd (gradcheck / autograd),
device (CPU/CUDA/MPS parity), slow (heavy integration).
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 midas_dfxm-0.1.0.tar.gz.
File metadata
- Download URL: midas_dfxm-0.1.0.tar.gz
- Upload date:
- Size: 95.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
13bbdf3a3ba7e43275a40ac8bce601bbdb1a76f36b6f63761c2350a16fb6275a
|
|
| MD5 |
3de1520e531103f9e44c61888c0f9b6f
|
|
| BLAKE2b-256 |
f74dd1f72be76f2fe97a0d56f81ea1d7d790944e300ae23fc6256ebff921c22d
|
Provenance
The following attestation bundles were made for midas_dfxm-0.1.0.tar.gz:
Publisher:
python-packages.yml on marinerhemant/MIDAS
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
midas_dfxm-0.1.0.tar.gz -
Subject digest:
13bbdf3a3ba7e43275a40ac8bce601bbdb1a76f36b6f63761c2350a16fb6275a - Sigstore transparency entry: 2281985376
- Sigstore integration time:
-
Permalink:
marinerhemant/MIDAS@39dcce1352a4159dfa4d808587ce28eba6de5b35 -
Branch / Tag:
refs/tags/midas-dfxm-v0.1.0 - Owner: https://github.com/marinerhemant
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-packages.yml@39dcce1352a4159dfa4d808587ce28eba6de5b35 -
Trigger Event:
release
-
Statement type:
File details
Details for the file midas_dfxm-0.1.0-py3-none-any.whl.
File metadata
- Download URL: midas_dfxm-0.1.0-py3-none-any.whl
- Upload date:
- Size: 81.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7f39cd1ef024a174dd5e507c344290d722baa4e419382b22160a460fa4c9e0d0
|
|
| MD5 |
e07df9039544f661cef07d8f5b6aa20b
|
|
| BLAKE2b-256 |
990586fa4af54ea1b722ed2fd53c4dd4ed64875ea37b12bf40c02ac1c9f6ccec
|
Provenance
The following attestation bundles were made for midas_dfxm-0.1.0-py3-none-any.whl:
Publisher:
python-packages.yml on marinerhemant/MIDAS
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
midas_dfxm-0.1.0-py3-none-any.whl -
Subject digest:
7f39cd1ef024a174dd5e507c344290d722baa4e419382b22160a460fa4c9e0d0 - Sigstore transparency entry: 2281985480
- Sigstore integration time:
-
Permalink:
marinerhemant/MIDAS@39dcce1352a4159dfa4d808587ce28eba6de5b35 -
Branch / Tag:
refs/tags/midas-dfxm-v0.1.0 - Owner: https://github.com/marinerhemant
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-packages.yml@39dcce1352a4159dfa4d808587ce28eba6de5b35 -
Trigger Event:
release
-
Statement type: