From b96366e321eeacab67ae46f548b78d6f530e2b18 Mon Sep 17 00:00:00 2001 From: Sebastian Wehling-Benatelli Date: Wed, 8 Jun 2016 13:14:38 +0200 Subject: [PATCH] [ref #195] implementation done; some bugs have to be fixed --- pylot/core/pick/compare.py | 8 ++-- pylot/core/util/widgets.py | 93 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 95 insertions(+), 6 deletions(-) diff --git a/pylot/core/pick/compare.py b/pylot/core/pick/compare.py index d246be67..ed769fc9 100644 --- a/pylot/core/pick/compare.py +++ b/pylot/core/pick/compare.py @@ -29,10 +29,12 @@ class Comparison(object): names = list() self._pdfs = dict() for name, fn in kwargs.items(): - if not isinstance(PDFDictionary, fn): - self._pdfs[name] = PDFDictionary.from_quakeml(fn) - else: + if isinstance(fn, PDFDictionary): self._pdfs[name] = fn + elif isinstance(fn, dict): + self._pdfs[name] = PDFDictionary(fn) + else: + self._pdfs[name] = PDFDictionary.from_quakeml(fn) names.append(name) if len(names) > 2: raise ValueError('Comparison is only defined for two ' diff --git a/pylot/core/util/widgets.py b/pylot/core/util/widgets.py index 16beb544..d31132cf 100644 --- a/pylot/core/util/widgets.py +++ b/pylot/core/util/widgets.py @@ -28,6 +28,7 @@ from obspy import Stream, UTCDateTime from pylot.core.io.inputs import FilterOptions from pylot.core.pick.utils import getSNR, earllatepicker, getnoisewin, \ getResolutionWindow +from pylot.core.pick.compare import Comparison from pylot.core.util.defaults import OUTPUTFORMATS, FILTERDEFAULTS, LOCTOOLS, \ COMPPOSITION_MAP from pylot.core.util.utils import prepTimeAxis, getGlobalTimes, scaleWFData, \ @@ -67,10 +68,15 @@ def createAction(parent, text, slot=None, shortcut=None, icon=None, class ComparisonDialog(QDialog): def __init__(self, c, parent=None): self._data = c - self._stats = c.keys() + self._stats = c.stations self._canvas = PlotWidget(self) + self._widgets = dict(stationsComboBox=None, + phasesComboBox=None) + self._phases = 'PS' + self._plotprops = dict(station=self.stations[0], phase=self.phases[0]) super(ComparisonDialog, self).__init__(parent) self.setupUI() + self.plotcomparison() def setupUI(self): @@ -78,12 +84,18 @@ class ComparisonDialog(QDialog): _innerlayout = QVBoxLayout(self) _stats_combobox = QComboBox(self) + _stats_combobox.setObjectName('stationsComboBox') _stats_combobox.setEditable(True) + _stats_combobox.setInsertPolicy(QComboBox.NoInsert) _stats_combobox.addItems(self.stations) - _stats_combobox.textChanged.connect(self.plotcomparison) + _stats_combobox.editTextChanged.connect(self.prepareplot) + self.widgets = _stats_combobox _phases_combobox = QComboBox(self) + _phases_combobox.setObjectName('phasesComboBox') _phases_combobox.addItems(['P', 'S']) + _phases_combobox.currentIndexChanged.connect(self.prepareplot) + self.widgets = _phases_combobox _toolbar = QToolBar(self) _toolbar.addWidget(_stats_combobox) @@ -106,6 +118,10 @@ class ComparisonDialog(QDialog): def canvas(self): return self._canvas + @canvas.setter + def canvas(self, canvas_obj): + self._canvas = canvas_obj + @property def stations(self): return self._stats @@ -114,15 +130,86 @@ class ComparisonDialog(QDialog): def stations(self, stations): self._stats = stations + @property + def phases(self): + return self._phases + + @phases.setter + def phases(self, value): + self._phases = value + + @property + def plotprops(self): + return self._plotprops + + @plotprops.setter + def plotprops(self, values): + try: + key, value = values + if key not in self.plotprops.keys(): + raise KeyError("'key' {0} not found in " + "ComparisonDialog.plotprops keys.".format(key)) + except ValueError: + raise ValueError("Pass an iterable with two items") + else: + self._plotprops[key] = value + @property def data(self): return self._data @data.setter def data(self, data): - self.stations = data.keys() + assert not isinstance(data, Comparison) + self.stations = data.stations self._data = data + @property + def widgets(self): + return self._widgets + + @widgets.setter + def widgets(self, widget): + name = widget.objectName + if name in self.widgets.keys(): + self._widgets[name] = widget + + def hasvalue(self, sender): + text = sender.currentText() + index = sender.findText(text.upper()) + return index + + def prepareplot(self): + try: + _widget = self.sender() + name = _widget.objectName() + text = _widget.currentText().upper() + index = self.hasvalue(_widget) + if name == 'stationsComboBox' and index is not -1: + _widget.setCurrentIndex(index) + self.plotprops = ('station', text) + elif name == 'phasesComboBox': + self.plotprops = ('phase', text) + except ValueError: + raise ValueError('No sender widget given!') + finally: + self.plotcomparison() + + def plotcomparison(self): + _axes = self.canvas.figure.add_subplot(111) + station = self.plotprops['station'] + phase = self.plotprops['phase'] + pdf = self.data.comparison[station][phase] + x, y = pdf.axis, pdf.data + _axes.plot(x, y) + _axes.set_title(phase) + _axes.set_ylabel('propability density (qual.)') + _axes.set_xlabel('time difference [s]') + _anno = _axes.annotate(station, xy=(.05, .5), xycoords='axes fraction') + bbox_props = dict(boxstyle='round', facecolor='lightgrey', alpha=.7) + _anno.set_bbox(bbox_props) + self.canvas.draw() + class PlotWidget(FigureCanvas): def __init__(self, parent=None, xlabel='x', ylabel='y', title='Title'):