Source code for patato.io.hdf5_converter
# Copyright (c) Thomas Else 2023-25.
# License: MIT
import os
import glob
from os.path import join, dirname, split
from ..io.ithera.read_ithera import iTheraMSOT
from ..io.simpa.read_simpa import SimpaImporter
from ..utils import sort_key
[docs]
def convert_ithera_msot_binary_to_hdf5(
input_path: str,
output_path: str,
update: bool = False,
use_user_defined_scan_name: bool = False,
):
"""
This method converts all iThera MSOT files in a folder and exports them to an HDF5 format.
:param use_user_defined_scan_name: Use a user defined scan name instead of the ithera number.
:param input_path: A string that represents a directory. In this directory, a bunch of data is located in individual
folders following this naming convention: "Scan_N/" with N being an incrementing unique integer.
:param output_path: The output path is a string representing a directory path pointing to the location where the
resulting hdf5 files should be stored.
:param update: if True, the file will be processed again, even if an hdf5 file containing raw data with the desired
output name already exists at the output_path location.
"""
scan_paths = list(
sorted(
glob.glob(join(input_path, "**", "Scan_*/"), recursive=True), key=sort_key
)
)
if len(scan_paths) < 1:
print("Found no scans in the input path.")
errors = []
for scan_path in scan_paths:
ithera_defined_scan_name = split(dirname(scan_path))[-1]
print("WORKING ON", ithera_defined_scan_name)
try:
scan = iTheraMSOT(dirname(scan_path))
if 0 in scan.raw_data.shape:
print(
"Scan skipped because scan was not acquired properly",
ithera_defined_scan_name,
)
except FileNotFoundError as e:
print(str(e))
print("Scan skipped, some data missing?", ithera_defined_scan_name)
errors.append(
"Scan skipped, some data missing in " + ithera_defined_scan_name
)
continue
user_defined_scan_name = scan.get_scan_name()
if use_user_defined_scan_name:
scan_name = user_defined_scan_name
else:
scan_name = ithera_defined_scan_name
scan_name = join(dirname(dirname(scan_path))[len(input_path) + 1 :], scan_name)
if os.path.exists(join(output_path, scan_name + ".hdf5")) and not update:
continue
print("SAVING AS", join(output_path, scan_name + ".hdf5"))
scan.save_to_hdf5(join(output_path, scan_name + ".hdf5"))
print("Saved to HDF5.")
print("\n".join(errors))
[docs]
def convert_simpa(
input_path: str, output_path: str, use_user_defined_scan_name: bool = False
):
"""
This method converts simpa files to HDF5 format.
Parameters
----------
input_path
output_path
update
use_user_defined_scan_name
slice_n
"""
scan_paths = list(
sorted(
glob.glob(join(input_path, "**", "*.hdf5"), recursive=True), key=sort_key
)
)
if len(scan_paths) < 1:
print("Found no scans in the input path.")
i = 1
for scan_path in scan_paths:
print("WORKING ON", scan_path)
scan = SimpaImporter(scan_path)
user_defined_scan_name = scan.get_scan_name()
if use_user_defined_scan_name:
scan_name = user_defined_scan_name
else:
scan_name = f"Scan_{str(i)}"
i += 1
scan_name = join(dirname(dirname(scan_path))[len(input_path) + 1 :], scan_name)
print(scan_name)
print("SAVING AS", join(output_path, scan_name + ".hdf5"))
scan.save_to_hdf5(join(output_path, scan_name + ".hdf5"))
print("Saved to HDF5.")