def test_preferred_no_origins(self): """ when the preferred id is set but origin is empty None should be returned. """ event = obspy.read_events()[0] # clear origins and ensure resource_id is not holding a reference event.origins.clear() rid = str(ev.ResourceIdentifier()) event.preferred_origin_id = rid # It should now return None with pytest.warns(UserWarning): assert get_preferred(event, "origin") is None # but if init_empty it should return an empty origin with pytest.warns(UserWarning): ori = get_preferred(event, "origin", init_empty=True) assert isinstance(ori, ev.Origin)
def test_bad_preferred_origin(self): """ ensure the bad preferred just returns last in list """ eve = obspy.read_events()[0] eve.preferred_origin_id = "bob" with pytest.warns(UserWarning) as w: preferred_origin = get_preferred(eve, "origin") assert len(w) == 1 assert preferred_origin is eve.origins[-1]
def __call__(self): """ Return a dict of origin quality attributes. """ out = {} origin = get_preferred(self.event, "origin", init_empty=True) # now extract information self._get_origin_quality_info(origin, out) self._get_depth_uncertainty_info(origin, out) # get phase and pick count self._get_phase_and_pick_counts(origin, out) return out
def _get_magnitude_info(eve: ev.Event): """ extract magnitude information. Get base magnitude, as well as various other magnitude types (where applicable). """ out = {} magnitude = get_preferred(eve, "magnitude", init_empty=True) out["magnitude"] = magnitude.mag out["magnitude_type"] = magnitude.magnitude_type or "" for col_name, mag_type in MAGNITUDE_COLUMN_TYPES.items(): out[col_name] = _get_last_magnitude(eve.magnitudes, mag_type) return out
def test_events_different_time_same_id_not_duplicated(self, tmpdir): """ events with different times but the same id should not be duplicated; the old path should be used when detected. """ cat = obspy.read_events() path = Path(tmpdir) catalog_to_directory(cat, path) first_event_path = get_event_path(cat[0], str(path)) file_event_count = list(path.rglob("*.xml")) # modify first event preferred origin time slightly event = cat[0] origin = get_preferred(event, "origin") origin.time += 10 # save to disk again catalog_to_directory(cat, path) # ensure event count didnt change assert len(file_event_count) == len(list(path.rglob("*.xml"))) assert Path(first_event_path).exists() # read first path and make sure origin time was updated cat2 = obspy.read_events(str(first_event_path)) assert len(cat2) == 1 assert get_preferred(cat2[0], "origin").time == origin.time
def _get_origin_quality(eve: ev.Event): """ get information from origin quality """ # ensure resource_ids in arrivals don't point to picks that dont exist ori = get_preferred(eve, "origin", init_empty=True) for pick in eve.picks: pick.resource_id.set_referred_object(pick) pick_dict = {str(p.resource_id): p for p in eve.picks} apid = {str(ar.pick_id): ar for ar in ori.arrivals} assert set(apid).issubset( set(pick_dict)), "arrivals link to non-existent picks" # desired attrs qual_set = { "standard_error", "associated_phase_count", "azimuthal_gap", "used_phase_count", } uncert_set = {"horizontal_uncertainty"} # objects to pull from qual = ori.quality uncert = ori.origin_uncertainty duncert = ori.depth_errors # out dict to populate out = {} for obsject, attrs in ((qual, qual_set), (uncert, uncert_set)): obsject = obsject or {} out.update(getattrs(obsject, attrs)) if duncert is not None: out["vertical_uncertainty"] = duncert.get("uncertainty", np.nan) else: out["vertical_uncertainty"] = np.nan out["p_phase_count"] = _get_phase_count(ori, "P") out["s_phase_count"] = _get_phase_count(ori, "S") out["p_pick_count"] = _get_pick_count("P", pick_dict) out["s_pick_count"] = _get_pick_count("S", pick_dict) # get station count and concat'ed string of stations arrivals = ori.arrivals picks = [pick_dict.get(arr.pick_id.id) for arr in arrivals] assert all(picks) pset = {p.waveform_id.station_code for p in picks} sl = sorted(list(pset)) out.update({"stations": ", ".join(sl), "station_count": len(sl)}) return out
def _get_magnitude_info(eve: ev.Event): """ extract magnitude information. Get base magnitude, as well as various other magnitude types (where applicable). """ out = {} magnitude = get_preferred(eve, "magnitude", init_empty=True) out["magnitude"] = magnitude.mag out["magnitude_type"] = magnitude.magnitude_type mw = [ x.mag for x in eve.magnitudes if x.magnitude_type and x.magnitude_type.upper() == "MW" ] ml = [ x.mag for x in eve.magnitudes if x.magnitude_type and x.magnitude_type.upper() == "ML" ] md = [ x.mag for x in eve.magnitudes if x.magnitude_type and x.magnitude_type.upper() == "MD" ] out["moment_magnitude"] = mw[-1] if mw else np.nan out["local_magnitude"] = ml[-1] if ml else np.nan out["duration_magnitude"] = md[-1] if md else np.nan return out
def _get_origin_basic(eve): """ extract basic info from origin. """ ori = get_preferred(eve, "origin", init_empty=True) return getattrs(ori, set(origin_dtypes))
def test_events_no_preferred(self): """ Test that the last origin gets returned. """ event = obspy.read_events()[0] event.preferred_origin_id = None # clear origin_id assert event.origins[-1] == get_preferred(event, "origin")
def _get_origin_time(cat): ori = obsplus.get_preferred(cat, "origin") return ori.time