- pyproject towards PEP621
- catch errors reading metadata in tifread - read dimension order from ome
This commit is contained in:
@@ -6,9 +6,10 @@ from pathlib import Path
|
||||
import numpy as np
|
||||
import tifffile
|
||||
import yaml
|
||||
from ome_types import model
|
||||
import warnings
|
||||
from ome_types import model, from_xml
|
||||
|
||||
from .. import AbstractReader
|
||||
from .. import AbstractReader, try_default
|
||||
|
||||
|
||||
class Reader(AbstractReader, ABC):
|
||||
@@ -25,10 +26,15 @@ class Reader(AbstractReader, ABC):
|
||||
|
||||
@cached_property
|
||||
def metadata(self):
|
||||
return {key: yaml.safe_load(value) if isinstance(value, str) else value
|
||||
return {key: try_default(yaml.safe_load, value, value) if isinstance(value, str) else value
|
||||
for key, value in self.reader.imagej_metadata.items()}
|
||||
|
||||
def get_ome(self):
|
||||
if self.reader.is_ome:
|
||||
with warnings.catch_warnings():
|
||||
warnings.simplefilter('ignore', category=UserWarning)
|
||||
return from_xml(self.reader.ome_metadata)
|
||||
else:
|
||||
page = self.reader.pages[0]
|
||||
size_y = page.imagelength
|
||||
size_x = page.imagewidth
|
||||
@@ -70,16 +76,25 @@ class Reader(AbstractReader, ABC):
|
||||
|
||||
def open(self):
|
||||
self.reader = tifffile.TiffFile(self.path)
|
||||
page = self.reader.pages[0]
|
||||
page = self.reader.pages.first
|
||||
self.p_ndim = page.ndim # noqa
|
||||
if self.p_ndim == 3:
|
||||
self.p_transpose = [i for i in [page.axes.find(j) for j in 'SYX'] if i >= 0] # noqa
|
||||
else:
|
||||
self.p_transpose = [i for i in [page.axes.find(j) for j in 'YX'] if i >= 0] # noqa
|
||||
|
||||
def close(self):
|
||||
self.reader.close()
|
||||
|
||||
def __frame__(self, c, z, t):
|
||||
def __frame__(self, c: int, z: int, t: int):
|
||||
dimension_order = self.ome.images[0].pixels.dimension_order.value
|
||||
if self.p_ndim == 3:
|
||||
return np.transpose(self.reader.asarray(z + t * self.base_shape['z']), self.p_transpose)[c]
|
||||
axes = ''.join([ax.lower() for ax in dimension_order if ax.lower() in 'zt'])
|
||||
ct = {'z': z, 't': t}
|
||||
n = sum([ct[ax] * np.prod(self.base_shape[axes[:i]]) for i, ax in enumerate(axes)])
|
||||
return np.transpose(self.reader.asarray(int(n)), self.p_transpose)[int(c)]
|
||||
else:
|
||||
return self.reader.asarray(c + z * self.base_shape['c'] + t * self.base_shape['c'] * self.base_shape['z'])
|
||||
axes = ''.join([ax.lower() for ax in dimension_order if ax.lower() in 'czt'])
|
||||
czt = {'c': c, 'z': z, 't': t}
|
||||
n = sum([czt[ax] * np.prod(self.base_shape[axes[:i]]) for i, ax in enumerate(axes)])
|
||||
return np.transpose(self.reader.asarray(int(n)), self.p_transpose)
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
#Insight Transform File V1.0
|
||||
#Transform 0
|
||||
Transform: CompositeTransform_double_2_2
|
||||
#Transform 1
|
||||
Transform: AffineTransform_double_2_2
|
||||
Parameters: 1 0 0 1 0 0
|
||||
|
||||
@@ -299,7 +299,7 @@ class Transform:
|
||||
new.shape = [float(t) for t in transform['Size']]
|
||||
new.origin = [(t - 1) / 2 for t in new.shape]
|
||||
else:
|
||||
raise NotImplementedError(f'{kind} tranforms not implemented (yet)')
|
||||
raise NotImplementedError(f'{kind} transforms not implemented (yet)')
|
||||
new.dparameters = 6 * [np.nan]
|
||||
return new
|
||||
|
||||
|
||||
@@ -1,46 +1,43 @@
|
||||
[tool.poetry]
|
||||
[project]
|
||||
name = "ndbioimage"
|
||||
version = "2025.2.1"
|
||||
version = "2025.3.0"
|
||||
description = "Bio image reading, metadata and some affine registration."
|
||||
authors = ["W. Pomp <w.pomp@nki.nl>"]
|
||||
license = "GPLv3"
|
||||
authors = [
|
||||
{ name = "W. Pomp", email = "w.pomp@nki.nl" }
|
||||
]
|
||||
license = { text = "GPL-3.0-or-later"}
|
||||
readme = "README.md"
|
||||
keywords = ["bioformats", "imread", "numpy", "metadata"]
|
||||
include = ["transform.txt"]
|
||||
repository = "https://github.com/wimpomp/ndbioimage"
|
||||
requires-python = ">=3.10"
|
||||
exclude = ["ndbioimage/jars"]
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = "^3.10"
|
||||
numpy = ">=1.20.0"
|
||||
pandas = "*"
|
||||
tifffile = "*"
|
||||
czifile = "2019.7.2"
|
||||
tiffwrite = ">=2024.12.1"
|
||||
ome-types = ">=0.4.0"
|
||||
pint = "*"
|
||||
tqdm = "*"
|
||||
lxml = "*"
|
||||
pyyaml = "*"
|
||||
parfor = ">=2025.1.0"
|
||||
JPype1 = "*"
|
||||
SimpleITK-SimpleElastix = [
|
||||
{ version = "*", python = "<3.12" },
|
||||
{ version = "*", python = ">=3.12", markers = "sys_platform != 'darwin'" },
|
||||
{ version = "*", python = ">=3.12", markers = "platform_machine == 'aarch64'" },
|
||||
dependencies = [
|
||||
"czifile == 2019.7.2",
|
||||
"imagecodecs",
|
||||
"JPype1",
|
||||
"lxml",
|
||||
"numpy >= 1.20",
|
||||
"ome-types",
|
||||
"pandas",
|
||||
"parfor >= 2025.1.0",
|
||||
"pint",
|
||||
"pyyaml",
|
||||
"SimpleITK-SimpleElastix; sys_platform != 'darwin'",
|
||||
"scikit-image",
|
||||
"tifffile <= 2025.1.10",
|
||||
"tiffwrite >= 2024.12.1",
|
||||
"tqdm",
|
||||
]
|
||||
scikit-image = "*"
|
||||
imagecodecs = "*"
|
||||
xsdata = "^23" # until pydantic is up-to-date
|
||||
matplotlib = { version = "*", optional = true }
|
||||
scikit-video = { version = "*", optional = true }
|
||||
pytest = { version = "*", optional = true }
|
||||
|
||||
[tool.poetry.extras]
|
||||
[project.optional-dependencies]
|
||||
test = ["pytest"]
|
||||
write = ["matplotlib", "scikit-video"]
|
||||
|
||||
[tool.poetry.scripts]
|
||||
[project.urls]
|
||||
repository = "https://github.com/wimpomp/ndbioimage"
|
||||
|
||||
[project.scripts]
|
||||
ndbioimage = "ndbioimage:main"
|
||||
|
||||
[tool.pytest.ini_options]
|
||||
|
||||
Reference in New Issue
Block a user