Skip to content

Generated, not written

This page is the repository's CHANGELOG.md, included verbatim. python-semantic-release rewrites that file from the commit messages at every release, so it is never edited by hand -- and because this page includes it rather than copying it, the two cannot drift apart. Thyra follows Semantic Versioning and Conventional Commits.

CHANGELOG

v3.7.3 (2026-08-28)

Bug Fixes

  • Store non-numeric uns lists as JSON so read-back cannot segfault numpy 2.1-2.2 (ca6f2a7)

Documentation

  • Add validation workflow notebook with Open in Colab badge (8d06236)

  • Clarify local (non-Colab) runs of the validation notebook (7e623c4)

  • Floor numpy at 2.3 in notebook install to dodge string-array deepcopy segfault (ca900f5)

  • Keep Colab numpy untouched, work around numpy 2.1-2.2 StringDType deepcopy segfault in ROI cell (6f85aac)

  • Make validation notebook run end to end (349cc0d)

  • Pin pandas below 3 in notebook install to keep Colab runtime alive (177ce9a)

v3.7.2 (2026-08-26)

Bug Fixes

  • Refuse silent peak drops in _map_mass_to_indices (f062233)

v3.7.1 (2026-08-26)

Performance Improvements

  • Cut per-spectrum recompute across the conversion hot loops (edfd4d1)

v3.7.0 (2026-08-26)

Features

  • Record the resolved resampling plan in processing provenance (e7f24c0)

v3.6.0 (2026-08-26)

v3.5.1 (2026-08-26)

Bug Fixes

  • Convert imzML pixel size to micrometres using its declared unit (adeb252)

Build System

  • Sync uv.lock with the 3.5.0 version bump (9b91660)

v3.5.0 (2026-08-25)

Build System

  • Move project metadata to PEP 621 [project] table (4410adf)

  • Swap the build backend from poetry-core to hatchling (b6cb013)

  • Switch dependency management from Poetry to uv (dc14d0c)

Documentation

  • Update developer commands from poetry to uv (9694229)

Features

  • Recognize Shimadzu imaging formats (.imdx, .kbd) with imzML guidance (21b9a56)

v3.4.0 (2026-08-19)

Features

  • resampling: Recognise PHI ToF-SIMS instead of defaulting it to constant (ea21fa6)

v3.3.0 (2026-08-13)

Bug Fixes

  • converters: Stop the annotation hook pinning the CSC memmap open (6e2267d)

Documentation

  • phi: Say plainly which paths are untested, and invite the data (d70a93a)

Features

  • readers: Read PHI SmartSoft-TOF ToF-SIMS .raw data (bea94f9)

v3.2.2 (2026-08-03)

Bug Fixes

  • converters: Keep a volume's pixel footprints two-dimensional (110d5e7)

v3.2.1 (2026-08-03)

Bug Fixes

  • converters: Stop the PCS pre-scan sizing columns for spectra it skips (b8ef02a)

Documentation

  • changelog: Backfill the v3.0.0 entry the generator dropped (f831c28)

v3.2.0 (2026-08-03)

Documentation

  • output-format: Retire the "pixel shapes are still 2D" limitation (c42b7b2)

Features

  • converters: Give a volume's pixel footprints their slice depth (7317792)

v3.1.1 (2026-08-03)

Performance Improvements

  • converters: Make PCS the streaming default and drop the size threshold (291bdfd)

v3.1.0 (2026-08-03)

Bug Fixes

  • deps: Declare click, tifffile and xarray as runtime dependencies (74cb21d)

Documentation

  • tests: Record that the whole imzML corpus is 1-based in x and y (d92e2a9)

Features

  • converters: Give the 3D TIC volume a real z spacing (255c177)

v3.0.3 (2026-08-03)

Bug Fixes

  • cli: Put every --help option in a category, and keep it that way (bbc7865)

v3.0.2 (2026-08-03)

Bug Fixes

  • converters: Guard the streaming COO path against out-of-grid coordinates (2012287)

Documentation

  • handouts: Mark H's remaining item blocked, not merely open (5ac757a)

Testing

  • converters: Assert a named pixel's stored spectrum on all three write paths (#150, 3caad06)

v3.0.1 (2026-08-03)

Bug Fixes

  • converters: Store the 3D TIC volume on the axes it declares (4f0cf46)

Documentation

  • Correct six false statements and document the preview entry point (7756a4b)

  • handouts: Add the loose-ends handout and refresh the index (36ea1fe)

  • handouts: Record that the release-actor bypass does not exist (7ab456d)

  • handouts: Route the index to what is actually open (97a1928)

  • tests: Record what the local imzML corpus can and cannot exercise (fcad673)

