def _add_paz_and_coords(trace, dataless, paz_dict=None): trace.stats.paz = None trace.stats.coords = None traceid = trace.get_id() time = trace.stats.starttime # We first look into the dataless dictionary, if available if isinstance(dataless, dict): for sp in dataless.values(): # Check first if our traceid is in the dataless file if traceid not in str(sp): continue try: paz = AttribDict(sp.get_paz(traceid, time)) coords = AttribDict(sp.get_coordinates(traceid, time)) except SEEDParserException as err: logger.error('%s time: %s' % (err, str(time))) pass elif isinstance(dataless, Inventory): try: with warnings.catch_warnings(record=True) as warns: # get_sacpz() can issue warnings on more than one PAZ found, # so let's catch those warnings and log them properly sacpz = dataless.get_response(traceid, time).get_sacpz() for w in warns: message = str(w.message) logger.warning('%s: %s' % (traceid, message)) attach_paz(trace, io.StringIO(sacpz)) paz = trace.stats.paz coords = AttribDict(dataless.get_coordinates(traceid, time)) except Exception as err: logger.error('%s traceid: %s time: %s' % (err, traceid, str(time))) pass try: trace.stats.paz = paz # elevation is in meters in the dataless coords.elevation /= 1000. trace.stats.coords = coords except Exception: pass # If we couldn't find any PAZ in the dataless dictionary, # we try to attach paz from the paz dictionary passed # as argument if trace.stats.paz is None and paz_dict is not None: # Look for traceid or for a generic paz net, sta, loc, chan = trace.id.split('.') ids = [ trace.id, '.'.join(('__', '__', '__', '__')), '.'.join( (net, '__', '__', '__')), '.'.join((net, sta, '__', '__')), '.'.join((net, sta, loc, '__')), 'default' ] for id in ids: try: paz = paz_dict[id] trace.stats.paz = paz except KeyError: pass # If we're still out of luck, # we try to build the sensitivity from the # user2 and user3 header fields (ISNet format) if trace.stats.paz is None and trace.stats.format == 'ISNet': try: # instrument constants u2 = trace.stats.sac.user2 u3 = trace.stats.sac.user3 paz = AttribDict() paz.sensitivity = u3 / u2 paz.poles = [] paz.zeros = [] paz.gain = 1 trace.stats.paz = paz except AttributeError: pass # Still no paz? Antilles or IPOC format! if (trace.stats.paz is None and (trace.stats.format == 'Antilles' or trace.stats.format == 'IPOC')): paz = AttribDict() paz.sensitivity = 1 paz.poles = [] paz.zeros = [] paz.gain = 1 trace.stats.paz = paz # If we still don't have trace coordinates, # we try to get them from SAC header if trace.stats.coords is None: try: stla = trace.stats.sac.stla stlo = trace.stats.sac.stlo try: stel = trace.stats.sac.stel # elevation is in meters in SAC header: stel /= 1000. except AttributeError: stel = 0. coords = AttribDict() coords.elevation = stel coords.latitude = stla coords.longitude = stlo trace.stats.coords = coords except AttributeError: pass # Still no coords? Raise an exception if trace.stats.coords is None: raise Exception('%s: could not find coords for trace: skipping trace' % traceid)
def _add_paz_and_coords(trace, metadata, paz_dict, config): traceid = trace.get_id() # If we already know that traceid is skipped, raise a silent exception if traceid in _add_paz_and_coords.skipped: raise Exception() trace.stats.paz = None trace.stats.coords = None time = trace.stats.starttime # We first check whether metadata is a dataless dictionary if isinstance(metadata, dict): for sp in metadata.values(): # Check first if our traceid is in the dataless file if traceid not in str(sp): continue try: paz = AttribDict(sp.get_paz(traceid, time)) coords = AttribDict(sp.get_coordinates(traceid, time)) except SEEDParserException as err: logger.error('%s time: %s' % (err, str(time))) pass elif isinstance(metadata, Inventory): try: with warnings.catch_warnings(record=True) as warns: # get_sacpz() can issue warnings on more than one PAZ found, # so let's catch those warnings and log them properly sacpz = metadata.get_response(traceid, time).get_sacpz() for w in warns: message = str(w.message) logger.warning('%s: %s' % (traceid, message)) attach_paz(trace, io.StringIO(sacpz)) paz = trace.stats.paz coords = AttribDict(metadata.get_coordinates(traceid, time)) except Exception as err: logger.error('%s traceid: %s time: %s' % (err, traceid, str(time))) pass try: trace.stats.paz = paz # elevation is in meters coords.elevation /= 1000. trace.stats.coords = coords except Exception: pass # If we couldn't find any PAZ in the dataless dictionary # or in the Inventory, we try to attach paz from a paz dictionary if trace.stats.paz is None and paz_dict is not None: # Look for traceid or for a generic paz net, sta, loc, chan = trace.id.split('.') ids = [ trace.id, '.'.join(('__', '__', '__', '__')), '.'.join((net, '__', '__', '__')), '.'.join((net, sta, '__', '__')), '.'.join((net, sta, loc, '__')), 'default' ] for id in ids: try: paz = paz_dict[id] trace.stats.paz = paz except KeyError: pass # If a "sensitivity" config option is provided, override the paz computed # from metadata or paz_dict if config.sensitivity is not None: # instrument constants paz = AttribDict() paz.sensitivity = _compute_sensitivity(trace, config) paz.poles = [] paz.zeros = [] paz.gain = 1 trace.stats.paz = paz # If we still don't have trace coordinates, # we try to get them from SAC header if trace.stats.coords is None: try: stla = trace.stats.sac.stla stlo = trace.stats.sac.stlo try: stel = trace.stats.sac.stel # elevation is in meters in SAC header: stel /= 1000. except AttributeError: stel = 0. coords = AttribDict() coords.elevation = stel coords.latitude = stla coords.longitude = stlo trace.stats.coords = coords except AttributeError: pass # Still no coords? Raise an exception if trace.stats.coords is None: _add_paz_and_coords.skipped.append(traceid) raise Exception( '%s: could not find coords for trace: skipping trace' % traceid) if trace.stats.coords.latitude == trace.stats.coords.longitude == 0: logger.warning( '{}: trace has latitude and longitude equal to zero!'.format( traceid))