Skip to content

Releases: DataLab-Platform/Sigima

v1.1.3

02 Jun 16:24
v1.1.3
d8057ab

Choose a tag to compare

Sigima Version 1.1.3

🛠️ Bug Fixes since version 1.1.2

  • Ellipse/circle contour detection: Fixed swapped X/Y coordinates when using scikit-image ≥ 0.26.0. This closes Issue #21.
    • The new EllipseModel/CircleModel API returns center coordinates as (row, col) but the code was treating them as (x, y), causing detected ellipses and circles to appear at wrong positions on the image
    • Semi-axis lengths were also swapped for ellipses, resulting in incorrect aspect ratios
    • This bug only affected scikit-image ≥ 0.26.0; older versions were handled correctly
  • Ellipse visualization: Fixed incorrect minor axis direction in ellipse_to_diameters coordinate conversion
    • The minor axis endpoints were computed with a wrong sign, making the minor axis non-perpendicular to the major axis for rotated ellipses (e.g., at θ=45° both axes pointed in the same direction). This caused distorted ellipse overlays in DataLab when displaying detected or annotated ellipses at non-trivial rotation angles
  • Circle/ellipse detection with calibrated images: Fixed radius and semi-axes not being converted from pixel units to physical units
    • When an image had non-default pixel calibration (e.g., dx=2 mm/pixel), center coordinates were correctly converted to physical units but the radius and semi-axes remained in pixels, causing values to be wrong by a factor equal to the pixel size
  • Custom signal XY preservation: Fixed user-edited XY values being silently discarded when regenerating a custom signal from its creation parameters. generate_1d_data() now initializes the XY array only on first use and preserves user-edited contents on subsequent calls. This closes Issue #25.

🔧 Other changes since version 1.1.2

  • Debug environment variable: Renamed the test debug environment variable from DEBUG to SIGIMA_DEBUG to avoid collisions with unrelated tools and frameworks that commonly export a bare DEBUG variable. This closes Issue #19.
  • Remote control client: Added get_current_object_uuid() method to SimpleRemoteProxy and SimpleAbstractDLControl, allowing users to retrieve the UUID of the currently selected object in DataLab

🧪 Tests

  • Non-uniform image coordinates: Strengthened test coverage for images with non-uniform (irregularly spaced) X/Y coordinates, closing the remaining gaps in coordinate-mode switching, geometry operations and coordinated-text reading. This closes Issue #24.

v1.1.2

20 Apr 08:29

Choose a tag to compare

Sigima Version 1.1.2 (2026-04-20)

💥 Breaking changes since version 1.1.1

  • Removed deprecated sigima.tests.vistools module: The backward-compatibility shim introduced in version 1.1.0 has been removed
    • Update imports from from sigima.tests import vistools to from sigima import viz
    • All visualization helpers (view_curves, view_images, create_curve, create_image, etc.) remain available under their new home in sigima.viz

🛠️ Bug Fixes since version 1.1.1

  • CSV header parsing: Fixed whitespace and unit extraction issues when reading CSV column headers

    • Leading and trailing whitespace in column titles is now properly trimmed (e.g. " Padded NoUnit ""Padded NoUnit")
    • Nested parentheses in units are now correctly handled (e.g. "Signal (a.u. (norm))" → label "Signal", unit "a.u.(norm)" instead of incorrectly splitting at the last parenthesis)
    • Exotic whitespace characters (tabs, non-breaking spaces) in headers are normalized before parsing
  • Pandas 3.0 compatibility: Fixed datetime CSV parsing issue with pandas 3.0+

    • Replaced iloc assignment with column name assignment to handle dtype conversion correctly
    • Ensures compatibility with both pandas < 3.0 and pandas 3.0+ versions
    • Affected functionality: CSV file reading with datetime columns and signal data import from CSV files
    • All related tests pass after the fix
    • This closes Issue #12 - Fix pandas 3.0 compatibility issue in datetime CSV parsing
  • HDF5 serialization of TableResult: Fixed DataLab workspace save failure when table results contain enum values or callable formatters

    • Enum subclasses (e.g. SignalShape) stored in table data are now converted to plain strings before serialization, preventing dtype('<U4') errors
    • Non-serializable entries (e.g. callable column formatters) in TableResult.attrs are now sanitized before HDF5/JSON export
  • Datetime signal compatibility: Fixed datetime column handling for compatibility with various NumPy and pandas versions

    • Allowed any datetime64 resolution (not just ns) to support newer NumPy/pandas combinations
  • Signal uncertainty (dx/dy): Fixed phantom error bars displayed when only one of dx or dy was set on a fresh signal

    • When dy was set first (or dx first), the deferred uncertainty row for the other dimension was previously filled with zeros, which downstream tools interpreted as a real all-zero uncertainty array (e.g. PlotPy drew zero-width error bars)
    • Deferred rows are now initialized with NaN, so a missing uncertainty is properly reported as absent — no more spurious error bars
  • ROI extraction with uncertainty data: Fixed extract_roi and extract_rois losing the input signal's dx / dy uncertainty arrays

    • Uncertainty samples are now sliced and propagated to the extracted signal exactly like the X/Y data
    • Affects both single-ROI and multi-ROI extraction workflows
  • Zero-crossing detection: Fixed find_zero_crossings over-reporting on signals containing exact-zero samples

    • Samples exactly equal to zero used to count as two crossings (e.g. [-1, 0, 1] reported two crossings instead of one) and "touch-and-bounce" patterns like [1, 0, 1] were wrongly flagged as crossings
    • Sign changes are now detected between consecutive non-zero samples, with contiguous zero runs collapsed to a single crossing only when they actually bridge opposite signs
    • Downstream features benefit from the fix: find_x_axis_crossings, find_x_values_at_y, find_bandwidth_coordinates, and pulse FWHM / rise / fall measurements
  • Contrast computation: Fixed contrast returning inf / nan warnings on signals with negative or all-zero values

    • Denominator now uses absolute values ((max - min) / (|max| + |min|)), keeping the result bounded in [0, 1] for signals with negative samples while matching the standard Michelson contrast for non-negative signals
    • Returns nan cleanly (without a division-by-zero warning) when both max and min are zero
  • Datetime conversion accuracy: Fixed datetime64_to_seconds returning wrong Unix timestamps for coarse datetime64 resolutions

    • The previous implementation only recognized ns, us and ms and silently used a nanosecond divisor for any other resolution, producing incorrect timestamps for datetime64[s], datetime64[m], datetime64[h] or datetime64[D]
    • Inputs are now normalized to datetime64[ns] before conversion, ensuring correct results for any source resolution and for pandas DatetimeIndex objects
  • DICOM image origin and spacing: Fixed ImageObj.dicom_template falling back to inconsistent default coordinates when DICOM tags were missing

    • When ImagePositionPatient or PixelSpacing was absent from the DICOM template, only the Y origin and Y pixel spacing received the fallback while the X origin and X pixel spacing were left as bare scalars, due to operator precedence
    • Both X and Y origin (x0, y0) and pixel spacing (dx, dy) are now consistently filled with the intended (0.0, 0.0) and (1.0, 1.0) defaults

