Skip to content

Commit

Permalink
feat: support subjoined QPSeries file format
Browse files Browse the repository at this point in the history
  • Loading branch information
paulmueller committed Feb 28, 2019
1 parent c335474 commit e13f689
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 5 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
0.7.0
- feat: support subjoined QPSeries file format
0.6.4
- fix: ignore None or nan values in given meta data
0.6.3
Expand Down
3 changes: 2 additions & 1 deletion qpformat/file_formats/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from .dataset import SeriesData, hash_obj
from .dataset import SingleData # noqa:F401 (user convenience)
from .series_hdf5_hyperspy import SeriesHdf5HyperSpy
from .series_hdf5_qpimage import SeriesHdf5Qpimage
from .series_hdf5_qpimage import SeriesHdf5Qpimage, SeriesHdf5QpimageSubjoined
from .series_zip_tif_holo import SeriesZipTifHolo
from .series_zip_tif_phasics import SeriesZipTifPhasics
from .single_hdf5_qpimage import SingleHdf5Qpimage
Expand Down Expand Up @@ -199,6 +199,7 @@ def verify(path):
SingleNpyNumpy,
SeriesHdf5HyperSpy,
SeriesHdf5Qpimage,
SeriesHdf5QpimageSubjoined,
SeriesZipTifPhasics,
SeriesZipTifHolo, # after phasics, b/c phasics has extra keywords
]
Expand Down
47 changes: 43 additions & 4 deletions qpformat/file_formats/series_hdf5_qpimage.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@ class SeriesHdf5Qpimage(SeriesData):
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)
Expand All @@ -19,10 +26,6 @@ def __init__(self, *args, **kwargs):
and key in attrs):
self.meta_data[key] = attrs[key]

def __len__(self):
with self._qpseries() as qps:
return len(qps)

def _qpseries(self):
return qpimage.QPSeries(h5file=self.path, h5mode="r")

Expand Down Expand Up @@ -73,3 +76,39 @@ def verify(path):
"bg_data" in qpi0["amplitude"]):
valid = True
return valid


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
33 changes: 33 additions & 0 deletions tests/test_series_hdf5_qpimage.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import pathlib
import tempfile

import h5py
import numpy as np

import qpimage
Expand Down Expand Up @@ -152,6 +153,38 @@ def test_returned_identifier():
pass


def test_subjoined_load_data():
path = datapath / "single_qpimage.h5"
tf = tempfile.mktemp(suffix=".h5", prefix="qpformat_test_subjoined")
qpi1 = qpimage.QPImage(h5file=path, h5mode="r").copy()
qpi2 = qpi1.copy()
qpi1["identifier"] = "test100"
qpi2["identifier"] = "test200"
# generate subjoined qpseries hdf5 file
with h5py.File(tf, mode="w") as h5:
qps = h5.require_group("qpseries")
qpimage.QPSeries(qpimage_list=[qpi1, qpi2],
h5file=qps)

ds = qpformat.load_data(tf)
assert len(ds) == 2
assert ds.path == pathlib.Path(tf)
assert np.isnan(ds.get_time(1))
assert "SeriesHdf5QpimageSubjoined" in ds.__repr__()
qpd = ds.get_qpimage(1)
assert qpd["identifier"] != qpi1["identifier"]
assert qpd == qpi1
assert qpd.shape == qpi1.shape
assert np.allclose(qpd.amp, qpi1.amp)
assert np.allclose(qpd.pha, qpi1.pha)

# cleanup
try:
os.remove(tf)
except OSError:
pass


if __name__ == "__main__":
# Run all tests
loc = locals()
Expand Down

0 comments on commit e13f689

Please sign in to comment.