Beispiel #1
0
def _merge_picks(eve1, eve2, delete_old=False):
    """
    Merge a list of objects that have waveform ids (arrivals, picks,
    amplitudes)
    """
    maps = _generate_pick_phase_maps(eve1, eve2)
    # new attributes that should overwrite old ones
    attrs_no_update = {"resource_id", "force_resource_id"}
    widp_p1 = maps["widp_p1"]
    widp_p2 = maps["widp_p2"]

    # for picks in old and new
    for key in set(widp_p1) & set(widp_p2):
        if widp_p1[key] != widp_p2[key]:
            bump_creation_version(widp_p2[key])  # bump creation info
            pd2 = widp_p2[key].__dict__
            update_vals = {x: pd2[x] for x in pd2 if x not in attrs_no_update}
            widp_p1[key].__dict__.update(update_vals)
    # for new picks append
    for key in set(widp_p2) - set(widp_p1):
        eve1.picks.append(widp_p2[key])

    # delete old
    if delete_old:
        eve1.picks = [
            x for x in eve1.picks if _hash_wid(x, "phase_hint") in widp_p2
        ]
Beispiel #2
0
def _merge_amplitudes(eve1, eve2, delete_old=False):
    """Merge the amplitudes together."""
    attrs_no_update = {"pick_id", "resource_id", "force_resource_id"}
    maps = _generate_pick_phase_maps(eve1, eve2)

    pid1_a1 = {x.pick_id.id: x for x in eve1.amplitudes}
    pid1_a2 = {}  # map all amplitude 2 back to pick ids on first event
    for amp in eve2.amplitudes:
        aid = amp.pick_id
        if aid is not None and maps["id2_p1"][aid.id] is not None:
            key = maps["id2_p1"][aid.id].resource_id.id
            pid1_a2[key] = amp
    # common keys
    for key in set(pid1_a1) & set(pid1_a2):
        amp1, amp2 = pid1_a2[key], pid1_a1[key]
        if amp1 == amp2:
            continue
        bump_creation_version(amp2)  # bump creation info
        pd2 = amp2.__dict__
        update_vals = {x: pd2[x] for x in pd2 if x not in attrs_no_update}
        amp1.__dict__.update(update_vals)
    # for new amplitudes append
    for key in set(pid1_a2) - set(pid1_a1):
        eve1.amplitudes.append(pid1_a2[key])
    # delete old
    if delete_old:
        eve1.amplitudes = [
            x for x in eve1.amplitudes if x.pick_id.id in pid1_a2
        ]
Beispiel #3
0
def attach_new_origin(
    old_event: Event,
    new_event: Event,
    new_origin: Origin,
    preferred: bool,
    index: Optional[int] = None,
) -> Catalog:
    """
    Attach a new origin to an existing events object.

    Parameters
    ----------
    old_event : obspy.core.event.Event
        The old event that will receive the new origin
    new_event : obspy.core.event.Event
        The new event that contains the origin, needed for merging picks
        that may not exist in old_event
    new_origin : obspy.core.event.Origin
        The new origin that will be attached to old_event
    preferred : bool
        If True mark the new origin as the preferred_origin
    index : int or None
        The origin index of old_cat that new_origin will overwrite, if None
        append the new_origin to old_cat.origins

    Returns
    -------
    obspy.Catalog
        modifies old_cat in-place, returns old_catalog
    """
    # make sure all the picks/amplitudes in new_event are also in old_event
    merge_events(old_event, new_event, delete_old=False)
    # point the arrivals in the new origin at the old picks
    _associate_picks(old_event, new_event, new_origin)
    # append the origin
    if index is not None:  # if this origin is to replace another
        try:
            old_ori = old_event.origins[index]
        except IndexError:
            msg = ("%d is not valid for an origin list of length %d") % (
                index,
                len(old_event.origins),
            )
            msg += " appending new origin to end of list"
            warnings.warn(msg)
            old_event.origins.append(new_origin)
        else:
            # set resource id and creation info
            new_origin.resource_id = old_ori.resource_id
            new_origin.creation_info = old_ori.creation_info
            old_event.origins[index] = new_origin
    else:
        old_event.origins.append(new_origin)
    # bump origin creation info
    bump_creation_version(new_origin)
    # set preferred
    if preferred:
        old_event.preferred_origin_id = new_origin.resource_id
    validate_catalog(old_event)
    return old_event
Beispiel #4
0
 def test_bump_version_on_bad_object(self):
     """
     Ensure bumping the version on a non-obspy object doesnt error
     and doesnt add creation_info.
     """
     test_obj = "some_string"
     bump_creation_version(test_obj)
     assert not hasattr(test_obj, "creation_info")
Beispiel #5
0
 def eve_cis(self, cat):
     """return the original version and the bumped version"""
     ev1 = cat[0].origins[0]
     cl1 = copy.deepcopy(ev1.creation_info)
     ev2 = cat[0].origins[0].copy()
     bump_creation_version(ev2)
     cl2 = ev2.creation_info
     return cl1, cl2
Beispiel #6
0
 def int_version(self, cat):
     """
     Bump version, copy event, bump version again, set version to int,
     bump again.
     """
     eve1 = cat[0]
     bump_creation_version(eve1)
     eve1.creation_info.version = 0
     bump_creation_version(eve1)
     return eve1.creation_info
Beispiel #7
0
 def multi_version(self, cat):
     """
     Bump version, copy event, bump version again, return creation info.
     """
     eve1 = cat[0]
     bump_creation_version(eve1)
     eve2 = eve1.copy()
     time.sleep(0.001)
     bump_creation_version(eve2)
     return eve1.creation_info, eve2.creation_info