def db_magnitude_distance_by_trt(db1, dist_type, figure_size=(7, 5), filename=None, filetype="png", dpi=300): """ Plot magnitude-distance comparison by tectonic region """ trts = [] for i in db1.records: trts.append(i.event.tectonic_region) trt_types = list(set(trts)) selector = SMRecordSelector(db1) plt.figure(figsize=figure_size) for trt in trt_types: subdb = selector.select_trt_type(trt, as_db=True) mag, dists = get_magnitude_distances(subdb, dist_type) plt.semilogx(dists, mag, "o", mec='k', mew=0.5, label=trt) plt.xlabel(DISTANCE_LABEL[dist_type], fontsize=14) plt.ylabel("Magnitude", fontsize=14) plt.title("Magnitude vs Distance by Tectonic Region", fontsize=18) plt.legend(loc='lower right', numpoints=1) plt.grid() _save_image(filename, plt.gcf(), filetype, dpi) plt.show()
def get_residuals(self, database, nodal_plane_index=1, component="Geometric", normalise=True): """ Calculate the residuals for a set of ground motion records """ # Contexts is a list of dictionaries contexts = database.get_contexts(nodal_plane_index) self.database = SMRecordSelector(database) self.contexts = [] for context in contexts: # Get the observed strong ground motions context = self.get_observations(context, component) # Get the expected ground motions context = self.get_expected_motions(context) context = self.calculate_residuals(context, normalise) for gmpe in self.residuals.keys(): for imtx in self.residuals[gmpe].keys(): if not context["Residual"][gmpe][imtx]: continue for res_type in self.residuals[gmpe][imtx].keys(): if res_type == "Inter event": inter_ev = \ context["Residual"][gmpe][imtx][res_type] if np.all( np.fabs(inter_ev - inter_ev[0]) < 1.0E-12): # Single inter-event residual self.residuals[gmpe][imtx][res_type].append( inter_ev[0]) # Append indices self.unique_indices[gmpe][imtx].append( np.array([0])) else: # Inter event residuals per-site e.g. Chiou # & Youngs (2008; 2014) case self.residuals[gmpe][imtx][res_type].extend( inter_ev.tolist()) self.unique_indices[gmpe][imtx].append( np.arange(len(inter_ev))) else: self.residuals[gmpe][imtx][res_type].extend( context["Residual"][gmpe][imtx][res_type].tolist()) self.modelled[gmpe][imtx][res_type].extend( context["Expected"][gmpe][imtx][res_type].tolist()) self.modelled[gmpe][imtx]["Mean"].extend( context["Expected"][gmpe][imtx]["Mean"].tolist()) self.contexts.append(context) for gmpe in self.residuals.keys(): for imtx in self.residuals[gmpe].keys(): if not self.residuals[gmpe][imtx]: continue for res_type in self.residuals[gmpe][imtx].keys(): self.residuals[gmpe][imtx][res_type] = np.array( self.residuals[gmpe][imtx][res_type]) self.modelled[gmpe][imtx][res_type] = np.array( self.modelled[gmpe][imtx][res_type]) self.modelled[gmpe][imtx]["Mean"] = np.array( self.modelled[gmpe][imtx]["Mean"])
def db_magnitude_distance_by_site(db1, dist_type, classification="NEHRP", figure_size=(7, 5), filename=None, filetype="png", dpi=300): """ Plot magnitude-distance comparison by site NEHRP or Eurocode 8 Site class """ if classification == "NEHRP": site_bounds = NEHRP_BOUNDS elif classification == "EC8": site_bounds = EC8_BOUNDS else: raise ValueError("Unrecognised Site Classifier!") selector = SMRecordSelector(db1) plt.figure(figsize=figure_size) total_idx = [] for site_class in site_bounds.keys(): site_idx = _site_selection(db1, site_class, classification) if site_idx: site_db = selector.select_records(site_idx, as_db=True) mags, dists = get_magnitude_distances(site_db, dist_type) plt.plot(np.array(dists), np.array(mags), "o", mec='k', mew=0.5, label="Site Class %s" % site_class) total_idx.extend(site_idx) unc_idx = set(range(db1.number_records())).difference(set(total_idx)) unc_db = selector.select_records(unc_idx, as_db=True) mag, dists = get_magnitude_distances(site_db, dist_type) plt.semilogx(np.array(dists), np.array(mags), "o", mfc="None", mec='k', mew=0.5, label="Unclassified", zorder=0) plt.xlabel(DISTANCE_LABEL[dist_type], fontsize=14) plt.ylabel("Magnitude", fontsize=14) plt.grid() plt.legend(ncol=2,loc="lower right", numpoints=1) plt.title("Magnitude vs Distance (by %s Site Class)" % classification, fontsize=18) _save_image(filename, filetype, dpi) plt.show()
def get_residuals(self, database, nodal_plane_index=1, component="Geometric", normalise=True): """ Calculate the residuals for a set of ground motion records """ # Contexts is a list of dictionaries contexts = database.get_contexts(nodal_plane_index) self.database = SMRecordSelector(database) self.contexts = [] for context in contexts: # Get the observed strong ground motions context = self.get_observations(context, component) # Get the expected ground motions context = self.get_expected_motions(context) context = self.calculate_residuals(context, normalise) for gmpe in self.residuals.keys(): for imtx in self.residuals[gmpe].keys(): if not context["Residual"][gmpe][imtx]: continue for res_type in self.residuals[gmpe][imtx].keys(): if res_type == "Inter event": inter_ev = \ context["Residual"][gmpe][imtx][res_type] inter_ev, inter_idx = np.unique(inter_ev, return_index=True) self.residuals[gmpe][imtx][res_type].extend( inter_ev.tolist()) #inter_mags = (context["Rupture"].mag * # np.ones(len(inter_ev))).tolist() self.unique_indices[gmpe][imtx].append(inter_idx) else: self.residuals[gmpe][imtx][res_type].extend( context["Residual"][gmpe][imtx] [res_type].tolist()) self.modelled[gmpe][imtx][res_type].extend( context["Expected"][gmpe][imtx][res_type].tolist()) self.modelled[gmpe][imtx]["Mean"].extend( context["Expected"][gmpe][imtx]["Mean"].tolist()) self.contexts.append(context) for gmpe in self.residuals.keys(): for imtx in self.residuals[gmpe].keys(): if not self.residuals[gmpe][imtx]: continue for res_type in self.residuals[gmpe][imtx].keys(): self.residuals[gmpe][imtx][res_type] = np.array( self.residuals[gmpe][imtx][res_type]) self.modelled[gmpe][imtx][res_type] = np.array( self.modelled[gmpe][imtx][res_type]) self.modelled[gmpe][imtx]["Mean"] = np.array( self.modelled[gmpe][imtx]["Mean"])
def get_site_residuals(self, database, component="Geometric"): """ Calculates the total, inter-event and within-event residuals for each site """ imt_dict = dict([(imtx, {}) for imtx in self.imts]) for site_id in self.site_ids: print site_id selector = SMRecordSelector(database) site_db = selector.select_from_site_id(site_id, as_db=True) resid = Residuals(self.input_gmpe_list, self.imts) resid.get_residuals(site_db, normalise=False, component=component) setattr(resid, "site_analysis", self._set_empty_dict()) setattr(resid, "site_expected", self._set_empty_dict()) self.site_residuals.append(resid)
def get_site_residuals(self, database): """ Calculates the total, inter-event and within-event residuals for each site """ imt_dict = dict([(imtx, {}) for imtx in self.imts]) for site_id in self.site_ids: print site_id selector = SMRecordSelector(database) site_db = selector.select_from_site_id(site_id, as_db=True) resid = Residuals(self.gmpe_list, self.imts) resid.get_residuals(site_db, normalise=False) setattr( resid, "site_analysis", OrderedDict([(gmpe, imt_dict) for gmpe in self.gmpe_list])) setattr( resid, "site_expected", OrderedDict([(gmpe, imt_dict) for gmpe in self.gmpe_list])) self.site_residuals.append(resid)
def get_residuals(self, database, nodal_plane_index=1, component="Geometric", normalise=True): """ Calculate the residuals for a set of ground motion records """ # Contexts is a list of dictionaries contexts = database.get_contexts(nodal_plane_index) self.database = SMRecordSelector(database) self.contexts = [] for context in contexts: #print context # Get the observed strong ground motions context = self.get_observations(context, component) # Get the expected ground motions context = self.get_expected_motions(context) context = self.calculate_residuals(context, normalise) for gmpe in self.residuals.keys(): for imtx in self.residuals[gmpe].keys(): for res_type in self.residuals[gmpe][imtx].keys(): self.residuals[gmpe][imtx][res_type].extend( context["Residual"][gmpe][imtx][res_type].tolist()) self.modelled[gmpe][imtx][res_type].extend( context["Expected"][gmpe][imtx][res_type].tolist()) self.modelled[gmpe][imtx]["Mean"].extend( context["Expected"][gmpe][imtx]["Mean"].tolist()) self.contexts.append(context) for gmpe in self.residuals.keys(): for imtx in self.residuals[gmpe].keys(): for res_type in self.residuals[gmpe][imtx].keys(): self.residuals[gmpe][imtx][res_type] = np.array( self.residuals[gmpe][imtx][res_type]) self.modelled[gmpe][imtx][res_type] = np.array( self.modelled[gmpe][imtx][res_type]) self.modelled[gmpe][imtx]["Mean"] = np.array( self.modelled[gmpe][imtx]["Mean"])