OME-Zarr RFC-4 — Orientation Sample Data
Sample datasets for RFC-4 (Axis Anatomical Orientation) of OME-Zarr (spec · ome/ngff#528). Validator and conformance suite: github.com/fideus-labs/ome-zarr-rfc4-validation.
RFC-4 adds one optional field to spatial axes (type: "space"):
{ "name": "x", "type": "space",
"orientation": { "type": "anatomical", "value": "left-to-right" } }
value is one of 24 controlled-vocabulary directions naming the axis's
lowest→highest coordinate direction. The field is optional per axis: an axis
with no anatomical direction is left unannotated.
Overview
- 38 cases across 9 formats: OME-Zarr, DICOM, NIfTI, NRRD, MINC, Analyze, Bruker ParaVision, Varian FDF, whole-slide imaging (Aperio SVS).
- 30 real, 8 synthetic.
- 36 valid, 2 invalid (must-reject).
- All 24 vocabulary terms are present.
palmar/dorsalappear only in the synthetic hand phantom; the other 22 appear in real data. - All 24 terms appear as written OME-Zarr
orientationmetadata; for the source-format files the orientation is derived from the native header (DICOM IOP, NIfTI affine, NRRD space directions, MINC direction cosines).
Every case is indexed in manifest.csv: test_id, format, path, category, expect, rfc4_rules, orientation, data, source, license, notes.
Download
Clone this repo (git + git-lfs) or browse the file tree above. The data is also mirrored to a public Filebase S3 bucket, readable without credentials:
# a single file over plain HTTP
curl -O https://ome-zarr-rfc4.s3.filebase.io/manifest.csv
# the whole corpus via the anonymous S3 API (endpoint https://s3.filebase.io)
s5cmd --no-sign-request --endpoint-url=https://s3.filebase.io sync 's3://ome-zarr-rfc4/*' ./data/
# or with the AWS CLI
aws --no-sign-request --endpoint-url=https://s3.filebase.io s3 sync s3://ome-zarr-rfc4 ./data
An OME-Zarr can also be read straight from the mirror — e.g.
ngff_zarr.from_ngff_zarr("https://ome-zarr-rfc4.s3.filebase.io/ome-zarr/heart_sunnybrook_apex_base.ome.zarr")
(with the ngff-zarr[remote] extra).
Contents
One folder per format at the repo root.
manifest.csv index of all 38 cases
ome-zarr/ 18 OME-Zarr volumes with RFC-4 orientation written (16 valid + 2 invalid)
dicom/ 4 synthetic HFDR/HFDL pair · axial CT · oblique CT
nifti/ 5 avg152T1 LR/RL · Canon DTI oblique/axial · qform≠sform
nrrd/ 1 MRHead.nrrd
minc/ 3 ICBM152 T1 full · z-flip · xy-flip
analyze/ 1 avg152T1.hdr/.img
bruker/ 3 PV6.0 FLASH · rat PV5.1 · human PV5.1
fdf/ 2 Varian test.fdf · synthetic HFS supine
wsi/ 1 Aperio CMU-1-Small-Region.svs
screenshots/
derived/ 3-panel L/R/A/P/S/I orientation overlays (nibabel/ITK) — 33
slicer/ 3D Slicer captures — 13
itksnap/ ITK-SNAP captures — 8
niivue/ NiiVue captures — 14
napari/ napari captures — 16
Test datasets
Orientation is listed per axis in lowest→highest coordinate order; — marks an
axis left unannotated (no applicable RFC-4 term).
OME-Zarr — orientation written in the metadata
| ID | File | Orientation | Data | License |
|---|---|---|---|---|
| TC-21 | ome-zarr/mouse_allen_quadruped.ome.zarr |
z rostral-to-caudal · y dorsal-to-ventral · x right-to-left | real | CC BY 4.0 |
| TC-39 | ome-zarr/mouse_allen_quadruped_flip.ome.zarr |
z caudal-to-rostral · y ventral-to-dorsal · x left-to-right | real | CC BY 4.0 |
| TC-22 | ome-zarr/foot_cmb_limb.ome.zarr |
z distal-to-proximal · y dorsal-to-plantar · x — | real | CC BY 4.0 |
| TC-40 | ome-zarr/foot_cmb_limb_flip.ome.zarr |
z proximal-to-distal · y plantar-to-dorsal · x — | real | CC BY 4.0 |
| TC-24 | ome-zarr/skin_janelia_superficial_deep.ome.zarr |
z superficial-to-deep · y — · x — | real | CC BY 4.0 |
| TC-41 | ome-zarr/skin_janelia_flip.ome.zarr |
z deep-to-superficial · y — · x — | real | CC BY 4.0 |
| TC-25 | ome-zarr/heart_sunnybrook_apex_base.ome.zarr |
z apex-to-base · y — · x — | real | CC0 1.0 |
| TC-42 | ome-zarr/heart_sunnybrook_flip.ome.zarr |
z base-to-apex · y — · x — | real | CC0 1.0 |
| TC-44 | ome-zarr/airway_epithelium.ome.zarr |
z apical-to-basal · y — · x — | real | CC BY 4.0 |
| TC-45 | ome-zarr/airway_epithelium_flip.ome.zarr |
z basal-to-apical · y — · x — | real | CC BY 4.0 |
| TC-46 | ome-zarr/mouse_rosenhain_wholebody.ome.zarr |
z caudal-to-cranial · y dorsal-to-ventral · x — | real | CC0 |
| TC-47 | ome-zarr/mouse_rosenhain_flip.ome.zarr |
z cranial-to-caudal · y dorsal-to-ventral · x — | real | CC0 |
| TC-49 | ome-zarr/brain_icbm_ras.ome.zarr |
z inferior-to-superior · y posterior-to-anterior · x left-to-right | real | MNI |
| TC-50 | ome-zarr/brain_icbm_ras_flip.ome.zarr |
z superior-to-inferior · y anterior-to-posterior · x right-to-left | real | MNI |
| VC-1 | ome-zarr/vocab-quad-limb.ome.zarr |
z cranial-to-caudal · y dorsal-to-palmar · x proximal-to-distal | synthetic | CC0 |
| VC-2 | ome-zarr/vocab-quad-limb-flip.ome.zarr |
z caudal-to-cranial · y palmar-to-dorsal · x distal-to-proximal | synthetic | CC0 |
Invalid (must be rejected):
| ID | File | Violation | Code |
|---|---|---|---|
| TC-C | ome-zarr/TC-C_invalid_vocabulary.ome.zarr |
LPS is not one of the 24 terms |
bad-value |
| TC-D | ome-zarr/TC-D_orientation_on_time_axis.ome.zarr |
orientation on a type: "time" axis |
orientation-on-non-space |
Source formats — orientation derived from the native header
| ID | File | Orientation | Data | License |
|---|---|---|---|---|
| TC-05 | dicom/TC-05_HFDR.dcm |
x posterior-to-anterior · y right-to-left · z inferior-to-superior | synthetic | CC0 |
| TC-06 | dicom/TC-06_HFDL.dcm |
x anterior-to-posterior · y left-to-right · z inferior-to-superior | synthetic | CC0 |
| TC-37 | dicom/real_ct_small.dcm |
x right-to-left · y anterior-to-posterior · z inferior-to-superior | real | pydicom test data |
| TC-48 | dicom/real_ct_oblique.dcm |
x right-to-left · y anterior-to-posterior · z inferior-to-superior | real | pydicom test data |
| TC-08 | nifti/avg152T1_LR_nifti.nii.gz |
i right-to-left · j posterior-to-anterior · k inferior-to-superior | real | public domain |
| TC-09 | nifti/avg152T1_RL_nifti.nii.gz |
i left-to-right · j posterior-to-anterior · k inferior-to-superior | real | public domain |
| TC-10 | nifti/TC-10_canon_DTI_oblique_20d.nii.gz |
i right-to-left · j posterior-to-anterior · k inferior-to-superior | real | BSD-2-Clause |
| TC-23 | nifti/TC-23_canon_DTI_axial.nii.gz |
i right-to-left · j posterior-to-anterior · k inferior-to-superior | real | BSD-2-Clause |
| TC-11 | nifti/TC-11_qform_sform_mismatch.nii.gz |
i right-to-left · j posterior-to-anterior · k inferior-to-superior | synthetic | CC0 |
| TC-13 | nrrd/MRHead.nrrd |
0 anterior-to-posterior · 1 superior-to-inferior · 2 left-to-right | real | donated, no restrictions |
| TC-26 | minc/mni_icbm152_t1.mnc |
xspace left-to-right · yspace posterior-to-anterior · zspace inferior-to-superior | real | MNI |
| TC-27 | minc/icbm152_t1_2mm_zflip.mnc |
xspace left-to-right · yspace posterior-to-anterior · zspace superior-to-inferior | real | MNI |
| TC-28 | minc/icbm152_t1_2mm_xyflip.mnc |
xspace right-to-left · yspace anterior-to-posterior · zspace inferior-to-superior | real | MNI |
| TC-30 | analyze/avg152T1.hdr |
i right-to-left · j posterior-to-anterior · k inferior-to-superior | real | BSD-3-Clause |
| TC-31 | bruker/PV6.0_FLASH |
read left-to-right · phase dorsal-to-ventral · slice rostral-to-caudal | real | Apache-2.0 |
| TC-34 | bruker/rat_PV5.1/9 |
read left-to-right · phase dorsal-to-ventral · slice rostral-to-caudal | real | CC BY 4.0 |
| TC-36 | bruker/human_PV5.1 |
axis0 right-to-left · axis1 superior-to-inferior · axis2 posterior-to-anterior | real | CC BY 4.0 |
| TC-32 | fdf/test.fdf |
— (no patient position; geometric orientation[] only) |
real | Apache-2.0 |
| TC-33 | fdf/synthetic_HFS_supine.fdf |
x left-to-right · y posterior-to-anterior · z inferior-to-superior | synthetic | CC0 |
| TC-38 | wsi/CMU-1-Small-Region.svs |
z superficial-to-deep · y — · x — | real | OpenSlide testdata |
Screenshots
Derived orientation overlays
Three-panel axial/coronal/sagittal views with L/R/A/P/S/I markers, rendered from
the file's own header via nibabel/ITK. One per case, 35 total in
screenshots/derived/.
A flip pair renders as mirrored markers — TC-49 above, and its exact axis-flip:
Viewers
The same files opened in four viewers.
3D Slicer — screenshots/slicer/, 13 captures (DICOM, NIfTI, NRRD, MINC, Analyze)
ITK-SNAP — screenshots/itksnap/, 8 captures
NiiVue — screenshots/niivue/, 14 captures
napari — screenshots/napari/, 16 captures (OME-Zarr, NRRD, WSI)
napari reads the OME-Zarr but does not apply the RFC-4 orientation field; its
axis labels are the axis names, not anatomical directions.
Usage
git clone https://huggingface.co/fideus-labs/ome-zarr-rfc4-data
git clone https://github.com/fideus-labs/ome-zarr-rfc4-validation
cd ome-zarr-rfc4-validation
uv sync
uv run python validate_rfc4.py --data-dir ../ome-zarr-rfc4-data
validate_rfc4.py exits 0 when every case meets the expectation recorded in
manifest.csv.
Conformance testing
conformance/run_conformance.py drives any tool's CLI against
conformance/manifest.yaml and diffs its output. The tool must read one dataset
and print this JSON to stdout:
{
"input": "<path>",
"format": "ome-zarr",
"rfc4_valid": true,
"axes": { "z": "inferior-to-superior", "y": "posterior-to-anterior", "x": "left-to-right" },
"violations": [],
"warnings": []
}
rfc4_valid is true/false for OME-Zarr, null for derived formats that
carry no OME-Zarr schema. axes maps axis name → RFC-4 value, omitting
unannotated axes. violations/warnings are code lists.
With ngff-zarr
ngff-zarr exposes this contract through
a conformance subcommand
(PR #605):
ngff-zarr conformance ome-zarr/brain_icbm_ras.ome.zarr
Drive the whole suite through it:
uv run python conformance/run_conformance.py \
--data-dir ../ome-zarr-rfc4-data \
--tool "ngff-zarr conformance {input}"
Exit code 0 means the tool matched the expected verdict on every case. The same driver runs the reference validator:
uv run python conformance/run_conformance.py \
--data-dir ../ome-zarr-rfc4-data \
--tool "python validate_rfc4.py --emit-canonical {input}"
Restrict to one format with --format ome-zarr; write a machine-readable report
with --json report.json.
Violation and warning codes
| Code | Condition | Rule |
|---|---|---|
orientation-on-non-space |
orientation on a time/channel axis |
R1 |
missing-value |
orientation object without value |
R2 |
bad-type |
orientation.type != "anatomical" |
R3 |
bad-value |
value not in the 24-term vocabulary | R4 |
duplicate-anatomical-axis |
two axes on the same antonym pair | R5 |
null-orientation (warning) |
orientation: null — SHOULD omit |
R6 |
not-roughly-aligned (warning) |
axis > 15° off the nearest anatomical axis | R8 |
Licensing & attribution
Redistributed here under CC BY 4.0 (umbrella). Per component:
| Data | License | Source |
|---|---|---|
Synthetic cases (ome-zarr/vocab-quad-limb{,_flip}, ome-zarr/TC-C,TC-D, dicom/TC-05,TC-06, nifti/TC-11, fdf/synthetic_HFS_supine) |
CC0 / generated | generated |
ome-zarr/mouse_allen_quadruped (TC-21/39) |
CC BY 4.0 | Allen Mouse Brain CCFv3 (Wang et al., Cell 2020, Allen Institute); packaged by BrainGlobe |
ome-zarr/foot_cmb_limb (TC-22/40) |
CC BY 4.0 | CMB-MEL foot CT, The Cancer Imaging Archive (TCIA) |
ome-zarr/skin_janelia_superficial_deep (TC-24/41) |
CC BY 4.0 | OpenOrganelle jrc_mus-skin-1 (HHMI Janelia); doi:10.25378/janelia.24085269 |
ome-zarr/heart_sunnybrook_apex_base (TC-25/42) |
CC0 1.0 | Sunnybrook Cardiac Data, patient SCD0000101 CINESAX (cine short-axis MRI); Cardiac Atlas Project (cardiacatlas.org) |
ome-zarr/airway_epithelium (TC-44/45) |
CC BY 4.0 | OpenOrganelle cam_hum-airway-14500, human airway epithelium FIB-SEM (CellMap / HHMI Janelia); doi:10.25378/janelia.26035168 |
ome-zarr/mouse_rosenhain_wholebody (TC-46/47) |
CC0 | Rosenhain et al. 2018, whole-body mouse micro-CT (figshare 7058615; Sci Data 5:180294), volume M10 CT280 |
ome-zarr/brain_icbm_ras{,_flip} (TC-49/50) |
MNI license (BSD-like) | ICBM152 T1 converted to OME-Zarr (RAS canonical + exact flip) |
nrrd/MRHead.nrrd (TC-13) |
donated without restrictions | 3D Slicer sample data |
nifti/avg152T1_{LR,RL} (TC-08/09) |
public domain | MNI avg152T1 (MONAI-extra-test-data) |
nifti/TC-10,TC-23 (Canon DTI) |
BSD-2-Clause | dcm_qa_canon_61 (Chris Rorden / neurolabusc); Canon 3T Galan, GHU Paris |
minc/mni_icbm152_t1 (TC-26) |
MNI license (BSD-like) | MNI ICBM152 2009c nonlinear symmetric T1 (V. Fonov / D.L. Collins, McConnell Brain Imaging Centre, MNI) |
minc/icbm152_t1_2mm_{zflip,xyflip} (TC-27/28) |
MNI license (BSD-like) | 2 mm-subsampled, axis-flipped copies of the ICBM152 T1 |
analyze/avg152T1 (TC-30) |
BSD-3-Clause | VTK test data (Testing/Data/ANALYZE.*); SPM avg152T1 |
bruker/PV6.0_FLASH (TC-31) |
Apache-2.0 | ITK test suite (Modules/IO/Bruker/test); ParaVision 6.0 FLASH QA phantom |
bruker/rat_PV5.1 (TC-34) |
CC-BY-4.0 | brkraw sample data — Sprague-Dawley rat, ParaVision 5.1 TurboRARE (anatomical scan); Center for Animal MRI, UNC Chapel Hill |
bruker/human_PV5.1 (TC-36) |
CC-BY-4.0 | Zenodo 10.5281/zenodo.18461488 — MRSI semiLASER PV5.1; includes the subject file (SUBJECT_entry=HeadFirst, SUBJECT_position=Supine) |
fdf/test.fdf (TC-32) |
Apache-2.0 | ITK test suite (Modules/IO/IOFDF/test); Varian VnmrJ mgre phantom |
fdf/synthetic_HFS_supine.fdf (TC-33) |
CC0 / generated | header schema from OpenVnmrJ FdfToDcm |
dicom/real_ct_small,real_ct_oblique (TC-37/48) |
pydicom test data | pydicom bundled CT samples; TC-37 axial identity IOP, TC-48 ~22° oblique IOP |
wsi/CMU-1-Small-Region.svs (TC-38) |
OpenSlide testdata | Aperio CMU-1 sample (OpenSlide test data) |







