Merge branch 'compare_events' into develop
This commit is contained in:
@@ -27,16 +27,8 @@ class Comparison(object):
|
||||
"""
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
names = list()
|
||||
self._pdfs = dict()
|
||||
for name, fn in kwargs.items():
|
||||
if isinstance(fn, PDFDictionary):
|
||||
self._pdfs[name] = fn
|
||||
elif isinstance(fn, dict) or isinstance(fn, AttribDict):
|
||||
self._pdfs[name] = PDFDictionary(fn)
|
||||
else:
|
||||
self._pdfs[name] = PDFDictionary.from_quakeml(fn)
|
||||
names.append(name)
|
||||
names = self.iter_kwargs(kwargs)
|
||||
if len(names) > 2:
|
||||
raise ValueError('Comparison is only defined for two '
|
||||
'arguments!')
|
||||
@@ -48,6 +40,40 @@ class Comparison(object):
|
||||
return False
|
||||
return True
|
||||
|
||||
def iter_kwargs(self, kwargs):
|
||||
names = list()
|
||||
for name, fn in kwargs.items():
|
||||
if name == 'eventlist':
|
||||
names = self.init_by_eventlist(fn)
|
||||
break
|
||||
if isinstance(fn, PDFDictionary):
|
||||
self._pdfs[name] = fn
|
||||
elif isinstance(fn, dict) or isinstance(fn, AttribDict):
|
||||
self._pdfs[name] = PDFDictionary(fn)
|
||||
else:
|
||||
self._pdfs[name] = PDFDictionary.from_quakeml(fn)
|
||||
names.append(name)
|
||||
return names
|
||||
|
||||
def init_by_eventlist(self, eventlist):
|
||||
# create one dictionary containing all picks for all events (therefore modify station key)
|
||||
global_picksdict = {}
|
||||
for event in eventlist:
|
||||
automanu = {'manu': event.pylot_picks,
|
||||
'auto': event.pylot_autopicks}
|
||||
for method, picksdict in automanu.items():
|
||||
if not method in global_picksdict.keys():
|
||||
global_picksdict[method] = {}
|
||||
for station, picks in picksdict.items():
|
||||
new_picksdict = global_picksdict[method]
|
||||
# new id combining event and station in one dictionary for all events
|
||||
id = '{}_{}'.format(event.pylot_id, station)
|
||||
new_picksdict[id] = picks
|
||||
for method, picksdict in global_picksdict.items():
|
||||
self._pdfs[method] = PDFDictionary(picksdict)
|
||||
names = list(global_picksdict.keys())
|
||||
return names
|
||||
|
||||
def get(self, name):
|
||||
return self._pdfs[name]
|
||||
|
||||
|
||||
@@ -121,7 +121,7 @@ def createAction(parent, text, slot=None, shortcut=None, icon=None,
|
||||
|
||||
|
||||
class ComparisonWidget(QWidget):
|
||||
def __init__(self, c, parent=None):
|
||||
def __init__(self, c, parent=None, windowflag=1):
|
||||
self._data = c
|
||||
self._stats = c.stations
|
||||
self._canvas = PlotWidget(self)
|
||||
@@ -130,7 +130,7 @@ class ComparisonWidget(QWidget):
|
||||
histCheckBox=None)
|
||||
self._phases = 'PS'
|
||||
self._plotprops = dict(station=list(self.stations)[0], phase=list(self.phases)[0])
|
||||
super(ComparisonWidget, self).__init__(parent, 1)
|
||||
super(ComparisonWidget, self).__init__(parent, windowflag)
|
||||
self.setupUI()
|
||||
self.resize(1280, 720)
|
||||
self.plotcomparison()
|
||||
@@ -154,19 +154,19 @@ class ComparisonWidget(QWidget):
|
||||
_phases_combobox.currentIndexChanged.connect(self.prepareplot)
|
||||
self.widgets = _phases_combobox
|
||||
|
||||
_hist_checkbox = QCheckBox('Show histograms', self)
|
||||
_hist_checkbox.setObjectName('histCheckBox')
|
||||
_hist_checkbox.stateChanged.connect(self.plothist)
|
||||
self.widgets = _hist_checkbox
|
||||
self._hist_checkbox = QCheckBox('Show histograms', self)
|
||||
self._hist_checkbox.setObjectName('histCheckBox')
|
||||
self._hist_checkbox.stateChanged.connect(self.plothist)
|
||||
self.widgets = self._hist_checkbox
|
||||
|
||||
_toolbar = QToolBar(self)
|
||||
_toolbar.addWidget(_stats_combobox)
|
||||
_toolbar.addWidget(_phases_combobox)
|
||||
_toolbar.addWidget(_hist_checkbox)
|
||||
self._toolbar = QToolBar(self)
|
||||
self._toolbar.addWidget(_stats_combobox)
|
||||
self._toolbar.addWidget(_phases_combobox)
|
||||
self._toolbar.addWidget(self._hist_checkbox)
|
||||
|
||||
_innerlayout.addWidget(self.canvas)
|
||||
|
||||
_outerlayout.addWidget(_toolbar)
|
||||
_outerlayout.addWidget(self._toolbar)
|
||||
_outerlayout.addLayout(_innerlayout)
|
||||
|
||||
# finally layout the entire widget
|
||||
@@ -232,6 +232,15 @@ class ComparisonWidget(QWidget):
|
||||
if name in self.widgets.keys():
|
||||
self._widgets[name] = widget
|
||||
|
||||
def showToolbar(self):
|
||||
self._toolbar.show()
|
||||
|
||||
def hideToolbar(self):
|
||||
self._toolbar.hide()
|
||||
|
||||
def setHistboxChecked(self, bool):
|
||||
self._hist_checkbox.setChecked(bool)
|
||||
|
||||
def clf(self):
|
||||
self.canvas.figure.clf()
|
||||
|
||||
@@ -2036,16 +2045,10 @@ class MultiEventWidget(QWidget):
|
||||
'''
|
||||
|
||||
'''
|
||||
def __init__(self, pickoptions=None, parent=None, windowflag=1):
|
||||
def __init__(self, options=None, parent=None, windowflag=1):
|
||||
QtGui.QWidget.__init__(self, parent, windowflag)
|
||||
|
||||
self.pickoptions = pickoptions
|
||||
# self.pickoptions =[('current event', None),
|
||||
# ('tune events', None),
|
||||
# ('test events', None),
|
||||
# ('all (picked)', None),
|
||||
# ('all events', None)]
|
||||
|
||||
self.options = options
|
||||
self.setupUi()
|
||||
# set initial size
|
||||
self.resize(1280, 720)
|
||||
@@ -2077,8 +2080,9 @@ class MultiEventWidget(QWidget):
|
||||
|
||||
self.start_button = QtGui.QPushButton('Start')
|
||||
|
||||
for index, (key, func) in enumerate(self.pickoptions):
|
||||
for index, (key, func) in enumerate(self.options):
|
||||
rb = QtGui.QRadioButton(key)
|
||||
rb.toggled.connect(self.check_rb_selection)
|
||||
if index == 0:
|
||||
rb.setChecked(True)
|
||||
self.rb_dict[key] = rb
|
||||
@@ -2088,69 +2092,58 @@ class MultiEventWidget(QWidget):
|
||||
self.rb_layout.addWidget(self.start_button)
|
||||
|
||||
self.rb_layout.addWidget(QtGui.QWidget())
|
||||
self.rb_layout.setStretch(len(self.pickoptions)+1, 1)
|
||||
self.rb_layout.setStretch(len(self.options) + 1, 1)
|
||||
|
||||
self.main_layout.insertLayout(0, self.rb_layout)
|
||||
|
||||
def refresh_tooltips(self):
|
||||
for key, func in self.options:
|
||||
eventlist = func()
|
||||
if not type(eventlist) == list:
|
||||
eventlist = [eventlist]
|
||||
tooltip=''
|
||||
for index, event in enumerate(eventlist):
|
||||
if not event:
|
||||
continue
|
||||
tooltip += '{}'.format(event.pylot_id)
|
||||
if not index + 1 == len(eventlist):
|
||||
tooltip += '\n'
|
||||
if not tooltip:
|
||||
tooltip = 'No events for this selection'
|
||||
self.rb_dict[key].setToolTip(tooltip)
|
||||
self.check_rb_selection()
|
||||
|
||||
def check_rb_selection(self):
|
||||
for rb in self.rb_dict.values():
|
||||
if rb.isChecked():
|
||||
check_events = (rb.toolTip() == 'No events for this selection')
|
||||
self.start_button.setEnabled(not(check_events))
|
||||
|
||||
def enable(self, bool):
|
||||
for rb in self.rb_dict.values():
|
||||
rb.setEnabled(bool)
|
||||
self.start_button.setEnabled(bool)
|
||||
self.eventbox.setEnabled(bool)
|
||||
self.button_clear.setEnabled(bool)
|
||||
|
||||
|
||||
class AutoPickWidget(MultiEventWidget):
|
||||
'''
|
||||
'''
|
||||
|
||||
def __init__(self, parent, pickoptions):
|
||||
MultiEventWidget.__init__(self, pickoptions, parent, 1)
|
||||
def __init__(self, parent, options):
|
||||
MultiEventWidget.__init__(self, options, parent, 1)
|
||||
self.connect_buttons()
|
||||
self.init_plot_layout()
|
||||
self.init_log_layout()
|
||||
self.reinitEvents2plot()
|
||||
self.setWindowTitle('Autopick events interactively')
|
||||
|
||||
def setupUi(self):
|
||||
# init main layout
|
||||
self.main_layout = QtGui.QVBoxLayout()
|
||||
self.setLayout(self.main_layout)
|
||||
# init main splitter
|
||||
self.main_splitter = QtGui.QSplitter()
|
||||
self.main_splitter.setChildrenCollapsible(False)
|
||||
|
||||
self.init_checkboxes()
|
||||
self.init_log_layout()
|
||||
self.init_plot_layout()
|
||||
|
||||
self.eventbox = QtGui.QComboBox()
|
||||
self.button_clear = QtGui.QPushButton('Clear')
|
||||
|
||||
self.main_layout.insertWidget(1, self.main_splitter)
|
||||
|
||||
self.main_layout.setStretch(0, 0)
|
||||
self.main_layout.setStretch(1, 1)
|
||||
self.main_splitter.setStretchFactor(0, 1)
|
||||
self.main_splitter.setStretchFactor(1, 2)
|
||||
self.set_main_stretch()
|
||||
|
||||
def connect_buttons(self):
|
||||
self.start_button.clicked.connect(self.run)
|
||||
self.button_clear.clicked.connect(self.reinitEvents2plot)
|
||||
|
||||
def init_checkboxes(self):
|
||||
self.rb_layout = QtGui.QHBoxLayout()
|
||||
|
||||
self.rb_dict = {}
|
||||
|
||||
self.start_button = QtGui.QPushButton('Start')
|
||||
|
||||
for index, (key, func) in enumerate(self.pickoptions):
|
||||
rb = QtGui.QRadioButton(key)
|
||||
if index == 0:
|
||||
rb.setChecked(True)
|
||||
self.rb_dict[key] = rb
|
||||
self.rb_layout.insertWidget(index, rb)
|
||||
self.rb_layout.setStretch(index, 0)
|
||||
|
||||
self.rb_layout.addWidget(self.start_button)
|
||||
|
||||
self.rb_layout.addWidget(QtGui.QWidget())
|
||||
self.rb_layout.setStretch(len(self.pickoptions)+1, 1)
|
||||
|
||||
self.main_layout.insertLayout(0, self.rb_layout)
|
||||
|
||||
def init_plot_layout(self):
|
||||
# init tab widget
|
||||
self.tab_plots = QtGui.QTabWidget()
|
||||
@@ -2202,6 +2195,10 @@ class AutoPickWidget(MultiEventWidget):
|
||||
self.eventbox_layout.setStretch(0, 1)
|
||||
self.plot_layout.insertLayout(0, self.eventbox_layout)
|
||||
|
||||
def set_main_stretch(self):
|
||||
self.main_layout.setStretch(0, 0)
|
||||
self.main_layout.setStretch(1, 1)
|
||||
|
||||
def reinitEvents2plot(self):
|
||||
self.events2plot = {}
|
||||
self.eventbox.clear()
|
||||
@@ -2210,32 +2207,69 @@ class AutoPickWidget(MultiEventWidget):
|
||||
def refresh_plot_tabs(self):
|
||||
self.tab_plots.clear()
|
||||
|
||||
def refresh_tooltips(self):
|
||||
for key, func in self.pickoptions:
|
||||
eventlist = func()
|
||||
if not type(eventlist) == list:
|
||||
eventlist = [eventlist]
|
||||
tooltip=''
|
||||
for index, event in enumerate(eventlist):
|
||||
if not event:
|
||||
continue
|
||||
tooltip += '{}'.format(event.pylot_id)
|
||||
if not index + 1 == len(eventlist):
|
||||
tooltip += '\n'
|
||||
if not tooltip:
|
||||
tooltip = 'No events for this selection'
|
||||
self.rb_dict[key].setToolTip(tooltip)
|
||||
|
||||
def run(self):
|
||||
self.refresh_plot_tabs()
|
||||
self.start.emit()
|
||||
|
||||
def enable(self, bool):
|
||||
for rb in self.rb_dict.values():
|
||||
rb.setEnabled(bool)
|
||||
self.start_button.setEnabled(bool)
|
||||
self.eventbox.setEnabled(bool)
|
||||
self.button_clear.setEnabled(bool)
|
||||
|
||||
class CompareEventsWidget(MultiEventWidget):
|
||||
'''
|
||||
'''
|
||||
|
||||
def __init__(self, parent, options, eventdict, comparisons):
|
||||
MultiEventWidget.__init__(self, options, parent, 1)
|
||||
self.eventdict = eventdict
|
||||
self.comparisons = comparisons
|
||||
self.compare_widget = QtGui.QWidget()
|
||||
self.init_eventbox()
|
||||
self.init_event_area()
|
||||
self.fill_eventbox()
|
||||
self.connect_buttons()
|
||||
self.setWindowTitle('Compare events')
|
||||
self.set_main_stretch()
|
||||
|
||||
def connect_buttons(self):
|
||||
self.start_button.clicked.connect(self.run)
|
||||
self.start_button.setText('Show Histograms')
|
||||
|
||||
def init_event_area(self):
|
||||
self.event_layout = QVBoxLayout()
|
||||
self.event_layout.insertWidget(0, self.eventbox)
|
||||
self.event_area = QGroupBox('Single Event')
|
||||
self.event_area.setLayout(self.event_layout)
|
||||
self.main_layout.insertWidget(1, self.event_area)
|
||||
|
||||
def init_eventbox(self):
|
||||
self.eventbox_layout = QtGui.QHBoxLayout()
|
||||
self.eventbox_layout.addWidget(self.eventbox)
|
||||
self.eventbox.currentIndexChanged.connect(self.update_comparison)
|
||||
|
||||
def fill_eventbox(self):
|
||||
event_ids = list(self.eventdict.keys())
|
||||
for event_id in sorted(event_ids):
|
||||
self.eventbox.addItem(str(event_id))
|
||||
self.update_comparison()
|
||||
|
||||
def update_eventbox(self):
|
||||
self.eventbox.clear()
|
||||
self.fill_eventbox()
|
||||
|
||||
def update_comparison(self, index=0):
|
||||
self.compare_widget.setParent(None)
|
||||
self.compare_widget = ComparisonWidget(
|
||||
self.comparisons[self.eventbox.currentText()], self, 0)
|
||||
self.event_layout.insertWidget(1, self.compare_widget)
|
||||
self.set_main_stretch()
|
||||
|
||||
def set_main_stretch(self):
|
||||
self.main_layout.setStretch(0, 0)
|
||||
self.main_layout.setStretch(1, 1)
|
||||
self.main_layout.setStretch(2, 0)
|
||||
self.event_layout.setStretch(0, 0)
|
||||
self.event_layout.setStretch(1, 1)
|
||||
|
||||
def run(self):
|
||||
self.start.emit()
|
||||
|
||||
|
||||
class TuneAutopicker(QWidget):
|
||||
|
||||
Reference in New Issue
Block a user