ngio 0.5.0__py3-none-any.whl → 0.5.0a2__py3-none-any.whl

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 (53) hide show
  1. ngio/__init__.py +2 -5
  2. ngio/common/__init__.py +6 -11
  3. ngio/common/_masking_roi.py +54 -34
  4. ngio/common/_pyramid.py +85 -309
  5. ngio/common/_roi.py +330 -258
  6. ngio/experimental/iterators/_feature.py +3 -3
  7. ngio/experimental/iterators/_rois_utils.py +11 -10
  8. ngio/hcs/_plate.py +60 -132
  9. ngio/images/_abstract_image.py +35 -539
  10. ngio/images/_create.py +287 -0
  11. ngio/images/_create_synt_container.py +42 -39
  12. ngio/images/_image.py +250 -516
  13. ngio/images/_label.py +172 -249
  14. ngio/images/_masked_image.py +2 -2
  15. ngio/images/_ome_zarr_container.py +241 -644
  16. ngio/io_pipes/_io_pipes.py +9 -9
  17. ngio/io_pipes/_io_pipes_masked.py +7 -7
  18. ngio/io_pipes/_io_pipes_roi.py +6 -6
  19. ngio/io_pipes/_io_pipes_types.py +3 -3
  20. ngio/io_pipes/_match_shape.py +8 -6
  21. ngio/io_pipes/_ops_slices_utils.py +5 -8
  22. ngio/ome_zarr_meta/__init__.py +18 -29
  23. ngio/ome_zarr_meta/_meta_handlers.py +708 -392
  24. ngio/ome_zarr_meta/ngio_specs/__init__.py +0 -4
  25. ngio/ome_zarr_meta/ngio_specs/_axes.py +51 -152
  26. ngio/ome_zarr_meta/ngio_specs/_dataset.py +22 -13
  27. ngio/ome_zarr_meta/ngio_specs/_ngio_hcs.py +91 -129
  28. ngio/ome_zarr_meta/ngio_specs/_ngio_image.py +68 -57
  29. ngio/ome_zarr_meta/v04/__init__.py +1 -5
  30. ngio/ome_zarr_meta/v04/{_v04_spec.py → _v04_spec_utils.py} +85 -54
  31. ngio/ome_zarr_meta/v05/__init__.py +1 -5
  32. ngio/ome_zarr_meta/v05/{_v05_spec.py → _v05_spec_utils.py} +87 -64
  33. ngio/resources/__init__.py +1 -1
  34. ngio/resources/resource_model.py +1 -1
  35. ngio/tables/_tables_container.py +11 -62
  36. ngio/tables/backends/_anndata.py +8 -58
  37. ngio/tables/backends/_anndata_utils.py +6 -1
  38. ngio/tables/backends/_csv.py +19 -3
  39. ngio/tables/backends/_json.py +13 -10
  40. ngio/tables/backends/_non_zarr_backends.py +196 -0
  41. ngio/tables/backends/_parquet.py +31 -3
  42. ngio/tables/v1/_roi_table.py +24 -41
  43. ngio/utils/__init__.py +12 -6
  44. ngio/utils/_datasets.py +0 -6
  45. ngio/utils/_logger.py +50 -0
  46. ngio/utils/_zarr_utils.py +58 -167
  47. {ngio-0.5.0.dist-info → ngio-0.5.0a2.dist-info}/METADATA +4 -11
  48. ngio-0.5.0a2.dist-info/RECORD +89 -0
  49. {ngio-0.5.0.dist-info → ngio-0.5.0a2.dist-info}/WHEEL +1 -1
  50. ngio/images/_create_utils.py +0 -406
  51. ngio/tables/backends/_py_arrow_backends.py +0 -222
  52. ngio-0.5.0.dist-info/RECORD +0 -88
  53. {ngio-0.5.0.dist-info → ngio-0.5.0a2.dist-info}/licenses/LICENSE +0 -0
