Source code for djura.record_selection.gm_to_rs

# SPDX-License-Identifier: AGPL-3.0-or-later
# Copyright (C) 2025-2026 Djura | Risk - Data - Engineering S.r.l.
from typing import List, Union

from pandas import DataFrame, read_csv
import numpy as np
from pathlib import Path

from .intensity_measure import IntensityMeasure


[docs] class ResponseSpectrumFromGM: # Periods periods = np.arange(0, 4.01, 0.01) def __init__(self, damping: float, output_format: str = "dict"): """Initialize Parameters ---------- damping : float Damping ratio output_format : str Output format, by default "dict" """ self.damping = damping self.output_format = output_format.lower()
[docs] def derive_response_spectrum_batch( self, gm_dir_path: Path, dt_filepath: Path, gm_filepath: Union[Path, List[Path]], periods: List = None ) -> None: """Derives response spectrum for 1 or more ground motion records and stores into self.rs Parameters ---------- gm_dir_path : Path Path to the folder containing ground motion files dt_filepath : Path Path to a file containing time steps of each ground motion of interest gm_filepath : Union[Path, List[Path]] Path to a file containing filenames of each ground motion of interest periods : List, optional Periods used to compute the accelerations, if left None, uses a range between 0 and 4 seconds """ if isinstance(gm_filepath, List): gm_files = [] for file in gm_filepath: gm_files += list(read_csv(file, header=None)[0]) else: gm_files = list(read_csv(gm_filepath, header=None)[0]) dts = np.array(read_csv(dt_filepath, header=None)[0]) rs = {} for i in range(len(dts)): acc = np.array(read_csv( gm_dir_path / gm_files[i], header=None)[0]) dt = dts[i] _, sa = self.derive_response_spectrum(acc, dt, periods) rs[gm_files[i].replace('.txt', '')] = sa if self.output_format == "dict": return rs rs = DataFrame.from_dict(rs) if periods is None: periods = self.periods rs['T1'] = periods return rs
[docs] def derive_response_spectrum( self, accelerations: List, dt: float, periods: List = None) -> tuple[List, any]: """ Derives response spectrum for a single acceleration time history Parameters ---------- accelerations : List Accelerations time history dt : float Time step periods : List, optional Periods used to compute the accelerations, if left None, uses a range between 0 and 4 seconds Returns ------- tuple[List, any] Periods in [s] Spectral accelerations, Union[List, float] """ if periods is None: periods = np.arange(0, 4.01, 0.01) else: periods = np.array(periods) im = IntensityMeasure() sa = im.get_sat(periods, accelerations, dt, self.damping) periods = list(periods) return periods, list(sa)