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¶
v4.3.4 (2026-10-05)¶
Bug Fixes¶
v4.3.3 (2026-10-01)¶
Bug Fixes¶
v4.3.2 (2026-10-01)¶
Bug Fixes¶
v4.3.1 (2026-09-30)¶
Bug Fixes¶
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 ConversionRefusedout of the reader's parser initialisation, where it raisedIndexErrorout of pyimzml's constructor.ConversionRefusedsubclassesValueError, so a caller catchingException,ValueErrororConversionRefusedgains the message and loses nothing; one catchingIndexError-- 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¶
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¶
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