def _add_hypocenter(trace, hypo): if hypo is None: # Try to get hypocenter information from the SAC header try: evla = trace.stats.sac.evla evlo = trace.stats.sac.evlo evdp = trace.stats.sac.evdp begin = trace.stats.sac.b except AttributeError: return try: tori = trace.stats.sac.o origin_time = trace.stats.starttime + tori - begin except AttributeError: origin_time = None if origin_time is not None: # make a copy of origin_time and round it to the nearest second _second = origin_time.second if origin_time.microsecond >= 500000: _second += 1 _microsecond = 0 _evid_time = origin_time.replace( second=_second, microsecond=_microsecond) else: # make a copy of starttime and round it to the nearest minute _starttime = trace.stats.starttime _minute = _starttime.minute if _starttime.second >= 30: _minute += 1 _second = 0 _microsecond = 0 _evid_time = _starttime.replace( minute=_minute, second=_second, microsecond=_microsecond) hypo = AttribDict() hypo.origin_time = origin_time try: kevnm = trace.stats.sac.kevnm # if string is empty, raise Exception if not kevnm: raise Exception # if string has spaces, then kevnm is not a code, # so raise Exception if ' ' in kevnm: raise Exception hypo.evid = kevnm except Exception: hypo.evid = _evid_time.strftime('%Y%m%d_%H%M%S') hypo.latitude = evla hypo.longitude = evlo hypo.depth = evdp trace.stats.hypo = hypo
def _parse_hypocenter(hypo_file): if hypo_file is None: return None hypo = AttribDict() hypo.latitude = None hypo.longitude = None hypo.depth = None hypo.origin_time = None hypo.evid = None if isinstance(hypo_file, str): try: with open(hypo_file) as fp: # Corinth hypocenter file format: # TODO: check file format line = fp.readline() # Skip the first line if it contains # characters in the first 10 digits: if any(c.isalpha() for c in line[0:10]): line = fp.readline() except IOError as err: logger.error(err) ssp_exit(1) timestr = line[0:17] # There are two possible formats for the timestring. # We try both of them try: dt = datetime.strptime(timestr, '%y%m%d %H %M%S.%f') except ValueError: dt = datetime.strptime(timestr, '%y%m%d %H%M %S.%f') hypo.origin_time = UTCDateTime(dt) lat = float(line[17:20]) lat_deg = float(line[21:26]) hypo.latitude = lat + lat_deg / 60 lon = float(line[26:30]) lon_deg = float(line[31:36]) hypo.longitude = lon + lon_deg / 60 hypo.depth = float(line[36:42]) evid = os.path.basename(hypo_file) evid = evid.replace('.phs', '').replace('.h', '').replace('.hyp', '') hypo.evid = evid else: # FIXME: put a condition here! ev = hypo_file # FIXME: improve this! hypo.latitude = ev.latitude hypo.longitude = ev.longitude hypo.depth = ev.depth hypo.origin_time = ev.utcdate hypo.evid = ev.event_id return hypo
def _parse_hypo2000_file(hypo_file): hypo = AttribDict() picks = list() hypo_line = False station_line = False oldpick = None for line in open(hypo_file): word = line.split() if not word: continue if hypo_line: hypo = _parse_hypo2000_hypo_line(line) evid = os.path.basename(hypo_file) evid = evid.replace('.txt', '') hypo.evid = evid if station_line: try: pick = _parse_hypo2000_station_line( line, oldpick, hypo.orig_time) oldpick = pick picks.append(pick) except Exception: continue if word[0] == 'YEAR': hypo_line = True continue hypo_line = False if word[0] == 'STA': station_line = True if not hypo: raise TypeError('Could not find hypocenter data.') return hypo, picks
def _parse_hypo71_hypocenter(hypo_file): with open(hypo_file) as fp: line = fp.readline() # Skip the first line if it contains # characters in the first 10 digits: if any(c.isalpha() for c in line[0:10]): line = fp.readline() hypo = AttribDict() timestr = line[0:17] # There are two possible formats for the timestring. # We try both of them try: dt = datetime.strptime(timestr, '%y%m%d %H %M%S.%f') except Exception: dt = datetime.strptime(timestr, '%y%m%d %H%M %S.%f') hypo.origin_time = UTCDateTime(dt) lat = float(line[17:20]) lat_deg = float(line[21:26]) hypo.latitude = lat + lat_deg/60 lon = float(line[26:30]) lon_deg = float(line[31:36]) hypo.longitude = lon + lon_deg/60 hypo.depth = float(line[36:42]) evid = os.path.basename(hypo_file) evid = evid.replace('.phs', '').replace('.h', '').replace('.hyp', '') hypo.evid = evid return hypo
def _parse_hypocenter_from_event(ev): hypo = AttribDict() hypo.latitude = ev.latitude hypo.longitude = ev.longitude hypo.depth = ev.depth hypo.origin_time = ev.utcdate hypo.evid = ev.event_id return hypo
def _parse_qml(qml_file, evid=None): if qml_file is None: return None, None hypo = AttribDict() hypo.latitude = None hypo.longitude = None hypo.depth = None hypo.origin_time = None hypo.evid = None try: cat = read_events(qml_file) except Exception as err: logger.error(err) ssp_exit(1) if evid is not None: ev = [e for e in cat if evid in str(e.resource_id)][0] else: # just take the first event ev = cat[0] # See if there is a preferred origin... origin = ev.preferred_origin() # ...or just use the first one if origin is None: origin = ev.origins[0] hypo.origin_time = origin.time hypo.latitude = origin.latitude hypo.longitude = origin.longitude hypo.depth = origin.depth / 1000. hypo.evid = ev.resource_id.id.split('/')[-1] picks = [] for pck in ev.picks: pick = Pick() pick.station = pck.waveform_id.station_code pick.network = pck.waveform_id.network_code pick.channel = pck.waveform_id.channel_code if pck.waveform_id.location_code is not None: pick.location = pck.waveform_id.location_code else: pick.location = '' if pck.onset == 'emergent': pick.flag = 'E' elif pck.onset == 'impulsive': pick.flag = 'I' try: pick.phase = pck.phase_hint[0:1] except Exception: # ignore picks with no phase hint continue if pck.polarity == 'positive': pick.polarity = 'U' elif pck.polarity == 'negative': pick.polarity = 'D' pick.time = pck.time picks.append(pick) return hypo, picks
def _add_hypocenter(trace, hypo): # we need to lazy-import here, so that OBSPY_VERSION is defined from sourcespec.ssp_setup import OBSPY_VERSION if hypo is None: # Try to get hypocenter information from the SAC header try: evla = trace.stats.sac.evla evlo = trace.stats.sac.evlo evdp = trace.stats.sac.evdp begin = trace.stats.sac.b except AttributeError: return try: tori = trace.stats.sac.o origin_time = trace.stats.starttime + tori - begin except AttributeError: origin_time = None if origin_time is not None: # make a copy of origin_time and round it to the nearest second _second = origin_time.second if origin_time.microsecond >= 500000: _second += 1 _microsecond = 0 if OBSPY_VERSION > (1, 1, 1): # UTCDateTime objects will become immutable in future # versions of ObsPy _evid_time = origin_time.replace(second=_second, microsecond=_microsecond) else: # For old versions, UTCDateTime objects are mutable _evid_time = UTCDateTime(origin_time) _evid_time.second = _second _evid_time.microsecond = _microsecond else: # make a copy of starttime and round it to the nearest minute _starttime = trace.stats.starttime _minute = _starttime.minute if _starttime.second >= 30: _minute += 1 _second = 0 _microsecond = 0 if OBSPY_VERSION > (1, 1, 1): # UTCDateTime objects will become immutable in future # versions of ObsPy _evid_time = _starttime.replace(minute=_minute, second=_second, microsecond=_microsecond) else: # For old versions, UTCDateTime objects are mutable _evid_time = UTCDateTime(_starttime) _evid_time.minute = _minute _evid_time.second = _second _evid_time.microsecond = _microsecond hypo = AttribDict() hypo.origin_time = origin_time hypo.evid = _evid_time.strftime('%Y%m%d_%H%M%S') hypo.latitude = evla hypo.longitude = evlo hypo.depth = evdp trace.stats.hypo = hypo _, _, baz = gps2dist_azimuth(hypo.latitude, hypo.longitude, trace.stats.coords.latitude, trace.stats.coords.longitude) trace.stats.back_azimuth = baz