Earthquake catalog

Pyrocko provides access to some online earthquake catalogs via the pyrocko.client.catalog module.

QuakeML import

This example shows how to read QuakeML <https://quake.ethz.ch/quakeml/docs/REC?action=AttachFile&do=get&target=QuakeML-BED-20130214b.pdf> event catalogs using load_xml(). The function get_pyrocko_events() is used to obtain events in pyrocko format. If a moment tensor is provided as [Mrr, Mtt, Mpp, Mrt, Mrp, Mtp], this is converted to [mnn, mee, mdd, mne, mnd, med]. The strike, dip and rake values appearing in the pyrocko event are calculated from the moment tensor.

from pyrocko import model
from pyrocko.io import quakeml
from pyrocko.example import get_example_data


# small catalog containing two events (data from ingv):
catalog = get_example_data('example-catalog.xml')

# read quakeml events
qml = quakeml.QuakeML.load_xml(filename=catalog)

# get pyrocko events
events = qml.get_pyrocko_events()

for event in events:
    print(event)

# save events as pyrocko catalog:
model.event.dump_events(events, filename='test_pyrocko.pf')

Creating QuakeML from scratch

from pyrocko.io import quakeml as q
from pyrocko.util import str_to_time as stt


table = [
    # name     time                        lat  lon   depth    mag
    ('ev0001', stt('2021-09-29 01:02:03'), 55., 120., 11000.,  5.5),
    ('ev0002', stt('2021-09-29 04:05:06'), 57., 122., 9000.,  4.0),
    ('ev0003', stt('2021-09-29 07:08:09'), 56., 121., 1200.,  4.1)]


qml = q.QuakeML(
    event_parameters=q.EventParameters(
        public_id='quakeml:test/eventParameters/test',
        event_list=[
            q.Event(
                preferred_origin_id='quakeml:test/origin/%s' % name,
                preferred_magnitude_id='quakeml:test/magnitude/%s' % name,
                public_id='quakeml:test/event/%s' % name,
                origin_list=[
                    q.Origin(
                        public_id='quakeml:test/origin/%s' % name,
                        time=q.TimeQuantity(value=time),
                        longitude=q.RealQuantity(value=lon),
                        latitude=q.RealQuantity(value=lat),
                        depth=q.RealQuantity(value=depth),
                    ),
                ],
                magnitude_list=[
                    q.Magnitude(
                        public_id='quakeml:test/magnitude/%s' % name,
                        origin_id='quakeml:test/origin/%s' % name,
                        mag=q.RealQuantity(value=magnitude),
                    )
                ],
            )
            for (name, time, lat, lon, depth, magnitude) in table
        ]
    )
)

print(qml.dump_xml())

Searching the GlobalCMT catalog

This example demonstrates how to query the GlobalCMT [1] database for events which occurred in 2011 in northern Chile.

from pyrocko import util, model
from pyrocko.client import catalog

tmin = util.str_to_time('2011-01-01 00:00:00')  # beginning time of query
tmax = util.str_to_time('2011-12-31 23:59:59')

# create an instance of the global CMT catalog
global_cmt_catalog = catalog.GlobalCMT()

# query the catalog
events = global_cmt_catalog.get_events(
    time_range=(tmin, tmax),
    magmin=2.,
    latmin=-35.,
    latmax=-20.,
    lonmin=-76.,
    lonmax=-65.)

print('Downloaded %s events' % len(events))
print('The last one is:')
print(events[-1])

# dump events to catalog
model.dump_events(events, 'northern_chile_events.txt')

Download catalog_search_globalcmt.py

We expect to see the following output:

Downloaded 53 events
The last one is
--- !pf.Event
lat: -28.03
lon: -71.55
time: 2011-12-07 22:23:14.250000
name: 201112072223A
depth: 22800.0
magnitude: 6.106838394015895
region: NEAR COAST OF NORTHERN C
catalog: gCMT
moment_tensor: !pf.MomentTensor
  mnn: 1.16e+17
  mee: -1.24e+18
  mdd: 1.1200000000000001e+18
  mne: 1.29e+17
  mnd: 1.61e+17
  med: 1.0900000000000001e+18
  strike1: 16.540029329929244
  dip1: 24.774772153067424
  rake1: 109.14904335232158
  strike2: 175.61123518070136
  dip2: 66.6800337700307
  rake2: 81.39111828783355
  moment: 1.622772319211786e+18
  magnitude: 6.106838394015895
duration: 5.4

Search for an event in GEOFON catalog

Search for an event name only in the GEOFON catalog [2] using Geofon(), with a given magnitude range and timeframe.

from pyrocko import util
from pyrocko.client import catalog

tmin = util.ctimegm('2010-01-12 21:50:00')
tmax = util.ctimegm('2010-01-13 03:17:00')  # ending time of query
mag = 6.                                    # minimum magntiude (open end)

# download event information from GEOFON web page

geofon = catalog.Geofon()
event_names = geofon.get_event_names(
    time_range=(tmin, tmax),
    magmin=mag)

for event_name in event_names:
    event = geofon.get_event(event_name)
    print(event)

Download catalog_search_geofon.py

We expect to see the following output (in YAML format):

--- !pf.Event
lat: 18.37
lon: -72.55
time: 2010-01-12 21:53:11
name: gfz2010avtm
depth: 17000.0
magnitude: 7.2
region: Haiti Region
catalog: GEOFON

Footnotes