Skip to content

feat(io): per-channel/timeframe addressing, physical-spacing calibration, and Zarr v3/tiled OME-TIFF hardening - #398

Open
darkclad wants to merge 3 commits into
PolusAI:mainfrom
darkclad:main-io-reorg-2
Open

feat(io): per-channel/timeframe addressing, physical-spacing calibration, and Zarr v3/tiled OME-TIFF hardening#398
darkclad wants to merge 3 commits into
PolusAI:mainfrom
darkclad:main-io-reorg-2

Conversation

@darkclad

Copy link
Copy Markdown

Part 2 of 4 of the native OME IO series. Stacked on main-io-reorg-1.

Builds multi-dimensional addressing and physical calibration on top of the Part 1 native-read foundation, and hardens it with the fixes/edge-case coverage that came from exercising it against real fixtures:

  • Per-channel/timeframe volumetric featurization with a c_index output column
  • Opt-in physical-voxel-spacing calibration with phys_x/y/z/unit output columns
  • Tiled multi-plane OME-TIFF (z,c,t)->IFD support
  • Native OME-Zarr 0.5 (Zarr v3) reads, including zstd
  • Correctness fixes this surfaced: prescan out-of-bounds reads, CSV output overwriting itself across channels/timeframes, partial edge tiles, Zarr v3 sharding/blosc/pyramidal reads, non-canonical OME-XML TiffData plane mapping, a multi-timeframe segmented OME-TIFF crash, and an end-to-end anisotropy-rescaling check

Standalone build/test verified green (C++ gtest 833/833 + pytest tests/python/ 79 passed/1 skipped).

Demian Vladi added 3 commits July 30, 2026 12:35
…of the IO series)

Foundation branch for the main-io-reorg-* stack. Bundles oracle-vetting
promotions for the moments/GLCM/GLRLM/GLSZM/GLDM/morphology/caliper feature
families, a release-please manifest fix, and the CLAUDE.md workflow guide --
none of which are IO/OME work. Kept separate from the 4 IO PRs; should be
reviewed/merged via its own track.

Absorbed commits (oldest to newest):
73f6ca8 fix(moments): correct Hu invariant h5/h6 formulas (9x bracket, stray +eta03)
a500bd9 ci(release-please): use manifest config so 0.x breaking = minor, and pin 0.12.0
79d0974 fix(3d): compute 3ROBUST_MEAN (was hardcoded 0) + vet 18 3D first-order features
60a1ebb fix(glcm): normalize HOM2/ENTROPY by sum_p (2D+3D) + fully oracle-vet GLCM
d44dde7 test(glrlm): vet 12 2D gray-level-run joint-emphasis features vs IBSI
cb07b9d test(glrlm): vet 14 3D _AVE features vs PyRadiomics -> glrlm 100%
285bc39 docs(vetting): record the config scope of the glrlm promotions
7db4532 test(glszm): vet 6 2D gray-level-zone joint-emphasis features vs IBSI -> glszm 100%
c4bb8b1 docs(vetting): record the config scope of the glszm promotions
d213b50 test(gldm): vet 14 2D grey-level-dependence features vs IBSI -> gldm 100%
0780912 docs(vetting): record the config scope of the gldm promotions (7 are mode-invariant)
0af100b fix(3d-shape): correct mislabeled axis lengths + vet 7 morphology features
bc3e92a fix(caliper): correct Martin/Nassenstein diameters + vet 12 features vs imea
059998c test(morphology): vet Feret diameters vs imea + promote 6 features
701201b test(morphology): vet min-enclosing-circle diameter vs imea/cv2
965ab47 test(morphology): vet 8 EXTREMA coords vs matlab regionprops
992d5e6 test(morphology): promote FRACT_DIM_BOXCOUNT/PERIMETER (fraclac oracle)
a9ddc15 test(morphology): vet FRACT_DIM (fraclac) + CIRCULARITY/ROUNDNESS (analytic)
3377183 fix(caliper): float-precision hull rotation + address PR PolusAI#381 review
cc5b4de docs(caliper): correct inaccurate/stale comments (no code change)
b924f8e docs(vetting): retract unproven 3D NGLDM "ibsi" promotions; document MIRP disagreement
e301fe6 docs: add CLAUDE.md codebase and workflow guide
a548b57 docs(CLAUDE): add git workflow and tests/vetting conformance rules
466c038 docs(CLAUDE): address PR PolusAI#388 review - C++20; agentic git workflow
4235e0c docs(CLAUDE): address PR PolusAI#388 review - generalize paths, drop z5py pin, add no-local-paths rule
…lumetric reads