Testing

  • Repair the integration lane's streaming-converter fixtures (6247407)

v3.0.0 (2026-08-02)

Bug Fixes

  • converters: Drop the PCS path's phantom pixel rows, and refuse depth (87f287c)

  • converters: Give the PCS store the root attrs and obs column it skipped (2c719d4)

  • imzml: Read file_mode and uuid from the file instead of by luck (d61a09f)

  • imzml: Rebase z on the file instead of clamping z-1 at zero (76c18b8)

  • metadata: Refuse a dataset with no mass range instead of inventing one (3cae48b)

  • resampling: Drop out-of-range peaks instead of folding them into edge bins (ef59115)

Breaking Changes

  • A PCS store's row indices change. Nothing migrates an existing one.

The streaming-PCS path wrote one row per grid position where the other three write one per acquired spectrum. Acquisitions are polygon-shaped and the grid is their bounding box, so the corners came out as all-zero rows. On real pea.imzML that is 17,423 rows against 12,737 spectra, 4,686 of them empty, with a shapes polygon for each phantom. All four paths now agree at 12,737.

This affects any store written by the streaming path with use_csc=True, which is chosen automatically for large datasets. Kept rows keep their grid index as instance_id, gaps and all -- only the row offsets compact. The TIC image stays full-grid, deliberately: it is a dense raster, not a per-pixel table, which is why sum(TIC) == sum(X) still holds.

Migration: reconvert. Nothing rewrites an existing store in place, and code that indexes rows positionally will read the wrong pixel. Index by instance_id rather than by row offset and the change is invisible to you.

To tell the two layouts apart on disk, count the root attrs: a store written before v3.0.0 by this path has 7, missing coordinate_systems, format_specific_metadata and msi_dataset_info (see the second commit above), and has no obs/region_number column. A v3.0.0 store has 10 and the column, on every path.

  • n_z > 1 is now refused on the streaming path rather than silently flattened. The PCS scatter indexes rows by y * n_x + x with no z term, so a multi-plane acquisition summed both planes onto one and returned success. Use the 2D or 3D converter, which the refusal message names.

  • Stored values also change, without a row-layout change, for two inputs: resampling with a narrowed mass range (--resample-min-mz / --resample-max-mz) no longer piles the discarded part of every spectrum onto the first and last bins, and a dataset from which no spectrum yields a peak is now refused instead of being given an invented (0.0, 1000.0) mass range that also sized the common axis.

v2.3.1 (2026-08-02)

Bug Fixes

  • convert: Let a reader's refusal out of the streaming size estimate (27ad37c)

  • imzml: Remember a refused imzML instead of parsing it again (8ec81c7)

  • imzml: Validate pyimzml's parser state against the .ibd (f8e7009)

Documentation

  • fixtures: State the corpus's measured compressed size (a3cb821)

  • imzml: Describe what the .ibd validator refuses (0995a12)

  • imzml: Write down the pyimzml hazards that correctly get no code (21ab15a)

Testing

  • fixtures: Add a hand-authored imzML corpus that pyimzml did not write (540efd1)

  • fixtures: Assert the structural property each hand-authored pair exists for (362c604)

  • fixtures: Guard the .gitignore negations and correct three stale notes (15d07da)

  • imzml: Invert the two-precision characterisation onto the refusal (a48ff88)

  • imzml: Resolve the .ibd in tests the way production resolves it (00a7de9)

v2.3.0 (2026-08-01)

Bug Fixes

  • converters: Stop the streaming-PCS path inventing its own provenance (09a2db7)

Features

  • imzml: Take spectrum representation explicitly, as SCiLS does (5c7aa29)

v2.2.4 (2026-08-01)

Documentation

  • resampling: Source the SCiLS claims, and stop recommending a forbidden pairing (90df8cc)

v2.2.3 (2026-08-01)

Bug Fixes

  • metadata: Read the declared spectrum representation, don't infer it (d6c080e)

v2.2.2 (2026-08-01)

Bug Fixes

  • resampling: Stop handing unknown modalities MALDI-TOF resampling (f98bc3e)

v2.2.1 (2026-08-01)

Bug Fixes

  • imzml: Parse with ElementTree so unindented CRLF files load (b9fe017)

v2.2.0 (2026-08-01)

Features

  • resampling: Give tic_preserving a gap tolerance, as Cardinal and matter have (954c95d)

v2.1.0 (2026-08-01)

