Skip to content

Releases: silx-kit/pyFAI

pyFAI v2026.05

19 May 14:54
@kif kif
v2026.05

Choose a tag to compare

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 handle dummy` 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

23 Mar 15:59
@kif kif
v2026.03

Choose a tag to compare

  • New features:

    • Implement renormalization of integration results (#2737)
    • Put the workerConfiguration in a scroll-area (#2779)
  • 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

27 Feb 13:10
@kif kif
v2026.02

Choose a tag to compare

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 pixel1 and pixel2 from 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

19 Dec 06:53
@kif kif
v2025.12.1

Choose a tag to compare

  • 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

12 Dec 17:09
@kif kif
v2025.12

Choose a tag to compare

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, pyFAI moves 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
  • Integrate is now able to perform fiber integration.
  • Calib2 exposes the sensor definition in detector configuration
  • Pilx is now compatible with files produced by mesh-scan on BM29 in addition to diffmap.

Median filtering

  • fix an infinite loop in the OpenCL code

Crystallography

  • Move most of the calibrant file 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_groups contain an extensive list of 230 space-groups with their extinctions for use in the Cell class

  • The Cell class 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_xrpdp method to generate 1D powder patterns with configurable resolution

  • Refactoring of the fake_image method which takes benefit of fake_xrpdp improvements

  • 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 --> splinefile in 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 on numpy) function evaluation in favor of the Cython path for geometry initialization, less prone to numerical noise.
    Cython is 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`` and chiArray` 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

Full Changelog: v2025.03...v2025.12

PyFAI v2025.03

14 Mar 08:10
@kif kif
v2025.03
a9ac3a1

Choose a tag to compare

  • 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
    • dummy and delta_dummy values are already known from the manufacturer
    • empty bins are no more marked with the dummy value (which can be very large for Eiger) but with the empty value which is fully under control of the user, 0.0 by default.
  • Improve the plot generated by the benchmarking tool (Thanks to Jon)
  • MultiGeometry allows the mixing of different kind of detectors (Thanks ThomasK)
  • WorkerConfig dataclass, many fixes at several places, Ewoks compatibility.
  • Diffmap compatiblity with binned images
  • Pilx uses now the dynamic mask to hide hot/defective pixels
  • Improvement of the fake_calibration_image to provide both Imin and Imax
  • 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

31 Jan 12:19
@kif kif
v2025.01

Choose a tag to compare

  • 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

13 Sep 07:54
@kif kif
v2024.09
1e815a2

Choose a tag to compare

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

Full Changelog: v2024.05...v2024.09

pyFAI-2024.05

21 May 17:04
@kif kif
v2024.05
dfce87a

Choose a tag to compare

  • 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 bob to cibuildwheels
    • Windows wheels are build with openmp disabled (?)

pyFAI-2024.02

01 Feb 16:43
@kif kif
v2024.02

Choose a tag to compare

  • 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