Releases: silx-kit/pyFAI
pyFAI v2026.05
New features:
- Calib2: improve "recalib" like calibration, without peak-picking but a known geometry in input (#2840)
- Sensor: new CZT (Cadmium-Zinc-Telluride) detector material
- Support for logarithmic/sqrt/non-linear units binning space with formula-based conversions
- Multigeometry integration results now support
union()
Bug Fixes & Code Quality:
- New `ImmutableDict`` class for immutable dictionary representation
- Fixed
Integrate1dResult.rebin1d()`` to properly handledummy` values and normalization - PoniFile Enhancements: calibrant and image metadata are now saved to ease Recalibration
- Sensor Configuration now properly initializes material strings
- Wavelength is checked in
enable_parallax() - Several typos and grammar improvements in documentation/tutorials
- Improved kernel OpenCL compilation for silx v3+ compatibility
Supports python 3.10-3.14, 3.14t is untested.
62 commits over 2 month
Full Changelog: v2026.03...v2026.05
pyFAI v2026.03
-
New features:
-
Bug fixes:
- Result of 2d integration from pyFAI-integrate has wrong interpretation "spectrum" not "image" in Nexus (#2812)
- Prevent the usage of compilers other than MSVC on Windows
- Ensure application's help is available on Windows too
- Prevent GUI exception, related to detector definition (#2828)
- Implement parallax correction for ring extraction, when requested
- Fix regression in recalculate_means, switch math to
numepr - Fix relative path issue under Windows (#2823)
- Fix RingExtractor calling message_box from a QThread, violating Qt threading rules.
-
Supports python 3.10-3.14, 3.14t is untested.
-
32 commits over 1 month
-
Contributors for this release:
- Tianyi Ma
- Edgar Gutierrez-Fernandez
- Thomas Vincent
- Jérôme Kieffer
pyFAI v2026.02
What's Changed
- make bugfix release by @kif in #2749
- Fix deprecation replacement in twoThetaArray by @t20100 in #2753
- Ensure SensorConfig can be copied by @kif in #2751
- [Pilx] explicit title with full path in image plot by @kif in #2754
- Implement c-type cells in crystallography module by @kif in #2756
- Fix loading
pixel1andpixel2from nexus detector definition by @t20100 in #2758 - Parallax tutorial by @kif in #2761
- Define detector's sensor when enabling parallax. by @kif in #2760
- [diffmap] Motor range checks bug for None value when motor ranges are (None, None) by @mjdiff in #2763
- tutorial on spotty data by @kif in #2764
- [Fibert-Unit]simplify code, fix numpy equations, shortcuts for qlab by @EdgarGF93 in #2772
- Check the precision for the thickness and stop complaining for difference in the nm scale by @kif in #2770
- Fix pilx for empty mask by @kif in #2784
- Fix binning for Eiger detector by @kif in #2789
- Convert README.rst to Markdown as README.md by @kif in #2767
- Enforce encoding to UTF-8 when saving text by @kif in #2799
- Document AI policy by @kif in #2800
- belt & suspender for json export by @kif in #2803
- Nxazint1d file writer by @fgjorup in #2795
- leave box empty when parameter is None by @kif in #2804
- 2775 ring extractor by @kif in #2805
- Start to implement a multi-module detector by @kif in #2748
- move methods from azimuthal to common by @EdgarGF93 in #2786
- Azimuthal variance accumulation by @kif in #2776
New Contributors
Full Changelog: v2025.12.1...v2026.02
pyFAI v2025.12.1 bugfix
- Fix documentation for pixel-splitting + non-regression test on the Cython part
- Fix pixel size for Pilatus4-CdTe
- Fix CITATION.cff which prevented Zenodo upload
- Clean-up repository from deprecated example/debug files
pyFAI v2025.12
Summary:
Parallax
This effect shifts the pixel position when the inclination of the beam is large (>30°) making calibration challenging
- Provide absorption coefficients of most common sensor materials
- Update the database of detectors with sensor material and thickness (#2606)
- New PONI-file version (backwards compatible when possible)
- [Calib2] exposes the feature in detector configuration
- Performance regression while calibrating and geometry initialization (will be addressed in the future)
Graphical user interface
- Like
silx,pyFAImoves from pyQt5 to pySide6 (or pyQt6). Several bugs were found
and addressed to increase compatibility with Qt6. PyQt5 is no more a priority and will be dropped in next release Integrateis now able to perform fiber integration.Calib2exposes the sensor definition in detector configurationPilxis now compatible with files produced by mesh-scan on BM29 in addition todiffmap.
Median filtering
- fix an infinite loop in the OpenCL code
Crystallography
-
Move most of the
calibrantfile into the crystallography module -
Calibrant have seen the IO part devoted to a dataclass called CalibrantConfig:
- Import/export of D-file, including now the relative intensity
- Import from diff-files available from the American Mineralogist Database
-
space_groupscontain an extensive list of 230 space-groups with their extinctions for use in theCellclass -
The
Cellclass can now be directly exported as calibrant -
Added new resolution functions for powder diffraction peak shapes with:
- Constant resolution
- Caglioti model (U, V, W parametrization)
- Langford model (4 parameters)
- Chernyshov model (3 parameters)
-
Added
fake_xrpdpmethod to generate 1D powder patterns with configurable resolution -
Refactoring of the
fake_imagemethod which takes benefit offake_xrpdpimprovements -
Documentation with a new tutorial on carbon polymorphs (diamond, graphite and C60)
integrate1|2d methods:
- enforce arguments to be kwargs to limit user errors
Documentation:
- Improve the notebook about "flatfield" calculation.
Fiber/GrazingIncidence
- Compatibility with pyFAI-integrate GUI and Worker
- Build the missing wedge mask using percentile threshold of counts
Integrate1/2dResult
Those objects behave like the (2th, I, std) but in facts, they are much more ...
- Can perform some basic maths (+, -), uncertainties are propagated accordingly.
- 2D container can be rebinned in 1D containers.
- 1D container can calculate the spottiness of the initial frame (with azimuthal error-model).
Fit2dGeometry
- It becomes a case-insensitive dataclass (thus mutable, was NamedTuple) which behaves like a dict.
Deprecation
splineFile-->splinefilein most arguments and also as properties (PEP8 compliance)- Replace python2.5 style properties with @Property decorators. Deprecate former accessors where appropriate.
- Start to support type annotation in the code (proper doc-string is still mandatory).
- Prefer the
numexpr(fallback onnumpy) function evaluation in favor of theCythonpath for geometry initialization, less prone to numerical noise.
Cythonis still preferred for geometry optimization where performance is critical.
Bugs:
There are several known bugs:
- Regression in pixel-splitting methods when dealing with pixels on the boundary #2736
array_from_unit`` andchiArray` are not consistent #2589- Uncollectable objects when using PySide6 GUI (PyQt6 is OK) #2523
- pyFAI-calib2 crashes when loading the image (PyQt5 only issue. Wont'fix, please upgrade) #2422
Statistics
- Supports python 3.10-3.14, 3.14t is untested.
- 1700 commits, 577 files modified over 9 months: This is a big baby.
- List of contributors for this release: Gudrun Lotze, Loic Huder, Edgar Gutierrez-Fernandez, Harshal G and Jérôme Kieffer
New Contributors
- @harshal301002 made their first contribution in #2542
- @gudlot made their first contribution in #2565
Full Changelog: v2025.03...v2025.12
PyFAI v2025.03
- Bug fix version (Thanks to Fred Picca/Debian for testing on many architectures)
- Use automatically dynamic mask for Dectris detector data:
- Automatically recognizes and masks out bad pixel
dummyanddelta_dummyvalues are already known from the manufacturer- empty bins are no more marked with the
dummyvalue (which can be very large for Eiger) but with theemptyvalue which is fully under control of the user, 0.0 by default.
- Improve the plot generated by the benchmarking tool (Thanks to Jon)
MultiGeometryallows the mixing of different kind of detectors (Thanks ThomasK)WorkerConfigdataclass, many fixes at several places, Ewoks compatibility.Diffmapcompatiblity with binned imagesPilxuses now the dynamic mask to hide hot/defective pixels- Improvement of the
fake_calibration_imageto provide bothIminandImax - New Lambda 9M detector
- Improved support of FiberIntegrator for using the correct fiber units and key parameters
- Supports python 3.9 to 3.13. The GIL-free version on python 3.13 is untested.
- Tested by the developers on Windows (amd64), linux (amd64, arm64 and ppc64le) and MacOS (amd64 and arm64).
- A dozen of Pull-requests by Thomas Kluyver, Loic Huder, Edgar Gutierrez-Fernandez and Jérôme Kieffer
2025.01: 31/01/2025
- Refactoring of the integrator classes:
- Azimuthal integrator moved to pyFAI.integrator.azimuthal
- Most common code into pyFAI.integrator.common (including a lot of deprecated stuff)
- New sub-module dedicated to fiber/surface diffraction (pyFAI.integrator.fiber)
- Engine loading is now in pyFAI.integrator.load_engines
- Those are all (still) sub-classes of each-other but it will change in the futrure where they will need to be promoted to transfer all the geometry and enable other's class feature. For example: ai.promote("FiberIntegrator") or ai.promote("GeometryRefinement") - Refactoring of the handling of the serialization of the pyFAI-integrate GUI and pyFAI.worker.Worker into a JSON file.
- Use a dataclass defined in pyFAI.io.integration_config.WorkerConfig to manage all parameters to configure the Worker
- New format version 5, enables the handling of sigma-clip & median filtering
- Provides better compatibility with Ewoks - Median filtering for 1D filtering:
- includes quantile average
- available in Python, Cython & OpenCL
- Performances charts for sigma-clip & median filter. - New FiberIntegrator class for grazing-incidence/fiber scattering data (former fiber/gi methods in a new API)
- FiberIntegrator located in pyFAI.integrator.fiber
- Usage tutorial in doc/source/usage/tutorial/FiberGrazingIncidence.ipynb or https://www.silx.org/doc/pyFAI/dev/usage/tutorial/FiberGrazingIncidence.html
- integrate2d_grazing_incidence method to display qIP - qOOP patterns. New API with minimum inputs
- integrate1d_grazing_incidence method to perform qIP or qOOP slices. New API with minimum inputs
- Corrected equations to handle incident_angle and tilt_angle parameters
- 8 possible sample_orientation (1-8), to rotate and flip the qIP-qOOP maps (or other units)
- integrate2d_polar to represent the polar angle (arctan(qOOP/qIP)) versus the q modulus
- integrate1d_polar to integrate the polar angle map (vertical or horizontal)
- integrate2d_exitangles to reshape the diffraction pattern into horizontal and vertical exit angles, with the origin in the sample horizon
- integrate1d_exitangles to perform an integration across one of the exit angles
- Faster calculation with numexpr package formulas - New MultiGeometryFiber in pyFAI.multi_geometry
- Analog to MultiGeometry class.
- Instead of taking a list of AzimuthalIntegrators, it takes a list of FiberIntegrators
- Access to integrate1d and integrate2d grazing_incidence/fiber methods
- New tutorial of usage in doc/source/usage/tutorial/MultiGeometry/MultiGeometryFiber.ipynb` - Tool to rebin 2d-result into 1d-result (pyFAI.containers.rebin1d)
- pyFAI-diffmap-view now displays the motor position in the the map.
- Change documentation template to pydata
- Several bug-fixes & better code coverage
- Supports python 3.9 to 3.13. The GIL-free version on python 3.13 is untested.
- Tested by the developers on Windows (amd64), linux (amd64, arm64 and ppc64le) and MacOS (amd64 and arm64). Thanks to Debian for extending this matrix.
- More than 500 commits, by Thomas Vincent, Loic Huder, Edgar Gutierrez Fernandez and Jérôme Kieffer
PyFAI-2024.09
What's Changed
- New tutorials:
- On flatfield calculation from several detector position (ID31)
- On discarded pixels when using sigma-clipping (ID15a)
- New feature in pilx: the tool to view diffraction map
- Fix/unfix curves
- Colors improved
- Motor position can ge registered and displayed along axis
- Other new feature:
- Expose orientation in calib2 (excluding Nexus-detectors)
- Extra comments in PONI-file like the calibration file
- Sigma-clipping in pure cython with hybrid error-model
- New calibrant (Lysozyme for MX) & integration into calib2
- Engineering notation when printing detector
- New JSON format for integration configuration (backward compatible)
- Import CrystFEL geom-file to generate a detector + geometry
- GIWAXS and sigma-clip impose no pixel splitting
- Sigma-clipping is possible from the GUI and via config files
- Peakfinding: discard peaks with masked pixels in the local region
- New detector: Jungfrau 1M (ID09)
- Bug fixed:
- Absorption kwarg was missing in sigma-clip
- Close HDF5 files ASAP (risk of hitting the max number of file open)
- Bug in medfilt (empty ensemble)
- Several bugs fixed in worker (heavily used by ewoks)
- Correct some tutorials for typos
- Orientation of interate2d results legacy vs ng
- Compatibility with Numpy2
- Compatibility with Eiger2+Lima2 multi-threshold files
- Compatibility with GCC14, discarded some deprecated code
- Validated with Python 3.8-3.12
New Contributors
- @pierrepaleo made their first contribution in #2207
- @mjdiff made their first contribution in #2239
- @jacobfilik made their first contribution in #2243
Full Changelog: v2024.05...v2024.09
pyFAI-2024.05
- Implemented unweighted average for 2D integration
- Integration engines now handle the boolean 'weighted_average' to switch to unweighted mean, similar to legacy methods
- Implementation of pilx (pyFAI-diffmap-view command): interactive viewer for pyFAI-diffmap files (thanks Loic Huder)
- Creation of a RingExtraction class based on multi-threading (thanks Emily Massahud)
- Flat-field and dark current corrections for pyFAI-calib2
- Tunable units and integration methods for fiber/grazing-incidence scattering
- Fix several bugs related to pyFAI-diffmap GUI/no-GUI options
- Compatibility with numpy2
- Fix numerical precision issue (spotted on MacOS/arm64)
- Build system moved from
bobtocibuildwheels- Windows wheels are build with openmp disabled (?)
pyFAI-2024.02
- Include grazing-incidence capabilities + tutorial (thanks Edgar)
- Fix segmentation-fault in calib2 application #2047 (thanks Thomas & Edgar)
- Use the dynamic mask to mask-out dead pixels in Eiger images in calib2
- Extend Poisson+azimuthal uncertainties to all Cython integrators (+ non regression tests)
- Support for Python 3.7-3.12 & requires silx v2