ngio 0.5.0b5__tar.gz → 0.5.0b7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. {ngio-0.5.0b5 → ngio-0.5.0b7}/PKG-INFO +1 -1
  2. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/common/_pyramid.py +129 -30
  3. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/common/_roi.py +1 -1
  4. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/images/_abstract_image.py +118 -50
  5. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/images/_create_synt_container.py +4 -0
  6. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/images/_create_utils.py +9 -13
  7. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/images/_image.py +9 -1
  8. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/images/_label.py +24 -22
  9. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/images/_ome_zarr_container.py +22 -4
  10. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/ome_zarr_meta/__init__.py +6 -0
  11. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/ome_zarr_meta/v04/_v04_spec.py +3 -1
  12. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/ome_zarr_meta/v05/_v05_spec.py +3 -1
  13. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/images/test_create.py +40 -2
  14. {ngio-0.5.0b5 → ngio-0.5.0b7}/.copier-answers.yml +0 -0
  15. {ngio-0.5.0b5 → ngio-0.5.0b7}/.gitattributes +0 -0
  16. {ngio-0.5.0b5 → ngio-0.5.0b7}/.github/ISSUE_TEMPLATE.md +0 -0
  17. {ngio-0.5.0b5 → ngio-0.5.0b7}/.github/TEST_FAIL_TEMPLATE.md +0 -0
  18. {ngio-0.5.0b5 → ngio-0.5.0b7}/.github/dependabot.yml +0 -0
  19. {ngio-0.5.0b5 → ngio-0.5.0b7}/.github/pull_request_template.md +0 -0
  20. {ngio-0.5.0b5 → ngio-0.5.0b7}/.github/workflows/build_docs.yml +0 -0
  21. {ngio-0.5.0b5 → ngio-0.5.0b7}/.github/workflows/ci.yml +0 -0
  22. {ngio-0.5.0b5 → ngio-0.5.0b7}/.gitignore +0 -0
  23. {ngio-0.5.0b5 → ngio-0.5.0b7}/.pre-commit-config.yaml +0 -0
  24. {ngio-0.5.0b5 → ngio-0.5.0b7}/CHANGELOG.md +0 -0
  25. {ngio-0.5.0b5 → ngio-0.5.0b7}/LICENSE +0 -0
  26. {ngio-0.5.0b5 → ngio-0.5.0b7}/README.md +0 -0
  27. {ngio-0.5.0b5 → ngio-0.5.0b7}/_typos.toml +0 -0
  28. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/api/hcs.md +0 -0
  29. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/api/images.md +0 -0
  30. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/api/iterators.md +0 -0
  31. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/api/ngio/common.md +0 -0
  32. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/api/ngio/hcs.md +0 -0
  33. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/api/ngio/images.md +0 -0
  34. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/api/ngio/io_pipes.md +0 -0
  35. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/api/ngio/iterators.md +0 -0
  36. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/api/ngio/ngio.md +0 -0
  37. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/api/ngio/tables.md +0 -0
  38. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/api/ngio/transforms.md +0 -0
  39. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/api/ngio/utils.md +0 -0
  40. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/api/ome_zarr_container.md +0 -0
  41. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/api/tables.md +0 -0
  42. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/changelog.md +0 -0
  43. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/code_of_conduct.md +0 -0
  44. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/contributing.md +0 -0
  45. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/getting_started/0_quickstart.md +0 -0
  46. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/getting_started/1_ome_zarr_containers.md +0 -0
  47. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/getting_started/2_images.md +0 -0
  48. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/getting_started/3_tables.md +0 -0
  49. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/getting_started/4_masked_images.md +0 -0
  50. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/getting_started/5_hcs.md +0 -0
  51. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/getting_started/6_iterators.md +0 -0
  52. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/index.md +0 -0
  53. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/table_specs/backend.md +0 -0
  54. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/table_specs/overview.md +0 -0
  55. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/table_specs/table_types/condition_table.md +0 -0
  56. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/table_specs/table_types/custom_table.md +0 -0
  57. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/table_specs/table_types/feature_table.md +0 -0
  58. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/table_specs/table_types/generic_table.md +0 -0
  59. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/table_specs/table_types/masking_roi_table.md +0 -0
  60. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/table_specs/table_types/roi_table.md +0 -0
  61. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/tutorials/create_ome_zarr.ipynb +0 -0
  62. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/tutorials/feature_extraction.ipynb +0 -0
  63. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/tutorials/hcs_exploration.ipynb +0 -0
  64. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/tutorials/image_processing.ipynb +0 -0
  65. {ngio-0.5.0b5 → ngio-0.5.0b7}/docs/tutorials/image_segmentation.ipynb +0 -0
  66. {ngio-0.5.0b5 → ngio-0.5.0b7}/mkdocs.yml +0 -0
  67. {ngio-0.5.0b5 → ngio-0.5.0b7}/pyproject.toml +0 -0
  68. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/__init__.py +0 -0
  69. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/common/__init__.py +0 -0
  70. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/common/_dimensions.py +0 -0
  71. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/common/_masking_roi.py +0 -0
  72. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/common/_synt_images_utils.py +0 -0
  73. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/common/_zoom.py +0 -0
  74. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/experimental/__init__.py +0 -0
  75. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/experimental/iterators/__init__.py +0 -0
  76. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/experimental/iterators/_abstract_iterator.py +0 -0
  77. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/experimental/iterators/_feature.py +0 -0
  78. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/experimental/iterators/_image_processing.py +0 -0
  79. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/experimental/iterators/_mappers.py +0 -0
  80. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/experimental/iterators/_rois_utils.py +0 -0
  81. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/experimental/iterators/_segmentation.py +0 -0
  82. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/hcs/__init__.py +0 -0
  83. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/hcs/_plate.py +0 -0
  84. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/images/__init__.py +0 -0
  85. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/images/_masked_image.py +0 -0
  86. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/images/_table_ops.py +0 -0
  87. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/io_pipes/__init__.py +0 -0
  88. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/io_pipes/_io_pipes.py +0 -0
  89. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/io_pipes/_io_pipes_masked.py +0 -0
  90. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/io_pipes/_io_pipes_roi.py +0 -0
  91. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/io_pipes/_io_pipes_types.py +0 -0
  92. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/io_pipes/_match_shape.py +0 -0
  93. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/io_pipes/_ops_axes.py +0 -0
  94. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/io_pipes/_ops_slices.py +0 -0
  95. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/io_pipes/_ops_slices_utils.py +0 -0
  96. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/io_pipes/_ops_transforms.py +0 -0
  97. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/io_pipes/_zoom_transform.py +0 -0
  98. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/ome_zarr_meta/_meta_handlers.py +0 -0
  99. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/ome_zarr_meta/ngio_specs/__init__.py +0 -0
  100. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/ome_zarr_meta/ngio_specs/_axes.py +0 -0
  101. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/ome_zarr_meta/ngio_specs/_channels.py +0 -0
  102. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/ome_zarr_meta/ngio_specs/_dataset.py +0 -0
  103. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/ome_zarr_meta/ngio_specs/_ngio_hcs.py +0 -0
  104. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/ome_zarr_meta/ngio_specs/_ngio_image.py +0 -0
  105. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/ome_zarr_meta/ngio_specs/_pixel_size.py +0 -0
  106. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/ome_zarr_meta/v04/__init__.py +0 -0
  107. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/ome_zarr_meta/v04/_custom_models.py +0 -0
  108. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/ome_zarr_meta/v05/__init__.py +0 -0
  109. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/ome_zarr_meta/v05/_custom_models.py +0 -0
  110. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/mask.png +0 -0
  111. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/nuclei.png +0 -0
  112. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/raw.jpg +0 -0
  113. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/resources/__init__.py +0 -0
  114. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/resources/resource_model.py +0 -0
  115. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/__init__.py +0 -0
  116. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/_abstract_table.py +0 -0
  117. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/_tables_container.py +0 -0
  118. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/backends/__init__.py +0 -0
  119. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/backends/_abstract_backend.py +0 -0
  120. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/backends/_anndata.py +0 -0
  121. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/backends/_anndata_utils.py +0 -0
  122. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/backends/_csv.py +0 -0
  123. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/backends/_json.py +0 -0
  124. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/backends/_parquet.py +0 -0
  125. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/backends/_py_arrow_backends.py +0 -0
  126. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/backends/_table_backends.py +0 -0
  127. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/backends/_utils.py +0 -0
  128. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/v1/__init__.py +0 -0
  129. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/v1/_condition_table.py +0 -0
  130. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/v1/_feature_table.py +0 -0
  131. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/v1/_generic_table.py +0 -0
  132. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/tables/v1/_roi_table.py +0 -0
  133. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/transforms/__init__.py +0 -0
  134. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/transforms/_zoom.py +0 -0
  135. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/utils/__init__.py +0 -0
  136. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/utils/_cache.py +0 -0
  137. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/utils/_datasets.py +0 -0
  138. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/utils/_errors.py +0 -0
  139. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/utils/_fractal_fsspec_store.py +0 -0
  140. {ngio-0.5.0b5 → ngio-0.5.0b7}/src/ngio/utils/_zarr_utils.py +0 -0
  141. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/conftest.py +0 -0
  142. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/create_test_data.py +0 -0
  143. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/.zattrs +0 -0
  144. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/.zgroup +0 -0
  145. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/0/.zarray +0 -0
  146. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/0/.zattrs +0 -0
  147. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/1/.zarray +0 -0
  148. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/1/.zattrs +0 -0
  149. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/labels/.zattrs +0 -0
  150. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/labels/.zgroup +0 -0
  151. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/labels/label/.zattrs +0 -0
  152. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/labels/label/.zgroup +0 -0
  153. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/labels/label/0/.zarray +0 -0
  154. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/labels/label/0/.zattrs +0 -0
  155. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/labels/label/1/.zarray +0 -0
  156. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/labels/label/1/.zattrs +0 -0
  157. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/tables/.zattrs +0 -0
  158. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/tables/.zgroup +0 -0
  159. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/tables/well_ROI_table/.zattrs +0 -0
  160. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/tables/well_ROI_table/.zgroup +0 -0
  161. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_c1yx.zarr/tables/well_ROI_table/table.csv +0 -0
  162. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/.zattrs +0 -0
  163. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/.zgroup +0 -0
  164. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/0/.zarray +0 -0
  165. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/0/.zattrs +0 -0
  166. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/1/.zarray +0 -0
  167. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/1/.zattrs +0 -0
  168. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/labels/.zattrs +0 -0
  169. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/labels/.zgroup +0 -0
  170. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/labels/label/.zattrs +0 -0
  171. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/labels/label/.zgroup +0 -0
  172. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/labels/label/0/.zarray +0 -0
  173. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/labels/label/0/.zattrs +0 -0
  174. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/labels/label/1/.zarray +0 -0
  175. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/labels/label/1/.zattrs +0 -0
  176. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/tables/.zattrs +0 -0
  177. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/tables/.zgroup +0 -0
  178. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/tables/well_ROI_table/.zattrs +0 -0
  179. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/tables/well_ROI_table/.zgroup +0 -0
  180. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_cyx.zarr/tables/well_ROI_table/table.csv +0 -0
  181. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/.zattrs +0 -0
  182. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/.zgroup +0 -0
  183. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/0/.zarray +0 -0
  184. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/0/.zattrs +0 -0
  185. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/1/.zarray +0 -0
  186. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/1/.zattrs +0 -0
  187. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/labels/.zattrs +0 -0
  188. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/labels/.zgroup +0 -0
  189. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/labels/label/.zattrs +0 -0
  190. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/labels/label/.zgroup +0 -0
  191. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/labels/label/0/.zarray +0 -0
  192. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/labels/label/0/.zattrs +0 -0
  193. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/labels/label/1/.zarray +0 -0
  194. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/labels/label/1/.zattrs +0 -0
  195. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/tables/.zattrs +0 -0
  196. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/tables/.zgroup +0 -0
  197. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/tables/well_ROI_table/.zattrs +0 -0
  198. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/tables/well_ROI_table/.zgroup +0 -0
  199. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_czyx.zarr/tables/well_ROI_table/table.csv +0 -0
  200. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/.zattrs +0 -0
  201. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/.zgroup +0 -0
  202. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/0/.zarray +0 -0
  203. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/0/.zattrs +0 -0
  204. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/1/.zarray +0 -0
  205. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/1/.zattrs +0 -0
  206. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/labels/.zattrs +0 -0
  207. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/labels/.zgroup +0 -0
  208. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/labels/label/.zattrs +0 -0
  209. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/labels/label/.zgroup +0 -0
  210. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/labels/label/0/.zarray +0 -0
  211. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/labels/label/0/.zattrs +0 -0
  212. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/labels/label/1/.zarray +0 -0
  213. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/labels/label/1/.zattrs +0 -0
  214. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/tables/.zattrs +0 -0
  215. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/tables/.zgroup +0 -0
  216. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/tables/well_ROI_table/.zattrs +0 -0
  217. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/tables/well_ROI_table/.zgroup +0 -0
  218. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tcyx.zarr/tables/well_ROI_table/table.csv +0 -0
  219. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/.zattrs +0 -0
  220. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/.zgroup +0 -0
  221. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/0/.zarray +0 -0
  222. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/0/.zattrs +0 -0
  223. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/1/.zarray +0 -0
  224. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/1/.zattrs +0 -0
  225. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/labels/.zattrs +0 -0
  226. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/labels/.zgroup +0 -0
  227. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/labels/label/.zattrs +0 -0
  228. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/labels/label/.zgroup +0 -0
  229. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/labels/label/0/.zarray +0 -0
  230. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/labels/label/0/.zattrs +0 -0
  231. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/labels/label/1/.zarray +0 -0
  232. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/labels/label/1/.zattrs +0 -0
  233. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/tables/.zattrs +0 -0
  234. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/tables/.zgroup +0 -0
  235. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/tables/well_ROI_table/.zattrs +0 -0
  236. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/tables/well_ROI_table/.zgroup +0 -0
  237. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tczyx.zarr/tables/well_ROI_table/table.csv +0 -0
  238. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/.zattrs +0 -0
  239. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/.zgroup +0 -0
  240. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/0/.zarray +0 -0
  241. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/0/.zattrs +0 -0
  242. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/1/.zarray +0 -0
  243. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/1/.zattrs +0 -0
  244. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/labels/.zattrs +0 -0
  245. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/labels/.zgroup +0 -0
  246. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/labels/label/.zattrs +0 -0
  247. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/labels/label/.zgroup +0 -0
  248. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/labels/label/0/.zarray +0 -0
  249. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/labels/label/0/.zattrs +0 -0
  250. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/labels/label/1/.zarray +0 -0
  251. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/labels/label/1/.zattrs +0 -0
  252. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/tables/.zattrs +0 -0
  253. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/tables/.zgroup +0 -0
  254. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/tables/well_ROI_table/.zattrs +0 -0
  255. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/tables/well_ROI_table/.zgroup +0 -0
  256. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tyx.zarr/tables/well_ROI_table/table.csv +0 -0
  257. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/.zattrs +0 -0
  258. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/.zgroup +0 -0
  259. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/0/.zarray +0 -0
  260. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/0/.zattrs +0 -0
  261. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/1/.zarray +0 -0
  262. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/1/.zattrs +0 -0
  263. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/labels/.zattrs +0 -0
  264. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/labels/.zgroup +0 -0
  265. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/labels/label/.zattrs +0 -0
  266. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/labels/label/.zgroup +0 -0
  267. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/labels/label/0/.zarray +0 -0
  268. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/labels/label/0/.zattrs +0 -0
  269. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/labels/label/1/.zarray +0 -0
  270. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/labels/label/1/.zattrs +0 -0
  271. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/tables/.zattrs +0 -0
  272. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/tables/.zgroup +0 -0
  273. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/tables/well_ROI_table/.zattrs +0 -0
  274. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/tables/well_ROI_table/.zgroup +0 -0
  275. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_tzyx.zarr/tables/well_ROI_table/table.csv +0 -0
  276. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/.zattrs +0 -0
  277. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/.zgroup +0 -0
  278. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/0/.zarray +0 -0
  279. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/0/.zattrs +0 -0
  280. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/1/.zarray +0 -0
  281. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/1/.zattrs +0 -0
  282. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/labels/.zattrs +0 -0
  283. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/labels/.zgroup +0 -0
  284. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/labels/label/.zattrs +0 -0
  285. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/labels/label/.zgroup +0 -0
  286. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/labels/label/0/.zarray +0 -0
  287. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/labels/label/0/.zattrs +0 -0
  288. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/labels/label/1/.zarray +0 -0
  289. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/labels/label/1/.zattrs +0 -0
  290. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/tables/.zattrs +0 -0
  291. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/tables/.zgroup +0 -0
  292. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/tables/well_ROI_table/.zattrs +0 -0
  293. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/tables/well_ROI_table/.zgroup +0 -0
  294. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_yx.zarr/tables/well_ROI_table/table.csv +0 -0
  295. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/.zattrs +0 -0
  296. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/.zgroup +0 -0
  297. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/0/.zarray +0 -0
  298. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/0/.zattrs +0 -0
  299. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/1/.zarray +0 -0
  300. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/1/.zattrs +0 -0
  301. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/labels/.zattrs +0 -0
  302. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/labels/.zgroup +0 -0
  303. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/labels/label/.zattrs +0 -0
  304. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/labels/label/.zgroup +0 -0
  305. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/labels/label/0/.zarray +0 -0
  306. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/labels/label/0/.zattrs +0 -0
  307. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/labels/label/1/.zarray +0 -0
  308. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/labels/label/1/.zattrs +0 -0
  309. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/tables/.zattrs +0 -0
  310. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/tables/.zgroup +0 -0
  311. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/tables/well_ROI_table/.zattrs +0 -0
  312. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/tables/well_ROI_table/.zgroup +0 -0
  313. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/images/test_image_zyx.zarr/tables/well_ROI_table/table.csv +0 -0
  314. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/meta/base_ome_zarr_image_meta.json +0 -0
  315. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/meta/base_ome_zarr_image_meta_wrong_axis_order.json +0 -0
  316. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/meta/base_ome_zarr_label_meta.json +0 -0
  317. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/meta/base_ome_zarr_well_meta.json +0 -0
  318. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v04/meta/ome_zarr_well_path_normalization_meta.json +0 -0
  319. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_c1yx.zarr/0/zarr.json +0 -0
  320. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_c1yx.zarr/1/zarr.json +0 -0
  321. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_c1yx.zarr/labels/label/0/zarr.json +0 -0
  322. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_c1yx.zarr/labels/label/1/zarr.json +0 -0
  323. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_c1yx.zarr/labels/label/zarr.json +0 -0
  324. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_c1yx.zarr/labels/zarr.json +0 -0
  325. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_c1yx.zarr/tables/well_ROI_table/table.csv +0 -0
  326. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_c1yx.zarr/tables/well_ROI_table/zarr.json +0 -0
  327. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_c1yx.zarr/tables/zarr.json +0 -0
  328. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_c1yx.zarr/zarr.json +0 -0
  329. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_cyx.zarr/0/zarr.json +0 -0
  330. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_cyx.zarr/1/zarr.json +0 -0
  331. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_cyx.zarr/labels/label/0/zarr.json +0 -0
  332. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_cyx.zarr/labels/label/1/zarr.json +0 -0
  333. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_cyx.zarr/labels/label/zarr.json +0 -0
  334. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_cyx.zarr/labels/zarr.json +0 -0
  335. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_cyx.zarr/tables/well_ROI_table/table.csv +0 -0
  336. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_cyx.zarr/tables/well_ROI_table/zarr.json +0 -0
  337. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_cyx.zarr/tables/zarr.json +0 -0
  338. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_cyx.zarr/zarr.json +0 -0
  339. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_czyx.zarr/0/zarr.json +0 -0
  340. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_czyx.zarr/1/zarr.json +0 -0
  341. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_czyx.zarr/labels/label/0/zarr.json +0 -0
  342. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_czyx.zarr/labels/label/1/zarr.json +0 -0
  343. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_czyx.zarr/labels/label/zarr.json +0 -0
  344. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_czyx.zarr/labels/zarr.json +0 -0
  345. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_czyx.zarr/tables/well_ROI_table/table.csv +0 -0
  346. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_czyx.zarr/tables/well_ROI_table/zarr.json +0 -0
  347. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_czyx.zarr/tables/zarr.json +0 -0
  348. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_czyx.zarr/zarr.json +0 -0
  349. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tcyx.zarr/0/zarr.json +0 -0
  350. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tcyx.zarr/1/zarr.json +0 -0
  351. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tcyx.zarr/labels/label/0/zarr.json +0 -0
  352. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tcyx.zarr/labels/label/1/zarr.json +0 -0
  353. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tcyx.zarr/labels/label/zarr.json +0 -0
  354. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tcyx.zarr/labels/zarr.json +0 -0
  355. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tcyx.zarr/tables/well_ROI_table/table.csv +0 -0
  356. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tcyx.zarr/tables/well_ROI_table/zarr.json +0 -0
  357. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tcyx.zarr/tables/zarr.json +0 -0
  358. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tcyx.zarr/zarr.json +0 -0
  359. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tczyx.zarr/0/zarr.json +0 -0
  360. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tczyx.zarr/1/zarr.json +0 -0
  361. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tczyx.zarr/labels/label/0/zarr.json +0 -0
  362. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tczyx.zarr/labels/label/1/zarr.json +0 -0
  363. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tczyx.zarr/labels/label/zarr.json +0 -0
  364. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tczyx.zarr/labels/zarr.json +0 -0
  365. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tczyx.zarr/tables/well_ROI_table/table.csv +0 -0
  366. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tczyx.zarr/tables/well_ROI_table/zarr.json +0 -0
  367. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tczyx.zarr/tables/zarr.json +0 -0
  368. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tczyx.zarr/zarr.json +0 -0
  369. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tyx.zarr/0/zarr.json +0 -0
  370. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tyx.zarr/1/zarr.json +0 -0
  371. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tyx.zarr/labels/label/0/zarr.json +0 -0
  372. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tyx.zarr/labels/label/1/zarr.json +0 -0
  373. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tyx.zarr/labels/label/zarr.json +0 -0
  374. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tyx.zarr/labels/zarr.json +0 -0
  375. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tyx.zarr/tables/well_ROI_table/table.csv +0 -0
  376. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tyx.zarr/tables/well_ROI_table/zarr.json +0 -0
  377. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tyx.zarr/tables/zarr.json +0 -0
  378. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tyx.zarr/zarr.json +0 -0
  379. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tzyx.zarr/0/zarr.json +0 -0
  380. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tzyx.zarr/1/zarr.json +0 -0
  381. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tzyx.zarr/labels/label/0/zarr.json +0 -0
  382. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tzyx.zarr/labels/label/1/zarr.json +0 -0
  383. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tzyx.zarr/labels/label/zarr.json +0 -0
  384. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tzyx.zarr/labels/zarr.json +0 -0
  385. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tzyx.zarr/tables/well_ROI_table/table.csv +0 -0
  386. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tzyx.zarr/tables/well_ROI_table/zarr.json +0 -0
  387. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tzyx.zarr/tables/zarr.json +0 -0
  388. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_tzyx.zarr/zarr.json +0 -0
  389. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_yx.zarr/0/zarr.json +0 -0
  390. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_yx.zarr/1/zarr.json +0 -0
  391. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_yx.zarr/labels/label/0/zarr.json +0 -0
  392. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_yx.zarr/labels/label/1/zarr.json +0 -0
  393. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_yx.zarr/labels/label/zarr.json +0 -0
  394. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_yx.zarr/labels/zarr.json +0 -0
  395. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_yx.zarr/tables/well_ROI_table/table.csv +0 -0
  396. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_yx.zarr/tables/well_ROI_table/zarr.json +0 -0
  397. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_yx.zarr/tables/zarr.json +0 -0
  398. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_yx.zarr/zarr.json +0 -0
  399. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_zyx.zarr/0/zarr.json +0 -0
  400. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_zyx.zarr/1/zarr.json +0 -0
  401. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_zyx.zarr/labels/label/0/zarr.json +0 -0
  402. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_zyx.zarr/labels/label/1/zarr.json +0 -0
  403. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_zyx.zarr/labels/label/zarr.json +0 -0
  404. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_zyx.zarr/labels/zarr.json +0 -0
  405. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_zyx.zarr/tables/well_ROI_table/table.csv +0 -0
  406. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_zyx.zarr/tables/well_ROI_table/zarr.json +0 -0
  407. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_zyx.zarr/tables/zarr.json +0 -0
  408. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/data/v05/images/test_image_zyx.zarr/zarr.json +0 -0
  409. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/stores/conftest.py +0 -0
  410. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/stores/test_http_store.py +0 -0
  411. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/stores/test_local_store.py +0 -0
  412. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/stores/test_memory_store.py +0 -0
  413. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/stores/test_s3_store.py +0 -0
  414. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/stores/utils.py +0 -0
  415. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/common/test_dimensions.py +0 -0
  416. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/common/test_pyramid.py +0 -0
  417. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/common/test_roi.py +0 -0
  418. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/common/test_transforms.py +0 -0
  419. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/hcs/test_plate.py +0 -0
  420. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/hcs/test_well.py +0 -0
  421. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/images/test_images.py +0 -0
  422. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/images/test_masked_images.py +0 -0
  423. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/images/test_omezarr_container.py +0 -0
  424. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/images/test_table_ops.py +0 -0
  425. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/io_pipes/test_axes_ops.py +0 -0
  426. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/io_pipes/test_slicing_ops.py +0 -0
  427. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/iterators/test_iterators.py +0 -0
  428. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/ome_zarr_meta/test_image_handler.py +0 -0
  429. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/ome_zarr_meta/test_unit_ngio_specs.py +0 -0
  430. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/ome_zarr_meta/test_unit_v04_utils.py +0 -0
  431. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/tables/test_backends.py +0 -0
  432. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/tables/test_backends_utils.py +0 -0
  433. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/tables/test_feature_table.py +0 -0
  434. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/tables/test_generic_table.py +0 -0
  435. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/tables/test_masking_roi_table_v1.py +0 -0
  436. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/tables/test_roi_table_v1.py +0 -0
  437. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/tables/test_table_group.py +0 -0
  438. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/utils/test_download_datasets.py +0 -0
  439. {ngio-0.5.0b5 → ngio-0.5.0b7}/tests/unit/utils/test_zarr_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ngio
