Source code for openlifu.bf.delay_methods.direct

from __future__ import annotations

from dataclasses import dataclass
from typing import Annotated

import numpy as np
import xarray as xa

from openlifu.bf.delay_methods import DelayMethod
from openlifu.geo import Point
from openlifu.util.annotations import OpenLIFUFieldData
from openlifu.xdc import Transducer


[docs] @dataclass class Direct(DelayMethod): c0: Annotated[float, OpenLIFUFieldData("Speed of Sound (m/s)", "Speed of sound in the medium (m/s)")] = 1480.0 """Speed of sound in the medium (m/s)""" def __post_init__(self): if not isinstance(self.c0, (int, float)): raise TypeError("Speed of sound must be a number") if self.c0 <= 0: raise ValueError("Speed of sound must be greater than 0") self.c0 = float(self.c0) def calc_delays(self, arr: Transducer, target: Point, params: xa.Dataset | None=None, transform:np.ndarray | None=None): if params is None: c = self.c0 else: c = params['sound_speed'].attrs['ref_value'] target_pos = target.get_position(units="m") matrix = transform if transform is not None else np.eye(4) dists = np.array([el.distance_to_point(target_pos, units="m", matrix=matrix) for el in arr.elements]) tof = dists / c delays = max(tof) - tof return delays