Source code for seismic.synthetics.backends.backend_syngine
#!/usr/bin/env python
"""
Backend for making synthetic seismograms using Syngine.
"""
import obspy
from obspy.clients.syngine import Client as ClientS
from seismic.synthetics.backends.synthesizer_base import Synthesizer
from seismic.stream_processing import zne_order
# pylint: disable=invalid-name
[docs]def synthesizer():
"""Getter for backend Synthesizer class
:return: Class name
:rtype: SynthesizerSyngine
"""
return SynthesizerSyngine
# end func
[docs]class SynthesizerSyngine(Synthesizer):
"""
Class to synthesize seismograms using online Syngine service.
To write resultant stream to HDF5 format, add 'ignore' option::
synth_stream.write('test_synth.h5', 'h5', ignore=('mseed',))
"""
def __init__(self, station_latlon, earth_model='iasp91'):
"""
Initialization
:param station_latlon: See documentation for :func:`~seismic.synthetics.backends.synthesizer_base.Synthesizer.synthesize`
:param earth_model: String naming which standard earth model to use.
:type earth_model: str
"""
super().__init__(station_latlon)
self.earth_model = earth_model
# end func
[docs] def synthesize(self, src_latlon, fs, time_window):
"""
See documentation for :func:`~seismic.synthetics.backends.synthesizer_base.Synthesizer.synthesize`
"""
dt = 1.0/fs
stream_all = obspy.Stream()
for src_lat, src_lon in src_latlon:
stream = self._synthone(src_lat, src_lon, time_window, dt)
stream.traces = sorted(stream.traces, key=zne_order)
stream_all += stream
# end for
return stream_all
# end func
def _synthone(self, src_lat, src_lon, time_window, dt, src_depth_m=0, origintime=None):
"""
Synthesize single event
"""
components = 'ZNE'
units = 'velocity'
default_model = self.earth_model + '_2s'
if origintime is None:
origintime = obspy.UTCDateTime.now()
# end if
client_synth = ClientS()
assert time_window[0] <= 0
assert time_window[1] >= 0
receiver_lat, receiver_lon = self.station_latlon
starttime = 'P' + '-{}'.format(abs(time_window[0]))
endtime = 'P' + '+{}'.format(time_window[1])
synth_stream = client_synth.get_waveforms(model=default_model,
receiverlatitude=receiver_lat,
receiverlongitude=receiver_lon,
starttime=starttime,
endtime=endtime,
dt=dt,
components=components,
units=units,
scale=1e9, # nanometres
sourcelatitude=src_lat,
sourcelongitude=src_lon,
sourcedepthinmeters=src_depth_m,
origintime=origintime)
event_id_base = 'hiperseis:SYN/evid='
stats = self.compute_event_stats(src_lat, src_lon, event_id_base,
earth_model=self.earth_model,
origin_time=origintime)
for tr in synth_stream:
tr.stats.update(stats)
# end for
return synth_stream
# end func
# end class
if __name__ == '__main__':
example = SynthesizerSyngine('AU.ARMA')
test_strm = example.synthesize(((30, 150),), 100.0, (-10, 30))
print(test_strm)
# end if