diff --git a/export_waveforms.py b/export_waveforms.py index 38fd399..bc4b2e9 100644 --- a/export_waveforms.py +++ b/export_waveforms.py @@ -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): ''' @@ -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__():