✨ Enhancements since version 1.1.1

  • Legend value formatting: Improved numeric formatting in analysis result legends

    • Short values are displayed as plain numbers, while long values use scientific notation adapted to fit within the display width
    • Pulse features table now uses adaptive scientific notation showing only the significant digits needed for exact round-trip representation
  • Table column display formats: Added per-column format control for TableResult

    • New get_column_formats() / set_column_formats() methods on TableResult
    • TableResultBuilder supports set_column_formats() for specifying format strings (e.g. {"x0": ".2e"}) or callable formatters
    • Supports "*" wildcard key as a per-table default formatter

📦 Dependencies changes since version 1.1.1

  • Pandas 3.0 support: Officially support pandas 3.0.x after validation — upper bound raised from < 3.0 to < 3.1

  • Python 3.14 support: Added Python 3.14 classifier

v1.1.1

02 Feb 15:00

Choose a tag to compare

Version 1.1

Sigima Version 1.1.1 (2026-02-02)

🛠️ Bug Fixes since version 1.1.0

  • Stub server: Added missing Web API control methods to DataLabStubServer for testing DataLab's REST API integration
    • Added start_webapi_server() stub (returns dummy URL and token)
    • Added stop_webapi_server() stub
    • Added get_webapi_status() stub (returns server status dictionary)

🔧 Other changes

  • Updated development status classifier to "Production/Stable"
  • Added "Try it Online" section with notebook.link integration in documentation

Sigima Version 1.1.0 (2026-01-31)

