Source code for pyrocko.client.kinherd

# http://pyrocko.org - GPLv3
#
# The Pyrocko Developers, 21st Century
# ---|P------/S----------~Lg----------
from __future__ import absolute_import, division

try:
    from urllib.request import Request
    from urllib.error import HTTPError
    from urllib.parse import urlencode
    from future.moves.urllib.request import urlopen
except ImportError:
    from urllib2 import Request, urlopen
    from urllib2 import HTTPError
    from urllib import urlencode
import calendar
import logging

from pyrocko import util, model
from pyrocko.moment_tensor import MomentTensor
from .base_catalog import EarthquakeCatalog, NotFound

logger = logging.getLogger('pyrocko.client.kinherd')

km = 1000.


def ws_request(url, post=False, **kwargs):
    url_values = urlencode(kwargs)
    url = url + '?' + url_values
    logger.debug('Accessing URL %s' % url)

    req = Request(url)
    if post:
        req.add_data(post)

    req.add_header('Accept', '*/*')

    try:
        return urlopen(req)

    except HTTPError as e:
        if e.code == 404:
            raise NotFound(url)
        else:
            raise e


[docs]class Kinherd(EarthquakeCatalog): def __init__(self, catalog='KPS'): self.catalog = catalog self.events = {}
[docs] def retrieve(self, **kwargs): import yaml kwargs['format'] = 'yaml' url = 'http://kinherd.org/quakes/%s' % self.catalog f = ws_request(url, **kwargs) names = [] for eq in yaml.safe_load_all(f): pset = eq['parametersets'][0] tref = calendar.timegm(pset['reference_time'].timetuple()) tpost = calendar.timegm(pset['posted_time'].timetuple()) params = pset['parameters'] mt = MomentTensor( strike=params['strike'], dip=params['dip'], rake=params['slip_rake'], scalar_moment=params['moment']) event = model.Event( time=tref + params['time'], lat=params['latitude'], lon=params['longitude'], depth=params['depth'], magnitude=params['magnitude'], duration=params['rise_time'], name=eq['name'], catalog=self.catalog, moment_tensor=mt) event.ext_confidence_intervals = {} trans = {'latitude': 'lat', 'longitude': 'lon'} for par in 'latitude longitude depth magnitude'.split(): event.ext_confidence_intervals[trans.get(par, par)] = \ (params[par+'_ci_low'], params[par+'_ci_high']) event.ext_posted_time = tpost name = eq['name'] self.events[name] = event names.append(name) return names
[docs] def iter_event_names(self, time_range=None, **kwargs): qkwargs = {} for k in 'magmin magmax latmin latmax lonmin lonmax'.split(): if k in kwargs and kwargs[k] is not None: qkwargs[k] = '%f' % kwargs[k] if time_range is not None: form = '%Y-%m-%d_%H-%M-%S' if time_range[0] is not None: qkwargs['tmin'] = util.time_to_str(time_range[0], form) if time_range[1] is not None: qkwargs['tmax'] = util.time_to_str(time_range[1], form) for name in self.retrieve(**qkwargs): yield name
[docs] def get_event(self, name): if name not in self.events: self.retrieve(name=name) return self.events[name]