fix: ensure consistent NDTiff axes ordering for indices in index file with Python writer #183
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Hi all, this PR fixes an issue in the Python
ndstoragewriter where the ordering of axes in the NDTiff index file could be inconsistent across frames. This caused downstream reading withtifffileto produce incorrect array shapes (cgohlke/tifffile#311).Importantly, this change brings the Python writer in line with Micro-Manager Java NDTiff writer, which seems to always serializes axes alphabetically to produce a consistent index key. (I am pretty sure it is here:
NDStorage/java/src/main/java/org/micromanager/ndtiffstorage/NDTiffStorage.java
Line 840 in 508491e
Problem
In the original implementation, index keys were derived from axes dictionaries by:
frozenset(used as intermediate keys)NDStorage/python/ndstorage/ndtiff_dataset.py
Line 199 in 508491e
NDStorage/python/ndstorage/ndtiff_index.py
Line 140 in 508491e
json.dumps():NDStorage/python/ndstorage/ndtiff_index.py
Line 141 in 508491e
However:
frozensetis unordered, so the order of axes is not guaranteed.Solution
This PR modifies
NDTiffIndexEntry.as_byte_buffer()to useserialize_axes(axes)for generating the index key. This ensures:tifffilecan rely on consistent axes order, preventing shape mismatches.