Wiki source code of FDSN Guide

Version 4.1 by robert on 2025/03/24 10:36

Show last authors
1 {{box cssClass="floatinginfobox" title="**Contents**"}}
2 {{toc/}}
3 {{/box}}
4
5 = [[How to Install ObsPy>>url:https://github.com/obspy/obspy/wiki#installation]] =
6
7 = [[Seed-Vault>>https://github.com/AuScope/seed-vault]] =
8
9 = Connecting to an FDSN Server =
10
11 == How to connect to AusPass with & without authenticated access ==
12
13
14 {{code language="python"}}
15 import obspy
16 from obspy.clients.fdsn import Client
17
18 # Initialize FDSN client for AusPass
19
20 # For open access data, no username or password is required.
21 client = Client('AUSPASS')
22
23 # To access restricted data, supply your username and password
24 # Replace 'Z1' and '12345' with your actual credentials
25 client = Client('AUSPASS', user='Z1', password='12345')
26 {{/code}}
27
28 = Station Metadata =
29
30 Information such as site locations, sensor and data logger types, response information, etc are in the station metadata. This can be accessed directly(link) or via the obspy get_stations (link) tool.
31
32
33 == How to download event, station, instrument response ==
34
35
36 {{code language="python"}}
37 import obspy
38 from obspy.clients.fdsn import Client
39
40 # Use AusPass client for station, waveform, and earthquake information
41 client = Client("AUSPASS")
42
43
44 # Download station information for AUMTC station in S1 network at the response level
45 inv = client.get_stations(network="S1", station="AUMTC", location="*",
46 channel="*", level="response")
47
48 # Inventory metadata is stored in a Inventory > Network > Station > Channel hierarchy
49
50 print(inv) #inventory level
51
52 print(inv[0]) # network level (the first network in the inventory)
53
54 print(inv[0][0]) # station level (the first station of the first network in the inventory)
55
56 print(inv[0][0][0]) # channel level (the first channel of the first station of the first network in the inventoy)
57
58 # you can also select items directly
59
60 print(inv.select(station='AUMTC',channel='HHZ')[0][0][0])
61
62 # instrument response is attached to a channel object
63
64 response = inv.select(station='AUMTC',channel='HHZ')[0][0][0].response
65 {{/code}}
66
67 = Waveform Data =
68
69 Waveform data (e.g. the actual seismic data) can be accessed directly (link) or via obspy's get_waveforms (link) tool. It can also be accessed via various tools such as seed-vault, pyweed, etc (add links).
70
71 == Downloading and Storing data ==
72
73 === How to download waveform data ===
74
75 {{code language="python"}}
76 from obspy import UTCDateTime
77 from obspy.clients.fdsn import Client
78
79 # Initialize the FDSN client (you can also specify other data centers)
80 client = Client("AUSPASS")
81
82 # Event information
83 network = "S1"
84 station = "AUGRF"
85 starttime = UTCDateTime("2021-09-21T23:15:53") # The time of the earthquake
86 endtime = starttime + 360 # One hour of data after the earthquake
87
88 # Download the MiniSEED data
89 st = client.get_waveforms(network=network, station=station, location="*", channel="BHZ",
90 starttime=starttime, endtime=endtime)
91 # Save the stream to a MiniSEED file
92 st.write("Woodspoint_2021.mseed", format="MSEED")
93 print("Downloaded and saved the MiniSEED file.")
94 {{/code}}
95
96 === How to download a LOT of waveform data ===
97
98 {{code language="python"}}
99 from obspy import UTCDateTime
100 from obspy.clients.fdsn import Client
101 import datetime
102
103 # Initialize client and set parameters
104 client = Client("IRIS")
105 start_date = UTCDateTime("2023-07-01")
106 end_date = UTCDateTime("2023-07-02")
107 network = "S1"
108 station = "AUMTS"
109 channel = "BHZ"
110
111 # Loop to download data one day at a time
112 while start_date <= end_date:
113 next_date = start_date + datetime.timedelta(days=1)
114 try:
115 st = client.get_waveforms(network, station, "*", channel, start_date, next_date)
116 st.write(f"{start_date.date}.mseed", format="MSEED")
117 except:
118 print(f"Failed for {start_date} to {next_date}")
119 start_date = next_date
120 {{/code}}
121
122 === How to store and archive waveform data in SeisComP Data Structure (SDS) ===
123
124 {{code language="python"}}
125 import os
126 from obspy import UTCDateTime, read
127 from obspy.clients.fdsn import Client
128
129 # Initialize the client
130 client = Client("AUSPASS") # Replace with the correct client endpoint if different
131
132 # Define event time and time window
133 event_time = UTCDateTime("2021-09-21T23:15:53")
134 starttime = event_time - 600 # 10 minutes before the event
135 endtime = event_time + 1800 # 30 minutes after the event
136
137 # Download the waveform data
138 st = client.get_waveforms(network="S1", station="AUMTS", location="*", channel="*", starttime=starttime, endtime=endtime)
139
140 # Create SDS structure: ROOT/YEAR/NET/STA/CHAN.TYPE/NET.STA.LOC.CHAN.YEAR.DAY
141 sds_root = "." # Replace with your desired directory
142
143 for tr in st:
144 net = tr.stats.network
145 sta = tr.stats.station
146 loc = tr.stats.location
147 chan = tr.stats.channel
148 year = str(tr.stats.starttime.year)
149 jday = str(tr.stats.starttime.julday).zfill(3)
150
151 sds_path = os.path.join(sds_root, year, net, sta, f"{chan}.D", f"{net}.{sta}.{loc}.{chan}.{year}.{jday}")
152
153 # Create directories if they don't exist
154 os.makedirs(os.path.dirname(sds_path), exist_ok=True)
155
156 # Save the trace as a MiniSEED file
157 tr.write(sds_path, format="MSEED")
158 {{/code}}
159
160 == Common Data Operations ==
161
162 === How to remove instrument response ===
163
164 {{code language="python"}}
165 from obspy import read
166 from obspy.core.util import AttribDict
167
168 # Load the MiniSEED file
169 st = read("Woodspoint_2021.mseed")
170
171 # Download the instrument response
172 inv = client.get_stations(network=network, station=station, location="*",
173 channel="*", starttime=starttime, endtime=endtime,
174 level="response")
175
176 # Remove the instrument response
177 output = 'VEL' # Output unit ('VEL' = velocity (default), 'DISP' = displacement, 'ACC' = acceleration)
178
179 for tr in st:
180 tr.remove_response(inventory=inv, output=output, plot=True)
181
182 # Save the corrected MiniSEED file
183 st.write("Woodspoint_2021_corrected.mseed", format="MSEED")
184 {{/code}}
185
186 === How to apply a bandpass filter ===
187
188 {{code language="python"}}
189 from obspy import read
190
191 # Load the MiniSEED file
192 st = read("Woodspoint_2021.mseed")
193
194 # Define the frequency band
195 freq_min = 0.1 # Minimum frequency in Hz
196 freq_max = 1.0 # Maximum frequency in Hz
197
198 # Apply the bandpass filter
199 for tr in st:
200 tr.filter(type='bandpass', freqmin=freq_min, freqmax=freq_max)
201
202 # Save the filtered MiniSEED file
203 st.write("Woodspoint_2021_filtered.mseed", format="MSEED")
204 {{/code}}
205
206 === How to slice a waveform ===
207
208 {{code language="python"}}
209 from obspy import read, UTCDateTime, Stream # Importing Stream here
210
211 # Load the filtered MiniSEED file
212 st = read("Woodspoint_2021_filtered.mseed")
213
214 # Define the time window for slicing
215 slice_start = UTCDateTime("2021-09-21T23:20:00")
216 slice_end = slice_start +10
217
218 # Slice the waveform for each Trace in the Stream
219 sliced_st = Stream() # Now Stream is defined
220 for tr in st:
221 sliced_tr = tr.slice(starttime=slice_start, endtime=slice_end)
222 sliced_st.append(sliced_tr)
223
224 # Save the sliced MiniSEED file
225 sliced_st.write("Woodspoint_2021_filtered_sliced.mseed", format="MSEED")
226 {{/code}}
227
228 === How to save a waveform ===
229
230 {{code language="python"}}
231 # Save the sliced file as MiniSEED
232 sliced_st.write("Woodspoint_2021_filtered_sliced.mseed", format="MSEED")
233
234 # Or, save the sliced SAC file
235 sliced_st.write("Woodspoint_2021_filtered_sliced.sac", format="SAC")
236 {{/code}}
237
238 === How to convert miniSEED to SAC ===
239
240 {{code language="python"}}
241 from obspy import read
242
243 # Read the MiniSEED file
244 st = read("Woodspoint_2021.mseed")
245
246 # Take the first Trace from the Stream
247 tr = st[0]
248
249 # Save that Trace as a SAC file
250 tr.write("Woodspoint_2021.sac", format="SAC")
251 {{/code}}
252
253
254 = Earthquake Data =
255
256 Earthquake data can be accessed directly or via ObsPy's get_events code
257
258 == How to download an Earthquake Catalog ==
259
260 {{code language="python"}}
261 from obspy.clients.fdsn import Client
262 from obspy import UTCDateTime
263
264 # Initialize the AusPass FDSN client
265 client = Client("AUSPASS")
266
267 # Define the time range for the earthquake catalog
268 start_time = UTCDateTime("2021-08-01")
269 end_time = UTCDateTime("2022-01-01") # End of year
270
271 # Define the geographic region (latitude and longitude for Woodspoint, Victoria, Australia)
272 latitude = -37.47
273 longitude = 146.10
274 max_radius = 5 # in degrees
275
276 # Download the earthquake catalog
277 catalog = client.get_events(starttime=start_time, endtime=end_time,
278 minmagnitude=2, latitude=latitude, longitude=longitude,
279 maxradius=max_radius)
280
281 # Save the catalog to a file (e.g., QuakeML format)
282 catalog.write("Woodspoint_earthquakes.xml", format="QUAKEML")
283 {{/code}}
284
285 == How to plot (Global) Earthquakes ==
286
287 {{code language="python"}}
288 from obspy import UTCDateTime
289 from obspy.clients.fdsn import Client
290
291 # Initialize FDSN client to connect to the IRIS data center
292 client = Client("IRIS")
293
294 # Set the time range for fetching earthquake data
295 # Start time: January 1, 2023
296 # End time: Current time
297 starttime = UTCDateTime("2023-01-01")
298 endtime = UTCDateTime()
299
300 # Fetch earthquake events with a minimum magnitude of 7
301 catalog = client.get_events(starttime=starttime, endtime=endtime, minmagnitude=7)
302 #client.get_events(). This function returns a Catalog object that contains a list of Event objects.
303 #Each Event object, in turn, has an Origins attribute that contains the depth information
304
305 # Plot the fetched earthquake data using an orthographic projection
306 catalog.plot(projection="ortho", title="Global Earthquakes with Magnitude >= 7 since 2023")
307 #catalog.plot(), ObsPy automatically uses the depth information to color the events in the plot
308 {{/code}}
309
310 == How to plot (Local) Earthquakes ==
311
312 {{code language="python"}}
313 from obspy import UTCDateTime
314 from obspy.clients.fdsn import Client
315
316 # Initialize FDSN client
317 client = Client("AUSPASS")
318
319 # Define time range
320 starttime = UTCDateTime("2023-01-01")
321 endtime = UTCDateTime()
322
323 # Latitude and longitude bounds for Australia
324 minlatitude = -44.0
325 maxlatitude = -10.0
326 minlongitude = 113.0
327 maxlongitude = 154.0
328
329 # Fetch event data for Australia with a minimum magnitude
330 catalog = client.get_events(starttime=starttime, endtime=endtime, minmagnitude=4,
331 minlatitude=minlatitude, maxlatitude=maxlatitude,
332 minlongitude=minlongitude, maxlongitude=maxlongitude)
333
334 # Plot the earthquakes
335 catalog.plot(projection="local", title="Australia Earthquakes", resolution="i")
336 {{/code}}
337
338