✨ New features and enhancements:

  • Stub server: Added missing methods to DataLabStubServer to support new DataLab features

    • Added remove_object() method (removes an object from DataLab)
    • Added call_method() method (simulates calling a method on DataLab's main interface or panels)
  • Test infrastructure: Refactored visualization code in test suite for better maintainability

    • Centralized PlotPy visualization utilities in sigima.viz module
    • Added standardized helper functions: create_curve(), create_image(), create_circle(), create_segment(), create_cursor(), create_marker(), and create_contour_shapes()
    • Updated all interactive test functions to use the new unified API instead of direct PlotPy builder calls
    • Improved code consistency across signal and image test modules
  • Visualization backend flexibility: Added support for Matplotlib as an alternative to PlotPy for test visualizations

    • New configuration option viz_backend to select visualization library ("auto", "plotpy", or "matplotlib")
    • Environment variable SIGIMA_VIZ_BACKEND can override configuration
    • Automatic fallback from PlotPy to Matplotlib when PlotPy is not available
    • Backend information exposed via sigima.viz.BACKEND_NAME and BACKEND_SOURCE
    • Matplotlib backend provides stubs for unsupported functions (raises NotImplementedError)
    • Unit test ensures API compatibility between backends
  • Jupyter notebook HTML representation: Added rich HTML display for Sigima objects in Jupyter notebooks

    • SignalObj displays shape, dtype, X/Y ranges, axis labels, and title in a formatted table
    • ImageObj displays shape, dtype, value range, origin, pixel spacing, extent, axis labels, and title
    • ROI objects (BaseSingleROI, BaseROI) display their geometric properties
    • BaseCoordinates and derived classes display point coordinates
    • TableResult and GeometryResult display result data with source object information
    • Centralized CSS styling in HTML_TABLE_CSS constant for consistent appearance

v1.1.0

01 Feb 10:06

Choose a tag to compare

Version 1.1

Sigima Version 1.1.0

✨ New features and enhancements:

  • Stub server: Added missing methods to DataLabStubServer to support new DataLab features

    • Added remove_object() method (removes an object from DataLab)
    • Added call_method() method (simulates calling a method on DataLab's main interface or panels)
  • Test infrastructure: Refactored visualization code in test suite for better maintainability

    • Centralized PlotPy visualization utilities in sigima.viz module
    • Added standardized helper functions: create_curve(), create_image(), create_circle(), create_segment(), create_cursor(), create_marker(), and create_contour_shapes()
    • Updated all interactive test functions to use the new unified API instead of direct PlotPy builder calls
    • Improved code consistency across signal and image test modules
  • Visualization backend flexibility: Added support for Matplotlib as an alternative to PlotPy for test visualizations

    • New configuration option viz_backend to select visualization library ("auto", "plotpy", or "matplotlib")
    • Environment variable SIGIMA_VIZ_BACKEND can override configuration
    • Automatic fallback from PlotPy to Matplotlib when PlotPy is not available
    • Backend information exposed via sigima.viz.BACKEND_NAME and BACKEND_SOURCE
    • Matplotlib backend provides stubs for unsupported functions (raises NotImplementedError)
    • Unit test ensures API compatibility between backends
  • Jupyter notebook HTML representation: Added rich HTML display for Sigima objects in Jupyter notebooks

    • SignalObj displays shape, dtype, X/Y ranges, axis labels, and title in a formatted table
    • ImageObj displays shape, dtype, value range, origin, pixel spacing, extent, axis labels, and title
    • ROI objects (BaseSingleROI, BaseROI) display their geometric properties
    • BaseCoordinates and derived classes display point coordinates
    • TableResult and GeometryResult display result data with source object information
    • Centralized CSS styling in HTML_TABLE_CSS constant for consistent appearance

v1.0.6

31 Jan 18:01

Choose a tag to compare

Sigima Version 1.0.6

🛠️ Bug fixes:

  • Compatibility with scikit-image 0.26.0+: Fixed deprecation warnings and API compatibility issues

    • scikit-image 0.26.0 introduced breaking changes to CircleModel and EllipseModel APIs: old API used model.estimate(contour) + model.params, new API uses model.from_estimate(contour) + property-based access (model.center, model.radius, model.axis_lengths)
    • Added version-aware compatibility layer in sigima.tools.image.preprocessing with new helper functions fit_circle_model() and fit_ellipse_model() that handle both old and new APIs
    • Updated get_contour_shapes() in sigima.tools.image.detection to use compatibility functions
    • Updated get_enclosing_circle() in sigima.tools.image.geometry to use compatibility functions
    • Used packaging.version.Version for robust version checking instead of fragile string parsing
    • Eliminates deprecation warnings while maintaining backward compatibility with Python 3.9 and scikit-image < 0.26
    • This closes Issue #10 - Sigima is not compatible with NumPy 2.4.0 and scikit-image 0.26.0
  • Compatibility with NumPy 2.4.0: Fixed centroid computation failure with NumPy 2.4.0's new einsum optimization

    • NumPy 2.4.0 introduced new einsum optimization used by scikit-image.measure.centroid() that fails with certain ndarray types
    • Fixed by explicitly converting image data to basic NumPy array before calling measure.centroid() in get_centroid_auto() function
    • Ensures compatibility with NumPy 2.4.0+ and scikit-image 0.26.0+ without changing computational results

📦 Dependencies:

  • Dependency version constraints: Added maximum version constraints to prevent future compatibility issues
    • Updated dependency specifications: NumPy >= 1.22, < 2.5, SciPy >= 1.10.1, < 1.17, scikit-image >= 0.19.2, < 0.27, pandas >= 1.4, < 3.0, PyWavelets >= 1.2, < 2.0
    • New CI job build_latest runs scheduled tests against latest dependency versions to detect breaking changes early
    • Prevents automatic breakage from major dependency updates while allowing controlled upgrades after validation

🚀 CI/CD improvements:

  • CI workflow enhancements: Added automated testing against latest dependency versions
    • New build_latest job in GitHub Actions runs on schedule (weekly) and manual dispatch
    • Extracts dependency names from pyproject.toml and installs latest available versions
    • Provides early warning system for upcoming dependency compatibility issues
    • Enhanced workflow dispatch with configurable job selection for flexible testing scenarios

v1.0.5

19 Dec 12:41
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

Sigima Version 1.0.5 (2025-12-19)

ℹ️ This is a hotfix release addressing a packaging issue where French translations were missing from the previous release package. This release contains no functional changes compared to version 1.0.4 - it only ensures that the compiled translation files (.mo) are properly included in the distribution package.

🛠️ Bug fixes:

  • Packaging: Fixed missing French translation files in release package
    • Previous release packages were missing compiled .mo translation files, causing the application to display only English text regardless of locale settings
    • Updated build process to ensure all translation files are properly included in distribution packages
    • No functional code changes - this is purely a packaging fix to restore internationalization support

Sigima Version 1.0.4 (2025-12-18)

🛠️ Bug fixes:

  • Image processing: LUT range incorrectly copied to result: Fixed processed images showing incorrect contrast because LUT range was copied from original

    • When processing an image (e.g., subtracting offset), the result image inherited the original's LUT range (zscalemin/zscalemax), causing incorrect visualization when data values changed significantly
    • Example: After subtracting ~50 lsb background from an image with LUT 50-200, the result (data range ~-5 to ~175) was still displayed with the original 50-200 LUT, making parts of the image appear clipped or invisible
    • Fixed by adding image-specific dst_1_to_1, dst_2_to_1, and dst_n_to_1 wrapper functions in sigima.proc.image.base that reset the LUT range after copying the source image
    • The ImageObj.copy() method remains unchanged (a copy should faithfully copy all attributes) - the fix is applied at the processing layer where it belongs
    • Added regression test test_image_offset_correction_lut_range in offset_correction_unit_test.py
    • This closes Issue #9 - LUT range incorrectly copied when processing images
  • Backwards-defined rectangular ROI causes NaN statistics: Fixed rectangular ROI coordinate normalization when defined in reverse direction

    • When a rectangular ROI was drawn graphically "backwards" in DataLab (from bottom-right to top-left instead of top-left to bottom-right), statistics analysis returned NaN values
    • The RectangularROI.rect_to_coords() method was producing negative Δx and Δy values when x1 < x0 or y1 < y0
    • Fixed by normalizing coordinates using min/max to ensure Δx and Δy are always positive
    • ROI mask generation now works correctly regardless of the direction in which the rectangle was drawn
    • Added regression test test_backwards_drawn_rectangle in roi_coords_unit_test.py
  • Grid ROI - Missing spacing parameters for non-uniform grids: Fixed grid ROI extraction to support non-uniform feature spacing

    • Grid ROI extraction previously assumed evenly distributed features (spacing = width/nx), which failed for images where features don't fill the entire grid area
    • Example: laser_spot_array_raw.png has laser spots spaced ~300 pixels apart, but the grid was defined over 3100×3100 pixels, causing incorrect ROI placement
    • Added xstep and ystep percentage parameters (1-200%, default 100%) to ROIGridParam to specify spacing between ROI centers
    • Updated generate_image_grid_roi() function to use separate step calculation: dx_step = dx_cell * p.xstep / 100.0
    • Position calculation now uses: x0 = src.x0 + (ic + 0.5) * dx_step + xtrans - 0.5 * dx (preserving backward compatibility)
    • Default values (100%) maintain exact original behavior for existing workflows
    • This allows precise ROI placement for gapped grids (e.g., laser spot arrays, sample arrays) by adjusting spacing independently of ROI size
  • Signal result title formatting: Fixed duplicate suffix in result titles for image-to-signal functions

    • When computing radial profile or other operations using new_signal_result, the suffix (e.g., center coordinates) was appearing twice in the title
    • Example: radial_profile(i019)|center=(192.500, 192.500)|center=(192.500, 192.500) instead of radial_profile(i019)|center=(192.500, 192.500)
    • The new_signal_result function in sigima/proc/base.py was adding the suffix twice: once via the formatter and once explicitly
    • Removed the redundant suffix addition - the formatter's format_1_to_1_title method already handles suffix formatting correctly
    • Affects functions like radial_profile, histogram, and other image-to-signal conversions
    • This closes Issue #8 - Duplicate suffix in result title when using new_signal_result
  • HDF5 serialization with detection ROIs: Fixed workspace save failure when images contain ROIs generated by blob detection

    • Saving DataLab workspace to HDF5 format failed with NotImplementedError: cannot serialize 'rectangle' of type <enum 'DetectionROIGeometry'>
    • The store_roi_creation_metadata() function was storing the DetectionROIGeometry enum directly in geometry attributes
    • Fixed by storing the enum's string value instead of the enum object itself
    • This allows proper HDF5 serialization while preserving the information needed for apply_detection_rois() to recreate ROIs
    • This closes Issue #7 - HDF5 Serialization Fails for Detection ROI Geometry Enum
  • CSV numeric data import: Fixed numeric columns being incorrectly interpreted as datetime values (Issue #6)

    • When importing CSV files with large numeric values (e.g., frequencies in Hz like 4.884e+06), the data was incorrectly converted to datetime timestamps
    • The pd.to_datetime() function was interpreting numeric values as nanoseconds since Unix epoch, corrupting the original data
    • Added check to skip columns with numeric dtypes in datetime detection - real datetime columns are loaded as string (object) dtype
    • Numeric data (frequencies, voltages, etc.) is now correctly preserved during CSV import

📚 Documentation:

  • Parameter usage documentation: Improved documentation for parameters requiring signal/image context (Issue #5)

    • Added comprehensive documentation explaining the update_from_obj() pattern for parameters like ZeroPadding1DParam
    • Clarified that sigima.params is the recommended import location for all parameter classes
    • Enhanced ZeroPadding1DParam class docstring with usage example and "Important" admonition
    • Added new section in sigima.params module listing all parameters requiring update_from_obj()
    • Created new example doc/examples/features/zero_padding.py demonstrating proper parameter initialization
  • New ROI grid example: Added example demonstrating the grid ROI feature

    • Introduced laser_spot_array.png test image (6×6 laser spot array) to help debug an issue reported in DataLab
    • Created new example doc/examples/features/roi_grid.py showcasing the generate_image_grid_roi() function
    • Example covers: loading images, extracting sub-regions, generating ROI grids, configuring size/translation/step parameters, understanding direction labels, and extracting individual spots

v1.0.4

18 Dec 17:40
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

Sigima Version 1.0.4 (2025-12-18)

🛠️ Bug fixes:

  • Image processing: LUT range incorrectly copied to result: Fixed processed images showing incorrect contrast because LUT range was copied from original

    • When processing an image (e.g., subtracting offset), the result image inherited the original's LUT range (zscalemin/zscalemax), causing incorrect visualization when data values changed significantly
    • Example: After subtracting ~50 lsb background from an image with LUT 50-200, the result (data range ~-5 to ~175) was still displayed with the original 50-200 LUT, making parts of the image appear clipped or invisible
    • Fixed by adding image-specific dst_1_to_1, dst_2_to_1, and dst_n_to_1 wrapper functions in sigima.proc.image.base that reset the LUT range after copying the source image
    • The ImageObj.copy() method remains unchanged (a copy should faithfully copy all attributes) - the fix is applied at the processing layer where it belongs
    • Added regression test test_image_offset_correction_lut_range in offset_correction_unit_test.py
    • This closes Issue #9 - LUT range incorrectly copied when processing images
  • Backwards-defined rectangular ROI causes NaN statistics: Fixed rectangular ROI coordinate normalization when defined in reverse direction

    • When a rectangular ROI was drawn graphically "backwards" in DataLab (from bottom-right to top-left instead of top-left to bottom-right), statistics analysis returned NaN values
    • The RectangularROI.rect_to_coords() method was producing negative Δx and Δy values when x1 < x0 or y1 < y0
    • Fixed by normalizing coordinates using min/max to ensure Δx and Δy are always positive
    • ROI mask generation now works correctly regardless of the direction in which the rectangle was drawn
    • Added regression test test_backwards_drawn_rectangle in roi_coords_unit_test.py
  • Grid ROI - Missing spacing parameters for non-uniform grids: Fixed grid ROI extraction to support non-uniform feature spacing

    • Grid ROI extraction previously assumed evenly distributed features (spacing = width/nx), which failed for images where features don't fill the entire grid area
    • Example: laser_spot_array_raw.png has laser spots spaced ~300 pixels apart, but the grid was defined over 3100×3100 pixels, causing incorrect ROI placement
    • Added xstep and ystep percentage parameters (1-200%, default 100%) to ROIGridParam to specify spacing between ROI centers
    • Updated generate_image_grid_roi() function to use separate step calculation: dx_step = dx_cell * p.xstep / 100.0
    • Position calculation now uses: x0 = src.x0 + (ic + 0.5) * dx_step + xtrans - 0.5 * dx (preserving backward compatibility)
    • Default values (100%) maintain exact original behavior for existing workflows
    • This allows precise ROI placement for gapped grids (e.g., laser spot arrays, sample arrays) by adjusting spacing independently of ROI size
  • Signal result title formatting: Fixed duplicate suffix in result titles for image-to-signal functions

    • When computing radial profile or other operations using new_signal_result, the suffix (e.g., center coordinates) was appearing twice in the title
    • Example: radial_profile(i019)|center=(192.500, 192.500)|center=(192.500, 192.500) instead of radial_profile(i019)|center=(192.500, 192.500)
    • The new_signal_result function in sigima/proc/base.py was adding the suffix twice: once via the formatter and once explicitly
    • Removed the redundant suffix addition - the formatter's format_1_to_1_title method already handles suffix formatting correctly
    • Affects functions like radial_profile, histogram, and other image-to-signal conversions
    • This closes Issue #8 - Duplicate suffix in result title when using new_signal_result
  • HDF5 serialization with detection ROIs: Fixed workspace save failure when images contain ROIs generated by blob detection

    • Saving DataLab workspace to HDF5 format failed with NotImplementedError: cannot serialize 'rectangle' of type <enum 'DetectionROIGeometry'>
    • The store_roi_creation_metadata() function was storing the DetectionROIGeometry enum directly in geometry attributes
    • Fixed by storing the enum's string value instead of the enum object itself
    • This allows proper HDF5 serialization while preserving the information needed for apply_detection_rois() to recreate ROIs
    • This closes Issue #7 - HDF5 Serialization Fails for Detection ROI Geometry Enum
  • CSV numeric data import: Fixed numeric columns being incorrectly interpreted as datetime values (Issue #6)

    • When importing CSV files with large numeric values (e.g., frequencies in Hz like 4.884e+06), the data was incorrectly converted to datetime timestamps
    • The pd.to_datetime() function was interpreting numeric values as nanoseconds since Unix epoch, corrupting the original data
    • Added check to skip columns with numeric dtypes in datetime detection - real datetime columns are loaded as string (object) dtype
    • Numeric data (frequencies, voltages, etc.) is now correctly preserved during CSV import

📚 Documentation:

  • Parameter usage documentation: Improved documentation for parameters requiring signal/image context (Issue #5)

    • Added comprehensive documentation explaining the update_from_obj() pattern for parameters like ZeroPadding1DParam
    • Clarified that sigima.params is the recommended import location for all parameter classes
    • Enhanced ZeroPadding1DParam class docstring with usage example and "Important" admonition
    • Added new section in sigima.params module listing all parameters requiring update_from_obj()
    • Created new example doc/examples/features/zero_padding.py demonstrating proper parameter initialization
  • New ROI grid example: Added example demonstrating the grid ROI feature

    • Introduced laser_spot_array.png test image (6×6 laser spot array) to help debug an issue reported in DataLab
    • Created new example doc/examples/features/roi_grid.py showcasing the generate_image_grid_roi() function
    • Example covers: loading images, extracting sub-regions, generating ROI grids, configuring size/translation/step parameters, understanding direction labels, and extracting individual spots

v1.0.3

03 Dec 18:04
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

Version 1.0

Sigima Version 1.0.3 (2025-12-03)

🛠️ Bug fixes:

  • Signal data type validation: Fixed integer arrays not being automatically converted to float64

    • Integer input arrays are now automatically converted to float64 instead of raising errors
    • Validation applied consistently across all signal data setters: set_xydata(), x, y, dx, dy
    • Improves usability by accepting integer inputs (common in test data and calibration values) while maintaining computational precision
    • Raises clear ValueError for truly invalid dtypes with helpful error message listing valid types
  • Signal axis calibration: Added replace_x_by_other_y() function to replace signal X coordinates with Y values from another signal

    • Addresses missing functionality for wavelength calibration and similar use cases where calibration data is stored in a separate signal's Y values
    • This operation was previously impossible, even if the ambiguous X-Y mode feature existed and seemed related to this use case (but this feature performs resampling/interpolation, which is not desired here)
    • The new function directly uses Y arrays from both signals without interpolation, requiring signals to have the same number of points
    • Takes two signals: first provides Y data for output, second provides Y data to become X coordinates
    • Automatically transfers metadata: X label/unit from second signal's Y label/unit, Y label/unit preserved from first signal
    • Typical use case: spectroscopy wavelength calibration (combine absorption measurements with wavelength scale)
    • This closes Issue #4 - Missing functionality: Replace X coordinates with Y values from another signal for calibration
  • Signal title formatting:

    • Polynomial signal titles: Fixed polynomial signal title generation to display mathematical notation (e.g., 1+2x-3x²+4x³) instead of verbose parameter listing (e.g., polynomial(a0=1,a1=2,a2=-3,a3=4,a4=0,a5=0))
    • The PolyParam.generate_title() method now constructs proper mathematical expressions with correct sign handling, coefficient simplification (e.g., x instead of 1x, -x instead of -1x), and exponent notation using ^ symbol
    • Improves readability in DataLab GUI and signal listings by presenting polynomials in standard mathematical form
    • Zero coefficients are automatically omitted from the expression (e.g., 1+x+x³ when a2=0)
    • Handles edge cases including all-zero polynomials (returns "0"), single terms, and negative coefficients
    • This closes Issue #3 - Polynomial signal titles should use mathematical notation instead of parameter listing
  • ROI data extraction:

    • Fixed ValueError: zero-size array to reduction operation minimum which has no identity error when computing statistics on images with ROI extending beyond canvas boundaries
    • The ImageObj.get_data() method now properly clips ROI bounding boxes to image boundaries
    • When a ROI is completely outside the image bounds, returns a fully masked 1x1 array (containing NaN) to avoid zero-size array errors in statistics computations
    • Partial overlap ROIs are correctly handled by clipping coordinates to valid image ranges
    • This fix ensures robust statistics computation regardless of ROI position relative to image boundaries
    • This closes Issue #1 - ValueError when computing statistics on ROI extending beyond image boundaries

Sigima Version 1.0.2 (2025-11-12)

✨ New features and enhancements:

  • New parametric image types: Added five new parametric image generation types for testing and calibration

    • Checkerboard pattern: Alternating squares for camera calibration and spatial frequency analysis. Parameters include square size, offset, and min/max values
    • Sinusoidal grating: Frequency response testing with configurable spatial frequencies (fx, fy), phase, amplitude, and DC offset
    • Ring pattern: Concentric circular rings for radial analysis. Configurable period, width, center position, and amplitude range
    • Siemens star: Resolution testing pattern with radial spokes. Parameters include number of spokes, inner/outer radius, center position, and value range
    • 2D sinc function: PSF/diffraction modeling with cardinal sine function. Configurable amplitude, center, scale factor (sigma), and DC offset
  • GeometryResult.value property: New convenience property for easy script access to computed geometry values

    • Supports POINT, MARKER, and SEGMENT shapes
    • Returns (x, y) tuple for POINT and MARKER shapes (both coordinates accessible)
    • Returns float length for SEGMENT shapes (calculated via segments_lengths())
    • Return type annotation: float | tuple[float, float]
    • Provides intuitive API: unpack coordinates with x, y = result.value or get length with length = result.value
    • Comprehensive error handling for unsupported shapes and multi-row results
  • Signal analysis functions return GeometryResult: Changed x_at_y() and y_at_x() to return geometry results for better visualization

    • x_at_y() now returns GeometryResult with MARKER kind (previously returned TableResult)
    • y_at_x() now returns GeometryResult with MARKER kind (previously returned TableResult)
    • Both functions return coordinates as [x, y] in N×2 array format for cross marker display
    • Enables proper marker visualization in DataLab GUI (displayed as cross markers on plots)
    • Script-friendly API: use .value property to easily extract coordinates as (x, y) tuple
    • Example: x, y = proxy.compute_x_at_y(params).value provides direct access to both coordinates
    • Breaking change: Scripts accessing results as tables need to update to use .value property or .coords array

🛠️ Bug fixes:

  • Detection functions:

    • Contour detection: Removed ROI creation support from ContourShapeParam as it doesn't make sense for contour detection use cases. The ContourShapeParam class no longer inherits from DetectionROIParam, and the contour_shape() function no longer calls store_roi_creation_metadata(). ROI creation remains available for other detection methods (blob detection, 2D peak detection) where it is appropriate.

    • ROI creation error handling: Enhanced error handling in create_image_roi_around_points() function to provide clearer error messages:

      • Now raises ValueError when calculated ROI size is too small (points too close together)
      • Improved error messages to help users understand the cause of failures
      • Validates ROI geometry parameter more explicitly
      • Better handling of edge cases in automatic ROI sizing
  • Public API:

    • Made BaseObj.roi_has_changed method private (by renaming to BaseObj.__roi_has_changed) to avoid accidental external usage. This would interfere with the internal mask refresh mechanism that relies on controlled access to this method. The method is not part of the public API and should not be called directly by applications.

Sigima Version 1.0.1 (2025-11-05)

✨ New features and enhancements:

  • Detection ROI creation: Generic mechanism for ROI creation across all detection functions

    • New DetectionROIParam parameter class providing standardized ROI creation fields
      • create_rois: Boolean flag to enable/disable ROI creation (default: False)
      • roi_geometry: Enum selecting ROI shape (RECTANGLE or CIRCLE, default: RECTANGLE)
    • New DetectionROIGeometry enum in sigima.enums with RECTANGLE and CIRCLE options
    • All detection parameter classes now inherit from DetectionROIParam:
      • Peak2DDetectionParam: 2D peak detection
      • ContourShapeParam: Contour shape fitting
      • BlobDOGParam, BlobDOHParam, BlobLOGParam, BlobOpenCVParam: Blob detection methods
      • HoughCircleParam: Hough circle detection
    • New store_roi_creation_metadata() helper function:
      • Stores ROI creation intent in GeometryResult.attrs dictionary
      • Called within computation functions to communicate ROI preferences
      • Does not violate function purity (no object modification)
    • New apply_detection_rois() helper function:
      • Creates ROIs on image objects based on GeometryResult.attrs metadata
      • Returns True if ROIs were created, False otherwise
      • Handles both rectangle and circle geometries
      • Automatically calculates optimal ROI size based on feature spacing
      • Can be called by applications outside computation functions
    • Metadata-based architecture maintains separation of concerns:
      • Computation functions remain pure (no side effects)
      • Applications control when/how ROIs are created
      • Works seamlessly with multiprocessing engines (e.g., DataLab processors)
    • Comprehensive test coverage with validate_detection_rois() helper in test suite
  • Automatic func_name injection for result objects

    • The @computation_function decorator now automatically injects the function name into TableResult and GeometryResult objects
    • When a computation function returns a result object with func_name=None, the decorator sets it to the function's name using dataclasses.replace()
    • Ensures systematic assignment of func_name for proper result tracking and display
    • Implementation uses direct isinstance() type checking for TableResult and GeometryResult
    • Applies to both main decorator wrapper (with DataSet parameters) and simple passthrough wrapper
    • Eliminates need for manual func_name assignment in computation functions
  • Image ROI creation utility: New create_image_roi_around_points() function in sigima.objects.image.roi

    • Creates rectangular or circular ROIs around a set of point coordinates
      *...
Read more

v1.0.2

12 Nov 16:02
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

sigima 1.0.2

💥 New features and enhancements:

  • New parametric image types: Added five new parametric image generation types for testing and calibration

    • Checkerboard pattern: Alternating squares for camera calibration and spatial frequency analysis. Parameters include square size, offset, and min/max values
    • Sinusoidal grating: Frequency response testing with configurable spatial frequencies (fx, fy), phase, amplitude, and DC offset
    • Ring pattern: Concentric circular rings for radial analysis. Configurable period, width, center position, and amplitude range
    • Siemens star: Resolution testing pattern with radial spokes. Parameters include number of spokes, inner/outer radius, center position, and value range
    • 2D sinc function: PSF/diffraction modeling with cardinal sine function. Configurable amplitude, center, scale factor (sigma), and DC offset
  • GeometryResult.value property: New convenience property for easy script access to computed geometry values

    • Supports POINT, MARKER, and SEGMENT shapes
    • Returns (x, y) tuple for POINT and MARKER shapes (both coordinates accessible)
    • Returns float length for SEGMENT shapes (calculated via segments_lengths())
    • Return type annotation: float | tuple[float, float]
    • Provides intuitive API: unpack coordinates with x, y = result.value or get length with length = result.value
    • Comprehensive error handling for unsupported shapes and multi-row results
  • Signal analysis functions return GeometryResult: Changed x_at_y() and y_at_x() to return geometry results for better visualization

    • x_at_y() now returns GeometryResult with MARKER kind (previously returned TableResult)
    • y_at_x() now returns GeometryResult with MARKER kind (previously returned TableResult)
    • Both functions return coordinates as [x, y] in N×2 array format for cross marker display
    • Enables proper marker visualization in DataLab GUI (displayed as cross markers on plots)
    • Script-friendly API: use .value property to easily extract coordinates as (x, y) tuple
    • Example: x, y = proxy.compute_x_at_y(params).value provides direct access to both coordinates
    • Breaking change: Scripts accessing results as tables need to update to use .value property or .coords array

🛠️ Bug fixes:

  • Detection functions:

    • Contour detection: Removed ROI creation support from ContourShapeParam as it doesn't make sense for contour detection use cases. The ContourShapeParam class no longer inherits from DetectionROIParam, and the contour_shape() function no longer calls store_roi_creation_metadata(). ROI creation remains available for other detection methods (blob detection, 2D peak detection) where it is appropriate.

    • ROI creation error handling: Enhanced error handling in create_image_roi_around_points() function to provide clearer error messages:

      • Now raises ValueError when calculated ROI size is too small (points too close together)
      • Improved error messages to help users understand the cause of failures
      • Validates ROI geometry parameter more explicitly
      • Better handling of edge cases in automatic ROI sizing
  • Public API:

    • Made BaseObj.roi_has_changed method private (by renaming to BaseObj.__roi_has_changed) to avoid accidental external usage. This would interfere with the internal mask refresh mechanism that relies on controlled access to this method. The method is not part of the public API and should not be called directly by applications.

sigima 1.0.1

💥 New features and enhancements:

  • Detection ROI creation: Generic mechanism for ROI creation across all detection functions

    • New DetectionROIParam parameter class providing standardized ROI creation fields
      • create_rois: Boolean flag to enable/disable ROI creation (default: False)
      • roi_geometry: Enum selecting ROI shape (RECTANGLE or CIRCLE, default: RECTANGLE)
    • New DetectionROIGeometry enum in sigima.enums with RECTANGLE and CIRCLE options
    • All detection parameter classes now inherit from DetectionROIParam:
      • Peak2DDetectionParam: 2D peak detection
      • ContourShapeParam: Contour shape fitting
      • BlobDOGParam, BlobDOHParam, BlobLOGParam, BlobOpenCVParam: Blob detection methods
      • HoughCircleParam: Hough circle detection
    • New store_roi_creation_metadata() helper function:
      • Stores ROI creation intent in GeometryResult.attrs dictionary
      • Called within computation functions to communicate ROI preferences
      • Does not violate function purity (no object modification)
    • New apply_detection_rois() helper function:
      • Creates ROIs on image objects based on GeometryResult.attrs metadata
      • Returns True if ROIs were created, False otherwise
      • Handles both rectangle and circle geometries
      • Automatically calculates optimal ROI size based on feature spacing
      • Can be called by applications outside computation functions
    • Metadata-based architecture maintains separation of concerns:
      • Computation functions remain pure (no side effects)
      • Applications control when/how ROIs are created
      • Works seamlessly with multiprocessing engines (e.g., DataLab processors)
    • Comprehensive test coverage with validate_detection_rois() helper in test suite
  • Automatic func_name injection for result objects

    • The @computation_function decorator now automatically injects the function name into TableResult and GeometryResult objects
    • When a computation function returns a result object with func_name=None, the decorator sets it to the function's name using dataclasses.replace()
    • Ensures systematic assignment of func_name for proper result tracking and display
    • Implementation uses direct isinstance() type checking for TableResult and GeometryResult
    • Applies to both main decorator wrapper (with DataSet parameters) and simple passthrough wrapper
    • Eliminates need for manual func_name assignment in computation functions
  • Image ROI creation utility: New create_image_roi_around_points() function in sigima.objects.image.roi

    • Creates rectangular or circular ROIs around a set of point coordinates
    • Automatically calculates optimal ROI size based on minimum distance between points
    • Handles boundary conditions to keep ROIs within valid image coordinates
    • Supports both "rectangle" and "circle" geometry types
    • Designed for creating ROIs around detected features (peaks, blobs, etc.)
    • Centralizes ROI creation logic previously duplicated across applications
  • Annotations API: New public API for managing annotations on Signal and Image objects

    • Added get_annotations() method: Returns a list of annotations in versioned JSON format
    • Added set_annotations(annotations) method: Sets annotations from a list (replaces existing annotations)
    • Added add_annotation(annotation) method: Adds a single annotation to the object
    • Added clear_annotations() method: Removes all annotations from the object
    • Added has_annotations() method: Returns True if the object has any annotations
    • Annotations are stored in object metadata with versioning support (currently version "1.0")
    • Each annotation is a dictionary with keys such as type, item_class, and item_json (for example)
    • Provides clean separation between generic annotation storage and visualization-specific details
    • Enables applications to manage plot annotations (shapes, labels, etc.) independently of ROIs
    • Fully compatible with DataLab's PlotPy adapter pattern for visualization

🛠️ Bug fixes:

  • 2D peak detection: Fixed architectural violation in peak_detection() computation function

    • Removed direct ROI creation from computation function (was modifying input objects)
    • Computation functions decorated with @computation_function() must be pure (no side effects)
    • Removed line 128: obj.roi = create_image_roi(...) which violated this principle
    • ROI creation now handled by applications in their presentation layer
    • DataLab uses new create_image_roi_around_points() utility for this purpose
    • Maintains separation of concerns: Sigima computes results, applications create visual representations
    • Fixes regression where ROIs were not appearing in DataLab's processor-based workflow
  • Parameter classes: Removed default titles from generic OrdinateParam and AbscissaParam classes

    • These parameter classes are reused across multiple computation functions (e.g., full_width_at_y, x_at_y)
    • Default titles like "Ordinate" created redundancy when displayed with function names in analysis results
    • Titles are now empty by default, allowing applications to provide context-specific titles when needed
    • Improves clarity when the same parameter class is used by different functions
  • Result HTML representation: Improved color contrast for dark mode

    • Changed result title color in to_html() methods from standard blue (#0000FF) to a lighter shade (#5294e2)
    • Affects TableResult and GeometryResult HTML output
    • Provides better visibility in dark mode while maintaining good appearance in light mode
    • Improves readability when results are displayed in applications with dark themes
  • Fixed pulse features extraction with ROI signals. When extracting pulse features from signals with ROIs, the start/end range parameters (which apply to the full signal) were being used on ROI-extracted data, causing incorrect results. Now extract_pulse_features() detects when the parameter ranges are outside the ROI's x-range and automatically switches to auto-detection mode. Additionally, extract_pulse_features() in sigima.tools.signal.pulse now properly initializes None ranges using get_start_range() and get_end_range() with...

Read more

v1.0.1

06 Nov 08:20
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

Release notes

The sigima library is part of the DataLab open-source platform.
See DataLab roadmap page for future and past milestones.

sigima 1.0.1

💥 New features and enhancements:

  • Detection ROI creation: Generic mechanism for ROI creation across all detection functions

    • New DetectionROIParam parameter class providing standardized ROI creation fields
      • create_rois: Boolean flag to enable/disable ROI creation (default: False)
      • roi_geometry: Enum selecting ROI shape (RECTANGLE or CIRCLE, default: RECTANGLE)
    • New DetectionROIGeometry enum in sigima.enums with RECTANGLE and CIRCLE options
    • All detection parameter classes now inherit from DetectionROIParam:
      • Peak2DDetectionParam: 2D peak detection
      • ContourShapeParam: Contour shape fitting
      • BlobDOGParam, BlobDOHParam, BlobLOGParam, BlobOpenCVParam: Blob detection methods
      • HoughCircleParam: Hough circle detection
    • New store_roi_creation_metadata() helper function:
      • Stores ROI creation intent in GeometryResult.attrs dictionary
      • Called within computation functions to communicate ROI preferences
      • Does not violate function purity (no object modification)
    • New apply_detection_rois() helper function:
      • Creates ROIs on image objects based on GeometryResult.attrs metadata
      • Returns True if ROIs were created, False otherwise
      • Handles both rectangle and circle geometries
      • Automatically calculates optimal ROI size based on feature spacing
      • Can be called by applications outside computation functions
    • Metadata-based architecture maintains separation of concerns:
      • Computation functions remain pure (no side effects)
      • Applications control when/how ROIs are created
      • Works seamlessly with multiprocessing engines (e.g., DataLab processors)
    • Comprehensive test coverage with validate_detection_rois() helper in test suite
  • Automatic func_name injection for result objects

    • The @computation_function decorator now automatically injects the function name into TableResult and GeometryResult objects
    • When a computation function returns a result object with func_name=None, the decorator sets it to the function's name using dataclasses.replace()
    • Ensures systematic assignment of func_name for proper result tracking and display
    • Implementation uses direct isinstance() type checking for TableResult and GeometryResult
    • Applies to both main decorator wrapper (with DataSet parameters) and simple passthrough wrapper
    • Eliminates need for manual func_name assignment in computation functions
  • Image ROI creation utility: New create_image_roi_around_points() function in sigima.objects.image.roi

    • Creates rectangular or circular ROIs around a set of point coordinates
    • Automatically calculates optimal ROI size based on minimum distance between points
    • Handles boundary conditions to keep ROIs within valid image coordinates
    • Supports both "rectangle" and "circle" geometry types
    • Designed for creating ROIs around detected features (peaks, blobs, etc.)
    • Centralizes ROI creation logic previously duplicated across applications
  • Annotations API: New public API for managing annotations on Signal and Image objects

    • Added get_annotations() method: Returns a list of annotations in versioned JSON format
    • Added set_annotations(annotations) method: Sets annotations from a list (replaces existing annotations)
    • Added add_annotation(annotation) method: Adds a single annotation to the object
    • Added clear_annotations() method: Removes all annotations from the object
    • Added has_annotations() method: Returns True if the object has any annotations
    • Annotations are stored in object metadata with versioning support (currently version "1.0")
    • Each annotation is a dictionary with keys such as type, item_class, and item_json (for example)
    • Provides clean separation between generic annotation storage and visualization-specific details
    • Enables applications to manage plot annotations (shapes, labels, etc.) independently of ROIs
    • Fully compatible with DataLab's PlotPy adapter pattern for visualization

🛠️ Bug fixes:

  • 2D peak detection: Fixed architectural violation in peak_detection() computation function

    • Removed direct ROI creation from computation function (was modifying input objects)
    • Computation functions decorated with @computation_function() must be pure (no side effects)
    • Removed line 128: obj.roi = create_image_roi(...) which violated this principle
    • ROI creation now handled by applications in their presentation layer
    • DataLab uses new create_image_roi_around_points() utility for this purpose
    • Maintains separation of concerns: Sigima computes results, applications create visual representations
    • Fixes regression where ROIs were not appearing in DataLab's processor-based workflow
  • Parameter classes: Removed default titles from generic OrdinateParam and AbscissaParam classes

    • These parameter classes are reused across multiple computation functions (e.g., full_width_at_y, x_at_y)
    • Default titles like "Ordinate" created redundancy when displayed with function names in analysis results
    • Titles are now empty by default, allowing applications to provide context-specific titles when needed
    • Improves clarity when the same parameter class is used by different functions
  • Result HTML representation: Improved color contrast for dark mode

    • Changed result title color in to_html() methods from standard blue (#0000FF) to a lighter shade (#5294e2)
    • Affects TableResult and GeometryResult HTML output
    • Provides better visibility in dark mode while maintaining good appearance in light mode
    • Improves readability when results are displayed in applications with dark themes
  • Fixed pulse features extraction with ROI signals. When extracting pulse features from signals with ROIs, the start/end range parameters (which apply to the full signal) were being used on ROI-extracted data, causing incorrect results. Now extract_pulse_features() detects when the parameter ranges are outside the ROI's x-range and automatically switches to auto-detection mode. Additionally, extract_pulse_features() in sigima.tools.signal.pulse now properly initializes None ranges using get_start_range() and get_end_range() with the fraction parameter. This ensures pulse features extracted from a signal with ROIs match the features extracted from individually extracted ROI signals.

  • Fixed ROI extraction for signals: ROIs are no longer incorrectly copied to destination signals when extracting ROIs. When using extract_roi() or extract_rois(), the extracted signals now have no ROI defined, which is the expected behavior since the extracted data already represents the ROI itself. This fixes the issue where extracted signals would inherit the source signal's ROI definitions.

  • Fixed pulse features computation to be ROI-exclusive when ROIs are defined. Previously, TableKind.PULSE_FEATURES incorrectly computed results for both the whole object and each ROI. This made no sense for pulse analysis, where defining ROIs indicates the presence of multiple pulses, making whole-object features irrelevant. Now PULSE_FEATURES correctly computes only on ROIs when they exist, otherwise on the whole object. TableKind.STATISTICS and TableKind.CUSTOM maintain the expected behavior (whole object + ROIs).

  • Fixed ValueError in choose_savgol_window_auto() when processing small data arrays (e.g., ROI segments). The function now properly constrains the Savitzky-Golay window length to be strictly less than the array size, as required by scipy's mode='interp' option. This fixes the issue when extracting pulse features from small ROI segments in signals.

  • Modified RadialProfileParam to allow initialization of the dataset even when the associated image object is not yet set (call to update_from_obj). This is useful when creating the parameter object before assigning the image, enabling more flexible workflows.

  • Removed unused signals_to_array() function from sigima.proc.signal.arithmetic module. This function was not used anywhere in the codebase and has been replaced by direct NumPy array construction in __signals_y_to_array() and __signals_dy_to_array() functions, for internal use only.

  • ROI coordinate setters: Fixed bugs in set_physical_coords() and set_indices_coords() methods

    • Fixed RectangularROI.set_physical_coords(): Now correctly stores coordinates in delta format [x0, y0, dx, dy] instead of corner format [x0, y0, x1, y1] when indices=True
    • Fixed BaseSingleROI.set_indices_coords(): Now correctly converts the input coords parameter instead of self.coords when indices=False
    • These methods were implemented for API completeness but were not used in the Sigima/DataLab codebase
    • Added comprehensive unit tests covering all ROI types (rectangular, circular, polygonal) and edge cases

sigima 1.0.0

💥 New features and enhancements:

  • Signals to image conversion: New feature to combine multiple signals into a 2D image
    • New computation function signals_to_image() in sigima.proc.signal.arithmetic
    • Takes a list of signals and combines them into an image by stacking Y-arrays
    • Two orientation modes:
      • Rows: Each signal becomes a row in the image (default)
      • Columns: Each signal becomes a column in the image
    • Optional normalization:
      • Supports multiple normalization methods (Z-score, Min-Max, Maximum)
      • Normalizes each signal independently before stacking
      • Useful for visualizing signals with different amplitude ranges
    • Validates that...
Read more