From b7dadb645edd0a1e5c808e5a05a4ef073a2bcfbd Mon Sep 17 00:00:00 2001 From: Wim Pomp Date: Wed, 19 Mar 2025 16:06:07 +0100 Subject: [PATCH] - read metadata from first file in ome tiff sequence --- ndbioimage/readers/tifread.py | 88 +++++++++++++++++++---------------- pyproject.toml | 2 +- 2 files changed, 49 insertions(+), 41 deletions(-) diff --git a/ndbioimage/readers/tifread.py b/ndbioimage/readers/tifread.py index 607dd99..68d4944 100644 --- a/ndbioimage/readers/tifread.py +++ b/ndbioimage/readers/tifread.py @@ -1,3 +1,5 @@ +import re +import warnings from abc import ABC from functools import cached_property from itertools import product @@ -6,8 +8,8 @@ from pathlib import Path import numpy as np import tifffile import yaml -import warnings -from ome_types import model, from_xml +from lfdfiles import TiffFile +from ome_types import from_xml, model from .. import AbstractReader, try_default @@ -31,48 +33,54 @@ class Reader(AbstractReader, ABC): 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) + match = re.match(r'^(.*)(pos.*)$', self.path.stem, flags=re.IGNORECASE) + if match is not None and len(match.groups()) == 2: + a, b = match.groups() + file0 = TiffFile(self.path.with_stem(a + re.sub(r'\d', '0', b))) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', category=UserWarning) + ome = from_xml(file0.ome_metadata) + ome.images = [image for image in ome.images if self.path.stem[:len(image.name)] == image.name] + return ome + + page = self.reader.pages[0] + size_y = page.imagelength + size_x = page.imagewidth + if self.p_ndim == 3: + size_c = page.samplesperpixel + size_t = self.metadata.get('frames', 1) # // C else: - page = self.reader.pages[0] - size_y = page.imagelength - size_x = page.imagewidth - if self.p_ndim == 3: - size_c = page.samplesperpixel - size_t = self.metadata.get('frames', 1) # // C - else: - size_c = self.metadata.get('channels', 1) - size_t = self.metadata.get('frames', 1) - size_z = self.metadata.get('slices', 1) - if 282 in page.tags and 296 in page.tags and page.tags[296].value == 1: - f = page.tags[282].value - pxsize = f[1] / f[0] - else: - pxsize = None + size_c = self.metadata.get('channels', 1) + size_t = self.metadata.get('frames', 1) + size_z = self.metadata.get('slices', 1) + if 282 in page.tags and 296 in page.tags and page.tags[296].value == 1: + f = page.tags[282].value + pxsize = f[1] / f[0] + else: + pxsize = None - dtype = page.dtype.name - if dtype not in ('int8', 'int16', 'int32', 'uint8', 'uint16', 'uint32', - 'float', 'double', 'complex', 'double-complex', 'bit'): - dtype = 'float' + dtype = page.dtype.name + if dtype not in ('int8', 'int16', 'int32', 'uint8', 'uint16', 'uint32', + 'float', 'double', 'complex', 'double-complex', 'bit'): + dtype = 'float' - interval_t = self.metadata.get('interval', 0) + interval_t = self.metadata.get('interval', 0) - ome = model.OME() - ome.instruments.append(model.Instrument(id='Instrument:0')) - ome.instruments[0].objectives.append(model.Objective(id='Objective:0')) - ome.images.append( - model.Image( - id='Image:0', - pixels=model.Pixels( - id='Pixels:0', - size_c=size_c, size_z=size_z, size_t=size_t, size_x=size_x, size_y=size_y, - dimension_order='XYCZT', type=dtype, # type: ignore - physical_size_x=pxsize, physical_size_y=pxsize), - objective_settings=model.ObjectiveSettings(id='Objective:0'))) - for c, z, t in product(range(size_c), range(size_z), range(size_t)): - ome.images[0].pixels.planes.append(model.Plane(the_c=c, the_z=z, the_t=t, delta_t=interval_t * t)) - return ome + ome = model.OME() + ome.instruments.append(model.Instrument(id='Instrument:0')) + ome.instruments[0].objectives.append(model.Objective(id='Objective:0')) + ome.images.append( + model.Image( + id='Image:0', + pixels=model.Pixels( + id='Pixels:0', + size_c=size_c, size_z=size_z, size_t=size_t, size_x=size_x, size_y=size_y, + dimension_order='XYCZT', type=dtype, # type: ignore + physical_size_x=pxsize, physical_size_y=pxsize), + objective_settings=model.ObjectiveSettings(id='Objective:0'))) + for c, z, t in product(range(size_c), range(size_z), range(size_t)): + ome.images[0].pixels.planes.append(model.Plane(the_c=c, the_z=z, the_t=t, delta_t=interval_t * t)) + return ome def open(self): self.reader = tifffile.TiffFile(self.path) diff --git a/pyproject.toml b/pyproject.toml index d3e8d96..82c68ce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ndbioimage" -version = "2025.3.0" +version = "2025.3.1" description = "Bio image reading, metadata and some affine registration." authors = [ { name = "W. Pomp", email = "w.pomp@nki.nl" }