def plot_time_series(acceleration, time_step, velocity=[], displacement=[], units="cm/s/s", figure_size=(8, 6), filename=None, filetype="png", dpi=300, linewidth=1.5): """ Creates a plot of acceleration, velocity and displacement for a specific ground motion record """ acceleration = convert_accel_units(acceleration, units) accel_time = get_time_vector(time_step, len(acceleration)) if not len(velocity): velocity, dspl = get_velocity_displacement(time_step, acceleration) vel_time = get_time_vector(time_step, len(velocity)) if not len(displacement): displacement = dspl disp_time = get_time_vector(time_step, len(displacement)) fig = plt.figure(figsize=figure_size) fig.set_tight_layout(True) ax = plt.subplot(3, 1, 1) # Accleration ax.plot(accel_time, acceleration, 'k-', linewidth=linewidth) ax.set_xlabel("Time (s)", fontsize=12) ax.set_ylabel("Acceleration (cm/s/s)", fontsize=12) end_time = np.max(np.array([accel_time[-1], vel_time[-1], disp_time[-1]])) pga = np.max(np.fabs(acceleration)) ax.set_xlim(0, end_time) ax.set_ylim(-1.1 * pga, 1.1 * pga) ax.grid() # Velocity ax = plt.subplot(3, 1, 2) ax.plot(vel_time, velocity, 'b-', linewidth=linewidth) ax.set_xlabel("Time (s)", fontsize=12) ax.set_ylabel("Velocity (cm/s)", fontsize=12) pgv = np.max(np.fabs(velocity)) ax.set_xlim(0, end_time) ax.set_ylim(-1.1 * pgv, 1.1 * pgv) ax.grid() # Displacement ax = plt.subplot(3, 1, 3) ax.plot(disp_time, displacement, 'r-', linewidth=linewidth) ax.set_xlabel("Time (s)", fontsize=12) ax.set_ylabel("Displacement (cm)", fontsize=12) pgd = np.max(np.fabs(displacement)) ax.set_xlim(0, end_time) ax.set_ylim(-1.1 * pgd, 1.1 * pgd) ax.grid() _save_image(filename, filetype, dpi) plt.show()
def _parse_time_history(self, ifile): """ Parses the time history """ # Build the metadata dictionary again metadata = _get_metadata_from_file(ifile) self.number_steps = _to_int(metadata["NDATA"]) self.time_step = _to_float(metadata["SAMPLING_INTERVAL_S"]) self.units = metadata["UNITS"] # Get acceleration data accel = np.genfromtxt(ifile, skip_header=64) if "DIS" in ifile: pga = None pgd = np.fabs( _to_float(metadata["PGD_" + metadata["UNITS"].upper()])) else: pga = np.fabs( _to_float(metadata["PGA_" + metadata["UNITS"].upper()])) pgd = None if "s^2" in self.units: self.units = self.units.replace("s^2", "s/s") output = { # Although the data will be converted to cm/s/s internally we can # do it here too "Acceleration": convert_accel_units(accel, self.units), "Time": get_time_vector(self.time_step, self.number_steps), "Time-step": self.time_step, "Number Steps": self.number_steps, "Units": self.units, "PGA": pga, "PGD": pgd } return output
def _parse_time_history(self, ifile): """ Parses the time history """ # Build the metadata dictionary again metadata = _get_metadata_from_file(ifile) self.number_steps = _to_int(metadata["NDATA"]) self.time_step = _to_float(metadata["SAMPLING_INTERVAL_S"]) self.units = metadata["UNITS"] # Get acceleration data accel = np.genfromtxt(ifile, skip_header=64) if "DIS" in ifile: pga = None pgd = np.fabs(_to_float(metadata["PGD_" + metadata["UNITS"].upper()])) else: pga = np.fabs(_to_float( metadata["PGA_" + metadata["UNITS"].upper()])) pgd = None if "s^2" in self.units: self.units = self.units.replace("s^2", "s/s") output = { # Although the data will be converted to cm/s/s internally we can # do it here too "Acceleration": convert_accel_units(accel, self.units), "Time": get_time_vector(self.time_step, self.number_steps), "Time-step": self.time_step, "Number Steps": self.number_steps, "Units": self.units, "PGA": pga, "PGD": pgd } return output
def get_husid(acceleration, time_step): """ Returns the Husid vector, defined as \int{acceleration ** 2.} """ time_vector = get_time_vector(time_step, len(acceleration)) husid = np.hstack([0., cumtrapz(acceleration ** 2., time_vector)]) return husid, time_vector
def get_husid(acceleration, time_step): """ Returns the Husid vector, defined as \int{acceleration ** 2.} :param numpy.ndarray acceleration: Vector of acceleration values :param float time_step: Time-step of record (s) """ time_vector = get_time_vector(time_step, len(acceleration)) husid = np.hstack([0., cumtrapz(acceleration**2., time_vector)]) return husid, time_vector
def get_husid(acceleration, time_step): """ Returns the Husid vector, defined as \int{acceleration ** 2.} :param numpy.ndarray acceleration: Vector of acceleration values :param float time_step: Time-step of record (s) """ time_vector = get_time_vector(time_step, len(acceleration)) husid = np.hstack([0., cumtrapz(acceleration ** 2., time_vector)]) return husid, time_vector
def get_bracketed_duration(acceleration, time_step, threshold): """ Returns the bracketed duration, defined as the time between the first and last excrusions above a particular level of acceleration """ idx = np.where(np.fabs(acceleration) >= threshold)[0] if len(idx) == 0: # Record does not exced threshold at any point return 0. else: time_vector = get_time_vector(time_step, len(acceleration)) return time_vector[idx[-1]] - time_vector[idx[0]] + time_step
def get_bracketed_duration(acceleration, time_step, threshold): """ Returns the bracketed duration, defined as the time between the first and last excursions above a particular level of acceleration :param float threshold: Threshold acceleration in units of the acceleration time series """ idx = np.where(np.fabs(acceleration) >= threshold)[0] if len(idx) == 0: # Record does not exced threshold at any point return 0. else: time_vector = get_time_vector(time_step, len(acceleration)) return time_vector[idx[-1]] - time_vector[idx[0]] + time_step
def _parse_time_history(self, ifile, component2parse): """ Parses the time history and returns the time history of the specified component. All 3 components are provided in every ASA file. Note that components are defined with various names, and are not always given in the same order """ # The components are definied using the following names comp_names = { 'X': ['N90E', 'N90E;', 'N90W', 'N90W;', 'S90E', 'S90W', 'E--W', 'S9OE'], 'Y': ['N00E', 'N00E;', 'N00W', 'N00W;', 'S00E', 'S00W', 'N--S', 'NOOE'], 'V': ['V', 'V;+', '+V', 'Z', 'VERT'] } # Read component names, which are given on line 107 o = open(ifile, "r") r = o.readlines() components = list(r[107].split()) # Check if any component names are repeated if any(components.count(x) > 1 for x in components): raise ValueError( "Some components %s in record %s have the same name" % (components, ifile)) # Check if more than 3 components are given if len(components) > 3: raise ValueError("More than 3 components %s in record %s" % (components, ifile)) # Get acceleration data from correct column column = None for i in comp_names[component2parse]: if i == components[0]: column = 0 try: accel = np.genfromtxt(ifile, skip_header=109, usecols=column, delimiter='') except: raise ValueError( "Check %s has 3 equal length time-series columns" % ifile) break elif i == components[1]: column = 1 try: accel = np.genfromtxt(ifile, skip_header=109, usecols=column, delimiter='') except: raise ValueError( "Check %s has 3 equal length time-series columns" % ifile) break elif i == components[2]: column = 2 try: accel = np.genfromtxt(ifile, skip_header=109, usecols=column, delimiter='') except: raise ValueError( "Check %s has 3 equal length time-series columns" % ifile) break if column is None: raise ValueError("None of the components %s were found to be \n\ the %s component of file %s" % (components, component2parse, ifile)) # Build the metadata dictionary again metadata = _get_metadata_from_file(ifile) # Get units units_provided = metadata["UNIDADES DE LOS DATOS"] units = units_provided[units_provided.find("(") + 1:units_provided.find(")")] # Get time step, naming is not consistent so allow for variation for i in metadata: if 'INTERVALO DE MUESTREO, C1' in i: self.time_step = get_float(metadata[i].split("/")[1]) # Get number of time steps, use len(accel) because # sometimes "NUM. TOTAL DE MUESTRAS, C1-C6" is wrong self.number_steps = len(accel) output = { "Acceleration": convert_accel_units(accel, self.units), "Time": get_time_vector(self.time_step, self.number_steps), "Time-step": self.time_step, "Number Steps": self.number_steps, "Units": self.units, "PGA": max(abs(accel)), "PGD": None } return output
def _parse_time_history(self, ifile, component2parse): """ Parses the time history and returns the time history of the specified component. All 3 components are provided in every ASA file. Note that components are defined with various names, and are not always given in the same order """ # The components are definied using the following names comp_names = {'X': ['ENE', 'N90E', 'N90E;', 'N90W', 'N90W;', 'S90E', 'S90W', 'E--W', 'S9OE'], 'Y': ['ENN', 'N00E', 'N00E;', 'NOOE;', 'N00W', 'NOOW;', 'S00E', 'S00W', 'N--S', 'NOOE'], 'V': ['ENZ', 'V', 'V;+', '+V', 'Z', 'VERT']} # Read component names, which are given on line 107 o = open(ifile, "r", encoding='iso-8859-1') r = o.readlines() components = list(r[107].split()) # Check if any component names are repeated if any(components.count(x) > 1 for x in components): raise ValueError( "Some components %s in record %s have the same name" % (components, ifile)) # Check if more than 3 components are given if len(components) > 3: raise ValueError( "More than 3 components %s in record %s" % (components, ifile)) # Get acceleration data from correct column column = None for i in comp_names[component2parse]: if i == components[0]: column = 0 try: accel = np.genfromtxt(ifile, skip_header=109, usecols=column, delimiter='', encoding='iso-8859-1') except: raise ValueError( "Check %s has 3 equal length time-series columns" % ifile) break elif i == components[1]: column = 1 try: accel = np.genfromtxt(ifile, skip_header=109, usecols=column, delimiter='', encoding='iso-8859-1') except: raise ValueError( "Check %s has 3 equal length time-series columns" % ifile) break elif i == components[2]: column = 2 try: accel = np.genfromtxt(ifile, skip_header=109, usecols=column, delimiter='', encoding='iso-8859-1') except: raise ValueError( "Check %s has 3 equal length time-series columns" % ifile) break if column is None: raise ValueError( "None of the components %s were found to be \n\ the %s component of file %s" % (components, component2parse, ifile)) # Build the metadata dictionary again metadata = _get_metadata_from_file(ifile) # Get units units_provided = metadata["UNIDADES DE LOS DATOS"] units = units_provided[units_provided.find("(") + 1: units_provided.find(")")] # Get time step, naming is not consistent so allow for variation for i in metadata: if 'INTERVALO DE MUESTREO, C1' in i: self.time_step = get_float(metadata[i].split("/")[1]) # Get number of time steps, use len(accel) because # sometimes "NUM. TOTAL DE MUESTRAS, C1-C6" is wrong self.number_steps = len(accel) output = { "Acceleration": convert_accel_units(accel, self.units), "Time": get_time_vector(self.time_step, self.number_steps), "Time-step": self.time_step, "Number Steps": self.number_steps, "Units": self.units, "PGA": max(abs(accel)), "PGD": None } return output