From b076ee90fadeb8a1f0761520eb35f44794c32f09 Mon Sep 17 00:00:00 2001 From: Marcel Date: Thu, 22 Feb 2018 16:03:11 +0100 Subject: [PATCH] [add] cb for overwriteFilter, else filter automatically again --- PyLoT.py | 15 ++++------ pylot/RELEASE-VERSION | 2 +- pylot/core/util/utils.py | 11 ++++++- pylot/core/util/widgets.py | 59 ++++++++++++++++++++++++++++++-------- 4 files changed, 63 insertions(+), 24 deletions(-) diff --git a/PyLoT.py b/PyLoT.py index a711373d..2c2fd138 100755 --- a/PyLoT.py +++ b/PyLoT.py @@ -75,7 +75,7 @@ from pylot.core.util.dataprocessing import read_metadata, restitute_data from pylot.core.util.utils import fnConstructor, getLogin, \ full_range, readFilterInformation, trim_station_components, check4gaps, make_pen, pick_color_plt, \ pick_linestyle_plt, remove_underscores, check4doubled, identifyPhaseID, excludeQualityClasses, has_spe, \ - check4rotated, transform_colors_mpl, transform_colors_mpl_str + check4rotated, transform_colors_mpl, transform_colors_mpl_str, getAutoFilteroptions from pylot.core.util.event import Event from pylot.core.io.location import create_creation_info, create_event from pylot.core.util.widgets import FilterOptionsDialog, NewEventDlg, \ @@ -182,6 +182,8 @@ class MainWindow(QMainWindow): settings.setValue("data/dataRoot", dirname) if settings.value('compclass', None) is None: settings.setValue('compclass', SetChannelComponents()) + if settings.value('useGuiFilter') is None: + settings.setValue('useGuiFilter', False) if settings.value('output/Format', None) is None: outformat = QInputDialog.getText(self, "Enter output format (*.xml, *.cnv, *.obs):", @@ -1888,15 +1890,8 @@ class MainWindow(QMainWindow): #self.drawPicks() #self.draw() - def getAutoPickFilter(self, phase): - filtername = {'P': 'bpz2', - 'S': 'bph2'} - if not phase in filtername.keys(): - print('autoPickParameter: No filter options for phase {}.'.format(phase)) - return - freqmin, freqmax = self._inputs.get(filtername[phase]) - filteroptions = FilterOptions(type='bandpass', freq=[freqmin, freqmax], order=4) # order=4 default from obspy - return filteroptions + def getAutoFilteroptions(self, phase): + return getAutoFilteroptions(phase, self._inputs) def adjustFilterOptions(self): fstring = "Filter Options" diff --git a/pylot/RELEASE-VERSION b/pylot/RELEASE-VERSION index 1250d82e..4c473311 100644 --- a/pylot/RELEASE-VERSION +++ b/pylot/RELEASE-VERSION @@ -1 +1 @@ -2e5e-dirty +bff88-dirty diff --git a/pylot/core/util/utils.py b/pylot/core/util/utils.py index 239f3c8d..b2cbd57a 100644 --- a/pylot/core/util/utils.py +++ b/pylot/core/util/utils.py @@ -13,7 +13,7 @@ from obspy.core import AttribDict from obspy.signal.rotate import rotate2zne from obspy.io.xseed.utils import SEEDParserException -from pylot.core.io.inputs import PylotParameter +from pylot.core.io.inputs import PylotParameter, FilterOptions from pylot.styles import style_settings from scipy.interpolate import splrep, splev @@ -31,6 +31,15 @@ def _pickle_method(m): else: return getattr, (m.im_self, m.im_func.func_name) +def getAutoFilteroptions(phase, parameter): + filtername = {'P': 'bpz2', + 'S': 'bph2'} + if not phase in filtername.keys(): + print('autoPickParameter: No filter options for phase {}.'.format(phase)) + return + freqmin, freqmax = parameter.get(filtername[phase]) + filteroptions = FilterOptions(type='bandpass', freq=[freqmin, freqmax], order=4) # order=4 default from obspy + return filteroptions def readDefaultFilterInformation(fname): """ diff --git a/pylot/core/util/widgets.py b/pylot/core/util/widgets.py index 95af68b2..226f60d7 100644 --- a/pylot/core/util/widgets.py +++ b/pylot/core/util/widgets.py @@ -49,7 +49,7 @@ from pylot.core.util.utils import prepTimeAxis, full_range, scaleWFData, \ demeanTrace, isSorted, findComboBoxIndex, clims, pick_linestyle_plt, pick_color_plt, \ check4rotated, check4doubled, check4gaps, remove_underscores, find_horizontals, identifyPhase, \ loopIdentifyPhase, trim_station_components, transformFilteroptions2String, \ - identifyPhaseID, real_Bool, pick_color + identifyPhaseID, real_Bool, pick_color, getAutoFilteroptions from autoPyLoT import autoPyLoT from pylot.core.util.thread import Thread @@ -1847,12 +1847,19 @@ class PickDlg(QDialog): def getUser(self): return self._user - def getFilterOptions(self, phase): - options = self.filteroptions[self.getPhaseID(phase)] - if type(options) == dict: - return FilterOptions(**options) + def getFilterOptions(self, phase, gui_filter=False): + settings = QSettings() + phaseID = self.getPhaseID(phase) + + if real_Bool(settings.value('useGuiFilter')) or gui_filter: + filteroptions = self.filteroptions[phaseID] else: - return options + filteroptions = getAutoFilteroptions(phaseID, self.parameter).parseFilterOptions() + + if type(filteroptions) == dict: + return FilterOptions(**filteroptions) + else: + return filteroptions def getXLims(self): return self.cur_xlim @@ -2045,11 +2052,15 @@ class PickDlg(QDialog): xlims = [ini_pick - x_res, ini_pick + x_res] ylims = list(np.array([-.5, .5]) + [0, len(data)-1]) + title = self.getStation() + ' picking mode' + if filterphase: + filtops_str = transformFilteroptions2String(filteroptions) + title += ' | Filteroptions: {}'.format(filtops_str) + plot_additional = bool(self.compareChannel.currentText()) additional_channel = self.compareChannel.currentText() self.multicompfig.plotWFData(wfdata=data, - title=self.getStation() + - ' picking mode', + title=title, zoomx=xlims, zoomy=ylims, noiselevel=noiselevels, @@ -2075,7 +2086,7 @@ class PickDlg(QDialog): # get filter parameter for the phase to be picked filterphase = self.currentFilterPhase() - filteroptions = self.getFilterOptions(self.getPhaseID(filterphase)).parseFilterOptions() + filteroptions = self.getFilterOptions(filterphase).parseFilterOptions() # copy and filter data for earliest and latest possible picks wfdata = self.getWFData().copy().select(channel=channel) @@ -2401,7 +2412,7 @@ class PickDlg(QDialog): if filter: filtoptions = None if phase: - filtoptions = self.getFilterOptions(self.getPhaseID(phase)).parseFilterOptions() + filtoptions = self.getFilterOptions(self.getPhaseID(phase), gui_filter=True).parseFilterOptions() # if self.filterActionP.isChecked() or self.filterActionS.isChecked(): # if not phase: @@ -4480,8 +4491,8 @@ class FilterOptionsDialog(QDialog): 'S': FilterOptions()} self.setWindowTitle(titleString) - self.filterOptionWidgets = {'P': FilterOptionsWidget(self.filterOptions['P'], self.parent().getAutoPickFilter('P')), - 'S': FilterOptionsWidget(self.filterOptions['S'], self.parent().getAutoPickFilter('S'))} + self.filterOptionWidgets = {'P': FilterOptionsWidget(self.filterOptions['P'], self.parent().getAutoFilteroptions('P')), + 'S': FilterOptionsWidget(self.filterOptions['S'], self.parent().getAutoFilteroptions('S'))} self.setupUi() self.updateUi() self.connectButtons() @@ -4492,6 +4503,14 @@ class FilterOptionsDialog(QDialog): self.groupBoxes = {'P': QtGui.QGroupBox('P Filter'), 'S': QtGui.QGroupBox('S Filter')} + settings = QSettings() + overwriteFilter = real_Bool(settings.value('useGuiFilter')) + + self.overwriteFilterCheckbox = QCheckBox('Overwrite filteroptions') + self.overwriteFilterCheckbox.setToolTip('Overwrite filter settings for refined pick with GUI settings') + self.overwriteFilterCheckbox.setChecked(overwriteFilter) + self.overwriteFilterCheckbox.clicked.connect(self.toggleFilterOverwrite) + self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) @@ -4504,9 +4523,25 @@ class FilterOptionsDialog(QDialog): box_layout.addWidget(self.filterOptionWidgets[phase]) self.main_layout.addLayout(self.filter_layout) + self.main_layout.addWidget(self.overwriteFilterCheckbox) self.main_layout.addWidget(self.buttonBox) self.setLayout(self.main_layout) + def toggleFilterOverwrite(self): + if self.overwriteFilterCheckbox.isChecked(): + qmb = QMessageBox(self, icon=QMessageBox.Warning, + text='Warning: Overwriting automatic filter settings' + ' for final pick will contaminate comparability' + ' of automatic and manual picks! Continue?') + qmb.setStandardButtons(QMessageBox.Yes | QMessageBox.No) + qmb.setDefaultButton(QMessageBox.Yes) + ret = qmb.exec_() + if not ret == qmb.Yes: + self.overwriteFilterCheckbox.setChecked(False) + + settings = QSettings() + settings.setValue('useGuiFilter', self.overwriteFilterCheckbox.isChecked()) + def connectButtons(self): self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject)