1. Reading Microscopy Data in Python#
Choosing the right Python library for microscopy data analysis is crucial for optimizing workflow efficiency and gaining valuable insights. This guide offers a comprehensive overview of available libraries, helping you make informed decisions based on your priorities, whether it’s speed, versatility, or integration with other tools. Empower your microscopy data analysis by exploring the options tailored to meet your specific requirements.
For opening microscopy data files in Python, you have several options, each with its own advantages. Here’s a breakdown of the options and some considerations:
scikit-image (skimage.io.imread and skimage.io.imread_collection):
Used for reading standard image formats.
Provides simple and efficient functions for reading individual images or collections of images.
tifffile (tifffile.TiffFile and tifffile.TiffSequence):
Specialized for working with TIFF files, including multi-dimensional arrays.
TiffSequence is useful for handling sequences of TIFF files.
bioformats (bioformats.ImageReader):
Supports a variety of microscopy formats, especially those using the OME data model.
Handles multi-dimensional data and can read metadata.
Regarding ImageJ hyperstack organization (TZCYXS):
T: Time
Z: Z-stack (slices)
C: Channels
Y: Height
X: Width
S: Series (used for distinguishing multiple acquisitions)
For Holoviews:
It’s used for interactive visualization but doesn’t directly handle file reading. Check for memmap support and disk reading capabilities.
Regarding Bioformats standard:
Bioformats follows the OME (Open Microscopy Environment) standard, where each channel and time point is stored in a separate TIFF file. An OME.tif typically contains a single plane or a Z-stack.
About tiles and 5D in Bioformats:
In the context of Bioformats, 5D typically refers to a dataset with dimensions T-Z-C-Y-X, where T is time, Z is the z-stack, C is the channel, and Y and X are spatial dimensions. Tiles may refer to sub-images or chunks of the larger image, which can be useful for efficiently working with large datasets.
The 6D, 7D, and 8D configurations in Bioformats likely involve additional dimensions or parameters specific to certain types of microscopy data.
To understand the exact definition of 5D in Bioformats, you should refer to the Bioformats documentation or OME data model specifications for detailed information on how these dimensions are interpreted and utilized in the context of microscopy data.
1.1. Data Path Assignment and Imports#
To begin our analysis, we first need to import the necessary libraries and assign the path to our data files. This step ensures that we have access to the tools and resources required for the subsequent tasks.
Let’s get started by executing the following code:
[1]:
%load_ext autoreload
%autoreload 2
from pathlib import Path
import skimage.io
import tifffile
import nima_io.read as ir
tdata = Path("../../tests/data/")
lif = tdata / "2015Aug28_TransHXB2_50min+DMSO.lif"
img_tile = tdata / "t4_1.tif" # C=3 T=4 S=15
img_void_tile = tdata / "tile6_1.tif" # C=4 T=3 S=14 scattered
# imgsingle = tdata / "exp2_2.tif" # C=2 T=81
# mcts = tdata / "multi-channel-time-series.ome.tif" # C=3 T=7
# bigtiff = tdata / "LC26GFP_1.tf8" # bigtiff
slif = str(lif)
simg_tile = str(img_tile)
simg_void_tile = str(img_void_tile)
# simgsingle = str(imgsingle)
# smcts = str(mcts)
# sbigtiff = str(bigtiff)
1.2. Skimage and Tifffile#
scikit-image
serves as a versatile option for general image reading, encompassing various formats, including TIFF. Meanwhile tifffile
stands out for its capabilities in managing sequences, OME metadata, memory mapping, and Zarr arrays specifically for TIFF data files.
Memory mapping
memmap
enables efficient work with large files by mapping portions into memory as needed, without loading the entire file.Zarr
storage format, known for its handling of chunked, compressed, and n-dimensional arrays. This provides flexibility in reading and writing Zarr arrays, contributing to the library’s versatility in managing microscopy datasets, especially those with large or complex structures.
[2]:
t1 = skimage.io.imread(img_tile, plugin="tifffile")
t2 = skimage.io.imread(img_void_tile, plugin="tifffile")
t1.shape, t2.shape
/tmp/ipykernel_4412/3133617244.py:1: FutureWarning: The plugin infrastructure in `skimage.io` and the parameter `plugin` are deprecated since version 0.25 and will be removed in 0.27 (or later). To avoid this warning, please do not use the parameter `plugin`. Instead, use `imageio` or other I/O packages directly. See also `imread`.
t1 = skimage.io.imread(img_tile, plugin="tifffile")
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
/tmp/ipykernel_4412/3133617244.py in ?()
----> 1 t1 = skimage.io.imread(img_tile, plugin="tifffile")
2 t2 = skimage.io.imread(img_void_tile, plugin="tifffile")
3 t1.shape, t2.shape
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/skimage/_shared/utils.py in ?(*args, **kwargs)
324 elif self.new_name is not None:
325 # Assign old value to new one
326 kwargs[self.new_name] = deprecated_value
327
--> 328 return func(*args, **kwargs)
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/skimage/io/_io.py in ?(fname, as_gray, plugin, **plugin_args)
78 if fname.lower().endswith(('.tiff', '.tif')):
79 plugin = 'tifffile'
80
81 with file_or_url_context(fname) as fname, _hide_plugin_deprecation_warnings():
---> 82 img = call_plugin('imread', fname, plugin=plugin, **plugin_args)
83
84 if not hasattr(img, 'ndim'):
85 return img
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/skimage/_shared/utils.py in ?(*args, **kwargs)
534 @functools.wraps(func)
535 def wrapped(*args, **kwargs):
536 stacklevel = 1 + self.get_stack_length(func) - stack_rank
537 warnings.warn(message, category=FutureWarning, stacklevel=stacklevel)
--> 538 return func(*args, **kwargs)
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/skimage/io/manage_plugins.py in ?(kind, *args, **kwargs)
250 func = [f for (p, f) in plugin_funcs if p == plugin][0]
251 except IndexError:
252 raise RuntimeError(f'Could not find the plugin "{plugin}" for {kind}.')
253
--> 254 return func(*args, **kwargs)
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/skimage/io/_plugins/tifffile_plugin.py in ?(fname, **kwargs)
70 """
71 if 'img_num' in kwargs:
72 kwargs['key'] = kwargs.pop('img_num')
73
---> 74 return tifffile_imread(fname, **kwargs)
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/tifffile/tifffile.py in ?(files, selection, aszarr, key, series, level, squeeze, maxworkers, buffersize, mode, name, offset, size, pattern, axesorder, categories, imread, imreadargs, sort, container, chunkshape, chunkdtype, axestiled, ioworkers, chunkmode, fillvalue, zattrs, multiscales, omexml, out, out_inplace, _multifile, _useframes, **kwargs)
1207 ):
1208 files = files[0]
1209
1210 if isinstance(files, str) or not isinstance(files, Sequence):
-> 1211 with TiffFile(
1212 files,
1213 mode=mode,
1214 name=name,
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/tifffile/tifffile.py in ?(self, file, mode, name, offset, size, omexml, _multifile, _useframes, _parent, **is_flags)
4285 raise ValueError('invalid OME-XML')
4286 self._omexml = omexml
4287 self.is_ome = True
4288
-> 4289 fh = FileHandle(file, mode=mode, name=name, offset=offset, size=size)
4290 self._fh = fh
4291 self._multifile = True if _multifile is None else bool(_multifile)
4292 self._files = {fh.name: self}
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/tifffile/tifffile.py in ?(self, file, mode, name, offset, size)
13343 self._offset = -1 if offset is None else offset
13344 self._size = -1 if size is None else size
13345 self._close = True
13346 self._lock = NullContext()
> 13347 self.open()
13348 assert self._fh is not None
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/tifffile/tifffile.py in ?(self)
13362 if self._mode not in {'rb', 'r+b', 'wb', 'xb'}:
13363 raise ValueError(f'invalid mode {self._mode}')
13364 self._file = os.path.realpath(self._file)
13365 self._dir, self._name = os.path.split(self._file)
> 13366 self._fh = open(self._file, self._mode, encoding=None)
13367 self._close = True
13368 self._offset = max(0, self._offset)
13369 elif isinstance(self._file, FileHandle):
FileNotFoundError: [Errno 2] No such file or directory: '/home/runner/work/nima_io/nima_io/tests/data/t4_1.tif'
[3]:
tf1 = tifffile.imread(img_tile)
tf2 = tifffile.imread(img_void_tile)
tf1.shape, tf2.shape
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
/tmp/ipykernel_4412/3090132194.py in ?()
----> 1 tf1 = tifffile.imread(img_tile)
2 tf2 = tifffile.imread(img_void_tile)
3 tf1.shape, tf2.shape
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/tifffile/tifffile.py in ?(files, selection, aszarr, key, series, level, squeeze, maxworkers, buffersize, mode, name, offset, size, pattern, axesorder, categories, imread, imreadargs, sort, container, chunkshape, chunkdtype, axestiled, ioworkers, chunkmode, fillvalue, zattrs, multiscales, omexml, out, out_inplace, _multifile, _useframes, **kwargs)
1207 ):
1208 files = files[0]
1209
1210 if isinstance(files, str) or not isinstance(files, Sequence):
-> 1211 with TiffFile(
1212 files,
1213 mode=mode,
1214 name=name,
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/tifffile/tifffile.py in ?(self, file, mode, name, offset, size, omexml, _multifile, _useframes, _parent, **is_flags)
4285 raise ValueError('invalid OME-XML')
4286 self._omexml = omexml
4287 self.is_ome = True
4288
-> 4289 fh = FileHandle(file, mode=mode, name=name, offset=offset, size=size)
4290 self._fh = fh
4291 self._multifile = True if _multifile is None else bool(_multifile)
4292 self._files = {fh.name: self}
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/tifffile/tifffile.py in ?(self, file, mode, name, offset, size)
13343 self._offset = -1 if offset is None else offset
13344 self._size = -1 if size is None else size
13345 self._close = True
13346 self._lock = NullContext()
> 13347 self.open()
13348 assert self._fh is not None
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/tifffile/tifffile.py in ?(self)
13362 if self._mode not in {'rb', 'r+b', 'wb', 'xb'}:
13363 raise ValueError(f'invalid mode {self._mode}')
13364 self._file = os.path.realpath(self._file)
13365 self._dir, self._name = os.path.split(self._file)
> 13366 self._fh = open(self._file, self._mode, encoding=None)
13367 self._close = True
13368 self._offset = max(0, self._offset)
13369 elif isinstance(self._file, FileHandle):
FileNotFoundError: [Errno 2] No such file or directory: '/home/runner/work/nima_io/nima_io/tests/data/t4_1.tif'
[4]:
fp1glob = str(tdata / "im1s1z3c5t_?.ome.tif")
tifs = tifffile.TiffSequence(fp1glob)
d = tifs.asarray()
print(d.shape)
print(tifs.shape)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/tmp/ipykernel_4412/2832391936.py in ?()
1 fp1glob = str(tdata / "im1s1z3c5t_?.ome.tif")
2
----> 3 tifs = tifffile.TiffSequence(fp1glob)
4 d = tifs.asarray()
5 print(d.shape)
6 print(tifs.shape)
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/tifffile/tifffile.py in ?(self, files, imread, **kwargs)
13059 *,
13060 imread: Callable[..., NDArray[Any]] = imread,
13061 **kwargs: Any,
13062 ) -> None:
> 13063 super().__init__(imread, '*.tif' if files is None else files, **kwargs)
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/tifffile/tifffile.py in ?(self, imread, files, container, sort, parse, **kwargs)
12777 files = sort_func(files)
12778
12779 files = [os.fspath(f) for f in files] # type: ignore[union-attr]
12780 if not files:
> 12781 raise ValueError('no files found')
12782
12783 if not callable(imread):
12784 raise ValueError('invalid imread function')
ValueError: no files found
[5]:
with tifffile.TiffFile(img_tile) as tif:
tag = tif.pages[0].tags["ImageDescription"]
tag.value[:1000]
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
/tmp/ipykernel_4412/3879889513.py in ?()
----> 1 with tifffile.TiffFile(img_tile) as tif:
2 tag = tif.pages[0].tags["ImageDescription"]
3
4 tag.value[:1000]
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/tifffile/tifffile.py in ?(self, file, mode, name, offset, size, omexml, _multifile, _useframes, _parent, **is_flags)
4285 raise ValueError('invalid OME-XML')
4286 self._omexml = omexml
4287 self.is_ome = True
4288
-> 4289 fh = FileHandle(file, mode=mode, name=name, offset=offset, size=size)
4290 self._fh = fh
4291 self._multifile = True if _multifile is None else bool(_multifile)
4292 self._files = {fh.name: self}
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/tifffile/tifffile.py in ?(self, file, mode, name, offset, size)
13343 self._offset = -1 if offset is None else offset
13344 self._size = -1 if size is None else size
13345 self._close = True
13346 self._lock = NullContext()
> 13347 self.open()
13348 assert self._fh is not None
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/tifffile/tifffile.py in ?(self)
13362 if self._mode not in {'rb', 'r+b', 'wb', 'xb'}:
13363 raise ValueError(f'invalid mode {self._mode}')
13364 self._file = os.path.realpath(self._file)
13365 self._dir, self._name = os.path.split(self._file)
> 13366 self._fh = open(self._file, self._mode, encoding=None)
13367 self._close = True
13368 self._offset = max(0, self._offset)
13369 elif isinstance(self._file, FileHandle):
FileNotFoundError: [Errno 2] No such file or directory: '/home/runner/work/nima_io/nima_io/tests/data/t4_1.tif'
1.3. nima_io#
1.3.1. read#
[6]:
md, wr = ir.read(simg_void_tile)
md.core, wr
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
Cell In[6], line 1
----> 1 md, wr = ir.read(simg_void_tile)
2 md.core, wr
File ~/work/nima_io/nima_io/src/nima_io/read.py:428, in read(filepath)
426 if not Path(filepath).is_file():
427 msg = f"File not found: {filepath}"
--> 428 raise FileNotFoundError(msg)
429 ensure_jvm()
430 channel_separator = jimport("loci.formats.ChannelSeparator")
FileNotFoundError: File not found: ../../tests/data/tile6_1.tif
[7]:
md.core.voxel_size
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[7], line 1
----> 1 md.core.voxel_size
NameError: name 'md' is not defined
[8]:
root = wr.rdr.getMetadataStoreRoot()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[8], line 1
----> 1 root = wr.rdr.getMetadataStoreRoot()
NameError: name 'wr' is not defined
[9]:
ome_store = wr.rdr.getMetadataStore()
ome_store
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[9], line 1
----> 1 ome_store = wr.rdr.getMetadataStore()
2 ome_store
NameError: name 'wr' is not defined
[10]:
get_power = ome_store.getArcPower(0, 4)
get_power
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[10], line 1
----> 1 get_power = ome_store.getArcPower(0, 4)
2 get_power
NameError: name 'ome_store' is not defined
[11]:
att = ome_store.getChannelLightSourceSettingsAttenuation(0, 0)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[11], line 1
----> 1 att = ome_store.getChannelLightSourceSettingsAttenuation(0, 0)
NameError: name 'ome_store' is not defined
[12]:
nmax = 7
(
len([md for md in md.full.items() if len(md[1][0][0]) == nmax]),
[md for md in md.full.items() if len(md[1][0][0]) == nmax],
)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[12], line 3
1 nmax = 7
2 (
----> 3 len([md for md in md.full.items() if len(md[1][0][0]) == nmax]),
4 [md for md in md.full.items() if len(md[1][0][0]) == nmax],
5 )
NameError: name 'md' is not defined
[13]:
list(range(4))
[13]:
[0, 1, 2, 3]
[14]:
[(0,) * n for n in range(3 + 1)]
[14]:
[(), (0,), (0, 0), (0, 0, 0)]
[15]:
ir.convert_java_numeric_field(att), ir.convert_java_numeric_field(get_power)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[15], line 1
----> 1 ir.convert_java_numeric_field(att), ir.convert_java_numeric_field(get_power)
AttributeError: module 'nima_io.read' has no attribute 'convert_java_numeric_field'
[16]:
{md.full.get(k)[0][0] for k in md.full}
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[16], line 1
----> 1 {md.full.get(k)[0][0] for k in md.full}
NameError: name 'md' is not defined
[17]:
[(k, md.full.get(k)[0]) for k in md.full if not md.full.get(k)[0][1]]
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[17], line 1
----> 1 [(k, md.full.get(k)[0]) for k in md.full if not md.full.get(k)[0][1]]
NameError: name 'md' is not defined
[18]:
ome_store.getRoot() == root
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[18], line 1
----> 1 ome_store.getRoot() == root
NameError: name 'ome_store' is not defined
[19]:
ome_store.getPlaneCount(4), ome_store.getPlaneTheC(4, 11), ome_store.getPixelsSizeZ(4)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[19], line 1
----> 1 ome_store.getPlaneCount(4), ome_store.getPlaneTheC(4, 11), ome_store.getPixelsSizeZ(4)
NameError: name 'ome_store' is not defined
[20]:
wr.rdr.getDimensionOrder(), ir.read(slif)[1].rdr.getDimensionOrder()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[20], line 1
----> 1 wr.rdr.getDimensionOrder(), ir.read(slif)[1].rdr.getDimensionOrder()
NameError: name 'wr' is not defined
Mind the difference between img_void_tile and lif files.
[21]:
md.full["PixelsDimensionOrder"]
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[21], line 1
----> 1 md.full["PixelsDimensionOrder"]
NameError: name 'md' is not defined
[22]:
root.getImage(0)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[22], line 1
----> 1 root.getImage(0)
NameError: name 'root' is not defined
[23]:
root.getImage(13).getPixels().getPlane(11).getTheC().getValue()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[23], line 1
----> 1 root.getImage(13).getPixels().getPlane(11).getTheC().getValue()
NameError: name 'root' is not defined
[24]:
(
root.getImage(13).getName(),
ir.read(slif)[1].rdr.getMetadataStoreRoot().getImage(2).getName(),
)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[24], line 2
1 (
----> 2 root.getImage(13).getName(),
3 ir.read(slif)[1].rdr.getMetadataStoreRoot().getImage(2).getName(),
4 )
NameError: name 'root' is not defined
[25]:
md.core.__dict__
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[25], line 1
----> 1 md.core.__dict__
NameError: name 'md' is not defined
[26]:
vars(md.core)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[26], line 1
----> 1 vars(md.core)
NameError: name 'md' is not defined
1.3.2. Stitch#
[27]:
f = ir.stitch(md.core, wr, c=2, t=2)
skimage.io.imshow(f)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[27], line 1
----> 1 f = ir.stitch(md.core, wr, c=2, t=2)
2 skimage.io.imshow(f)
NameError: name 'md' is not defined
[28]:
md.core.stage_position[2]
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[28], line 1
----> 1 md.core.stage_position[2]
NameError: name 'md' is not defined
1.4. nima_io.read#
function |
time (ms) |
note |
---|---|---|
read |
169 |
|
read_pims |
195 |
extra pims DIMS |
Metadata is now uniform across different reading functions.
In the following sections, various bioformats implementations are explored. None of the explored libraries return the numerous metadata linked to individual planes. Consequently, I have developed a small library to handle additional (often neglected) metadata, such as acquisition stage position (essential for reconstructing tiled images) and illumination and emission settings.
1.4.1. PIMS#
Which is currently unable to download loci_tools.jar.
I really like the frame metadata t_s, x_um, y_um and z_um. Every array (2D, 3D, …, n-D) having those metadata in common are contained in the Frame obj: a numpy array with metadata(dict) and frame_no(int).
Are fs.bundle_axes (fs.frame_shape), fs.iter_axes and fs.default_coords overcomplicated?
Anyway: iter=0 == iter=n which is at least unexpected.
[29]:
md_pims, wr_pims = ir.read_pims(img_void_tile)
md_pims.core.__dict__
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
Cell In[29], line 1
----> 1 md_pims, wr_pims = ir.read_pims(img_void_tile)
2 md_pims.core.__dict__
File ~/work/nima_io/nima_io/src/nima_io/read.py:479, in read_pims(filepath)
442 def read_pims(filepath: str) -> tuple[Metadata, ImageReaderWrapper]:
443 """Read metadata and initialize Bioformats reader using the pims library.
444
445 Parameters
(...) 477 (series, plane) where plane combines z, t and c?
478 """
--> 479 fs = pims.Bioformats(filepath)
480 core_md = CoreMetadata(fs.rdr)
481 md = Metadata(core_md, {}, {})
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/pims/bioformats.py:330, in BioformatsReader.__init__(self, filename, meta, java_memory, read_mode, series)
328 # Make sure that file exists before starting java
329 if not os.path.isfile(filename):
--> 330 raise IOError('The file "{}" does not exist.'.format(filename))
332 # Start java VM and initialize logger (globally)
333 if not jpype.isJVMStarted():
OSError: The file "../../tests/data/tile6_1.tif" does not exist.
[30]:
mdata = wr.rdr.getMetadataStore()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[30], line 1
----> 1 mdata = wr.rdr.getMetadataStore()
NameError: name 'wr' is not defined
[31]:
root = mdata.getRoot()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[31], line 1
----> 1 root = mdata.getRoot()
NameError: name 'mdata' is not defined
[32]:
im0 = root.getImage(0)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[32], line 1
----> 1 im0 = root.getImage(0)
NameError: name 'root' is not defined
[33]:
pixels = im0.getPixels()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[33], line 1
----> 1 pixels = im0.getPixels()
NameError: name 'im0' is not defined
[34]:
for idx in range(pixels.sizeOfTiffDataList()):
tiffData = pixels.getTiffData(idx)
c = tiffData.getFirstC().getValue().intValue()
t = tiffData.getFirstT().getValue().intValue()
print(f"TiffData: c={c}, t={t}")
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[34], line 1
----> 1 for idx in range(pixels.sizeOfTiffDataList()):
2 tiffData = pixels.getTiffData(idx)
3 c = tiffData.getFirstC().getValue().intValue()
NameError: name 'pixels' is not defined
1.5. ImageIO#
[35]:
from imageio.v3 import imread
%timeit imread(img_void_tile, index=13)
i = imread(img_void_tile, index=13)
i.shape
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
Cell In[35], line 3
1 from imageio.v3 import imread
----> 3 get_ipython().run_line_magic('timeit', 'imread(img_void_tile, index=13)')
4 i = imread(img_void_tile, index=13)
5 i.shape
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/IPython/core/interactiveshell.py:2504, in InteractiveShell.run_line_magic(self, magic_name, line, _stack_depth)
2502 kwargs['local_ns'] = self.get_local_scope(stack_depth)
2503 with self.builtin_trap:
-> 2504 result = fn(*args, **kwargs)
2506 # The code below prevents the output from being displayed
2507 # when using magics with decorator @output_can_be_silenced
2508 # when the last Python token in the expression is a ';'.
2509 if getattr(fn, magic.MAGIC_OUTPUT_CAN_BE_SILENCED, False):
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/IPython/core/magics/execution.py:1226, in ExecutionMagics.timeit(self, line, cell, local_ns)
1224 for index in range(0, 10):
1225 number = 10 ** index
-> 1226 time_number = timer.timeit(number)
1227 if time_number >= 0.2:
1228 break
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/IPython/core/magics/execution.py:184, in Timer.timeit(self, number)
182 gc.disable()
183 try:
--> 184 timing = self.inner(it, self.timer)
185 finally:
186 if gcold:
File <magic-timeit>:1, in inner(_it, _timer)
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/imageio/v3.py:53, in imread(uri, index, plugin, extension, format_hint, **kwargs)
50 if index is not None:
51 call_kwargs["index"] = index
---> 53 with imopen(uri, "r", **plugin_kwargs) as img_file:
54 return np.asarray(img_file.read(**call_kwargs))
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/imageio/core/imopen.py:113, in imopen(uri, io_mode, plugin, extension, format_hint, legacy_mode, **kwargs)
111 request.format_hint = format_hint
112 else:
--> 113 request = Request(uri, io_mode, format_hint=format_hint, extension=extension)
115 source = "<bytes>" if isinstance(uri, bytes) else uri
117 # fast-path based on plugin
118 # (except in legacy mode)
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/imageio/core/request.py:249, in Request.__init__(self, uri, mode, extension, format_hint, **kwargs)
246 raise ValueError(f"Invalid Request.Mode: {mode}")
248 # Parse what was given
--> 249 self._parse_uri(uri)
251 # Set extension
252 if extension is not None:
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/imageio/core/request.py:409, in Request._parse_uri(self, uri)
406 if is_read_request:
407 # Reading: check that the file exists (but is allowed a dir)
408 if not os.path.exists(fn):
--> 409 raise FileNotFoundError("No such file: '%s'" % fn)
410 else:
411 # Writing: check that the directory to write to does exist
412 dn = os.path.dirname(fn)
FileNotFoundError: No such file: '/home/runner/work/nima_io/nima_io/tests/data/tile6_1.tif'
[36]:
i.nbytes, 512**2 * 3 * 4 * 2
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[36], line 1
----> 1 i.nbytes, 512**2 * 3 * 4 * 2
NameError: name 'i' is not defined
It can read tif (tf8) files. Series might be passed using index
(you need to know in advance).
1.6. AICSImageIO#
[37]:
from aicsimageio import AICSImage
i = AICSImage(img_void_tile)
# i = AICSImage(img_void_tile, reconstruct_mosaic=True)
# i_lif = AICSImage(lif)
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
Cell In[37], line 1
----> 1 from aicsimageio import AICSImage
3 i = AICSImage(img_void_tile)
4 # i = AICSImage(img_void_tile, reconstruct_mosaic=True)
5 # i_lif = AICSImage(lif)
ModuleNotFoundError: No module named 'aicsimageio'
[38]:
i.ome_metadata.instruments[0].arcs[0]
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[38], line 1
----> 1 i.ome_metadata.instruments[0].arcs[0]
NameError: name 'i' is not defined
[39]:
lif_aics = AICSImage(slif)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[39], line 1
----> 1 lif_aics = AICSImage(slif)
NameError: name 'AICSImage' is not defined
[40]:
lif_aics.metadata
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[40], line 1
----> 1 lif_aics.metadata
NameError: name 'lif_aics' is not defined
[41]:
i.ome_metadata
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[41], line 1
----> 1 i.ome_metadata
NameError: name 'i' is not defined
[42]:
i.metadata.images[0].pixels.channels[0].light_source_settings.attenuation
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[42], line 1
----> 1 i.metadata.images[0].pixels.channels[0].light_source_settings.attenuation
NameError: name 'i' is not defined
[43]:
i.scenes
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[43], line 1
----> 1 i.scenes
NameError: name 'i' is not defined
[44]:
i.get_dask_stack()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[44], line 1
----> 1 i.get_dask_stack()
NameError: name 'i' is not defined
Mosaic stitch is not supported on tif files; so I will use my function relying on the PositionXYZ metadata.
1.7. dask_image#
[45]:
from dask_image.imread import imread
i = imread(img_void_tile)
---------------------------------------------------------------------------
UnknownFormatError Traceback (most recent call last)
Cell In[45], line 3
1 from dask_image.imread import imread
----> 3 i = imread(img_void_tile)
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/dask_image/imread/__init__.py:48, in imread(fname, nframes, arraytype)
45 import cupy
46 arrayfunc = cupy.asanyarray
---> 48 with pims.open(sfname) as imgs:
49 shape = (len(imgs),) + imgs.frame_shape
50 dtype = np.dtype(imgs.pixel_type)
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/pims/api.py:199, in open(sequence, **kwargs)
197 except Exception as e:
198 messages.append('{} errored: {}'.format(str(handler), str(e)))
--> 199 raise UnknownFormatError(
200 "All handlers returned exceptions:\n" + "\n".join(messages))
UnknownFormatError: All handlers returned exceptions:
<class 'pims.tiff_stack.TiffStack_tifffile'> errored: [Errno 2] No such file or directory: '/home/runner/work/nima_io/nima_io/tests/data/tile6_1.tif'
<class 'pims.imageio_reader.ImageIOReader'> errored: No such file: '/home/runner/work/nima_io/nima_io/tests/data/tile6_1.tif'
<class 'pims.bioformats.BioformatsReader'> errored: The file "../../tests/data/tile6_1.tif" does not exist.
[46]:
i
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[46], line 1
----> 1 i
NameError: name 'i' is not defined
Somehow it uses bioformats and can handle lif. No mosaic, no metadata though.
Pycroscopy https://pypi.org/project/pycroscopy/ is not reading lif nor ome-tif at the moment.
large-image[all] failed to install.
pyimagej need conda?
1.8. bioio-bioformats#
import bioio_ome_tiled_tiff
bioio_ome_tiled_tiff.Reader(str(img_void_tile))
TypeError: tile6_1.tif is not a tiled tiff. The python backend of the BioReader only supports OME tiled tiffs.
[47]:
import bioio_bioformats
im = bioio_bioformats.Reader(img_void_tile)
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
Cell In[47], line 3
1 import bioio_bioformats
----> 3 im = bioio_bioformats.Reader(img_void_tile)
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/bioio_bioformats/reader.py:121, in Reader.__init__(self, image, original_meta, memoize, options, dask_tiles, tile_size, fs_kwargs)
110 def __init__(
111 self,
112 image: types.PathLike,
(...) 119 fs_kwargs: Dict[str, Any] = {},
120 ):
--> 121 self._fs, self._path = io.pathlike_to_fs(
122 image,
123 enforce_exists=True,
124 fs_kwargs=fs_kwargs,
125 )
126 # Catch non-local file system
127 if not isinstance(self._fs, LocalFileSystem):
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/bioio_base/io.py:58, in pathlike_to_fs(uri, enforce_exists, fs_kwargs)
56 if enforce_exists:
57 if not fs.exists(path):
---> 58 raise FileNotFoundError(f"{fs.protocol}://{path}")
60 # Get and store details
61 # We do not return an AbstractBufferedFile (i.e. fs.open) as we do not want to have
62 # any open file buffers _after_ any API call. API calls must themselves call
63 # fs.open and complete their function during the context of the opened buffer.
64 return fs, path
FileNotFoundError: ('file', 'local'):///home/runner/work/nima_io/nima_io/docs/tutorials/../../tests/data/tile6_1.tif
[48]:
im.ome_metadata.images[0].pixels.channels[2].light_source_settings
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[48], line 1
----> 1 im.ome_metadata.images[0].pixels.channels[2].light_source_settings
NameError: name 'im' is not defined
[49]:
lif_bioio = bioio_bioformats.Reader(lif)
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
Cell In[49], line 1
----> 1 lif_bioio = bioio_bioformats.Reader(lif)
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/bioio_bioformats/reader.py:121, in Reader.__init__(self, image, original_meta, memoize, options, dask_tiles, tile_size, fs_kwargs)
110 def __init__(
111 self,
112 image: types.PathLike,
(...) 119 fs_kwargs: Dict[str, Any] = {},
120 ):
--> 121 self._fs, self._path = io.pathlike_to_fs(
122 image,
123 enforce_exists=True,
124 fs_kwargs=fs_kwargs,
125 )
126 # Catch non-local file system
127 if not isinstance(self._fs, LocalFileSystem):
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/bioio_base/io.py:58, in pathlike_to_fs(uri, enforce_exists, fs_kwargs)
56 if enforce_exists:
57 if not fs.exists(path):
---> 58 raise FileNotFoundError(f"{fs.protocol}://{path}")
60 # Get and store details
61 # We do not return an AbstractBufferedFile (i.e. fs.open) as we do not want to have
62 # any open file buffers _after_ any API call. API calls must themselves call
63 # fs.open and complete their function during the context of the opened buffer.
64 return fs, path
FileNotFoundError: ('file', 'local'):///home/runner/work/nima_io/nima_io/docs/tutorials/../../tests/data/2015Aug28_TransHXB2_50min+DMSO.lif
[50]:
lif_bioio.physical_pixel_sizes
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[50], line 1
----> 1 lif_bioio.physical_pixel_sizes
NameError: name 'lif_bioio' is not defined
[51]:
im.get_dask_stack()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[51], line 1
----> 1 im.get_dask_stack()
NameError: name 'im' is not defined
[52]:
im.ome_metadata.plates[0].wells[0]
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[52], line 1
----> 1 im.ome_metadata.plates[0].wells[0]
NameError: name 'im' is not defined
[53]:
i = bioio_bioformats.Reader(img_tile)
i.data.shape, i.dims
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
Cell In[53], line 1
----> 1 i = bioio_bioformats.Reader(img_tile)
2 i.data.shape, i.dims
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/bioio_bioformats/reader.py:121, in Reader.__init__(self, image, original_meta, memoize, options, dask_tiles, tile_size, fs_kwargs)
110 def __init__(
111 self,
112 image: types.PathLike,
(...) 119 fs_kwargs: Dict[str, Any] = {},
120 ):
--> 121 self._fs, self._path = io.pathlike_to_fs(
122 image,
123 enforce_exists=True,
124 fs_kwargs=fs_kwargs,
125 )
126 # Catch non-local file system
127 if not isinstance(self._fs, LocalFileSystem):
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/bioio_base/io.py:58, in pathlike_to_fs(uri, enforce_exists, fs_kwargs)
56 if enforce_exists:
57 if not fs.exists(path):
---> 58 raise FileNotFoundError(f"{fs.protocol}://{path}")
60 # Get and store details
61 # We do not return an AbstractBufferedFile (i.e. fs.open) as we do not want to have
62 # any open file buffers _after_ any API call. API calls must themselves call
63 # fs.open and complete their function during the context of the opened buffer.
64 return fs, path
FileNotFoundError: ('file', 'local'):///home/runner/work/nima_io/nima_io/docs/tutorials/../../tests/data/t4_1.tif
[54]:
i.xarray_dask_data.attrs["processed"]
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[54], line 1
----> 1 i.xarray_dask_data.attrs["processed"]
NameError: name 'i' is not defined
[55]:
unp = i.xarray_dask_data.attrs["unprocessed"]
unp[:1000]
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[55], line 1
----> 1 unp = i.xarray_dask_data.attrs["unprocessed"]
2 unp[:1000]
NameError: name 'i' is not defined
[56]:
stk = i.get_dask_stack()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[56], line 1
----> 1 stk = i.get_dask_stack()
NameError: name 'i' is not defined
[57]:
stk.A
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[57], line 1
----> 1 stk.A
NameError: name 'stk' is not defined
1.9. bfio#
[58]:
import bfio
bfio.BioReader(img_void_tile)
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
File ImageReader.java:859, in loci.formats.ImageReader.setId()
Exception: Java Exception
The above exception was the direct cause of the following exception:
java.io.FileNotFoundException Traceback (most recent call last)
Cell In[58], line 3
1 import bfio
----> 3 bfio.BioReader(img_void_tile)
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/bfio/bfio.py:98, in BioReader.__init__(self, file_path, max_workers, backend, clean_metadata, level)
96 elif self._backend_name == "bioformats":
97 try:
---> 98 self._backend = backends.JavaReader(self)
99 if max_workers is not None:
100 self.logger.warning(
101 "The max_workers keyword was present, but bioformats backend "
102 + "only operates with a single worker. Setting max_workers=1."
103 )
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/bfio/backends.py:963, in JavaReader.__init__(self, frontend)
961 self._rdr.setOriginalMetadataPopulated(True)
962 self._rdr.setMetadataStore(self.omexml)
--> 963 self._rdr.setId(JString(str(self.frontend._file_path.absolute())))
964 if self.frontend.level is not None:
965 if self._rdr.getSeriesCount() > self.frontend.level:
java.io.FileNotFoundException: java.io.FileNotFoundException: /home/runner/work/nima_io/nima_io/docs/tutorials/../../tests/data/tile6_1.tif (No such file or directory)
[59]:
rdr = bfio.BioReader(img_void_tile)
%timeit i = rdr.read()
i = rdr.read()
i.shape
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
File ImageReader.java:859, in loci.formats.ImageReader.setId()
Exception: Java Exception
The above exception was the direct cause of the following exception:
java.io.FileNotFoundException Traceback (most recent call last)
Cell In[59], line 1
----> 1 rdr = bfio.BioReader(img_void_tile)
2 get_ipython().run_line_magic('timeit', 'i = rdr.read()')
3 i = rdr.read()
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/bfio/bfio.py:98, in BioReader.__init__(self, file_path, max_workers, backend, clean_metadata, level)
96 elif self._backend_name == "bioformats":
97 try:
---> 98 self._backend = backends.JavaReader(self)
99 if max_workers is not None:
100 self.logger.warning(
101 "The max_workers keyword was present, but bioformats backend "
102 + "only operates with a single worker. Setting max_workers=1."
103 )
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/bfio/backends.py:963, in JavaReader.__init__(self, frontend)
961 self._rdr.setOriginalMetadataPopulated(True)
962 self._rdr.setMetadataStore(self.omexml)
--> 963 self._rdr.setId(JString(str(self.frontend._file_path.absolute())))
964 if self.frontend.level is not None:
965 if self._rdr.getSeriesCount() > self.frontend.level:
java.io.FileNotFoundException: java.io.FileNotFoundException: /home/runner/work/nima_io/nima_io/docs/tutorials/../../tests/data/tile6_1.tif (No such file or directory)
[60]:
rdr.metadata
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[60], line 1
----> 1 rdr.metadata
NameError: name 'rdr' is not defined
[61]:
rdr.ps_x
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[61], line 1
----> 1 rdr.ps_x
NameError: name 'rdr' is not defined
[62]:
rdr.close()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[62], line 1
----> 1 rdr.close()
NameError: name 'rdr' is not defined
1.10. PIMS#
[63]:
import pims
# %timeit fs = pims.Bioformats(img_void_tile)
fs = pims.Bioformats(img_void_tile)
fs.sizes
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
Cell In[63], line 4
1 import pims
3 # %timeit fs = pims.Bioformats(img_void_tile)
----> 4 fs = pims.Bioformats(img_void_tile)
5 fs.sizes
File ~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/pims/bioformats.py:330, in BioformatsReader.__init__(self, filename, meta, java_memory, read_mode, series)
328 # Make sure that file exists before starting java
329 if not os.path.isfile(filename):
--> 330 raise IOError('The file "{}" does not exist.'.format(filename))
332 # Start java VM and initialize logger (globally)
333 if not jpype.isJVMStarted():
OSError: The file "../../tests/data/tile6_1.tif" does not exist.
1.11. PyOMETiff#
[64]:
import pyometiff
%timeit rdr = pyometiff.OMETIFFReader(fpath=img_void_tile)
rdr = pyometiff.OMETIFFReader(fpath=img_void_tile)
1.33 μs ± 2.72 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
[65]:
%timeit r = rdr.read()
res = rdr.read()
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
/tmp/ipykernel_4412/1732195015.py in ?()
----> 1 get_ipython().run_line_magic('timeit', 'r = rdr.read()')
2 res = rdr.read()
<magic-timeit> in ?(_it, _timer)
----> 1 'Could not get source, probably due dynamically evaluated source code.'
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/pyometiff/omereader.py in ?(self)
38 def read(self) -> tuple[np.ndarray, dict, str]:
---> 39 self.array, self.omexml_string = self._open_tiff(self.fpath)
40 self.metadata = self.parse_metadata(self.omexml_string)
41 return self.array, self.metadata, self.omexml_string
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/pyometiff/omereader.py in ?(cls, fpath)
220 @classmethod
221 def _open_tiff(cls, fpath: pathlib.Path) -> (np.ndarray, str):
--> 222 with tifffile.TiffFile(str(fpath)) as tif:
223 omexml_string = tif.ome_metadata
224 array = tif.asarray()
225
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/tifffile/tifffile.py in ?(self, file, mode, name, offset, size, omexml, _multifile, _useframes, _parent, **is_flags)
4285 raise ValueError('invalid OME-XML')
4286 self._omexml = omexml
4287 self.is_ome = True
4288
-> 4289 fh = FileHandle(file, mode=mode, name=name, offset=offset, size=size)
4290 self._fh = fh
4291 self._multifile = True if _multifile is None else bool(_multifile)
4292 self._files = {fh.name: self}
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/tifffile/tifffile.py in ?(self, file, mode, name, offset, size)
13343 self._offset = -1 if offset is None else offset
13344 self._size = -1 if size is None else size
13345 self._close = True
13346 self._lock = NullContext()
> 13347 self.open()
13348 assert self._fh is not None
~/.local/share/hatch/env/virtual/nima-io/FLi94gtt/nima-io/lib/python3.12/site-packages/tifffile/tifffile.py in ?(self)
13362 if self._mode not in {'rb', 'r+b', 'wb', 'xb'}:
13363 raise ValueError(f'invalid mode {self._mode}')
13364 self._file = os.path.realpath(self._file)
13365 self._dir, self._name = os.path.split(self._file)
> 13366 self._fh = open(self._file, self._mode, encoding=None)
13367 self._close = True
13368 self._offset = max(0, self._offset)
13369 elif isinstance(self._file, FileHandle):
FileNotFoundError: [Errno 2] No such file or directory: '/home/runner/work/nima_io/nima_io/tests/data/tile6_1.tif'
[66]:
res[1]
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[66], line 1
----> 1 res[1]
NameError: name 'res' is not defined
[67]:
pyometiff.OMETIFFReader._get_metadata_template()
[67]:
{'Directory': None,
'Filename': None,
'Extension': None,
'ImageType': None,
'AcqDate': None,
'TotalSeries': None,
'SizeX': None,
'SizeY': None,
'SizeZ': 1,
'SizeC': 1,
'SizeT': 1,
'SizeS': 1,
'SizeB': 1,
'SizeM': 1,
'PhysicalSizeX': None,
'PhysicalSizeXUnit': None,
'PhysicalSizeY': None,
'PhysicalSizeYUnit': None,
'PhysicalSizeZ': None,
'PhysicalSizeZUnit': None,
'Sizes BF': None,
'DimOrder BF': None,
'DimOrder BF Array': None,
'ObjNA': [],
'ObjMag': [],
'ObjID': [],
'ObjName': [],
'ObjImmersion': [],
'TubelensMag': [],
'ObjNominalMag': [],
'DetectorModel': [],
'DetectorName': [],
'DetectorID': [],
'DetectorType': [],
'InstrumentID': [],
'MicroscopeType': [],
'Channels': [],
'ImageIDs': []}
1.12. Final Note#
I will keep
Read
stitch
md_grouping
impy
napari.read
pycromanager
microscope
python-microscopy