Version-2.0.0
Release Date : May 2026
This is a major release that consolidates all development since v1.27.5. Versions 1.28.0, 1.29.0, and 1.30.0 were beta milestones leading to this release.
New Features
Add Intensities Single Experiment (AISE) – Major Overhaul
Complete rewrite with a new, workflow-oriented UI
Built-in workflow guide dialog to walk users through the alignment and summation process
Image alignment table (
ImageAlignmentTable) with columns for center, rotation, image difference, and transform status; misaligned rows highlighted in redAuto-detection of misaligned images with configurable distance and image-difference thresholds
Per-image transform flag: apply (or skip) affine correction to individual images before summation
Auto-rotation and auto-center modes; propagate global base correction to subsequent images
Global settings dialog for managing the reference (base) image center and rotation
Blank image support applied during summation; CSV output of per-image intensity statistics
Multiprocessing support for geometry calculations; start/stop toggle on the “Sum Images” button
Center overlay visualization in the image viewer
Add Intensities Multiple Experiments (AIME) – New Module
New window for combining images across multiple experiment directories
Multiple experiment folders can be added at once (“Add Folder” / “Clear List” buttons)
Cartesian row-mapping strategy groups images by frame index across experiments
Tab-based experiment management with per-tab table views
Base name input dialog for naming output files; default base name appends
_foldedwhen source filenames containfoldedWorkflow guide dialog accessible via a “Workflow Guide” button; can be suppressed for future sessions
Quadrant Folding – Background Subtraction Overhaul
New
BackgroundSubtractionDialog: dedicated popup for all background subtraction controlsNew
background_search.pyengine: automated parameter search with optimization cache (optimization_cache.py) to reuse best configurations across imagesManual background assignment dialog (
ManualBackgroundAssignmentDialog) for per-image overridesBackground configurations table: stores multiple named configurations; best match auto-selected during batch processing
Optimization timeout feature: cap per-image search time to prevent runaway computations
Synthetic Gaussian data generation for quantitative evaluation of background subtraction quality
Full evaluation metric suite: MSE against synthetic data, equator metrics, symmetry score, and composite loss; metrics exported to
background_metrics.csvEvaluation baseline persistence: optionally fix a reference baseline across the dataset
“Optimize each image” mode: run parameter search independently per image
Layer-line mask support added to QF processing
ROI (Region of Interest) support with ROI translation for headless processing
“Save Cropped Image” option removed; only full-size folded images are saved
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
QuadrantFoldingGUIFold symmetry scoring (
fold_symmetry.py): quantitative metric exported to CSV and surfaced in the alignment table
Quadrant Folding – Batch Processing
Batch processing rewritten to use
ProcessPoolExecutorfor true parallel executionNew
process_one_qf_imageheadless function inmp_executor.pyfor GUI-free batch processingUser-initiated stop: “Stop” button cleanly cancels in-flight tasks with an indeterminate progress dialog
Progress bar logic refactored to use
taskManagerstatistics as the single source of truth
Projection Traces – Fitting Performance
Analytical Jacobian fast-path for GMM fitting (
scipy.optimize.least_squares): significant speedup for ≥ 10 peaksVectorised L3 batch Gaussian evaluation applied to production
layerlineModelHull-range slicing: fit arrays are cropped to the hull range before fitting
ProjectionProcessorrefactored to useleast_squares(TRF) solver
X-Ray Viewer – New Tools
Box Intensity Stats tool (
BoxStatsTool): multi-shot rectangular ROI tool for region intensity statistics; boxes are editable and numberedRadius tool (
RadiusTool): interactive radial selection on the imageUnit selection for calibrated distance display (nm or q-space)
Center marker overlay on the image
“Export Graph Data to Text File…” (Ctrl+Shift+E): saves current graph profile as a two-column ASCII file
XRayViewerGUIintegrated withProcessingWorkspacefor consistent file management, display options, navigation, and calibration
Total Diffraction Intensity – Refactored
Renamed from
TotalDisplayIntensitytoTotalDiffractionIntensityacross the projectRebuilt UI around
ProcessingWorkspacefor consistency with other modulesRadial range selection added via
RadiusTool
Equator – Settings Bindings
New
eq_settings_bindings.py: centralized loading/saving of Equator settingsSettings loaded from and bound to
<dataset>/settings/calibration.info; headless path uses the same fileNew
EQ_FittingTab: dedicated fitting settings tabInpainting option: fill invalid/masked pixels using pyFAI before processing
Process pool uses
spawncontext to avoid Qt fork-safety issues on Linux
Read/Write Directory Separation
New
DirectoryContextutility resolves the effective output directory at runtimeNew
AssociationStorepersists per-user input→output directory mappings in~/.musclex/directory_associations.jsonNew
OutputDirDialogwidget; “Change Output Directory” option added to all major modulesHeadless modules now validate and respect output directory settings
Architecture
New
SettingsManager: centralized, Qt-free manager for geometry, auto-geometry cache, blank/mask settingsFileManagerextended withload_from_sources()andload_from_directories()Cache file naming uses relative paths;
ImageDatano longer stores raw images to reduce cache sizeconfigparserreplaced withQSettingsfor user preferences across launcher and UI components“Fusion” style applied across all modules for consistent UI on all platforms
matplotlib backend updated from
Qt5AggtoQtAgg;canvas.draw()replaced withcanvas.draw_idle()
Startup – PySide6 Environment Check
Detects at startup if PySide6 is loaded from outside the active Python prefix
Shows a Tkinter error dialog with resolution steps; exits before crashing in C++
Bypass with
MUSCLEX_SKIP_ENV_CHECK=1
Improvements
Projection Traces – sub-pixel support: hull range inputs use
QDoubleSpinBox(0.5 step); center calculations no longer rounded to integers;center_log.csvrecords full-precision center and per-boxcenterXvaluesQF CSV:
summary.csvextended withversion,date,blank_enabled,mask_enabled,blank_weight,detector,lambda_sdd; ROI columns standardized; processing flags includedQF headless consistency:
QuadrantFoldinghapplies blank/mask preprocessing fromSettingsManager, matching GUI behaviorX-Ray Viewer – status bar: d-spacing (nm) shown instead of q-values when calibration available; distance measurements show calibrated Δq / d equivalents
X-Ray Viewer – PNG export: off-screen rendering; overlays excluded; playback returns to starting image after completion
Status bar: cursor coordinates and radial distance (r_px) shown across all modules
Display options:
gray_r(reversed grayscale) added as a colormap optionEquatorImage: interpolation for ignored hull values; mask threshold allows negative values
Headless:
EquatorWindowh,QuadrantFoldingh,ProjectionTraceshuseSettingsManagerfor center/rotation; CPU worker count limitableImage Blank Dialog: integrated
ImageViewerWidgetfor previewTooltips: added across AISE, AIME, QF, PT, navigation controls, image mask tool, and center/rotation settings widgets
Draw Mask: cross-environment launcher (
drawmask_launcher.py) handles venv, pip, and PyInstaller-frozen.deb; PyInstaller hooks forpyFAIandsilxcollect all required resourcesmacOS installer:
.dmgbuilds restored;multiprocessing.freeze_support()added for frozen appsLauncher – environment check: version mismatch messages clarified; output label changed from “Test results” to “Log excerpt”
Documentation Overhaul
All major module docs refreshed: Equator, Quadrant Folding, Projection Traces, X-Ray Viewer, Add Intensities, Scanning Diffraction, Total Diffracted Intensity
New dedicated Quadrant Folding – Background Subtraction reference page
New Common Settings page consolidating shared configuration across modules
Utilities section reorganised; DDF Processor and Convert Rectangle Image to Square Images entries added
Deprecated/outdated doc files removed
Code Cleanup
Removed deprecated
AddIntensitiesMultExp.py,AddIntensitiesExp.py,AddIntensitiesSingleExp_bak.py,CalibrationDialog.py,TotalDisplayIntensity.pyRemoved deprecated
getBlankImageAndMask/getMaskOnlyfromfile_manager.pyBackground subtraction functions removed from
QuadrantFoldingGUIand centralized inBackgroundSubtractionDialog
.. note:: Version 2.0.0 is a major release. This version has been tested on Python 3.10 on Ubuntu 22.04.
Total Changes: ~400 commits since v1.27.5