3
- Version: 0.5.0b5
3
+ Version: 0.5.0b7
4
4
  Summary: Next Generation file format IO
5
5
  Project-URL: homepage, https://github.com/BioVisionCenter/ngio
6
6
  Project-URL: repository, https://github.com/BioVisionCenter/ngio
@@ -1,3 +1,5 @@
1
+ import itertools
2
+ import math
1
3
  from collections.abc import Callable, Mapping, Sequence
2
4
  from typing import Any, Literal
3
5
 
@@ -195,7 +197,7 @@ ChunksLike = tuple[int, ...] | Literal["auto"]
195
197
  ShardsLike = tuple[int, ...] | Literal["auto"]
196
198
 
197
199
 
198
- def shapes_from_scaling_factors(
200
+ def compute_shapes_from_scaling_factors(
199
201
  base_shape: tuple[int, ...],
200
202
  scaling_factors: tuple[float, ...],
201
203
  num_levels: int,
@@ -215,7 +217,7 @@ def shapes_from_scaling_factors(
215
217
  for _ in range(num_levels):
216
218
  shapes.append(current_shape)
217
219
  current_shape = tuple(
218
- max(1, int(s / f))
220
+ max(1, math.floor(s / f))
219
221
  for s, f in zip(current_shape, scaling_factors, strict=True)
220
222
  )
221
223
  return shapes
@@ -233,6 +235,7 @@ class PyramidLevel(BaseModel):
233
235
  path: str
234
236
  shape: tuple[int, ...]
235
237
  scale: tuple[float, ...]
238
+ translation: tuple[float, ...]
236
239
  chunks: ChunksLike = "auto"
237
240
  shards: ShardsLike | None = None
238
241
 
@@ -247,6 +250,12 @@ class PyramidLevel(BaseModel):
247
250
  if any(isinstance(s, float) and s < 0 for s in self.scale):
248
251
  raise NgioValueError("Scale values must be positive.")
249
252
 
253
+ if len(self.translation) != len(self.shape):
254
+ raise NgioValueError(
255
+ "Translation must have the same length as shape "
256
+ f"({len(self.shape)}), got {len(self.translation)}"
257
+ )
258
+
250
259
  if isinstance(self.chunks, tuple):
251
260
  if len(self.chunks) != len(self.shape):
252
261
  raise NgioValueError(
@@ -271,6 +280,63 @@ class PyramidLevel(BaseModel):
271
280
  return self
272
281
 
273
282
 
283
+ def compute_scales_from_shapes(
284
+ shapes: Sequence[tuple[int, ...]],
285
+ base_scale: tuple[float, ...],
286
+ ) -> list[tuple[float, ...]]:
287
+ scales = [base_scale]
288
+ scale_ = base_scale
289
+ for current_shape, next_shape in itertools.pairwise(shapes):
290
+ # This only works for downsampling pyramids
291
+ # The _check_order function (called before) ensures that the
292
+ # shapes are decreasing
293
+ _scaling_factor = tuple(
294
+ s1 / s2
295
+ for s1, s2 in zip(
296
+ current_shape,
297
+ next_shape,
298
+ strict=True,
299
+ )
300
+ )
301
+ scale_ = tuple(s * f for s, f in zip(scale_, _scaling_factor, strict=True))
302
+ scales.append(scale_)
303
+ return scales
304
+
305
+
306
+ def _compute_translations_from_shapes(
307
+ scales: Sequence[tuple[float, ...]],
308
+ base_translation: Sequence[float] | None,
309
+ ) -> list[tuple[float, ...]]:
310
+ translations = []
311
+ if base_translation is None:
312
+ n_dim = len(scales[0])
313
+ base_translation = tuple(0.0 for _ in range(n_dim))
314
+ else:
315
+ base_translation = tuple(base_translation)
316
+
317
+ translation_ = base_translation
318
+ for _ in scales:
319
+ # TBD: How to update translation
320
+ # For now, we keep it constant but we should probably change it
321
+ # to reflect the shift introduced by downsampling
322
+ # translation_ = translation_ + _scaling_factor
323
+ translations.append(translation_)
324
+ return translations
325
+
326
+
327
+ def _compute_scales_from_factors(
328
+ base_scale: tuple[float, ...], scaling_factors: tuple[float, ...], num_levels: int
329
+ ) -> list[tuple[float, ...]]:
330
+ precision_scales = []
331
+ current_scale = base_scale
332
+ for _ in range(num_levels):
333
+ precision_scales.append(current_scale)
334
+ current_scale = tuple(
335
+ s * f for s, f in zip(current_scale, scaling_factors, strict=True)
336
+ )
337
+ return precision_scales
338
+
339
+
274
340
  class ImagePyramidBuilder(BaseModel):
275
341
  levels: list[PyramidLevel]
276
342
  axes: tuple[str, ...]
@@ -290,6 +356,7 @@ class ImagePyramidBuilder(BaseModel):
290
356
  base_shape: tuple[int, ...],
291
357
  base_scale: tuple[float, ...],
292
358
  axes: tuple[str, ...],
359
+ base_translation: Sequence[float] | None = None,
293
360
  chunks: ChunksLike = "auto",
294
361
  shards: ShardsLike | None = None,
295
362
  data_type: str = "uint16",
@@ -297,16 +364,39 @@ class ImagePyramidBuilder(BaseModel):
297
364
  compressors: Any = "auto",
298
365
  zarr_format: Literal[2, 3] = 2,
299
366
  other_array_kwargs: Mapping[str, Any] | None = None,
367
+ precision_scale: bool = True,
300
368
  ) -> "ImagePyramidBuilder":
301
- shapes = shapes_from_scaling_factors(
369
+ # Since shapes needs to be rounded to integers, we compute them here
370
+ # and then pass them to from_shapes
371
+ # This ensures that the shapes and scaling factors are consistent
372
+ # and avoids accumulation of rounding errors
373
+ shapes = compute_shapes_from_scaling_factors(
302
374
  base_shape=base_shape,
303
375
  scaling_factors=scaling_factors,
304
376
  num_levels=len(levels_paths),
305
377
  )
378
+
379
+ if precision_scale:
380
+ # Compute precise scales from shapes
381
+ # Since shapes are rounded to integers, the scaling factors
382
+ # may not be exactly the same as the input scaling factors
383
+ # Thus, we compute the scales from the shapes to ensure consistency
384
+ base_scale_ = compute_scales_from_shapes(
385
+ shapes=shapes,
386
+ base_scale=base_scale,
387
+ )
388
+ else:
389
+ base_scale_ = _compute_scales_from_factors(
390
+ base_scale=base_scale,
391
+ scaling_factors=scaling_factors,
392
+ num_levels=len(levels_paths),
393
+ )
394
+
306
395
  return cls.from_shapes(
307
396
  shapes=shapes,
308
- base_scale=base_scale,
397
+ base_scale=base_scale_,
309
398
  axes=axes,
399
+ base_translation=base_translation,
310
400
  levels_paths=levels_paths,
311
401
  chunks=chunks,
312
402
  shards=shards,
@@ -321,8 +411,9 @@ class ImagePyramidBuilder(BaseModel):
321
411
  def from_shapes(
322
412
  cls,
323
413
  shapes: Sequence[tuple[int, ...]],
324
- base_scale: tuple[float, ...],
414
+ base_scale: tuple[float, ...] | list[tuple[float, ...]],
325
415
  axes: tuple[str, ...],
416
+ base_translation: Sequence[float] | None = None,
326
417
  levels_paths: Sequence[str] | None = None,
327
418
  chunks: ChunksLike = "auto",
328
419
  shards: ShardsLike | None = None,
@@ -335,34 +426,42 @@ class ImagePyramidBuilder(BaseModel):
335
426
  levels = []
336
427
  if levels_paths is None:
337
428
  levels_paths = tuple(str(i) for i in range(len(shapes)))
429
+
338
430
  _check_order(shapes)
339
- scale_ = base_scale
340
- for i, (path, shape) in enumerate(zip(levels_paths, shapes, strict=True)):
341
- levels.append(
342
- PyramidLevel(
343
- path=path,
344
- shape=shape,
345
- scale=scale_,
346
- chunks=chunks,
347
- shards=shards,
431
+ if isinstance(base_scale, tuple) and all(
432
+ isinstance(s, float) for s in base_scale
433
+ ):
434
+ scales = compute_scales_from_shapes(shapes, base_scale)
435
+ elif isinstance(base_scale, list):
436
+ scales = base_scale
437
+ if len(scales) != len(shapes):
438
+ raise NgioValueError(
439
+ "Scales must have the same length as shapes "
440
+ f"({len(shapes)}), got {len(scales)}"
348
441
  )
442
+ else:
443
+ raise NgioValueError(
444
+ "base_scale must be either a tuple of floats or a list of tuples "
445
+ " of floats."
349
446
  )
350
- if i + 1 < len(shapes):
351
- # This only works for downsampling pyramids
352
- # The _check_order function ensures that
353
- # shapes are decreasing
354
- next_shape = shapes[i + 1]
355
- scaling_factor = tuple(
356
- s1 / s2
357
- for s1, s2 in zip(
358
- shape,
359
- next_shape,
360
- strict=True,
361
- )
362
- )
363
- scale_ = tuple(
364
- s * f for s, f in zip(scale_, scaling_factor, strict=True)
365
- )
447
+
448
+ translations = _compute_translations_from_shapes(scales, base_translation)
449
+ for level_path, shape, scale, translation in zip(
450
+ levels_paths,
451
+ shapes,
452
+ scales,
453
+ translations,
454
+ strict=True,
455
+ ):
456
+ level = PyramidLevel(
457
+ path=level_path,
458
+ shape=shape,
459
+ scale=scale,
460
+ translation=translation,
461
+ chunks=chunks,
462
+ shards=shards,
463
+ )
464
+ levels.append(level)
366
465
  other_array_kwargs = other_array_kwargs or {}
367
466
  return cls(
368
467
  levels=levels,
@@ -1,6 +1,6 @@
1
1
  """Region of interest (ROI) metadata.
2
2
 
3
- These are the interfaces bwteen the ROI tables / masking ROI tables and
3
+ These are the interfaces between the ROI tables / masking ROI tables and
4
4
  the ImageLikeHandler.
5
5
  """
6
6
 
@@ -16,9 +16,15 @@ from ngio.common import (
16
16
  Roi,
17
17
  consolidate_pyramid,
18
18
  )
19
- from ngio.common._pyramid import ChunksLike, ShardsLike, shapes_from_scaling_factors
19
+ from ngio.common._pyramid import (
20
+ ChunksLike,
21
+ ShardsLike,
22
+ compute_scales_from_shapes,
23
+ compute_shapes_from_scaling_factors,
24
+ )
20
25
  from ngio.images._create_utils import (
21
26
  _image_or_label_meta,
27
+ compute_base_scale,
22
28
  init_image_like_from_shapes,
23
29
  )
24
30
  from ngio.io_pipes import (
@@ -602,32 +608,39 @@ def consolidate_image(
602
608
 
603
609
  def _shapes_from_ref_image(
604
610
  ref_image: AbstractImage,
605
- ) -> list[tuple[int, ...]]:
611
+ ) -> tuple[list[tuple[int, ...]], list[tuple[float, ...]]]:
606
612
  """Rebuild base shape based on a new shape."""
607
- paths = ref_image.meta.paths
613
+ meta = ref_image.meta
614
+ paths = meta.paths
608
615
  index_path = paths.index(ref_image.path)
609
616
  sub_paths = paths[index_path:]
610
617
  group_handler = ref_image._group_handler
611
- shapes = []
618
+ shapes, scales = [], []
612
619
  for path in sub_paths:
613
620
  zarr_array = group_handler.get_array(path)
614
621
  shapes.append(zarr_array.shape)
622
+ scales.append(meta.get_dataset(path=path).scale)
615
623
  if len(shapes) == len(paths):
616
- return shapes
624
+ return shapes, scales
617
625
  missing_levels = len(paths) - len(shapes)
618
- extended_shapes = shapes_from_scaling_factors(
626
+ extended_shapes = compute_shapes_from_scaling_factors(
619
627
  base_shape=shapes[-1],
620
628
  scaling_factors=ref_image.meta.scaling_factor(),
621
629
  num_levels=missing_levels + 1,
622
630
  )
623
631
  shapes.extend(extended_shapes[1:])
624
- return shapes
632
+ extended_scales = compute_scales_from_shapes(
633
+ shapes=extended_shapes,
634
+ base_scale=scales[-1],
635
+ )
636
+ scales.extend(extended_scales[1:])
637
+ return shapes, scales
625
638
 
626
639
 
627
640
  def _shapes_from_new_shape(
628
641
  ref_image: AbstractImage,
629
642
  shape: Sequence[int],
630
- ) -> list[tuple[int, ...]]:
643
+ ) -> tuple[list[tuple[int, ...]], list[tuple[float, ...]]]:
631
644
  """Rebuild pyramid shapes based on a new base shape."""
632
645
  if len(shape) != len(ref_image.shape):
633
646
  raise NgioValueError(
@@ -637,27 +650,33 @@ def _shapes_from_new_shape(
637
650
  base_shape = tuple(shape)
638
651
  scaling_factors = ref_image.meta.scaling_factor()
639
652
  num_levels = len(ref_image.meta.paths)
640
- return shapes_from_scaling_factors(
653
+ shapes = compute_shapes_from_scaling_factors(
641
654
  base_shape=base_shape,
642
655
  scaling_factors=scaling_factors,
643
656
  num_levels=num_levels,
644
657
  )
658
+ scales = compute_scales_from_shapes(
659
+ shapes=shapes,
660
+ base_scale=ref_image.dataset.scale,
661
+ )
662
+ return shapes, scales
645
663
 
646
664
 
647
665
  def _compute_pyramid_shapes(
648
666
  ref_image: AbstractImage,
649
667
  shape: Sequence[int] | None,
650
- ) -> list[tuple[int, ...]]:
668
+ ) -> tuple[list[tuple[int, ...]], list[tuple[float, ...]]]:
651
669
  """Rebuild pyramid shapes based on a new base shape."""
652
670
  if shape is None:
653
671
  return _shapes_from_ref_image(ref_image=ref_image)
654
672
  return _shapes_from_new_shape(ref_image=ref_image, shape=shape)
655
673
 
656
674
 
657
- def _check_chunks_and_shards_compatibility(
675
+ def _check_len_compatibility(
658
676
  ref_shape: tuple[int, ...],
659
677
  chunks: ChunksLike,
660
678
  shards: ShardsLike | None,
679
+ translation: Sequence[float] | None = None,
661
680
  ) -> None:
662
681
  """Check if the chunks and shards are compatible with the reference shape.
663
682
 
@@ -665,6 +684,7 @@ def _check_chunks_and_shards_compatibility(
665
684
  ref_shape: The reference shape.
666
685
  chunks: The chunks to check.
667
686
  shards: The shards to check.
687
+ translation: The translation to check.
668
688
  """
669
689
  if chunks != "auto":
670
690
  if len(chunks) != len(ref_shape):
@@ -676,6 +696,12 @@ def _check_chunks_and_shards_compatibility(
676
696
  raise NgioValueError(
677
697
  "The length of the shards must be the same as the number of dimensions."
678
698
  )
699
+ if translation is not None:
700
+ if len(translation) != len(ref_shape):
701
+ raise NgioValueError(
702
+ "The length of the translation must be the same as the number of "
703
+ "dimensions."
704
+ )
679
705
 
680
706
 
681
707
  def _apply_channel_policy(
@@ -685,7 +711,16 @@ def _apply_channel_policy(
685
711
  axes: tuple[str, ...],
686
712
  chunks: ChunksLike,
687
713
  shards: ShardsLike | None,
688
- ) -> tuple[list[tuple[int, ...]], tuple[str, ...], ChunksLike, ShardsLike | None]:
714
+ translation: Sequence[float],
715
+ scales: list[tuple[float, ...]] | tuple[float, ...],
716
+ ) -> tuple[
717
+ list[tuple[int, ...]],
718
+ tuple[str, ...],
719
+ ChunksLike,
720
+ ShardsLike | None,
721
+ tuple[float, ...],
722
+ list[tuple[float, ...]] | tuple[float, ...],
723
+ ]:
689
724
  """Apply the channel policy to the shapes and axes.
690
725
 
691
726
  Args:
@@ -695,12 +730,15 @@ def _apply_channel_policy(
695
730
  axes: The axes of the image.
696
731
  chunks: The chunks of the image.
697
732
  shards: The shards of the image.
733
+ translation: The translation of the image.
734
+ scales: The scales of the image.
698
735
 
699
736
  Returns:
700
737
  The new shapes and axes after applying the channel policy.
701
738
  """
739
+ translation = tuple(translation)
702
740
  if channels_policy == "same":
703
- return shapes, axes, chunks, shards
741
+ return shapes, axes, chunks, shards, translation, scales
704
742
 
705
743
  if channels_policy == "singleton":
706
744
  # Treat 'singleton' as setting channel size to 1
@@ -709,7 +747,7 @@ def _apply_channel_policy(
709
747
  channel_index = ref_image.axes_handler.get_index("c")
710
748
  if channel_index is None:
711
749
  if channels_policy == "squeeze":
712
- return shapes, axes, chunks, shards
750
+ return shapes, axes, chunks, shards, translation, scales
713
751
  raise NgioValueError(
714
752
  f"Cannot apply channel policy {channels_policy=} to an image "
715
753
  "without channels axis."
@@ -719,6 +757,15 @@ def _apply_channel_policy(
719
757
  for shape in shapes:
720
758
  new_shape = shape[:channel_index] + shape[channel_index + 1 :]
721
759
  new_shapes.append(new_shape)
760
+
761
+ if isinstance(scales, tuple):
762
+ new_scales = scales[:channel_index] + scales[channel_index + 1 :]
763
+ else:
764
+ new_scales = []
765
+ for scale in scales:
766
+ new_scale = scale[:channel_index] + scale[channel_index + 1 :]
767
+ new_scales.append(new_scale)
768
+
722
769
  new_axes = axes[:channel_index] + axes[channel_index + 1 :]
723
770
  if chunks == "auto":
724
771
  new_chunks: ChunksLike = "auto"
@@ -728,7 +775,9 @@ def _apply_channel_policy(
728
775
  new_shards: ShardsLike | None = shards
729
776
  else:
730
777
  new_shards = shards[:channel_index] + shards[channel_index + 1 :]
731
- return new_shapes, new_axes, new_chunks, new_shards
778
+
779
+ translation = translation[:channel_index] + translation[channel_index + 1 :]
780
+ return new_shapes, new_axes, new_chunks, new_shards, translation, new_scales
732
781
  elif isinstance(channels_policy, int):
733
782
  new_shapes = []
734
783
  for shape in shapes:
@@ -738,7 +787,7 @@ def _apply_channel_policy(
738
787
  *shape[channel_index + 1 :],
739
788
  )
740
789
  new_shapes.append(new_shape)
741
- return new_shapes, axes, chunks, shards
790
+ return new_shapes, axes, chunks, shards, translation, scales
742
791
  else:
743
792
  raise NgioValueError(
744
793
  f"Invalid channels policy: {channels_policy}. "
@@ -783,6 +832,35 @@ def _check_channels_meta_compatibility(
783
832
  return channels_meta_
784
833
 
785
834
 
835
+ def adapt_scales(
836
+ scales: list[tuple[float, ...]],
837
+ pixelsize: float | tuple[float, float] | None,
838
+ z_spacing: float | None,
839
+ time_spacing: float | None,
840
+ ref_image: AbstractImage,
841
+ ) -> list[tuple[float, ...]] | tuple[float, ...]:
842
+ if pixelsize is None and z_spacing is None and time_spacing is None:
843
+ return scales
844
+ pixel_size = ref_image.pixel_size
845
+ if pixelsize is None:
846
+ pixelsize = (pixel_size.y, pixel_size.x)
847
+ if z_spacing is None:
848
+ z_spacing = pixel_size.z
849
+ else:
850
+ z_spacing = z_spacing
851
+ if time_spacing is None:
852
+ time_spacing = pixel_size.t
853
+ else:
854
+ time_spacing = time_spacing
855
+ base_scale = compute_base_scale(
856
+ pixelsize=pixelsize,
857
+ z_spacing=z_spacing,
858
+ time_spacing=time_spacing,
859
+ axes_handler=ref_image.axes_handler,
860
+ )
861
+ return base_scale
862
+
863
+
786
864
  def abstract_derive(
787
865
  *,
788
866
  ref_image: AbstractImage,
@@ -795,6 +873,7 @@ def abstract_derive(
795
873
  z_spacing: float | None = None,
796
874
  time_spacing: float | None = None,
797
875
  name: str | None = None,
876
+ translation: Sequence[float] | None = None,
798
877
  channels_policy: Literal["squeeze", "same", "singleton"] | int = "same",
799
878
  channels_meta: Sequence[str | Channel] | None = None,
800
879
  ngff_version: NgffVersions | None = None,
@@ -822,8 +901,9 @@ def abstract_derive(
822
901
  pixelsize (float | tuple[float, float] | None): The pixel size of the new image.
823
902
  z_spacing (float | None): The z spacing of the new image.
824
903
  time_spacing (float | None): The time spacing of the new image.
825
- axes_names (Sequence[str] | None): The axes names of the new image.
826
904
  name (str | None): The name of the new image.
905
+ translation (Sequence[float] | None): The translation for each axis
906
+ at the highest resolution level. Defaults to None.
827
907
  channels_policy (Literal["squeeze", "same", "singleton"] | int):
828
908
  Possible policies:
829
909
  - If "squeeze", the channels axis will be removed (no matter its size).
@@ -837,7 +917,7 @@ def abstract_derive(
837
917
  chunks (ChunksLike | None): The chunk shape of the new image.
838
918
  shards (ShardsLike | None): The shard shape of the new image.
839
919
  dtype (str | None): The data type of the new image.
840
- dimension_separator (DIMENSION_SEPARATOR | None): The separator to use for
920
+ dimension_separator (Literal[".", "/"] | None): The separator to use for
841
921
  dimensions.
842
922
  compressors (CompressorLike | None): The compressors to use.
843
923
  extra_array_kwargs (Mapping[str, Any] | None): Extra arguments to pass to
@@ -868,40 +948,23 @@ def abstract_derive(
868
948
  DeprecationWarning,
869
949
  stacklevel=2,
870
950
  )
871
- pixelsize_ = (pixel_size.y, pixel_size.x)
872
- z_spacing_ = pixel_size.z
873
- time_spacing_ = pixel_size.t
874
- else:
875
- if pixelsize is None:
876
- pixelsize_ = (ref_image.pixel_size.y, ref_image.pixel_size.x)
877
- else:
878
- pixelsize_ = pixelsize
879
-
880
- if z_spacing is None:
881
- z_spacing_ = ref_image.pixel_size.z
882
- else:
883
- z_spacing_ = z_spacing
884
-
885
- if time_spacing is None:
886
- time_spacing_ = ref_image.pixel_size.t
887
- else:
888
- time_spacing_ = time_spacing
951
+ pixelsize = (pixel_size.y, pixel_size.x)
952
+ # End of deprecated arguments handling
889
953
  ref_meta = ref_image.meta
890
954
 
891
- shapes = _compute_pyramid_shapes(
955
+ shapes, scales = _compute_pyramid_shapes(
892
956
  shape=shape,
893
957
  ref_image=ref_image,
894
958
  )
895
959
  ref_shape = next(iter(shapes))
896
960
 
897
- if pixelsize is None:
898
- pixelsize = (ref_image.pixel_size.y, ref_image.pixel_size.x)
899
-
900
- if z_spacing is None:
901
- z_spacing = ref_image.pixel_size.z
902
-
903
- if time_spacing is None:
904
- time_spacing = ref_image.pixel_size.t
961
+ scales = adapt_scales(
962
+ scales=scales,
963
+ pixelsize=pixelsize,
964
+ z_spacing=z_spacing,
965
+ time_spacing=time_spacing,
966
+ ref_image=ref_image,
967
+ )
905
968
 
906
969
  if name is None:
907
970
  name = ref_meta.name
@@ -915,27 +978,33 @@ def abstract_derive(
915
978
  if compressors is None:
916
979
  compressors = ref_image.zarr_array.compressors # type: ignore
917
980
 
981
+ if translation is None:
982
+ translation = ref_image.dataset.translation
983
+
918
984
  if chunks is None:
919
985
  chunks = ref_image.zarr_array.chunks
920
986
  if shards is None:
921
987
  shards = ref_image.zarr_array.shards
922
988
 
923
- _check_chunks_and_shards_compatibility(
989
+ _check_len_compatibility(
924
990
  ref_shape=ref_shape,
925
991
  chunks=chunks,
926
992
  shards=shards,
993
+ translation=translation,
927
994
  )
928
995
 
929
996
  if ngff_version is None:
930
997
  ngff_version = ref_meta.version
931
998
 
932
- shapes, axes, chunks, shards = _apply_channel_policy(
999
+ shapes, axes, chunks, shards, translation, scales = _apply_channel_policy(
933
1000
  ref_image=ref_image,
934
1001
  channels_policy=channels_policy,
935
1002
  shapes=shapes,
936
1003
  axes=ref_image.axes,
937
1004
  chunks=chunks,
938
1005
  shards=shards,
1006
+ translation=translation,
1007
+ scales=scales,
939
1008
  )
940
1009
  channels_meta_ = _check_channels_meta_compatibility(
941
1010
  meta_type=meta_type,
@@ -947,10 +1016,9 @@ def abstract_derive(
947
1016
  store=store,
948
1017
  meta_type=meta_type,
949
1018
  shapes=shapes,
950
- pixelsize=pixelsize_,
951
- z_spacing=z_spacing_,
952
- time_spacing=time_spacing_,
1019
+ base_scale=scales,
953
1020
  levels=ref_meta.paths,
1021
+ translation=translation,
954
1022
  time_unit=ref_image.time_unit,
955
1023
  space_unit=ref_image.space_unit,
956
1024
  axes_names=axes,
@@ -30,6 +30,7 @@ def create_synthetic_ome_zarr(
30
30
  shape: Sequence[int],
31
31
  reference_sample: AVAILABLE_SAMPLES | SampleInfo = "Cardiomyocyte",
32
32
  levels: int | list[str] = 5,
33
+ translation: Sequence[float] | None = None,
33
34
  table_backend: TableBackend = DefaultTableBackend,
34
35
  scaling_factors: Sequence[float] | Literal["auto"] = "auto",
35
36
  axes_names: Sequence[str] | None = None,
@@ -51,6 +52,8 @@ def create_synthetic_ome_zarr(
51
52
  Defaults to "Cardiomyocyte".
52
53
  levels (int | list[str]): The number of levels in the pyramid or a list of
53
54
  level names. Defaults to 5.
55
+ translation (Sequence[float] | None): The translation for each axis
56
+ at the highest resolution level. Defaults to None.
54
57
  table_backend (TableBackend): Table backend to be used to store tables.
55
58
  Defaults to DefaultTableBackend.
56
59
  scaling_factors (Sequence[float] | Literal["auto"]): The down-scaling factors
@@ -86,6 +89,7 @@ def create_synthetic_ome_zarr(
86
89
  z_spacing=sample_info.z_spacing,
87
90
  time_spacing=sample_info.time_spacing,
88
91
  levels=levels,
92
+ translation=translation,
89
93
  space_unit=sample_info.space_unit,
90
94
  time_unit=sample_info.time_unit,
91
95
  axes_names=axes_names,