|
|
|
@ -1,8 +1,14 @@
|
|
|
|
|
import os.path as op
|
|
|
|
|
import logging
|
|
|
|
|
import math
|
|
|
|
|
from pyrocko import io
|
|
|
|
|
from pyrocko import model
|
|
|
|
|
from pyrocko.gui.snuffling import Snuffling, Choice, Switch, Param
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger('export')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ExportWaveforms(Snuffling):
|
|
|
|
|
'''
|
|
|
|
|
<html>
|
|
|
|
@ -45,7 +51,7 @@ class ExportWaveforms(Snuffling):
|
|
|
|
|
0.1, 86400., low_is_none=True))
|
|
|
|
|
|
|
|
|
|
self.add_parameter(Switch('Save Station Meta', 'save_stations', False))
|
|
|
|
|
self.add_parameter(Switch('Apply Filters', 'apply_filter', False))
|
|
|
|
|
self.add_parameter(Switch('Apply Filters/Rotation', 'apply_filter', False))
|
|
|
|
|
self.set_live_update(False)
|
|
|
|
|
|
|
|
|
|
def call(self):
|
|
|
|
@ -68,7 +74,7 @@ class ExportWaveforms(Snuffling):
|
|
|
|
|
|
|
|
|
|
viewer = self.get_viewer()
|
|
|
|
|
for trs in self.chopper_selected_traces(fallback=True, tinc=self.tinc):
|
|
|
|
|
trs2save = []
|
|
|
|
|
traces_save = []
|
|
|
|
|
for tr in trs:
|
|
|
|
|
if self.format == 'mseed':
|
|
|
|
|
if len(tr.network) > 2:
|
|
|
|
@ -80,28 +86,60 @@ class ExportWaveforms(Snuffling):
|
|
|
|
|
if len(tr.channel) > 3:
|
|
|
|
|
tr.set_channel(tr.channel[:3])
|
|
|
|
|
|
|
|
|
|
if viewer.lowpass:
|
|
|
|
|
if viewer.lowpass < 0.5/tr.deltat:
|
|
|
|
|
tr.lowpass(4, viewer.lowpass, demean=False)
|
|
|
|
|
if viewer.highpass:
|
|
|
|
|
if viewer.highpass < 0.5/tr.deltat:
|
|
|
|
|
tr.highpass(4, viewer.highpass, demean=False)
|
|
|
|
|
|
|
|
|
|
trs2save.append(tr)
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
io.save(
|
|
|
|
|
trs2save, out_filename,
|
|
|
|
|
format=self.format,
|
|
|
|
|
overwrite=True)
|
|
|
|
|
|
|
|
|
|
except io.io_common.FileSaveError as e:
|
|
|
|
|
self.fail(str(e))
|
|
|
|
|
if self.apply_filter:
|
|
|
|
|
if viewer.lowpass is not None and \
|
|
|
|
|
viewer.highpass is not None:
|
|
|
|
|
tr.bandpass(2, viewer.highpass, viewer.lowpass)
|
|
|
|
|
|
|
|
|
|
elif viewer.lowpass is not None:
|
|
|
|
|
if viewer.lowpass < 0.5/tr.deltat:
|
|
|
|
|
tr.lowpass(4, viewer.lowpass, demean=False)
|
|
|
|
|
|
|
|
|
|
elif viewer.highpass is not None:
|
|
|
|
|
if viewer.highpass < 0.5/tr.deltat:
|
|
|
|
|
tr.highpass(4, viewer.highpass, demean=False)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
traces_save.append(tr)
|
|
|
|
|
|
|
|
|
|
if viewer.rotate != 0.0 and self.apply_filter:
|
|
|
|
|
phi = viewer.rotate/180.*math.pi
|
|
|
|
|
cphi = math.cos(phi)
|
|
|
|
|
sphi = math.sin(phi)
|
|
|
|
|
for a in traces_save:
|
|
|
|
|
for b in traces_save:
|
|
|
|
|
if (a.network == b.network
|
|
|
|
|
and a.station == b.station
|
|
|
|
|
and a.location == b.location
|
|
|
|
|
and ((a.channel.lower().endswith('n')
|
|
|
|
|
and b.channel.lower().endswith('e'))
|
|
|
|
|
or (a.channel.endswith('1')
|
|
|
|
|
and b.channel.endswith('2')))
|
|
|
|
|
and abs(a.deltat-b.deltat) < a.deltat*0.001
|
|
|
|
|
and abs(a.tmin-b.tmin) < a.deltat*0.01 and
|
|
|
|
|
a.get_ydata().size == b.get_ydata().size):
|
|
|
|
|
|
|
|
|
|
aydata = a.get_ydata()*cphi+b.get_ydata()*sphi
|
|
|
|
|
bydata = -a.get_ydata()*sphi+b.get_ydata()*cphi
|
|
|
|
|
a.set_ydata(aydata)
|
|
|
|
|
b.set_ydata(bydata)
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
io.save(
|
|
|
|
|
traces_save, out_filename,
|
|
|
|
|
format=self.format,
|
|
|
|
|
overwrite=True)
|
|
|
|
|
|
|
|
|
|
except io.io_common.FileSaveError as e:
|
|
|
|
|
self.fail(str(e))
|
|
|
|
|
|
|
|
|
|
logger.info('saved waveforms to %s', out_filename)
|
|
|
|
|
|
|
|
|
|
if self.save_stations:
|
|
|
|
|
stations = viewer.stations.values()
|
|
|
|
|
fn = self.output_filename('Save Stations', 'stations.pf')
|
|
|
|
|
model.dump_stations(list(stations), fn)
|
|
|
|
|
logger.info('saved stations to %s', fn)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __snufflings__():
|
|
|
|
|