Skip to content

Generated, not written

This page is the repository's CHANGELOG.md, included verbatim. The release pull request writes each new section from the commit titles, 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

4.5.0 (2026-10-15)

Features

  • converters: carry the raster origin as an "acquisition" coordinate system (schema 0.14.0) (#476) (1e98caf)
  • imzml: keep ion mobility from processed imzML (#471) (d84a250)
  • metadata: name the sample and the spectrum representation in msi_metadata (schema 0.12.0) (#469) (46064e4)
  • metadata: store a fingerprint of the mass axis (schema 0.11.0) (#461) (92e8f75), closes #444
  • mobility: store each feature's collision cross section (schema 0.13.0) (#472) (59fb0eb)
  • preview: report the TOF width law the instrument declares (#457) (eb49f9f), closes #456
  • regions: list regions and refuse the region option where it cannot apply (#466) (8cf30ac), closes #448
  • resampling: plan one mass axis for several sources (#462) (08f0ea4), closes #449
  • waters: read Synapt drift time as an ion mobility axis (#481) (16ab22d)

Bug Fixes

  • converters: average the mobility heatmap over pixels, not spectra (#455) (54e4a05)
  • converters: give each plane's table the mobility heatmap of its own plane (#460) (82fea7c)
  • converters: sum a repeated position in the sibling tables on every route (#459) (4bdf429)
  • metadata: read JSON inputs saved as UTF-16 or with a byte-order mark (#454) (c911018), closes #453
  • mobility: keep the summed table's edge samples in the heatmap, grid and MS/MS tables (#480) (d38279a)
  • readers: read mzPeak position z from a scan's parameters list (#452) (bdcd102), closes #451
  • readers: read the isolation windows of type-9 (DIA) frames (#443) (85792a0)
  • resampling: keep a planned imzML's edge samples and check plan files (#477) (a76a7ab), closes #473
  • resampling: rebin tic_preserving spectra whose bins skip source samples (#470) (0fed251), closes #442
  • resampling: refuse a bin count with a width, and half a TOF law (#458) (ba9324e), closes #445

v4.4.0 (2026-10-12)

Bug Fixes

  • converters: Centre each micrometre TIC cell on its pixel (#432, 55fd5ff)

  • metadata: Record the polarity every statement in the source agrees on (#437, be2b797)

  • readers: Test the intensity threshold on the scan-summed peak in every table (#436, 5aff4ed)

  • readers: Yield float64 arrays from the imzML reader (#438, 352c734)

Documentation

Features

  • readers: Read mzpeak-convert 0.17 archives of Bruker runs as their .d (#435, 565cb7c)

v4.3.4 (2026-10-05)

Bug Fixes

  • alignment: Place FlexImaging spots on their raster lattice (#430, f0a0144)

v4.3.3 (2026-10-01)

Bug Fixes

  • readers: Read mzPeak images by media type; record z only as stated (#426, aa5ab70)

v4.3.2 (2026-10-01)

Bug Fixes

  • readers: Convert an mzPeak archive to the store of its source (#424, e652f90)

v4.3.1 (2026-09-30)

Bug Fixes

  • readers: Leave out an mzPeak scan that has no position (#423, f9f49a9)

v4.3.0 (2026-09-30)

Bug Fixes

  • bruker: Name the calibration state a conversion applied (#414, c367dfe)

  • metadata: Do not read the area of a pixel as its size (mzPeak, imzML) (#418, 5818c56)

  • readers: Read centroid mzPeak archives from the peaks member (#417, 9a3ece3)

Features

  • converters: Write each row's acquisition order into obs (schema 0.10.0) (#415, 4ade6cb)

  • readers: Read the chunked layout of mzPeak archives (#420, b02ebbb)

Testing

  • imzml: Add five pixel size test files, one per form public files use (#419, ca6508c)

  • readers: Hold the conformance net to the registry's module table (#416, c06be13)

v4.2.0 (2026-09-28)

Features

v4.1.0 (2026-09-28)

Bug Fixes

  • bruker: Let the database's own error win over the no-raster check (ff715c0)

  • bruker: Reach the metadata of a .d that placed no frames on a raster (e1973ff)

  • cli: Make three messages say what the code does (a0e0069)

  • converters: Read the output path when the optical pixels stream (#380, 2cf0d1a)

  • metadata: Keep people and acquisition-PC folders out of a store (#399, 7b997c9)

  • metadata: Know the electrospray family and fill the resolving power (#389, 24323db)

  • metadata: Name the source in a document, locate it in a store (4cf50e6)

  • msms: Merges_precursors counts precursors, not isolation windows (#392, dea96b1)

Documentation

  • Add plain guides for formats, settings, the result and metadata (#404, 9eb9a86)

  • Correct the CLI, metadata and notebook pages against the code (7d32862)

  • Correct what the format and output pages say the code does (#407, aac49f1)

  • Name the metadata command where the other two are listed (873eba0)

  • Point the technical pages to the guides and drop their history (#409, 643a085)

  • Put a plain beginner path in front of the technical reference (#402, d9d1321)

  • Show a real ion image on the front page and in the README (#410, b613d10)

  • Stop recommending tic_preserving where it distorts intensities (#406, e550a7f)

  • converters: Record the converter decomposition as design decision D24 (#391, 71310fe)

  • design: Propose a metadata core and an imaging profile (D23) (17b2293)

Features

  • metadata: Publish the schema at a versioned address (#387, f461205)

  • metadata: State how the source's m/z values were calibrated (0.8.0) (#400, 43f443e)

  • metadata: State which optical image the raster is registered onto (0.9.0) (#405, 85ad3d3)

  • metadata: State who built the instrument and which machine it was (0.7.0) (aba4e4a)

  • metadata: Write a raw source's metadata document without converting it (0767cd2)

Performance Improvements

  • registry: Import a format's module when the format is looked up (5033e70)

Refactoring

  • converters: Lift the sibling tables into a SiblingTables collaborator (#378, 88d926a)

  • converters: One output-path accessor for both collaborators (#380, 2cf0d1a)

  • converters: The store assemblers live with the converter (#393, b610fba)

  • metadata: Move the CV constants out of the resampling package (7938999)

Testing

  • docs: Hold the beginner pages to the plain-language rules (#412, bc2636e)

  • metadata: Capture builder logs with the thyra_logs fixture, split the instrument resolution (#389, 24323db)

  • metadata: Hold every published schema version to its recorded bytes (#397, 54305a6)

v4.0.0 (2026-09-21)

Bug Fixes

  • bruker: Find optical images that are not TIFF (e7d4987)

  • converters: Close the two gaps in the Windows rename retry (a33dc51)

  • converters: Reference_element names an element, not the .mis filename (e864bed)

  • converters: Stop the converter burying its own defects in warnings (6e84fda)

  • converters: Take a declined sibling's name back out of the store (682d355)

  • converters: Tolerate a reader without the new optional method (67877be)

  • fixtures: Put the committed acquisition back when the swap fails (ed366e6)

  • imzml: Refuse a document that declares no spectra, by name (fc3df74)

  • lint: Pin mypy's platform so the gate does not depend on the runner (e3d6dc5)

  • metadata: Refuse an unconvertible pixel-size unit as a refusal (e1ac371)

  • notebooks: Choose the TIC by name, run off Colab, and stop on failure (5bd3014)

  • packaging: Ship the PEP 561 marker the classifier already promised (2113662)

  • preview: Say which shortfall sent an imzML back to the full parse (abf1771)

  • registry: Say what the lock covers, and delete what it did not (e0cb9b7)

  • resampling: PHI bins follow measured peak width, not the digitiser grid (864eff1)

  • tools: Keep the caller's path out of the generated imzML, and say what the seed fixes (3127389)

  • utils: Defer to Zarr's own rename retry once it has one (b09552c)

Build System

  • test: Declare PyYAML, which two tests import and only dask supplies (38655c5)

Documentation

  • A migration guide for 4.0.0 (e4c31c2)

  • Correct the bins-per-peak statistics; 70% under three, not 39% (afec2a1)

  • D21, the closed-form bin index, with the measurements behind it (4141785)

  • The open-time comparison was cold against warm; 1.8x, not 4x (c37f9aa)

  • Tidy wording in three handouts and a workflow comment (f68d59c)

  • Write every docstring section in the convention the repo declares (7def2f8)

  • ci: Correct six claims this branch itself made false (6b63bb3)

  • core: Give the seven spine modules a module docstring (c56790c)

  • decisions: D9 has shipped; mark it Implemented (281df1a)

  • decisions: Record that lint gates the release, and recount D18's contexts (b7b1565)

  • deps: Correct the stale click note in pyproject (695616a)

  • handouts: Drop the tool name from the two style sections (4167b19)

  • migration: Add the two v4 breaks the guide was missing (3748d60)

  • schema: Name the uns boundary, and stop hiding the dependency (229cc1c)

  • utils: Name the zarr release that carries the upstream retry (#362, 6b79635)

Features

  • converters: Say in the store where each optical image came from (896b4ef)

  • metadata: Add the normalised acquisition section to msi_metadata (0.6.0) (#370, 2eea29c)

  • optical: Crop the alignment image to the section a conversion covers (#373, ca9177d)

  • preview: Report the acquisition regions of a multi-region input (dc68ee1)

Performance Improvements

  • convert: Compare bins pairwise instead of diffing them (9a41288)

  • converters: Compute the nearest-neighbour bin index instead of searching for it (f5c095d)

  • converters: Place the sibling tables' m/z by the closed form too (af9eed2)

  • preview: Answer an imzML preview from the head of the document (a3ec990)

  • preview: Stop the mass-range scan at the first spectrum of a continuous-mode imzML (#372, 8f16d89)

Refactoring

  • convert: Annotate the front door with the types it constructs (f8590ae)

  • convert: Convert_msi owns the reader it opened (58d1582)

  • converters: Lift the optical images into an OpticalImages collaborator (a09b372)

  • core: Type the conversion state, replacing Dict[str, Any] (fb0c772)

  • metadata: Delete the two dead fields on EssentialMetadata (76d8821)

  • metadata: Lift the store's root attrs into a RootAttrsBuilder (#376, 2efcb25)

  • metadata: Lift the table uns block into an UnsAssembler (#375, e8f4da6)

  • readers: One convention for declining a capability (af13c64)

  • readers: Remove batch_size, which selected nothing (067cac6)

  • resampling: Lift what decides the mass axis into an AxisPlanner (#377, ca7618a)

  • resampling: Make the resampling strategies the operator the converter runs (#374, 67b7f2f)

  • resampling: Move the binning and interpolation operators out of the converter (1e2cc8e)

  • utils: Retire the Windows rename shim, closes #341 (#368, 52d0a52)

Testing

  • A store-identity harness for the converter decomposition (#349, 8c9ce17)

  • Read the isolated stdout before click closes it (759587f)

  • converters: Build OpticalImages without a converter (411ec38)

  • fixtures: Refuse before the build script deletes what it rebuilds (4447bfb)

  • lanes: Decide lane membership from the directory, not a decorator (6579b01)

  • logging: Move two tests PR #324 added onto the thyra_logs fixture (9d5f0bf)

  • logging: Put the dropped-image test on thyra_logs, not caplog (a861082)

  • logging: Stop one CLI test deciding what every later test can capture (f6e6a51)

  • preview: The empty-file fallback no longer pays for a parse (2e7b426)

  • readers: One conformance suite for all seven readers (45106b5)

Breaking Changes

  • imzml: An imzML whose holds no elements now raises ConversionRefused out of the reader's parser initialisation, where it raised IndexError out of pyimzml's constructor. ConversionRefused subclasses ValueError, so a caller catching Exception, ValueError or ConversionRefused gains the message and loses nothing; one catching IndexError -- which was never an outcome Thyra documented or intended -- no longer sees it.

v3.23.3 (2026-09-14)

Bug Fixes

  • bruker: Answer the three retired constructor keywords (9a09cf1)

  • bruker: Harden the shared .mis parser against entity expansion (57e733e)

  • bruker: Refuse an entity-bearing .mis out loud, naming the file (d1144ae)

  • ci: Catch user-home paths, which the lab-share guard structurally cannot (9331c33)

  • cli: Hide --format, the flag with one legal value (d56ed49)

  • deps: Import defusedxml unconditionally, drop the stdlib fallback (e8e3896)

  • deps: Let a missing spatialdata fail at import instead of degrading (c3f0c81)

  • resampling: Gate tic_preserving on the axis the conversion builds (a3e20c9)

  • resampling: Make the re-gate a module-level function, not a method (5bb9228)

  • utils: Resolve relative store paths so a fitting store cannot lose keys (fba01ed)

Documentation

  • Correct three pages that describe a tree that no longer exists (1c7e48c)

  • Name ConversionRefused in the seven Raises: blocks within reach (d53de2f)

  • Warn that a relative path can lose an array, correct the depth figure (fc4def9)

  • bruker: Say what each consumer does with the .mis refusal (d060ee0)

  • converter: Name the exception each docstring's code actually raises (0668de2)

  • converter: The two Raises: blocks this branch left saying ValueError (25d989c)

  • resampling: AxisType.UNKNOWN is not refused where the docstring said (7f44105)

  • resampling: Name ConversionRefused where the code refuses (94e13ce)

Refactoring

  • Delete the timsTOF utils package nothing has imported (bcc6ffd)

  • bruker: Parse a .mis in one place (6f37c91)

  • core: Delete the LIL-matrix pair D10 and D11 left behind (f4fe411)

  • imzml: Delete the dead _get_xml_parser defusedxml fallback (87be482)

  • resampling: Extract the re-gate so the complexity gate stays green (75fb516)

Testing

  • Assert absoluteness the way the running platform spells it (5be3334)

  • Delete two Bruker test files that execute nothing, gate the third (07ef45e)

  • registry: Pin the refusal convention on a format nobody registered (18d2642)

  • registry: This assertion is not the only holder, the same commit added another (e783927)

v3.23.2 (2026-09-09)

Bug Fixes

  • cli: Drop unusable intensities, refuse earlier, name ignored flags (bcadbf0)

  • convert: Keep bound peaks, rebase a 0-based imzML, warn on overrides (5b0655c)

  • convert: Per-table average, refuse an empty store, per-axis pitch (3b9c833)

  • convert: Sum duplicate pixels, refuse a wide axis, clean up on Ctrl-C (423da85)

  • deps: Drop the vestigial lxml declaration, close the API argument gaps (77b1096)

v3.23.1 (2026-09-08)

Bug Fixes

  • waters: Fit the raster to a lattice, and to the converted functions (1ff46ec)

v3.23.0 (2026-09-08)

Features

  • converters: Fold the in-memory converters into the streaming route (8eb9f76)

v3.22.0 (2026-09-08)

Features

  • cli: Drop --sparse-format, CSC is the only layout written (3410a58)

v3.21.1 (2026-09-08)

Bug Fixes

  • convert: Size --streaming auto from the source and the axis it writes (c0f54c7)

  • waters: Refuse an acquisition whose stage never moved (8a79d4c)

  • waters: Take the raster pitch over the intervals, not the positions (6b87d00)

Documentation

  • Refer to datasets by registry name, not by lab-share path (#221, 175f189)

  • decisions: The DESI grid premise, and what the size estimate counts (cf70c6d)

Testing

  • convert: Say why an untyped source takes the centroid branch (b02c43c)

v3.21.0 (2026-09-08)

Features

  • converters: Drop the streaming COO route, refuse csr on the one that remains (ca16090)

v3.20.0 (2026-09-07)

Documentation

  • decisions: The grid at the default axis, the cold share, and the indexed mapping (67e9ba3)

Features

  • converters: Map a frame's unique m/z once and gather by its inverse (7749ba1)

v3.19.2 (2026-09-07)

Bug Fixes

  • msms: A refusal must not call a 32-window run a single precursor (e5fedfc)

Documentation

  • decisions: A second acquired schedule, and the share census behind it (a6e6481)

Testing

  • msms: The split on real PASEF, and across schedules that differ (0422b38)

v3.19.1 (2026-09-07)

Bug Fixes

  • waters: The laser positions decide which functions hold the image (#210, 76142bc)

Documentation

  • decisions: D7 restated against the files, with what the chunking costs (#210, 76142bc)

  • decisions: Record the verified whole-image profile conversion in D7 (#210, 76142bc)

  • notebook: The explore notebook reads the sibling tables (98500ba)

v3.19.0 (2026-09-07)

Bug Fixes

  • waters: Convert the MS1 functions only and record the MS/MS ones (0dae3c1)

Documentation

  • Design decisions page, and the vendor centroid described as measured (0dae3c1)

  • Index, README, CLI, formats, output-format, metadata-schema and API (26001c6)

  • decisions: The Waters MRT profile default belongs on the record side of D1 (3aa3079)

Features

  • converters: One raw read per frame per pass serves every table (26001c6)

  • defaults: The instrument's record, the MS/MS split, and a memory guard (d33f5a0)

v3.18.0 (2026-09-07)

Features

  • waters: Expose the profile trace behind the vendor centroid (192da5e)

  • waters: MRT runs default to the profile trace on a digitiser-matched axis (62d7510)

Refactoring

  • cli: One --tof-law flag in place of --tof-a, --tof-b and --bins-per-fwhm (9e79ae8)

v3.17.1 (2026-09-07)

Bug Fixes

  • optical: Keep the old tolerance and bound while streaming TIFFs (f6c0104)

  • optical: Stream optical TIFFs into the store instead of holding them whole (e4c0117)

Refactoring

  • converters: One chunked CSC column sort for both routes (3507dd3)

v3.17.0 (2026-09-07)

Bug Fixes

  • streaming: Sort CSC columns when pixels arrive out of raster order (4c0b697)

Features

  • mobility: Build the sibling tables out of core (103353b)

v3.16.0 (2026-09-07)

Bug Fixes

  • mobility: Refuse a grid table that will not fit in memory (1c92b1b)

Features

  • mobility: Bin a TDF point cloud onto a common mobility grid (c14ccbf)

v3.15.0 (2026-09-06)

Bug Fixes

  • msms: Keep isomer precursors apart, and label features intrinsically (a7d61f5)

Documentation

  • msms: Place the demultiplexed table against the prior art (9f86963)

Features

  • msms: Split a PASEF frame into per-precursor spectra (3afca1b)

  • schema: Name the demultiplexed table in the metadata block (fce3fc8)

v3.14.0 (2026-09-06)

Features

  • msms: Record the fragmentation of an MS/MS acquisition (dc01af9)

Refactoring

  • schema: Group the instrument fields out of _build_ms_analysis (f831e1d)

v3.13.2 (2026-09-06)

Bug Fixes

  • converters: Store the mean, not the sum, as the 3D average spectrum (15dedf4)

v3.13.1 (2026-09-06)

Bug Fixes

  • metadata: Read stores through an extended-length path on Windows (ead3f68)

v3.13.0 (2026-09-05)

Features

  • mobility: TDF mobility axis, mass-mobility heatmap and CCS (471320f)

Refactoring

  • metadata: Split the ion mobility block builder below the complexity threshold (bfeba4e)

v3.12.0 (2026-09-05)

Features

  • imzml: Read the ion mobility array and write the mobility-resolved table (6e610ec)

v3.11.0 (2026-09-05)

Bug Fixes

  • bruker: Load the bundled Linux library under its shipped name (7077e71)

  • bruker: Read every TIMS scan of the right frame (76749d7)

Features

  • metadata: Record the mobility dimension and how TDF frames were summed (89070dd)

v3.10.1 (2026-09-02)

Bug Fixes

  • solarix: Open peaks.sqlite on UNC paths (21f4f3b)

v3.10.0 (2026-09-02)

Documentation

  • handouts: Add upstream handouts for spatialdata #1178 and zarr #4304 (f34a5d0)

  • handouts: Convert the remaining poetry instructions to uv (b3bbf51)

  • handouts: Replace the stale poetry commands with uv (d4f1324)

  • solarix: Record the imzML cross-validation results (ee28d33)

Features

  • readers: Native solariX .d reader via peaks.sqlite (3baa953)

v3.9.0 (2026-09-01)

Documentation

  • List mzPeak in the supported formats (b09769c)

Features

  • Experimental mzPeak reader (4bd6062)

Testing

  • Cover the mzPeak reader, extractor and imzML parity (23304e7)

v3.8.0 (2026-09-01)

Features

  • resampling: Recognise Waters, FT-ICR and exported timsTOF (7acb525)

v3.7.5 (2026-09-01)

Bug Fixes

  • Raise the zarr floor to 3.1.6 so auto-sharding cannot pick 1 KB chunks (a86a94f)

v3.7.4 (2026-08-31)

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