Version-1.30.0
Release Date : May 2026
Major Features
Quadrant Folding – Background Subtraction Overhaul
New
BackgroundSubtractionDialog: dedicated popup containing all background subtraction controls, separating them from the main QF window for a cleaner workflowNew
background_search.pyengine: automated parameter search for background subtraction with optimization cache (optimization_cache.py) to reuse best configurations across imagesManual background assignment dialog (
ManualBackgroundAssignmentDialog) for per-image overridesBackground configurations table in the dialog: stores multiple named configurations; best match is auto-selected during batch processing
Fold symmetry scoring (
fold_symmetry.py): quantitative metric for evaluating quadrant-fold quality; integrated intoQuadrantFolderprocessing and exported to CSVLayer-line mask support added to QF processing
ROI (Region of Interest) support in
QuadrantFolderwith ROI translation for headless processing“Save Cropped Image” option removed; only full-size folded images are saved
QF settings bindings (
qf_settings_bindings.py) and defaults (qf_defaults.py) centralized for consistent configuration managementCaching refactored: proper invalidation of background subtraction states; images removed from info dict to reduce cache size
Quadrant Folding – Image Alignment Detection
New
QFAlignmentDialog: non-modal dialog reusing the AISEImageAlignmentWidgetfor detecting misaligned images within a QF dataset“Detect Image Alignment” button added to
QuadrantFoldingGUI; dialog broadcasts changes back to the main window via signalFold symmetry score surfaced in the alignment table with configurable normalized threshold
Projection Traces – Fitting Performance
Analytical Jacobian fast-path for GMM fitting (
scipy.optimize.least_squares): significant speedup for cases with ≥ 10 peaksVectorised L3 batch Gaussian evaluation applied to production
layerlineModelHull-range slicing: fit arrays are cropped to the hull range before fitting, reducing unnecessary computation
ProjectionProcessorrefactored to useleast_squares(TRF) solver; Gaussian and Voigt model evaluations restructured
X-Ray Viewer – New Tools
Box Intensity Stats tool (
BoxStatsTool): multi-shot rectangular ROI tool for computing region intensity statistics; boxes are editable and numbered; accessible via a dedicated popup panelRadius tool (
RadiusTool): interactive radial selection on the imageUnit selection for calibrated distance display (nm or q-space)
Center marker overlay on the image
Tab switching dynamically repositions navigation controls
Status bar formatting and coordinate display further optimized
Quadrant-folded image detection added to
XRayViewer
Total Diffraction Intensity – Refactored
Renamed from
TotalDisplayIntensitytoTotalDiffractionIntensityacross the entire projectRebuilt UI around
ProcessingWorkspacefor consistency with other modulesRadial range selection added via
RadiusToolStatus bar enhancements
Equator – Settings Bindings
New
eq_settings_bindings.py: centralized classification and loading/saving of Equator settingsSettings are now loaded from and bound to
<dataset>/settings/calibration.info; headless path also sources calibration from the same fileNew
EQ_FittingTab: dedicated fitting settings tab extracted from the main Equator windowEquator cache size reduced: images removed from the info dict
Other Improvements
Headless:
EquatorWindowh,QuadrantFoldingh,ProjectionTraceshupdated to useSettingsManagerfor manual center and rotation; output directory validation addedCPU limiting: headless Equator batch processing can be bounded by worker count
EquatorImage: interpolation for ignored hull values; mask threshold extended to allow negative values; improved gap interpolation mechanisms
Image Blank Dialog: integrated
ImageViewerWidgetfor previewTooltips: comprehensive tooltips added across AISE, AIME, QF, PT, navigation controls, image mask tool, and center/rotation settings widgets
Cache:
ImageDatareduced in size by not storing raw images; cache relative-path fixes
Code Cleanup
TotalDisplayIntensity.pyreplaced byTotalDiffractionIntensity.pyBackground subtraction functions removed from
QuadrantFoldingGUIand centralized inBackgroundSubtractionDialogandbackground_search.py
v1.30.0-beta.2 Changes
Quadrant Folding – Batch Processing Overhaul
Batch processing rewritten to use
ProcessPoolExecutorfor true parallel execution; proxy classes handle lightweight data transfer between GUI and worker processesNew
process_one_qf_imageheadless function inmp_executor.pyfor batch-mode processing without GUI dependenciesUser-initiated stop: “Stop” button cleanly cancels in-flight tasks with an indeterminate progress dialog during wind-down; prevents retries on stopped tasks
Progress bar logic refactored to use
taskManagerstatistics as the single source of truthError handling improved: invalid images (all-zero/negative average fold) raise a
ValueErrorwith a specific GUI warningFWHM calculation fixed to handle
Nonevalues gracefully
X-Ray Viewer – ProcessingWorkspace Integration
XRayViewerGUInow usesProcessingWorkspaceinstead of rawImageNavigatorWidget, gaining consistent file management, display options, navigation, and calibration dialog handling shared with other modules
Equator Window – Initialization Refactor
Startup flow refactored: workspace signals are connected before user interaction; CSV manager and first-run processing are now triggered lazily on the first
imageDataReadysignal instead of a forcedbrowseFile()call at startupRemoved
browseFile()method and scan timer; file loading now fully delegated toProcessingWorkspace/ navigatorError handling improved:
CancelledErrorand empty error strings are treated as real errors (check for'image'key in task result instead ofnot task.error)Status bar scan indicator (
*) now derived fromfile_manager.is_scan_done()instead of a provisional flag
X-Ray Viewer – Status Bar Elision Fix
Status bar path label now uses
QSizePolicy.Ignoredhorizontal policy, eliminating a runaway feedback loop where setting elided text would grow the label’s size hint, widen the window, compute a larger available width, show more text, and grow the window againIntroduced
_statusPathFullTextcache and_elideStatusPath()method; elision is driven by aneventFilteron the path label that fires on every Qt layout resize — no manualstatusBar.width()arithmetic needed
.. note:: Version 1.30.0 is a major feature release. This version has been tested on Python 3.10 on Ubuntu 22.04.
v1.30.0-beta.3 Changes
Bug Fixes
Draw Mask: fixed draw mask tool not working in all installation environments
New cross-environment launcher (
drawmask_launcher.py): transparently handles venv, standard pip install, and PyInstaller-frozen.debpackagesImageMaskDialogandImageMaskToolnow userun_pyfai_drawmask()instead of callingpyFAI-drawmaskviaos.system()PyInstaller hooks for
pyFAIandsilxupdated to collect all resources (OpenCL kernels, Qt descriptors, calibrant tables, icons) required by drawmask at runtimeAdded
qtawesomeas a missing dependency
Improvements
Launcher – environment check: version mismatch messages clarified—warnings no longer imply a hard failure; output label changed from “Test results” to “Log excerpt”
Dependencies:
requirementsfile simplified;setup.pyis now the single source of truth for package dependencies
Total Changes: ~192 commits since v1.29.0