Source code for pacfish.api.adapters.Nrrd_File_Converter

# SPDX-FileCopyrightText: 2021 International Photoacoustics Standardisation Consortium (IPASC)
# SPDX-FileCopyrightText: 2021 Janek Gröhl
# SPDX-License-Identifier: BSD 3-Clause License

import numpy as np
import nrrd

from pacfish import BaseAdapter, MetaDatum
from pacfish import MetadataAcquisitionTags
from pacfish import DeviceMetaDataCreator, DetectionElementCreator, IlluminationElementCreator


[docs]class NrrdFileConverter(BaseAdapter): """ This converter assumes a linear transducer with 128 elements and an element pitch of 0.3mm. It assumes that the NRRD file metadata contains a 'sizes', 'type' and 'space directions' field. """ def __init__(self, nrrd_file_path): self.nrrd_file_path = nrrd_file_path [data, meta] = nrrd.read(nrrd_file_path) self.data = data self.meta = meta print(np.shape(data)) print(meta) super().__init__()
[docs] def generate_binary_data(self) -> np.ndarray: data = np.reshape(self.data, (self.meta['sizes'][0], self.meta['sizes'][1], 1, self.meta['sizes'][2])) return data
[docs] def generate_device_meta_data(self) -> dict: device_creator = DeviceMetaDataCreator() device_creator.set_general_information(uuid="c771111c-36ba-425d-9f53-84b8ff092059", fov=np.asarray([0, 0, 0, 0.0384, 0, 0.0384])) start_y_position = 0.00015 for y_idx in range(128): cur_y_position = start_y_position + 0.0003 * y_idx detection_element_creator = DetectionElementCreator() detection_element_creator.set_detector_position(np.asarray([0, cur_y_position, 0])) detection_element_creator.set_detector_orientation(np.asarray([0, 0, 1])) detection_element_creator.set_detector_geometry_type("CUBOID") detection_element_creator.set_detector_geometry(np.asarray([0.0003, 0.0003, 0.0001])) detection_element_creator.set_frequency_response(np.asarray([np.linspace(700, 900, 100), np.ones(100)])) detection_element_creator.set_angular_response(np.asarray([np.linspace(700, 900, 100), np.ones(100)])) device_creator.add_detection_element(detection_element_creator.get_dictionary()) for y_idx in range(2): illumination_element_creator = IlluminationElementCreator() illumination_element_creator.set_beam_divergence_angles(0.20944) illumination_element_creator.set_wavelength_range(np.asarray([700, 950, 1])) if y_idx == 0: illumination_element_creator.set_illuminator_position(np.asarray([0.0083, 0.0192, -0.001])) illumination_element_creator.set_illuminator_orientation(np.asarray([-0.383972, 0, 1])) elif y_idx == 1: illumination_element_creator.set_illuminator_position(np.asarray([-0.0083, 0.0192, -0.001])) illumination_element_creator.set_illuminator_orientation(np.asarray([0.383972, 0, 1])) illumination_element_creator.set_illuminator_geometry(np.asarray([0, 0.025, 0])) illumination_element_creator.set_illuminator_geometry_type("CUBOID") illumination_element_creator.set_beam_energy_profile(np.asarray([np.linspace(700, 900, 100), np.ones(100)])) illumination_element_creator.set_beam_stability_profile(np.asarray([np.linspace(700, 900, 100), np.ones(100)])) illumination_element_creator.set_pulse_width(7e-9) device_creator.add_illumination_element(illumination_element_creator.get_dictionary()) return device_creator.finalize_device_meta_data()
[docs] def set_metadata_value(self, metadatum: MetaDatum) -> object: if metadatum == MetadataAcquisitionTags.UUID: return "TestUUID" elif metadatum == MetadataAcquisitionTags.DATA_TYPE: return self.meta['type'] elif metadatum == MetadataAcquisitionTags.AD_SAMPLING_RATE: return 1.0 / (float(self.meta['space directions'][1][1]) / 1000000) elif metadatum == MetadataAcquisitionTags.ACOUSTIC_COUPLING_AGENT: return "Water" elif metadatum == MetadataAcquisitionTags.ACQUISITION_WAVELENGTHS: return np.asarray([700]) elif metadatum == MetadataAcquisitionTags.COMPRESSION: return "None" elif metadatum == MetadataAcquisitionTags.DIMENSIONALITY: return "time" elif metadatum == MetadataAcquisitionTags.ENCODING: return "raw" elif metadatum == MetadataAcquisitionTags.SCANNING_METHOD: return "Freehand" elif metadatum == MetadataAcquisitionTags.PHOTOACOUSTIC_IMAGING_DEVICE_REFERENCE: return "c771111c-36ba-425d-9f53-84b8ff092059" elif metadatum == MetadataAcquisitionTags.SIZES: return np.asarray(self.meta['sizes']) else: return None