Source code for patato.io.ipasc.read_ipasc
# Copyright (c) Thomas Else 2023-25.
# Copyright (c) Janek Grohl 2023.
# License: MIT
from os.path import split
import pacfish as pf
import numpy as np
from ..hdf.fileimporter import ReaderInterface
[docs]
class IPASCInterface(ReaderInterface):
"""An interface for iThera MSOT datasets."""
def _get_rois(self):
pass
def _get_segmentation(self):
return None
def _get_datasets(self):
return None
def get_speed_of_sound(self):
return None
[docs]
def __init__(self, file_path):
super().__init__()
self.scan_name = split(file_path)[-1]
self.pa_data = pf.load_data(file_path)
if len(self.pa_data.get_acquisition_wavelengths().shape) == 0:
self.nwavelengths = 1
else:
self.nwavelengths = len(self.pa_data.get_acquisition_wavelengths())
self.nframes = np.shape(self.pa_data.binary_time_series_data)[3]
# Optional add here: extract the reconstructed images that are from ViewMSOT.
# Extract attributes
self.geometry = self.pa_data.get_detector_position()
self.nsamples = self.nwavelengths * self.nframes
def get_n_samples(self):
return self.nsamples
def _get_wavelengths(self):
if len(self.pa_data.get_acquisition_wavelengths().shape) == 0:
return [self.pa_data.get_acquisition_wavelengths().item()]
return self.pa_data.get_acquisition_wavelengths()
def _get_correction_factor(self):
return self.pa_data.get_overall_gain()
def get_impulse_response(self):
return self.pa_data.get_frequency_response()
def _get_repetition_numbers(self):
return self.nsamples
def _get_run_numbers(self):
return np.arange(1, self.nframes + 1)
def get_scan_datetime(self):
return None
def _get_scan_times(self):
return self.pa_data.get_measurement_time_stamps()
def _get_temperature(self):
return self.pa_data.get_temperature()
def _get_pa_data(self):
raw_data = (
self.pa_data.binary_time_series_data
) # [detectors, samples, wavelengths, frames]
raw_data = np.swapaxes(
raw_data, 1, 3
) # [detectors, frames, wavelengths, samples]
raw_data = np.swapaxes(
raw_data, 0, 2
) # [wavelengths, frames, detectors, samples]
raw_data = np.swapaxes(
raw_data, 0, 1
) # [frames, wavelengths, detectors, samples]
return raw_data, {"fs": self.pa_data.get_sampling_rate()}
def _get_sampling_frequency(self):
return self.pa_data.get_sampling_rate()
def _get_sensor_geometry(self):
return self.pa_data.get_detector_position()
def _get_water_absorption(self):
return None
def get_us_data(self):
return None
def get_scan_name(self):
return self.scan_name
def _get_scanner_z_position(self):
return self.pa_data.get_measurement_spatial_poses()
def get_scan_comment(self):
return ""