Source code for eqsig.loader

import numpy as np
from eqsig.single import Signal, AccSignal


[docs]def load_values_and_dt(ffp): """ Loads values and time step that were saved in eqsig input format. Parameters ---------- ffp: str Full file path to output file Returns ------- values: array_like An array of values dt: float Time step """ # This is broken in numpy version 1.19 since string converter switches to complex try: data = np.genfromtxt(ffp, skip_header=1, delimiter=",", names=True, usecols=0) dt = data.dtype.names[0].split("_")[-1] dt = "." + dt[1:] dt = float(dt) except TypeError: # needed for numpy==1.19 data = np.genfromtxt(ffp, skip_header=2, delimiter=",", usecols=0) with open(ffp) as ifile: dt = float(ifile.read().splitlines()[1].split()[1]) values = data.astype(float) return values, dt
# def fast_nga_loader(ffp): # data = np.genfromtxt(ffp, skip_header=4, names=True) # data.flatten() # dt = data.dtype.names[0].split("DT=")[-1] # dt = "." + dt[1:] # print(dt) # dt = float(dt) # values = data.astype(np.float) # return values, dt
[docs]def save_values_and_dt(ffp, values, dt, label): """ Exports acceleration values to the eqsig format. Parameters ---------- ffp: str Full file path to output file values: array_like An array of values dt: float Time step label: str A label of the data """ para = [label, "%i %.4f" % (len(values), dt)] for i in range(len(values)): para.append("%.6f" % values[i]) ofile = open(ffp, "w") ofile.write("\n".join(para)) ofile.close()
[docs]def load_signal(ffp, astype='sig'): vals, dt = load_values_and_dt(ffp) if astype == "signal": return Signal(vals, dt) elif astype == "acc_sig": return AccSignal(vals, dt)
[docs]def load_sig(ffp, m=1.0): """ Loads a ``Signal`` that was saved in eqsig input format. Parameters ---------- ffp: str Full file path to output file Returns ------- sig: eqsig.Signal m: float (default=1.0) Scale factor to apply to time series data when loading """ vals, dt = load_values_and_dt(ffp) return Signal(vals * m, dt)
[docs]def load_asig(ffp, load_label=False, m=1.0): """ Loads an ``AccSignal`` that was saved in eqsig input format. Parameters ---------- ffp: str Full file path to output file load_label: bool if true then get label from file m: float (default=1.0) Scale factor to apply to time series data when loading Returns ------- asig: eqsig.AccSignal """ vals, dt = load_values_and_dt(ffp) if load_label: a = open(ffp) label = a.read().splitlines()[0] a.close() else: label = 'm1' return AccSignal(vals * m, dt, label=label)
[docs]def save_signal(ffp, signal): """ Saves a ``Signal`` or ``AccSignal`` to the eqsig format Parameters ---------- ffp: str Full file path to output file signal """ save_values_and_dt(ffp, signal.values, signal.dt, signal.label)
[docs]def load_3_comp_values_and_dt_from_v2a(ffp): """ Loads a ground motion file stored in the V2A format Parameters ---------- ffp Returns ------- """ a = open(ffp) b = a.readlines() a.close() npts = None dt = None for line in b: if 'Number of points' in line: parts = line.split('points')[1] n_str = parts.split('Duration')[0] npts = int(n_str) if 'corrected data at' in line: parts = line.split('data at')[1] dt_str = parts.split('sec')[0] dt = float(dt_str) if npts is not None and dt is not None: break b = b[26:] elines = int(np.ceil(float(npts) / 10)) accs = [] for i in range(3): accs.append([]) print(3 * i * elines, (3 * i + 1) * elines) for j in range(3 * i * elines + i * 26, (3 * i + 1) * elines + i * 26): accs[i] += b[j].split() accs = np.array(accs).astype(float) / 1e3 return accs[0], accs[1], accs[2], dt