From 884f5db5ed2b305a4d3fd3ecb6bc5f04d20ebde0 Mon Sep 17 00:00:00 2001 From: JacksonMaxfield Date: Mon, 9 Aug 2021 15:20:35 -0700 Subject: [PATCH 1/2] Switch from base TiffTags to Dict[int, Any] --- aicsimageio/readers/ome_tiff_reader.py | 4 +-- aicsimageio/readers/tiff_reader.py | 45 +++++++++++++++----------- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/aicsimageio/readers/ome_tiff_reader.py b/aicsimageio/readers/ome_tiff_reader.py index 8c02229e7..6bbacdbb1 100644 --- a/aicsimageio/readers/ome_tiff_reader.py +++ b/aicsimageio/readers/ome_tiff_reader.py @@ -331,7 +331,7 @@ def _read_delayed(self) -> xr.DataArray: with self._fs.open(self._path) as open_resource: with TiffFile(open_resource) as tiff: # Get unprocessed metadata from tags - tiff_tags = self._get_tiff_tags(tiff) + tiff_tags = self._get_tiff_tags() # Unpack dims and coords from OME dims, coords = self._get_dims_and_coords_from_ome( @@ -373,7 +373,7 @@ def _read_immediate(self) -> xr.DataArray: with self._fs.open(self._path) as open_resource: with TiffFile(open_resource) as tiff: # Get unprocessed metadata from tags - tiff_tags = self._get_tiff_tags(tiff) + tiff_tags = self._get_tiff_tags() # Unpack dims and coords from OME dims, coords = self._get_dims_and_coords_from_ome( diff --git a/aicsimageio/readers/tiff_reader.py b/aicsimageio/readers/tiff_reader.py index a2db7d40c..5858e3bfb 100644 --- a/aicsimageio/readers/tiff_reader.py +++ b/aicsimageio/readers/tiff_reader.py @@ -155,23 +155,30 @@ def _get_image_data( The image chunk as a numpy array. """ with fs.open(path) as open_resource: - arr = da.from_zarr( - imread( - open_resource, aszarr=True, series=scene, level=0, chunkmode="page" - ) - ) - arr = arr.transpose(transpose_indices) + with imread( + open_resource, aszarr=True, series=scene, level=0, chunkmode="page" + ) as store: + arr = da.from_zarr(store) + arr = arr.transpose(transpose_indices) + + # By setting the compute call to always use a "synchronous" scheduler, + # it informs Dask not to look for an existing scheduler / client + # and instead simply read the data using the current thread / process. + # In doing so, we shouldn't run into any worker data transfer and + # handoff _during_ a read. + return arr[retrieve_indices].compute(scheduler="synchronous") + + def _get_tiff_tags(self) -> TiffTags: + with self._fs.open(self._path) as open_resource: + with TiffFile(open_resource) as tiff: + unprocessed_tags = tiff.series[self.current_scene_index].pages[0].tags - # By setting the compute call to always use a "synchronous" scheduler, - # it informs Dask not to look for an existing scheduler / client - # and instead simply read the data using the current thread / process. - # - # In doing so, we shouldn't run into any worker data transfer and handoff - # _during_ a read. - return arr[retrieve_indices].compute(scheduler="synchronous") + # Create dict of tag and value + tags: Dict[int, str] = {} + for code, tag in unprocessed_tags.items(): + tags[code] = tag.value - def _get_tiff_tags(self, tiff: TiffFile) -> TiffTags: - return tiff.series[self.current_scene_index].pages[0].tags + return tags @staticmethod def _merge_dim_guesses(dims_from_meta: str, guessed_dims: str) -> str: @@ -431,7 +438,7 @@ def _read_delayed(self) -> xr.DataArray: image_data = self._create_dask_array(tiff, dims) # Get unprocessed metadata from tags - tiff_tags = self._get_tiff_tags(tiff) + tiff_tags = self._get_tiff_tags() # Get channel names for this scene or generate channels = self._get_channel_names_for_scene(image_data.shape, dims) @@ -450,7 +457,7 @@ def _read_delayed(self) -> xr.DataArray: constants.METADATA_UNPROCESSED: tiff_tags, constants.METADATA_PROCESSED: tiff_tags[ TIFF_IMAGE_DESCRIPTION_TAG_INDEX - ].value, + ], } except KeyError: attrs = {constants.METADATA_UNPROCESSED: tiff_tags} @@ -486,7 +493,7 @@ def _read_immediate(self) -> xr.DataArray: image_data = tiff.series[self.current_scene_index].asarray() # Get unprocessed metadata from tags - tiff_tags = self._get_tiff_tags(tiff) + tiff_tags = self._get_tiff_tags() # Get channel names for this scene or generate channels = self._get_channel_names_for_scene(image_data.shape, dims) @@ -505,7 +512,7 @@ def _read_immediate(self) -> xr.DataArray: constants.METADATA_UNPROCESSED: tiff_tags, constants.METADATA_PROCESSED: tiff_tags[ TIFF_IMAGE_DESCRIPTION_TAG_INDEX - ].value, + ], } except KeyError: attrs = {constants.METADATA_UNPROCESSED: tiff_tags} From 13badef9f7c2950e91687a20356e703232ff347b Mon Sep 17 00:00:00 2001 From: JacksonMaxfield Date: Mon, 9 Aug 2021 15:25:34 -0700 Subject: [PATCH 2/2] No need to re-init the file pointer --- aicsimageio/readers/ome_tiff_reader.py | 4 ++-- aicsimageio/readers/tiff_reader.py | 18 ++++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/aicsimageio/readers/ome_tiff_reader.py b/aicsimageio/readers/ome_tiff_reader.py index 6bbacdbb1..8c02229e7 100644 --- a/aicsimageio/readers/ome_tiff_reader.py +++ b/aicsimageio/readers/ome_tiff_reader.py @@ -331,7 +331,7 @@ def _read_delayed(self) -> xr.DataArray: with self._fs.open(self._path) as open_resource: with TiffFile(open_resource) as tiff: # Get unprocessed metadata from tags - tiff_tags = self._get_tiff_tags() + tiff_tags = self._get_tiff_tags(tiff) # Unpack dims and coords from OME dims, coords = self._get_dims_and_coords_from_ome( @@ -373,7 +373,7 @@ def _read_immediate(self) -> xr.DataArray: with self._fs.open(self._path) as open_resource: with TiffFile(open_resource) as tiff: # Get unprocessed metadata from tags - tiff_tags = self._get_tiff_tags() + tiff_tags = self._get_tiff_tags(tiff) # Unpack dims and coords from OME dims, coords = self._get_dims_and_coords_from_ome( diff --git a/aicsimageio/readers/tiff_reader.py b/aicsimageio/readers/tiff_reader.py index 5858e3bfb..d96b89b9f 100644 --- a/aicsimageio/readers/tiff_reader.py +++ b/aicsimageio/readers/tiff_reader.py @@ -168,15 +168,13 @@ def _get_image_data( # handoff _during_ a read. return arr[retrieve_indices].compute(scheduler="synchronous") - def _get_tiff_tags(self) -> TiffTags: - with self._fs.open(self._path) as open_resource: - with TiffFile(open_resource) as tiff: - unprocessed_tags = tiff.series[self.current_scene_index].pages[0].tags + def _get_tiff_tags(self, tiff: TiffFile) -> TiffTags: + unprocessed_tags = tiff.series[self.current_scene_index].pages[0].tags - # Create dict of tag and value - tags: Dict[int, str] = {} - for code, tag in unprocessed_tags.items(): - tags[code] = tag.value + # Create dict of tag and value + tags: Dict[int, str] = {} + for code, tag in unprocessed_tags.items(): + tags[code] = tag.value return tags @@ -438,7 +436,7 @@ def _read_delayed(self) -> xr.DataArray: image_data = self._create_dask_array(tiff, dims) # Get unprocessed metadata from tags - tiff_tags = self._get_tiff_tags() + tiff_tags = self._get_tiff_tags(tiff) # Get channel names for this scene or generate channels = self._get_channel_names_for_scene(image_data.shape, dims) @@ -493,7 +491,7 @@ def _read_immediate(self) -> xr.DataArray: image_data = tiff.series[self.current_scene_index].asarray() # Get unprocessed metadata from tags - tiff_tags = self._get_tiff_tags() + tiff_tags = self._get_tiff_tags(tiff) # Get channel names for this scene or generate channels = self._get_channel_names_for_scene(image_data.shape, dims)