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¶
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 > 1is now refused on the streaming path rather than silently flattened. The PCS scatter indexes rows byy * n_x + xwith 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¶
- cli: Add --version
(
b19f989)
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¶
v1.25.4 (2026-06-22)¶
Bug Fixes¶
v1.25.3 (2026-06-22)¶
Bug Fixes¶
v1.25.2 (2026-06-22)¶
Bug Fixes¶
v1.25.1 (2026-06-22)¶
Bug Fixes¶
v1.25.0 (2026-06-12)¶
Bug Fixes¶
Documentation¶
-
Credit Nepsis Scriptorium and place logotype on docs landing (
b6e629e) -
Switch brand assets from PNG to SVG (
344e152)
Features¶
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¶
Documentation¶
Features¶
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¶
Testing¶
v1.20.3 (2026-03-24)¶
Performance Improvements¶
Refactoring¶
-
Clean up convert.py and align flake8 line length with black (#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¶
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¶
v1.19.0 (2026-03-10)¶
Bug Fixes¶
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¶
Documentation¶
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¶
Documentation¶
Features¶
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¶
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¶
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¶
v1.14.1 (2026-02-18)¶
Bug Fixes¶
v1.14.0 (2026-02-13)¶
Bug Fixes¶
- ci: Fix release workflow to properly detect and publish new versions
(
76f9bb0)
Documentation¶
Features¶
Refactoring¶
Testing¶
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¶
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