#!/usr/bin/env python # coding: utf-8 #
#
#
#
ObsPy Tutorial
#
Downloading/Processing Exercise
#
#
#
# image: User:Abbaszade656 / Wikimedia Commons / CC-BY-SA-4.0 # ## Workshop for the "Training in Network Management Systems and Analytical Tools for Seismic" # ### Baku, October 2018 # # Seismo-Live: http://seismo-live.org # # ##### Authors: # * Lion Krischer ([@krischer](https://github.com/krischer)) # * Tobias Megies ([@megies](https://github.com/megies)) # --- # ![](images/obspy_logo_full_524x179px.png) # For the this exercise we will download some data from the Tohoku-Oki earthquake, cut out a certain time window around the first arrival and remove the instrument response from the data. # In[1]: get_ipython().run_line_magic('matplotlib', 'inline') from __future__ import print_function import matplotlib.pyplot as plt plt.style.use('ggplot') plt.rcParams['figure.figsize'] = 12, 8 # The first step is to download all the necessary information using the ObsPy FDSN client. **Learn to read the documentation!** # # We need the following things: # # 1. Event information about the 2014 South Napa earthquake. Use the `get_events()` method of the client. A good provider of event data is the USGS. # 2. Waveform information for a certain station. Choose your favorite one! If you have no preference, use `II.PFO` which is available for example from IRIS. Use the `get_waveforms()` method. # 3. Download the associated station/instrument information with the `get_stations()` method. # In[2]: import obspy from obspy.clients.fdsn import Client c_event = Client("USGS") # Event time. event_time = obspy.UTCDateTime("2014-08-24T10:20:44.0") # Get the event information. The temporal and magnitude constraints make it unique cat = c_event.get_events(starttime=event_time - 10, endtime=event_time + 10, minmagnitude=6) print(cat) c = Client("IRIS") # Download station information at the response level! inv = c.get_stations(network="II", station="PFO", location="00", channel="BHZ", starttime=event_time - 10 * 60, endtime=event_time + 30 * 60, level="response") print(inv) # Download 3 component waveforms. st = c.get_waveforms(network="II", station="PFO", location="00", channel="BHZ", starttime=event_time - 10 * 60, endtime=event_time + 30 * 60) print(st) # Have a look at the just downloaded data. # In[3]: inv.plot() inv.plot_response(0.001) cat.plot() st.plot() # ## Exercise # # The goal of this exercise is to cut the data from 1 minute before the first arrival to 5 minutes after it, and then remove the instrument response. # # # #### Step 1: Determine Coordinates of Station # In[4]: coords = inv.get_coordinates("II.PFO.00.BHZ") coords # #### Step 2: Determine Coordinates of Event # In[5]: origin = cat[0].origins[0] print(origin) # #### Step 3: Calculate distance of event and station. # # Use `obspy.geodetics.locations2degree`. # In[6]: from obspy.geodetics import locations2degrees distance = locations2degrees(origin.latitude, origin.longitude, coords["latitude"], coords["longitude"]) print(distance) # #### Step 4: Calculate Theoretical Arrivals # # ```python # from obspy.taup import TauPyModel # m = TauPyModel(model="ak135") # arrivals = m.get_ray_paths(...) # arrivals.plot() # ``` # In[7]: from obspy.taup import TauPyModel m = TauPyModel(model="ak135") arrivals = m.get_ray_paths( distance_in_degree=distance, source_depth_in_km=origin.depth / 1000.0) arrivals.plot(); # #### Step 5: Calculate absolute time of the first arrivals at the station # In[8]: first_arrival = origin.time + arrivals[0].time print(first_arrival) # #### Step 6: Cut to 1 minute before and 5 minutes after the first arrival # In[9]: st.trim(first_arrival - 60, first_arrival + 300) st.plot(); # #### Step 7: Remove the instrument response # # ```python # st.remove_response(inventory=inv, pre_filt=...) # ``` # # ![taper](images/cos_taper.png) # In[10]: st.remove_response(inventory=inv, pre_filt=(1.0 / 100.0, 1.0 / 50.0, 10.0, 20.0), output="VEL") st.plot() # ## Bonus: Interactive IPython widgets # In[15]: from ipywidgets import interact from obspy.taup import TauPyModel m = TauPyModel("ak135") def plot_raypaths(distance, depth, wavetype): try: plt.close() except: pass if wavetype == "ttall": phases = ["ttall"] elif wavetype == "diff": phases = ["Pdiff", "pPdiff"] m.get_ray_paths(distance_in_degree=distance, source_depth_in_km=depth, phase_list=phases).plot(); interact(plot_raypaths, distance=(1, 180), depth=(0, 700), wavetype=["ttall", "diff"]);