Source code for nvtools.io

"""File input/output tools."""

import operator
import pathlib
import sys
from dataclasses import dataclass

import h5py
import numpy as np
import numpy.typing as npt
from colorama import Fore, Style
from prettytable import SINGLE_BORDER, PrettyTable

import nvtools


[docs] @dataclass class MeasurementData: """Measurement data.""" x_data: npt.NDArray iterators: list observables: dict
[docs] class H5Loader: """H5 file loader.""" def __init__(self, *args): """H5 file loader.""" folder = pathlib.Path(sys.argv[0]).parent if args: self.file_path = pathlib.Path(folder, *args) else: self.file_path = pathlib.Path(folder, "raw_data.h5")
[docs] def print_contents(self): """Print file contents.""" with h5py.File(self.file_path, "r") as file: iterators = [] for e in file["Iterators"]: iterators.append((e, np.array(file["Iterators"][e]))) parameters = [] for e in file["Meta Info"]["Parameters"]: parameters.append((e, float(np.array(file["Meta Info"]["Parameters"][e])))) observables = [] for e in file["Observables"]: observables.append((e, np.array(file["Observables"][e]))) print( Fore.GREEN + Style.BRIGHT + "───────────────────────── H5 Loader ─────────────────────────" + Style.RESET_ALL ) table = PrettyTable() table.set_style(SINGLE_BORDER) table.field_names = ["Iterator", "Value"] for i in range(len(iterators)): table.add_row([f"{iterators[i][0]}", f"{iterators[i][1]}"]) print(table) print("") table = PrettyTable() table.set_style(SINGLE_BORDER) table.field_names = ["Parameter", "Value"] for i in range(len(parameters)): table.add_row([f"{parameters[i][0]}", f"{parameters[i][1]}"]) print(table) print("") table = PrettyTable() table.set_style(SINGLE_BORDER) table.field_names = ["Observables", "Value"] for i in range(len(observables)): table.add_row([f"{observables[i][0]}", f"{observables[i][1]}"]) print(table)
[docs] def load_odmr_lia(self, exclude=None, normalize=False): """Load LIA ODMR.""" exclude = [] if exclude is None else exclude with h5py.File(self.file_path, "r") as file: iterators = {} for e in file["Iterators"]: iterators[e] = np.array(file["Iterators"][e]) parameters = {} for e in file["Meta Info"]["Parameters"]: parameters[e] = float(np.array(file["Meta Info"]["Parameters"][e])) mw_start = float(np.array(file["Meta Info"]["Parameters"]["Sweep Start Frequency in MHz"])) mw_stop = float(np.array(file["Meta Info"]["Parameters"]["Sweep Stop Frequency in MHz"])) samples = int(np.array(file["Meta Info"]["Parameters"]["Samples"])) iterators = str(np.array(file["Meta Info"]["Iterators"]))[2:-1].split("\\n") iterators_list = [] for e in iterators: e = e.split(": ") iterators_list.append((e[0], np.array(file["Iterators"][e[0]]))) observables = {} for obs in file["Observables"]: observables[obs] = {} if len(iterators_list) == 1: arr = np.zeros(samples) n_excluded = 0 for j in range(len(iterators_list[0][1])): if f"{j}" in exclude: n_excluded += 1 continue arr += np.array(file["Observables"][obs][f"{j}"]) arr /= len(iterators_list[0][1]) - n_excluded if normalize: arr /= (arr[0] + arr[-1]) / 2 observables[obs] = arr elif len(iterators_list) == 2: for i in range(len(iterators_list[1][1])): arr = np.zeros(samples) n_excluded = 0 for j in range(len(iterators_list[0][1])): if f"{i}_{j}" in exclude: n_excluded += 1 continue arr += np.array(file["Observables"][obs][f"{i}_{j}"]) arr /= len(iterators_list[0][1]) - n_excluded if normalize: arr /= (arr[0] + arr[-1]) / 2 observables[obs][f"{i}"] = arr mw_frequency = np.linspace(mw_start, mw_stop, samples) if nvtools.VERBOSE: print( Fore.GREEN + Style.BRIGHT + "───────────────────────── H5 Loader ─────────────────────────" + Style.RESET_ALL ) table = PrettyTable() table.set_style(SINGLE_BORDER) table.field_names = ["", "Value"] table.add_row(["File path", f"{self.file_path}"]) table.add_row(["Iterators", f"{list(map(operator.itemgetter(0), iterators_list))}"]) table.add_row(["Observables", f"{list(observables.keys())}"]) if exclude: table.add_row(["Excluding", f"{exclude}"]) print(table) print("\n") return MeasurementData(mw_frequency, iterators_list, observables)