Source code for scri.LVC.file_io

# Copyright (c) 2018, Michael Boyle
# See LICENSE file for details: <https://github.com/moble/spherical_functions/blob/master/LICENSE>

import warnings
import numpy as np
import spherical_functions as sf
from .. import WaveformModes, Inertial, h


[docs] def read_from_h5(file_name, **kwargs): """Read data from an H5 file in LVC format""" import re import h5py from scipy.interpolate import InterpolatedUnivariateSpline as Spline phase_re = re.compile("phase_l(?P<ell>.*)_m(?P<m>.*)") amp_re = re.compile("amp_l(?P<ell>.*)_m(?P<m>.*)") with h5py.File(file_name, "r") as f: t = f["NRtimes"][:] ell_m = np.array( [[int(match["ell"]), int(match["m"])] for key in f for match in [phase_re.match(key)] if match] ) ell_min = np.min(ell_m[:, 0]) ell_max = np.max(ell_m[:, 0]) data = np.empty((t.size, sf.LM_total_size(ell_min, ell_max)), dtype=complex) for ell in range(ell_min, ell_max + 1): for m in range(-ell, ell + 1): amp = Spline( f[f"amp_l{ell}_m{m}/X"][:], f[f"amp_l{ell}_m{m}/Y"][:], k=int(f[f"amp_l{ell}_m{m}/deg"][()]) )(t) phase = Spline( f[f"phase_l{ell}_m{m}/X"][:], f[f"phase_l{ell}_m{m}/Y"][:], k=int(f[f"phase_l{ell}_m{m}/deg"][()]) )(t) data[:, sf.LM_index(ell, m, ell_min)] = amp * np.exp(1j * phase) if "auxiliary-info" in f and "history.txt" in f["auxiliary-info"]: history = ("### " + f["auxiliary-info/history.txt"][()].decode().replace("\n", "\n### ")).split("\n") else: history = [""] constructor_statement = f"scri.LVC.read_from_h5('{file_name}')" w = WaveformModes( t=t, data=data, ell_min=ell_min, ell_max=ell_max, frameType=Inertial, dataType=h, history=history, constructor_statement=constructor_statement, r_is_scaled_out=True, m_is_scaled_out=True, ) return w