Documentation

  • handouts: Record the SCiLS baseline for resampling (35fc7e7)

Features

  • readers: Default the raw mass axis cap to SCiLS's 10 million bins (93eb229)

v2.0.4 (2026-08-01)

Bug Fixes

  • resampling: Stop dropping negative bins, and correct the docs (96938e3)

v2.0.3 (2026-07-31)

Bug Fixes

  • streaming: Route on the real bin count, not a guessed one (3ad7c0a)

v2.0.2 (2026-07-31)

Bug Fixes

  • streaming: Widen CSR column indices and build the string indexes lazily (edf447a)

v2.0.1 (2026-07-31)

Bug Fixes

  • resampling: Make tic_preserving actually preserve TIC (106f15e)

Documentation

  • handouts: Mark the TIC finding as fixed (4c88657)

  • handouts: Report findings for the write-amplification investigation (6fd1798)

Performance Improvements

  • imzml: Stream the processed-mode raw mass axis build (b8562b4)

Refactoring

  • resampling: Share one TIC-preservation rule between both paths (e2a2b58)

v2.0.0 (2026-07-31)

Build System

  • Drop Python 3.11 and upgrade the spatialdata cluster (0ef2263)

Documentation

  • Correct the anndata pandas-3 fix status (d33460e)

  • Note that the anndata escape hatches work in combination on pandas 3 (54c0393)

  • Record the real anndata 0.13 prerequisites in the pin comment (951319f)

  • handouts: Refresh handout E after the #1055 rebase (87209aa)

Testing

  • Make tests a regular package so site-packages cannot shadow it (f68efee)

Breaking Changes

  • Python 3.11 is no longer supported. The minimum is now 3.12, required by spatialdata 0.8.0 and anndata 0.13.

v1.27.3 (2026-07-30)

Bug Fixes

  • ci: Mark the complexity monitor's subprocess import as reviewed (bfe811b)

Build System

  • Check out LF line endings on every platform (04879ab)

  • Make pyproject.toml the single source of truth for pydocstyle (eecabb2)

Documentation

  • handouts: Record how the toolchain-hygiene lane resolved (41d9c62)

Refactoring

  • types: Drop the two no-any-return errors from a full mypy run (f207f8d)

v1.27.2 (2026-07-30)

Bug Fixes

  • cli: Retire the --optimize-chunks pass that never ran (1d365c0)

Documentation

  • handouts: Add handout F and record the branch sweep (c62afc9)

  • handouts: Record how the optimize-chunks lane resolved (a868b41)

Testing

  • streaming: Cover the encoding attrs the PCS layout hand-writes (9786359)

v1.27.1 (2026-07-30)

Bug Fixes

  • spatialdata: Coerce pandas 3 string dtypes to object on write (86ffb1d)

Documentation

  • Add handouts for the four parallel workstreams (70be229)

  • handouts: Fold in findings from spatialdata PR #1055 (2d0851a)

v1.27.0 (2026-07-30)

Bug Fixes

  • cli: Exit non-zero when conversion fails (1584f10)

  • convert: Write through an extended-length path when the store is deep (f9c0199)

  • converters: Derive bin count from axis physics for FT-ICR and Orbitrap (20e39de)

  • converters: Reject unknown resampling method and axis type values (4840b7d)

  • converters: Retry Zarr metadata renames blocked on Windows (af19db6)

  • resampling: Align the ResamplingConfig reference_mz default with the CLI (de33301)

  • resampling: Emit Orbitrap and FT-ICR axes in ascending m/z order (40a191e)

Build System

  • Make .flake8 the single source of truth for lint settings (e144f2d)

Features

Refactoring

  • resampling: Drop the dead axis-generator width and bins methods (c6bf58d)

  • resampling: Drop the unimplemented LINEAR_INTERPOLATION method (23f8f76)

v1.26.0 (2026-07-30)

Documentation

  • Add tutorial and resampling pages, publish the example notebook (45b3680)

Features

  • tools: Add thyra-example-data synthetic dataset generator (6566a77)

v1.25.5 (2026-07-09)

