Files
deconv-test/zeiss2D.py
Otto Gustavson 7ec9a7ed12 initial commit
2025-10-14 09:33:38 +03:00

95 lines
3.1 KiB
Python

import numpy as np
import czifile as czi
import xml.etree.ElementTree as ET
class ZeissData:
def __init__(self, filename):
self.filename = filename
self._initialize()
def _initialize(self):
czi_obj = czi.CziFile(self.filename)
axes = czi_obj.axes
tmp = czi_obj.asarray()
self.axes = ""
# print(tmp.shape)
for i, size in enumerate(tmp.shape):
if size > 1:
self.axes += axes[i]
self.image = np.squeeze(tmp)
self.shape = self.image.shape
self.ndim = len(self.shape)
self.origin = np.array([[0, i1] for i1 in self.shape])
self.metadata = czi_obj.metadata()
root = ET.fromstring(self.metadata)
for d in root.findall("./Metadata/Scaling/Items/Distance"):
el = d.attrib["Id"]
if el in self.axes:
setattr(self, "p" + el.lower(), float(d[0].text) * 1e6)
# print(self.axes)
# print(self.shape)
# for k, v in kwargs.items():
# if k in ImageJ.allowed_kwargs:
# setattr(self, k, v)
# else:
# print(k, "is not allowed keyword argument!")
def get_channle_info(self, channelID):
# print(self.metadata)
root = ET.fromstring(self.metadata)
# for child in root:
# print(child.tag, child.attrib)
# print(type(root))
na = None
refractive_index = None
for _child in root.findall("./Metadata/Information/Instrument/Objectives/Objective"):
for _ch in _child:
if _ch.tag == "LensNA":
na = _ch.text
if _ch.tag == "ImmersionRefractiveIndex":
refractive_index = _ch.text
# print(_child.tag, _child.attrib, _child[1].tag, type(_child.tag), type(_child.attrib))
em, ex = None, None
for _child in root.findall("./Metadata/DisplaySetting/Channels"):
for _ch in _child.findall("./Channel"):
if _ch.attrib["Id"] == f"Channel:{channelID}":
for _c in _ch:
if _c.tag == "DyeMaxEmission":
em = _c.text
if _c.tag == "DyeMaxExcitation":
ex = _c.text
if ex is not None and em is not None:
break
# print(_c.tag)
# print(_ch.tag, _ch.attrib["Id"], _ch.text)
# print()
# print(_child.tag, _child.attrib, _child[1].tag, type(_child.tag), type(_child.attrib))
info = {
"MainEmissionWavelength": float(em),
"MainExcitationWavelength": float(ex),
"ObjectiveNA": float(na),
"RefractiveIndex": float(refractive_index),
}
return info
def get_stack(self, channleID):
#spacings = dict(X=self.px * 1e-6, Y=self.py * 1e-6, Z=self.pz * 1e-6)
spacings = dict(X=self.px * 1e-6, Y=self.py * 1e-6)
return self.image[channleID], spacings, self.get_channle_info(channleID)