- read metadata from first file in ome tiff sequence

This commit is contained in:
Wim Pomp
2025-03-19 16:06:07 +01:00
parent 0ac22aff87
commit b7dadb645e
2 changed files with 49 additions and 41 deletions

View File

@@ -1,3 +1,5 @@
import re
import warnings
from abc import ABC from abc import ABC
from functools import cached_property from functools import cached_property
from itertools import product from itertools import product
@@ -6,8 +8,8 @@ from pathlib import Path
import numpy as np import numpy as np
import tifffile import tifffile
import yaml import yaml
import warnings from lfdfiles import TiffFile
from ome_types import model, from_xml from ome_types import from_xml, model
from .. import AbstractReader, try_default from .. import AbstractReader, try_default
@@ -31,48 +33,54 @@ class Reader(AbstractReader, ABC):
def get_ome(self): def get_ome(self):
if self.reader.is_ome: if self.reader.is_ome:
with warnings.catch_warnings(): match = re.match(r'^(.*)(pos.*)$', self.path.stem, flags=re.IGNORECASE)
warnings.simplefilter('ignore', category=UserWarning) if match is not None and len(match.groups()) == 2:
return from_xml(self.reader.ome_metadata) 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: else:
page = self.reader.pages[0] size_c = self.metadata.get('channels', 1)
size_y = page.imagelength size_t = self.metadata.get('frames', 1)
size_x = page.imagewidth size_z = self.metadata.get('slices', 1)
if self.p_ndim == 3: if 282 in page.tags and 296 in page.tags and page.tags[296].value == 1:
size_c = page.samplesperpixel f = page.tags[282].value
size_t = self.metadata.get('frames', 1) # // C pxsize = f[1] / f[0]
else: else:
size_c = self.metadata.get('channels', 1) pxsize = None
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 dtype = page.dtype.name
if dtype not in ('int8', 'int16', 'int32', 'uint8', 'uint16', 'uint32', if dtype not in ('int8', 'int16', 'int32', 'uint8', 'uint16', 'uint32',
'float', 'double', 'complex', 'double-complex', 'bit'): 'float', 'double', 'complex', 'double-complex', 'bit'):
dtype = 'float' dtype = 'float'
interval_t = self.metadata.get('interval', 0) interval_t = self.metadata.get('interval', 0)
ome = model.OME() ome = model.OME()
ome.instruments.append(model.Instrument(id='Instrument:0')) ome.instruments.append(model.Instrument(id='Instrument:0'))
ome.instruments[0].objectives.append(model.Objective(id='Objective:0')) ome.instruments[0].objectives.append(model.Objective(id='Objective:0'))
ome.images.append( ome.images.append(
model.Image( model.Image(
id='Image:0', id='Image:0',
pixels=model.Pixels( pixels=model.Pixels(
id='Pixels:0', id='Pixels:0',
size_c=size_c, size_z=size_z, size_t=size_t, size_x=size_x, size_y=size_y, 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 dimension_order='XYCZT', type=dtype, # type: ignore
physical_size_x=pxsize, physical_size_y=pxsize), physical_size_x=pxsize, physical_size_y=pxsize),
objective_settings=model.ObjectiveSettings(id='Objective:0'))) objective_settings=model.ObjectiveSettings(id='Objective:0')))
for c, z, t in product(range(size_c), range(size_z), range(size_t)): 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)) ome.images[0].pixels.planes.append(model.Plane(the_c=c, the_z=z, the_t=t, delta_t=interval_t * t))
return ome return ome
def open(self): def open(self):
self.reader = tifffile.TiffFile(self.path) self.reader = tifffile.TiffFile(self.path)

View File

@@ -1,6 +1,6 @@
[project] [project]
name = "ndbioimage" name = "ndbioimage"
version = "2025.3.0" version = "2025.3.1"
description = "Bio image reading, metadata and some affine registration." description = "Bio image reading, metadata and some affine registration."
authors = [ authors = [
{ name = "W. Pomp", email = "w.pomp@nki.nl" } { name = "W. Pomp", email = "w.pomp@nki.nl" }