Source code for patato.core.image_structures.pa_time_data

"""
pa_time_data. Defines the time-domain version of PARawData class.
"""
#  Copyright (c) Thomas Else 2023.
#  License: MIT


import numpy as np
import xarray
from typing import Optional
import numpy.typing as npt

from ..image_structures.pa_raw_data import PARawData


class PATimeSeries(PARawData):
    """
    PATimeSeries is the data structure for time-domain raw PA data.
    """

    def __add__(self, other):
        new_data = xarray.concat([self.da, other.da], dim=other.da.dims[0])
        output = PATimeSeries(new_data, new_data.dims, new_data.coords, new_data.attrs,
                              self.hdf5_sub_name, self.algorithm_id)
        output.__class__ = self.__class__
        return output

    def get_hdf5_group_name(self):
        return "raw_data"

    def to_opencl(self, queue) -> "PATimeSeries":
        # Only import if needed.
        from pyopencl.array import to_device
        cls = self.copy()
        cls.da = cls.da.copy()
        new_data = to_device(queue, self.raw_data.astype(np.single))

        # Fudge to make pyopencl ducktyped with numpy array
        new_data.__array_function__ = None
        new_data.__array_ufunc__ = None

        cls.raw_data = new_data
        return cls

    def two_dims(self):
        return "detectors", "timeseries"

[docs] @classmethod def from_numpy(cls, dataset: npt.ArrayLike, wavelengths: npt.ArrayLike, fs: float, speed_of_sound: Optional[float] = None): """ Create a PATimeSeries class from a NumPy array. Parameters ---------- dataset: np.ndarray wavelengths: np.ndarray fs: float speed_of_sound: float Returns ------- PATimeSeries """ dims = ["frames", cls.get_ax1_label_meaning(), "detectors", "timeseries"] dim_coords = [np.arange(dataset.shape[0]), wavelengths, np.arange(dataset.shape[2]), np.arange(dataset.shape[3]) ] coordinates = {a: b for a, b in zip(dims, dim_coords)} attributes = {'fs': fs, 'speedofsound': speed_of_sound} return cls(dataset, dims, coordinates, attributes)