- read metadata from first file in ome tiff sequence
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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" }
|
||||||
|
|||||||
Reference in New Issue
Block a user