Source code for baseband_tasks.io.hdf5.frame

# Licensed under the GPLv3 - see LICENSE
"""Frame for HDF5 format."""
from baseband.base.frame import FrameBase

from .header import HDF5Header
from .payload import HDF5Payload


__all__ = ['HDF5Frame']


[docs]class HDF5Frame(FrameBase): """Representation of a HDF5 frame, consisting of a header and payload. Parameters ---------- header : `~baseband_tasks.io.hdf5.HDF5Header` Wrapper around the yaml-encoded header information. payload : `~baseband_tasks.io.hdf5.HDF5Payload` Wrapper around the payload, provding mechanisms to decode it. valid : bool or None Whether the data are valid. verify : bool Whether to do basic verification of integrity (default: `True`) Notes ----- The Frame can also be read instantiated using class methods: fromfile : read header and payload from a filehandle fromdata : encode data as payload Of course, one can also do the opposite: tofile : method to write header and payload to filehandle data : property that yields full decoded payload A number of properties are defined: `shape`, `dtype` and `size` are the shape, type and number of complete samples of the data array, and `nbytes` the frame size in bytes. Furthermore, the frame acts as a dictionary, with keys those of the header. Any attribute that is not defined on the frame itself, such as ``.time`` will be looked up on the header as well. """ _header_class = HDF5Header _payload_class = HDF5Payload @property def valid(self): """Whether frame contains valid data.""" return self._valid @valid.setter def valid(self, valid): assert valid, 'cannot deal with invalid data yet' self._valid = bool(valid)
[docs] @classmethod def fromfile(cls, fh, valid=True, verify=True): """Read a frame from a filehandle. Parameters ---------- fh : filehandle To read the header and payload from. valid : bool Whether the data are valid. Default: `True`. verify : bool Whether to do basic checks of frame integrity (default: `True`). """ header = cls._header_class.fromfile(fh, verify=verify) payload = cls._payload_class.fromfile(fh, header=header) return cls(header, payload, valid=valid, verify=verify)
[docs] @classmethod def fromdata(cls, data, header=None): return NotImplementedError('HDF5 frames cannot yet be initialized ' 'from data')
[docs] def tofile(self, fh): """Write encoded frame to filehandle.""" # Payloads and headers are always memory mapped, # so no need to do anything. pass