Step 1 of the IO project: lays the groundwork for native 5D (X,Y,Z,C,T) OME
input. Adds the OmeAxes descriptor and OME metadata parsers with unified
format detection, axis-aware tile loading (channel/timeframe), native
OME-TIFF and OME-Zarr reads honoring the file's own DimensionOrder,
ImageLoader::load_volume to assemble a whole X*Y*Z volume for the volumetric
pipeline, and wires all 3D volumetric consumers onto it. A NIfTI load_volume
equivalence guard protects the existing consumer path through the rewrite.

Absorbed commits (oldest to newest):
c916752 feat(io): OmeAxes descriptor, OME metadata parsers, unified format detection
364e802 feat(io): axis-aware loadTileFromFile (channel/timeframe) + 5D OME-Zarr addressability tests
33686dd feat(io): OME-Zarr native axis-order read via OmeAxes + rank/order/negative tests
a0d88be feat(io): OME-TIFF native read, full DimensionOrder permutations, adversarial hardening
eba3d4a feat(io): ImageLoader::load_volume - assemble whole X*Y*Z volume for the volumetric pipeline
958e1e1 test(io): NIfTI load_volume equivalence guard for the volumetric consumer rewrite
3e613cf feat(io): wire all 3D volumetric consumers onto load_volume + end-to-end consumer tests
…ion, and Zarr v3/tiled OME-TIFF hardening

Step 2 of the IO project: builds multi-dimensional addressing and physical
calibration on top of the Step 1 native-read foundation, and hardens it with
the fixes and edge-case coverage that came from exercising it against real
fixtures. Adds per-channel/timeframe volumetric featurization with a c_index
output column, opt-in physical-voxel-spacing calibration with
phys_x/y/z/unit output columns, tiled multi-plane OME-TIFF (z,c,t)->IFD
support, and native OME-Zarr 0.5 (Zarr v3) reads including zstd. The
remaining commits fix correctness issues this surfaced: prescan
out-of-bounds reads, CSV output overwriting itself across channels/
timeframes, partial edge tiles, Zarr v3 sharding/blosc/pyramidal reads,
non-canonical OME-XML TiffData plane->IFD mapping, a multi-timeframe
segmented OME-TIFF crash, and an end-to-end anisotropy-rescaling check.

Absorbed commits (oldest to newest):
4d2afda feat(io): per-channel/timeframe volumetric featurization + c_index output column
dd01c6e feat(io): opt-in physical-voxel-spacing calibration + phys_x/y/z/unit output columns
5839643 test(io): cover resolve_slide_anisotropy and out-of-range volume reads
9a24427 fix(io): reuse a single-channel mask across all intensity channels
7a19496 fix(io): pass use_physical_spacing to initialize_environment from the 3D Python classes
c06a2d7 feat(io): tiled multi-plane OME-TIFF - (z,c,t)->IFD in the tile loaders
9157d34 feat(io): read OME-Zarr 0.5 (Zarr v3), incl. zstd - via z5, no tensorstore
4df18ba fix(3d): whole-volume featurization threw "illegal call" and produced no output
2c72a85 fix(3d): prescan read out-of-bounds garbage and covered only (c0,t0)
6f3ce30 test(python): drop index/calibration columns by name in the 3D IBSI check
6267d16 fix(io): assemble volumes from the whole tile grid, and stream the prescan
4e8766a fix(io): stop CSV output from overwriting itself once per channel/timeframe
66b5d31 test(io): cover partial edge tiles in the volumetric assembly
b68bbb5 test(io): verify Zarr v3 sharding (sharding_indexed codec) reads end-to-end
3831675 fix(io): honor OME-XML <TiffData> plane->IFD mapping (non-canonical layouts)
fd81d63 test(io): cover Zarr v3 blosc and pyramidal (SubIFD) OME-TIFF reads
302a4b7 fix(io): clamp mask timeframe -- multi-timeframe segmented OME-TIFF crashed
374bbd5 test(io): positive + negative edge coverage across the OME read surfaces
2c916fe test(io): assert anisotropy actually rescales ROI geometry end-to-end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant