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 ]
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 ]
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
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")
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
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
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