Exemple #1
0
 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)
Exemple #2
0
 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]
Exemple #3
0
 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
Exemple #4
0
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
Exemple #5
0
 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
Exemple #6
0
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
Exemple #7
0
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
Exemple #8
0
def _get_origin_basic(eve):
    """ extract basic info from origin. """
    ori = get_preferred(eve, "origin", init_empty=True)
    return getattrs(ori, set(origin_dtypes))
Exemple #9
0
 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")
Exemple #10
0
 def _get_origin_time(cat):
     ori = obsplus.get_preferred(cat, "origin")
     return ori.time