Bug Fixes

  • deps: Add upper bounds so pip install lands on a working set (#102, 0210b0e)

v1.25.4 (2026-06-22)

Bug Fixes

  • streaming: Write PCS images via spatialdata and fail loudly on error (#100, 5347a76)

v1.25.3 (2026-06-22)

Bug Fixes

  • convert: Revert RAM-aware auto-streaming threshold (#98) (#99, 8474134)

v1.25.2 (2026-06-22)

Bug Fixes

  • convert: Make auto-streaming threshold RAM-aware (#98, 4e82aa3)

v1.25.1 (2026-06-22)

Bug Fixes

  • deps: Declare defusedxml as runtime dependency for Bruker reader (#97, 2bc4f86)

v1.25.0 (2026-06-12)

Bug Fixes

  • streaming: Clean up temp storage on every convert() exit path (#96, c56f0bb)

Documentation

  • Credit Nepsis Scriptorium and place logotype on docs landing (b6e629e)

  • Switch brand assets from PNG to SVG (344e152)

Features

  • spatialdata: Centralize image chunk policy as the sharding seam (foundation) (#95, 59eb93b)

v1.24.0 (2026-06-01)

v1.23.0 (2026-05-19)

Bug Fixes

  • resampling: Permissive timsTOF instrument-name match (2a200db)

Features

  • preview: Add thyra.preview_msi metadata-only shim (2d06d1f)

  • preview: Metadata-only mode for BrukerReader (skip SDK init) (8f23ef7)

Performance Improvements

  • preview: Skip SUM(NumPeaks) scan in metadata_only mode (ac3f214)

v1.22.0 (2026-05-06)

Bug Fixes

  • Align global coordinate system across image and shapes (#93, 36938e7)

Documentation

  • Document the coordinate-system contract (#93, 36938e7)

Features

  • Unified "global" coordinate-system contract for produced zarrs (#93, 36938e7)

v1.21.0 (2026-05-04)

Bug Fixes

  • Bruker region selection, pixel size, and size estimator bugs (#92, f4177d5)

  • Cast function_types dict keys to string for zarr serialization (#92, f4177d5)

  • Compute size estimator bins from real resampling axis (#92, f4177d5)

  • Drop empty pixel rows from obs when polygon != bbox (#92, f4177d5)

  • Prefer .mis Raster over BeamScanSize for pixel size (#92, f4177d5)

Features

  • Accept .mis Area Names on --region; surface mapping (#92, f4177d5)

Testing

  • Attach handler directly to module logger for log capture (#92, f4177d5)

  • Capture log via root logger to fix CI flake (#92, f4177d5)

v1.20.3 (2026-03-24)

Performance Improvements

  • Vectorise _create_coordinates_dataframe with numpy instead of Python loop (#86, 7eeaf40)

Refactoring

  • Clean up convert.py and align flake8 line length with black (#86, 7eeaf40)

  • Code quality improvements (#86, 7eeaf40)

  • Normalise resampling config to ResamplingConfig at init, remove isinstance branching (#86, 7eeaf40)

  • Remove duplicate _suppress_upstream_warnings from streaming_converter (#86, 7eeaf40)

  • Remove hardcoded path, clean up type ignores, delete dead integration test (#86, 7eeaf40)

Testing

  • Add unit tests for MSIRegistry format detection and registration (#86, 7eeaf40)

  • Clean up test suite - remove dead tests, mark integration, add unit tests (#86, 7eeaf40)

v1.20.2 (2026-03-21)

Bug Fixes

  • Compute bounding box from all points in polygon Area definitions (#85, 76741a5)

v1.20.1 (2026-03-17)

Bug Fixes

  • Iterate actual frame IDs from MaldiFrameInfo instead of assuming sequential 1..N (#83, 91642cb)

  • Pass per-region avg spectrum through COO path (#83, 91642cb)

  • Pass per-region avg spectrum through COO path data structures (#83, 91642cb)

v1.20.0 (2026-03-11)

Features

  • Store thyra_version in essential_metadata (#82, 7c309e2)

v1.19.0 (2026-03-10)

Bug Fixes

  • Extract region accumulation helpers to reduce complexity (#81, 159494e)

Features

  • Compute and store per-region mean spectrum for multi-region datasets (#81, 159494e)

  • Per-region mean spectrum for multi-region datasets (#81, 159494e)

v1.18.2 (2026-03-10)

Bug Fixes

  • Update Bruker SDK binaries to support TSF/MALDI on Linux (#80, b629c0a)

Documentation

  • Add Bruker SDK license and attribution for bundled binaries (#80, b629c0a)

v1.18.1 (2026-03-10)

Bug Fixes

  • Prevent duplicate PyPI publish on concurrent release runs (40884a6)

Documentation

  • Add prominent documentation links to top of README (b58f27b)

v1.18.0 (2026-03-10)

Bug Fixes

  • Correct changelog dates, dark mode, nav tabs, mypy version (#79, a2d662c)

  • Dark mode admonitions, navigation polish, mypy version (#79, a2d662c)

  • Docs review sweep - accuracy, mobile, and packaging fixes (#79, a2d662c)

  • Final docs sweep - version gap note, obs columns, kwargs type (#79, a2d662c)

  • Pin mkdocs <2 and change streaming default to auto (#79, a2d662c)

  • Resolve tab visibility and layout issues in docs theme (#79, a2d662c)

Code Style

  • Brand admonition colours for note, tip, info, and warning (#79, a2d662c)

  • Clean tab bar beneath gradient header (#79, a2d662c)

Documentation

  • Add MkDocs Material documentation site (#79, a2d662c)

  • Complete API reference with metadata, resampling, and registry (#79, a2d662c)

  • Comprehensive documentation overhaul (#79, a2d662c)

Features

  • Apply brand colour scheme and typography to docs (#79, a2d662c)

v1.17.2 (2026-03-10)

Bug Fixes

  • Add region_number to obs in streaming and 3D converters (3dea7ca)

v1.17.1 (2026-03-09)

Bug Fixes

  • Store region info as JSON to preserve dict structure in zarr (49d674e)

v1.17.0 (2026-03-09)

Features

  • Include area names from .mis file in region info output (2c34961)

v1.16.0 (2026-03-04)

Bug Fixes

  • Correct multi-brain optical alignment for shared TIFF slides (#78, 77fed1d)

Features

  • Interactive dataset selection, grouped CLI help, resample default (#78, 77fed1d)

  • Multi-brain alignment fix and CLI improvements (#78, 77fed1d)

v1.15.1 (2026-02-26)

Bug Fixes

  • Code quality sweep - mypy, logging, asserts, zarr consolidation (#77, fd51e6f)

v1.15.0 (2026-02-25)

Features

  • Multi-region support, optical alignment fixes, and image scaling (#76, 80c0d0b)

  • Optical alignment transforms, multi-region support, and streaming fixes (#76, 80c0d0b)

  • Optical alignment, multi-region support, and streaming fixes (#76, 80c0d0b)

Refactoring

  • Extract _resolve_imaging_bounds to reduce complexity (#76, 80c0d0b)

v1.14.1 (2026-02-18)

Bug Fixes

  • Resolve all 287 mypy type errors across codebase (#65, 899d81f)

v1.14.0 (2026-02-13)

Bug Fixes

  • ci: Fix release workflow to properly detect and publish new versions (76f9bb0)

Documentation

  • Update README with Waters .raw format support (#73, d372d3c)

Features

  • Add Waters .raw MSI reader with MassLynx native library support (#73, d372d3c)

Refactoring

  • Reduce cyclomatic complexity in main() and _scan_all_ms_spectra (#73, d372d3c)

Testing

  • Add comprehensive unit tests for Waters reader (#73, d372d3c)

v1.13.0 (2026-01-24)

Features

  • Add CLI support and tests for intensity threshold (#71, ab1dfe4)

  • Move intensity threshold filtering to reader level (#71, ab1dfe4)

  • Strategy pattern for instrument detection and continuous mode optimization (#72, 74c1f29)

v1.12.1 (2026-01-23)

Bug Fixes

  • Lower PCS threshold from 50 GB to 30 GB for memory efficiency (74f6700)

v1.12.0 (2026-01-23)

Bug Fixes

  • Support datasets with >2.1 billion non-zeros in streaming converter (f111ed8)

v1.11.1 (2026-01-23)

Bug Fixes

  • Handle ResamplingConfig dataclass in streaming converter (abb9d06)

v1.11.0 (2026-01-23)

Features

  • Add streaming parameter to convert_msi API (#70, 37c7d2d)

v1.10.0 (2026-01-23)

Bug Fixes

  • Correct release workflow YAML syntax and job dependencies (5ccf1ec)

Code Style

  • Apply black formatting to streaming converter (1432d27)

Features

  • Add streaming converter for memory-efficient large dataset conversion (55f7d42)

  • Add streaming converter for memory-efficient large dataset conversion (fd7acf5)

  • Implement no-cache CSC streaming for memory-efficient large dataset conversion (4bac2d1)

Refactoring

  • Reduce _get_mass_range_complete complexity from 13 to ~5 (94bcc95)

  • Reduce _stream_build_coo complexity from 16 to ~7 (69b5ba9)

  • Remove dead code (zero_copy parameter and _convert_with_scipy) (d6affd5)

  • Streamline streaming converter code (29a834f)

v1.9.0 (2025-12-15)

  • Initial Release