@@ -1,4 +1,4 @@
1
- from ngio import Roi
1
+ from ngio import Roi, RoiPixels
2
2
  from ngio.images._abstract_image import AbstractImage
3
3
 
4
4
 
@@ -48,17 +48,18 @@ def grid(
48
48
  for z in range(0, z_dim, stride_z):
49
49
  for y in range(0, y_dim, stride_y):
50
50
  for x in range(0, x_dim, stride_x):
51
- roi = Roi.from_values(
51
+ roi = RoiPixels(
52
52
  name=base_name,
53
- slices={
54
- "x": (x, size_x),
55
- "y": (y, size_y),
56
- "z": (z, size_z),
57
- "t": (t, size_t),
58
- },
59
- space="pixel",
53
+ x=x,
54
+ y=y,
55
+ z=z,
56
+ t=t,
57
+ x_length=size_x,
58
+ y_length=size_y,
59
+ z_length=size_z,
60
+ t_length=size_t,
60
61
  )
61
- new_rois.append(roi.to_world(pixel_size=ref_image.pixel_size))
62
+ new_rois.append(roi.to_roi(pixel_size=ref_image.pixel_size))
62
63
 
63
64
  return rois_product(rois, new_rois)
64
65
 
ngio/hcs/_plate.py CHANGED
@@ -15,16 +15,15 @@ from ngio.images import (
15
15
  list_image_tables_async,
16
16
  )
17
17
  from ngio.ome_zarr_meta import (
18
- DefaultNgffVersion,
19
18
  ImageInWellPath,
20
19
  NgffVersions,
21
20
  NgioPlateMeta,
22
21
  NgioWellMeta,
23
- PlateMetaHandler,
24
- WellMetaHandler,
22
+ find_plate_meta_handler,
23
+ find_well_meta_handler,
24
+ get_plate_meta_handler,
25
+ get_well_meta_handler,
25
26
  path_in_well_validation,
26
- update_ngio_plate_meta,
27
- update_ngio_well_meta,
28
27
  )
29
28
  from ngio.tables import (
30
29
  ConditionTable,
@@ -42,22 +41,17 @@ from ngio.tables import (
42
41
  from ngio.utils import (
43
42
  AccessModeLiteral,
44
43
  NgioCache,
45
- NgioError,
46
44
  NgioValueError,
47
45
  StoreOrGroup,
48
46
  ZarrGroupHandler,
49
47
  )
50
48
 
51
49
 
52
- def _try_get_table_container(
53
- handler: ZarrGroupHandler, create_mode: bool = True
54
- ) -> TablesContainer | None:
50
+ def _default_table_container(handler: ZarrGroupHandler) -> TablesContainer | None:
55
51
  """Return a default table container."""
56
- try:
57
- table_handler = handler.get_handler("tables", create_mode=create_mode)
52
+ success, table_handler = handler.safe_derive_handler("tables")
53
+ if success and isinstance(table_handler, ZarrGroupHandler):
58
54
  return TablesContainer(table_handler)
59
- except NgioError:
60
- return None
61
55
 
62
56
 
63
57
  # Mock lock class that does nothing
@@ -83,7 +77,7 @@ class OmeZarrWell:
83
77
  group_handler: The Zarr group handler that contains the Well.
84
78
  """
85
79
  self._group_handler = group_handler
86
- self._meta_handler = WellMetaHandler(group_handler)
80
+ self._meta_handler = find_well_meta_handler(group_handler)
87
81
 
88
82
  def __repr__(self) -> str:
89
83
  """Return a string representation of the well."""
@@ -97,7 +91,7 @@ class OmeZarrWell:
97
91
  @property
98
92
  def meta(self):
99
93
  """Return the metadata."""
100
- return self._meta_handler.get_meta()
94
+ return self._meta_handler.meta
101
95
 
102
96
  @property
103
97
  def acquisition_ids(self) -> list[int]:
@@ -143,7 +137,7 @@ class OmeZarrWell:
143
137
  Returns:
144
138
  OmeZarrContainer: The image.
145
139
  """
146
- handler = self._group_handler.get_handler(image_path)
140
+ handler = self._group_handler.derive_handler(image_path)
147
141
  return OmeZarrContainer(handler)
148
142
 
149
143
  def _add_image(
@@ -165,7 +159,7 @@ class OmeZarrWell:
165
159
  meta = self.meta.add_image(
166
160
  path=image_path, acquisition=acquisition_id, strict=strict
167
161
  )
168
- self.meta_handler.update_meta(meta)
162
+ self.meta_handler.write_meta(meta)
169
163
  self.meta_handler._group_handler.clean_cache()
170
164
 
171
165
  return self._group_handler.get_group(image_path, create_mode=True)
@@ -244,7 +238,7 @@ class OmeZarrPlate:
244
238
  table_container: The tables container that contains plate level tables.
245
239
  """
246
240
  self._group_handler = group_handler
247
- self._meta_handler = PlateMetaHandler(group_handler)
241
+ self._meta_handler = find_plate_meta_handler(group_handler)
248
242
  self._tables_container = table_container
249
243
  self._wells_cache: NgioCache[OmeZarrWell] = NgioCache(
250
244
  use_cache=self._group_handler.use_cache
@@ -265,7 +259,7 @@ class OmeZarrPlate:
265
259
  @property
266
260
  def meta(self):
267
261
  """Return the metadata."""
268
- return self._meta_handler.get_meta()
262
+ return self._meta_handler.meta
269
263
 
270
264
  @property
271
265
  def columns(self) -> list[str]:
@@ -383,7 +377,7 @@ class OmeZarrPlate:
383
377
  if cached_well is not None:
384
378
  return cached_well
385
379
 
386
- group_handler = self._group_handler.get_handler(well_path)
380
+ group_handler = self._group_handler.derive_handler(well_path)
387
381
  self._wells_cache.set(well_path, OmeZarrWell(group_handler))
388
382
  return OmeZarrWell(group_handler)
389
383
 
@@ -444,7 +438,7 @@ class OmeZarrPlate:
444
438
  cached_image = self._images_cache.get(image_path)
445
439
  if cached_image is not None:
446
440
  return cached_image
447
- img_group_handler = self._group_handler.get_handler(image_path)
441
+ img_group_handler = self._group_handler.derive_handler(image_path)
448
442
  image = OmeZarrContainer(img_group_handler)
449
443
  self._images_cache.set(image_path, image)
450
444
  return image
@@ -535,7 +529,7 @@ class OmeZarrPlate:
535
529
  for image_paths in self.well_images_paths(
536
530
  row=row, column=column, acquisition=acquisition
537
531
  ):
538
- group_handler = self._group_handler.get_handler(image_paths)
532
+ group_handler = self._group_handler.derive_handler(image_paths)
539
533
  images[image_paths] = OmeZarrContainer(group_handler)
540
534
  return images
541
535
 
@@ -564,11 +558,11 @@ class OmeZarrPlate:
564
558
  meta = meta.add_acquisition(
565
559
  acquisition_id=acquisition_id, acquisition_name=acquisition_name
566
560
  )
567
- self.meta_handler.update_meta(meta)
561
+ self.meta_handler.write_meta(meta)
568
562
  self.meta_handler._group_handler.clean_cache()
569
563
 
570
564
  well_path = self.meta.get_well_path(row=row, column=column)
571
- group_handler = self._group_handler.get_handler(well_path)
565
+ group_handler = self._group_handler.derive_handler(well_path)
572
566
 
573
567
  if atomic:
574
568
  well_lock = group_handler.lock
@@ -583,19 +577,18 @@ class OmeZarrPlate:
583
577
  well_meta = NgioWellMeta.default_init()
584
578
  version = self.meta.plate.version
585
579
  version = version if version is not None else "0.4"
586
- update_ngio_well_meta(group_handler, well_meta)
587
- meta_handler = WellMetaHandler(group_handler=group_handler)
580
+ meta_handler = get_well_meta_handler(group_handler, version=version)
588
581
  else:
589
- meta_handler = WellMetaHandler(group_handler=group_handler)
590
- well_meta = meta_handler.get_meta()
582
+ meta_handler = find_well_meta_handler(group_handler)
583
+ well_meta = meta_handler.meta
591
584
 
592
- group_handler = self._group_handler.get_handler(well_path)
585
+ group_handler = self._group_handler.derive_handler(well_path)
593
586
 
594
587
  if image_path is not None:
595
588
  well_meta = well_meta.add_image(
596
589
  path=image_path, acquisition=acquisition_id, strict=False
597
590
  )
598
- meta_handler.update_meta(well_meta)
591
+ meta_handler.write_meta(well_meta)
599
592
  meta_handler._group_handler.clean_cache()
600
593
 
601
594
  if image_path is not None:
@@ -672,7 +665,7 @@ class OmeZarrPlate:
672
665
  ) -> "OmeZarrPlate":
673
666
  """Add a column to an ome-zarr plate."""
674
667
  meta, _ = self.meta.add_column(column)
675
- self.meta_handler.update_meta(meta)
668
+ self.meta_handler.write_meta(meta)
676
669
  self.meta_handler._group_handler.clean_cache()
677
670
  return self
678
671
 
@@ -682,7 +675,7 @@ class OmeZarrPlate:
682
675
  ) -> "OmeZarrPlate":
683
676
  """Add a row to an ome-zarr plate."""
684
677
  meta, _ = self.meta.add_row(row)
685
- self.meta_handler.update_meta(meta)
678
+ self.meta_handler.write_meta(meta)
686
679
  self.meta_handler._group_handler.clean_cache()
687
680
  return self
688
681
 
@@ -702,7 +695,7 @@ class OmeZarrPlate:
702
695
  meta = self.meta.add_acquisition(
703
696
  acquisition_id=acquisition_id, acquisition_name=acquisition_name
704
697
  )
705
- self.meta_handler.update_meta(meta)
698
+ self.meta_handler.write_meta(meta)
706
699
  self.meta_handler._group_handler.clean_cache()
707
700
  return self
708
701
 
@@ -721,7 +714,7 @@ class OmeZarrPlate:
721
714
  with plate_lock:
722
715
  meta = self.meta
723
716
  meta = meta.remove_well(row, column)
724
- self.meta_handler.update_meta(meta)
717
+ self.meta_handler.write_meta(meta)
725
718
  self.meta_handler._group_handler.clean_cache()
726
719
 
727
720
  def _remove_image(
@@ -742,7 +735,7 @@ class OmeZarrPlate:
742
735
  with well_lock:
743
736
  well_meta = well.meta
744
737
  well_meta = well_meta.remove_image(path=image_path)
745
- well.meta_handler.update_meta(well_meta)
738
+ well.meta_handler.write_meta(well_meta)
746
739
  well.meta_handler._group_handler.clean_cache()
747
740
  if len(well_meta.paths()) == 0:
748
741
  self._remove_well(row, column, atomic=atomic)
@@ -779,8 +772,7 @@ class OmeZarrPlate:
779
772
  self,
780
773
  store: StoreOrGroup,
781
774
  plate_name: str | None = None,
782
- version: NgffVersions | None = None,
783
- ngff_version: NgffVersions = DefaultNgffVersion,
775
+ version: NgffVersions = "0.4",
784
776
  keep_acquisitions: bool = False,
785
777
  cache: bool = False,
786
778
  overwrite: bool = False,
@@ -790,8 +782,7 @@ class OmeZarrPlate:
790
782
  Args:
791
783
  store (StoreOrGroup): The Zarr store or group that stores the plate.
792
784
  plate_name (str | None): The name of the new plate.
793
- version (NgffVersion | None): Deprecated. Please use 'ngff_version' instead.
794
- ngff_version (NgffVersion): The NGFF version to use for the new plate.
785
+ version (NgffVersion): The version of the new plate.
795
786
  keep_acquisitions (bool): Whether to keep the acquisitions in the new plate.
796
787
  cache (bool): Whether to use a cache for the zarr group metadata.
797
788
  overwrite (bool): Whether to overwrite the existing plate.
@@ -800,21 +791,19 @@ class OmeZarrPlate:
800
791
  ome_zarr_plate=self,
801
792
  store=store,
802
793
  plate_name=plate_name,
803
- ngff_version=ngff_version,
804
794
  version=version,
805
795
  keep_acquisitions=keep_acquisitions,
806
796
  cache=cache,
807
797
  overwrite=overwrite,
808
798
  )
809
799
 
810
- def _get_tables_container(self, create_mode: bool = True) -> TablesContainer | None:
800
+ def _get_tables_container(self) -> TablesContainer | None:
811
801
  """Return the tables container."""
812
- if self._tables_container is not None:
813
- return self._tables_container
814
- _tables_container = _try_get_table_container(
815
- self._group_handler, create_mode=create_mode
816
- )
817
- self._tables_container = _tables_container
802
+ if self._tables_container is None:
803
+ _tables_container = _default_table_container(self._group_handler)
804
+ if _tables_container is None:
805
+ return None
806
+ self._tables_container = _tables_container
818
807
  return self._tables_container
819
808
 
820
809
  @property
@@ -829,20 +818,17 @@ class OmeZarrPlate:
829
818
 
830
819
  def list_tables(self, filter_types: TypedTable | str | None = None) -> list[str]:
831
820
  """List all tables in the image."""
832
- _tables_container = self._get_tables_container(create_mode=False)
833
- if _tables_container is None:
834
- return []
835
821
  return self.tables_container.list(filter_types=filter_types)
836
822
 
837
823
  def list_roi_tables(self) -> list[str]:
838
824
  """List all ROI tables in the image."""
839
- roi = self.tables_container.list(
840
- filter_types="roi_table",
841
- )
842
825
  masking_roi = self.tables_container.list(
843
826
  filter_types="masking_roi_table",
844
827
  )
845
- return roi + masking_roi
828
+ roi = self.tables_container.list(
829
+ filter_types="roi_table",
830
+ )
831
+ return masking_roi + roi
846
832
 
847
833
  def get_roi_table(self, name: str) -> RoiTable:
848
834
  """Get a ROI table from the image.
@@ -919,8 +905,8 @@ class OmeZarrPlate:
919
905
  """
920
906
  if check_type is not None:
921
907
  warnings.warn(
922
- "The 'check_type' argument is deprecated and will be removed in "
923
- "ngio=0.6. Please use 'get_table_as' instead or one of the "
908
+ "The 'check_type' argument is deprecated, and will be removed in "
909
+ "ngio=0.3. Use 'get_table_as' instead or one of the "
924
910
  "type specific get_*table() methods.",
925
911
  DeprecationWarning,
926
912
  stacklevel=2,
@@ -959,25 +945,6 @@ class OmeZarrPlate:
959
945
  name=name, table=table, backend=backend, overwrite=overwrite
960
946
  )
961
947
 
962
- def delete_table(self, name: str, missing_ok: bool = False) -> None:
963
- """Delete a table from the group.
964
-
965
- Args:
966
- name (str): The name of the table to delete.
967
- missing_ok (bool): If True, do not raise an error if the table does not
968
- exist.
969
-
970
- """
971
- table_container = self._get_tables_container(create_mode=False)
972
- if table_container is None and missing_ok:
973
- return
974
- if table_container is None:
975
- raise NgioValueError(
976
- f"No tables found in the image, cannot delete {name}. "
977
- "Set missing_ok=True to ignore this error."
978
- )
979
- table_container.delete(name=name, missing_ok=missing_ok)
980
-
981
948
  def list_image_tables(
982
949
  self,
983
950
  acquisition: int | None = None,
@@ -1180,24 +1147,14 @@ def open_ome_zarr_plate(
1180
1147
  def _create_empty_plate_from_meta(
1181
1148
  store: StoreOrGroup,
1182
1149
  meta: NgioPlateMeta,
1150
+ version: NgffVersions = "0.4",
1183
1151
  overwrite: bool = False,
1184
1152
  ) -> ZarrGroupHandler:
1185
- """Create an empty OME-Zarr plate from metadata.
1186
-
1187
- Args:
1188
- store: The Zarr store or group to create the plate in.
1189
- meta: The plate metadata to use.
1190
- overwrite: Whether to overwrite an existing plate.
1191
-
1192
- Returns:
1193
- The ZarrGroupHandler for the created plate.
1194
- """
1153
+ """Create an empty OME-Zarr plate from metadata."""
1195
1154
  mode = "w" if overwrite else "w-"
1196
- zarr_format = 2 if meta.plate.version == "0.4" else 3
1197
- group_handler = ZarrGroupHandler(
1198
- store=store, cache=True, mode=mode, zarr_format=zarr_format
1199
- )
1200
- update_ngio_plate_meta(group_handler, meta)
1155
+ group_handler = ZarrGroupHandler(store=store, cache=True, mode=mode)
1156
+ meta_handler = get_plate_meta_handler(group_handler, version=version)
1157
+ meta_handler.write_meta(meta)
1201
1158
  return group_handler
1202
1159
 
1203
1160
 
@@ -1205,8 +1162,7 @@ def create_empty_plate(
1205
1162
  store: StoreOrGroup,
1206
1163
  name: str,
1207
1164
  images: list[ImageInWellPath] | None = None,
1208
- version: NgffVersions | None = None,
1209
- ngff_version: NgffVersions = DefaultNgffVersion,
1165
+ version: NgffVersions = "0.4",
1210
1166
  cache: bool = False,
1211
1167
  overwrite: bool = False,
1212
1168
  ) -> OmeZarrPlate:
@@ -1217,26 +1173,18 @@ def create_empty_plate(
1217
1173
  name (str): The name of the plate.
1218
1174
  images (list[ImageInWellPath] | None): A list of images to add to the plate.
1219
1175
  If None, no images are added. Defaults to None.
1220
- version (NgffVersion | None): Deprecated. Please use 'ngff_version' instead.
1221
- ngff_version (NgffVersion): The NGFF version to use for the new plate.
1176
+ version (NgffVersion): The version of the new plate.
1222
1177
  cache (bool): Whether to use a cache for the zarr group metadata.
1223
1178
  overwrite (bool): Whether to overwrite the existing plate.
1224
1179
  """
1225
- if version is not None:
1226
- warnings.warn(
1227
- "The 'version' argument is deprecated and will be removed in ngio=0.6. "
1228
- "Please use 'ngff_version' instead.",
1229
- DeprecationWarning,
1230
- stacklevel=2,
1231
- )
1232
- ngff_version = version
1233
1180
  plate_meta = NgioPlateMeta.default_init(
1234
1181
  name=name,
1235
- ngff_version=ngff_version,
1182
+ version=version,
1236
1183
  )
1237
1184
  group_handler = _create_empty_plate_from_meta(
1238
1185
  store=store,
1239
1186
  meta=plate_meta,
1187
+ version=version,
1240
1188
  overwrite=overwrite,
1241
1189
  )
1242
1190
 
@@ -1261,8 +1209,7 @@ def derive_ome_zarr_plate(
1261
1209
  ome_zarr_plate: OmeZarrPlate,
1262
1210
  store: StoreOrGroup,
1263
1211
  plate_name: str | None = None,
1264
- version: NgffVersions | None = None,
1265
- ngff_version: NgffVersions = DefaultNgffVersion,
1212
+ version: NgffVersions = "0.4",
1266
1213
  keep_acquisitions: bool = False,
1267
1214
  cache: bool = False,
1268
1215
  overwrite: bool = False,
@@ -1273,33 +1220,24 @@ def derive_ome_zarr_plate(
1273
1220
  ome_zarr_plate (OmeZarrPlate): The existing OME-Zarr plate.
1274
1221
  store (StoreOrGroup): The Zarr store or group that stores the plate.
1275
1222
  plate_name (str | None): The name of the new plate.
1276
- version (NgffVersion | None): Deprecated. Please use 'ngff_version' instead.
1277
- ngff_version (NgffVersion): The NGFF version to use for the new plate.
1223
+ version (NgffVersion): The version of the new plate.
1278
1224
  keep_acquisitions (bool): Whether to keep the acquisitions in the new plate.
1279
1225
  cache (bool): Whether to use a cache for the zarr group metadata.
1280
1226
  overwrite (bool): Whether to overwrite the existing plate.
1281
1227
  """
1282
- if version is not None:
1283
- warnings.warn(
1284
- "The 'version' argument is deprecated and will be removed in ngio=0.6. "
1285
- "Please use 'ngff_version' instead.",
1286
- DeprecationWarning,
1287
- stacklevel=2,
1288
- )
1289
- ngff_version = version
1290
-
1291
1228
  if plate_name is None:
1292
1229
  plate_name = ome_zarr_plate.meta.plate.name
1293
1230
 
1294
1231
  new_meta = ome_zarr_plate.meta.derive(
1295
1232
  name=plate_name,
1296
- ngff_version=ngff_version,
1233
+ version=version,
1297
1234
  keep_acquisitions=keep_acquisitions,
1298
1235
  )
1299
1236
  _ = _create_empty_plate_from_meta(
1300
1237
  store=store,
1301
1238
  meta=new_meta,
1302
1239
  overwrite=overwrite,
1240
+ version=version,
1303
1241
  )
1304
1242
  return open_ome_zarr_plate(
1305
1243
  store=store,
@@ -1330,8 +1268,7 @@ def open_ome_zarr_well(
1330
1268
 
1331
1269
  def create_empty_well(
1332
1270
  store: StoreOrGroup,
1333
- version: NgffVersions | None = None,
1334
- ngff_version: NgffVersions = DefaultNgffVersion,
1271
+ version: NgffVersions = "0.4",
1335
1272
  cache: bool = False,
1336
1273
  overwrite: bool = False,
1337
1274
  ) -> OmeZarrWell:
@@ -1339,25 +1276,16 @@ def create_empty_well(
1339
1276
 
1340
1277
  Args:
1341
1278
  store (StoreOrGroup): The Zarr store or group that stores the well.
1342
- version (NgffVersion | None): Deprecated. Please use 'ngff_version' instead.
1343
- ngff_version (NgffVersion): The version of the new well.
1279
+ version (NgffVersion): The version of the new well.
1344
1280
  cache (bool): Whether to use a cache for the zarr group metadata.
1345
1281
  overwrite (bool): Whether to overwrite the existing well.
1346
1282
  """
1347
- if version is not None:
1348
- warnings.warn(
1349
- "The 'version' argument is deprecated and will be removed in ngio=0.6. "
1350
- "Please use 'ngff_version' instead.",
1351
- DeprecationWarning,
1352
- stacklevel=2,
1353
- )
1354
- ngff_version = version
1355
1283
  group_handler = ZarrGroupHandler(
1356
1284
  store=store, cache=True, mode="w" if overwrite else "w-"
1357
1285
  )
1358
- update_ngio_well_meta(
1359
- group_handler, NgioWellMeta.default_init(ngff_version=ngff_version)
1360
- )
1286
+ meta_handler = get_well_meta_handler(group_handler, version=version)
1287
+ meta = NgioWellMeta.default_init()
1288
+ meta_handler.write_meta(meta)
1361
1289
 
1362
1290
  return open_ome_zarr_well(
1363
1291
  store=store,