import h5py
import qpimage
from .dataset import SeriesData
[docs]class SeriesHdf5Qpimage(SeriesData):
"""Qpimage series (HDF5 format)"""
storage_type = "phase,amplitude"
def __init__(self, *args, **kwargs):
super(SeriesHdf5Qpimage, self).__init__(*args, **kwargs)
self._dataset = None
self._init_meta()
def __len__(self):
with self._qpseries() as qps:
return len(qps)
def _init_meta(self):
# update meta data
with h5py.File(self.path, mode="r") as h5:
attrs = dict(h5["qpi_0"].attrs)
for key in qpimage.meta.DATA_KEYS:
if (key not in self.meta_data
and key not in ["time"] # do not override time
and key in attrs):
self.meta_data[key] = attrs[key]
def _qpseries(self):
return qpimage.QPSeries(h5file=self.path, h5mode="r")
def get_qpimage(self, idx):
"""Return background-corrected QPImage of data at index `idx`"""
if self._bgdata:
# The user has explicitly chosen different background data
# using `get_qpimage_raw`.
qpi = super(SeriesHdf5Qpimage, self).get_qpimage(idx)
else:
# We can use the background data stored in the qpimage hdf5 file
with self._qpseries() as qps:
qpi = qps.get_qpimage(index=idx).copy()
# Force meta data
for key in self.meta_data:
qpi[key] = self.meta_data[key]
# set identifier
qpi["identifier"] = self.get_identifier(idx)
return qpi
def get_qpimage_raw(self, idx):
"""Return QPImage without background correction"""
with self._qpseries() as qps:
qpi = qps.get_qpimage(index=idx).copy()
# Remove previously performed background correction
qpi.set_bg_data(None)
# Force meta data
for key in self.meta_data:
qpi[key] = self.meta_data[key]
# set identifier
qpi["identifier"] = self.get_identifier(idx)
return qpi
@staticmethod
def verify(path):
"""Verify that `path` has the qpimage series file format"""
valid = False
try:
h5 = h5py.File(path, mode="r")
qpi0 = h5["qpi_0"]
except (OSError, KeyError):
pass
else:
if ("qpimage version" in qpi0.attrs and
"phase" in qpi0 and
"amplitude" in qpi0 and
"bg_data" in qpi0["phase"] and
"bg_data" in qpi0["amplitude"]):
valid = True
return valid
[docs]class SeriesHdf5QpimageSubjoined(SeriesHdf5Qpimage):
"""Subjoined qpimage series (HDF5 format), may contain other data"""
def _init_meta(self):
# update meta data
with h5py.File(self.path, mode="r") as h5:
attrs = dict(h5["qpseries/qpi_0"].attrs)
for key in qpimage.meta.DATA_KEYS:
if (key not in self.meta_data
and key in attrs):
self.meta_data[key] = attrs[key]
def _qpseries(self):
h5 = h5py.File(self.path, mode="r")
return qpimage.QPSeries(h5file=h5["qpseries"])
@staticmethod
def verify(path):
"""Verify that `path` has the qpimage series file format"""
valid = False
try:
h5 = h5py.File(path, mode="r")
qps = h5["qpseries"]
qpi0 = qps["qpi_0"]
except (OSError, KeyError):
pass
else:
if ("qpimage version" in qpi0.attrs and
"phase" in qpi0 and
"amplitude" in qpi0 and
"bg_data" in qpi0["phase"] and
"bg_data" in qpi0["amplitude"]):
valid = True
return valid