[add] compare widget for multiple events added

This commit is contained in:
Marcel Paffrath 2017-08-31 11:16:13 +02:00
parent ba001fb53d
commit eaa7a993af
2 changed files with 122 additions and 132 deletions

View File

@ -79,7 +79,8 @@ from pylot.core.util.event import Event
from pylot.core.io.location import create_creation_info, create_event from pylot.core.io.location import create_creation_info, create_event
from pylot.core.util.widgets import FilterOptionsDialog, NewEventDlg, \ from pylot.core.util.widgets import FilterOptionsDialog, NewEventDlg, \
WaveformWidget, WaveformWidgetPG, PropertiesDlg, HelpForm, createAction, PickDlg, \ WaveformWidget, WaveformWidgetPG, PropertiesDlg, HelpForm, createAction, PickDlg, \
getDataType, ComparisonWidget, TuneAutopicker, PylotParaBox, AutoPickDlg, CanvasWidget, AutoPickWidget getDataType, ComparisonWidget, TuneAutopicker, PylotParaBox, AutoPickDlg, CanvasWidget, AutoPickWidget, \
CompareEventsWidget
from pylot.core.util.map_projection import map_projection from pylot.core.util.map_projection import map_projection
from pylot.core.util.structure import DATASTRUCTURE from pylot.core.util.structure import DATASTRUCTURE
from pylot.core.util.thread import Thread, Worker from pylot.core.util.thread import Thread, Worker
@ -201,6 +202,14 @@ class MainWindow(QMainWindow):
s_filter['order'])} s_filter['order'])}
self.loc = False self.loc = False
# init event selection options for compare/autopick
self.pickoptions =[('current event', self.get_current_event),
('tune events', self.get_ref_events),
('test events', self.get_test_events),
('all (picked) events', self.get_manu_picked_events),
('all events', self.get_all_events)]
def setupUi(self): def setupUi(self):
try: try:
self.startTime = min( self.startTime = min(
@ -1230,17 +1239,27 @@ class MainWindow(QMainWindow):
return None return None
def comparePicks(self): def comparePicks(self):
if self.check4Comparison(): comparisons = {}
comparisons = {} eventdict = {}
for event in self.project.eventlist: for event in self.project.eventlist:
autopicks = excludeQualityClasses(event.getAutopicks(), [4], if not self.comparable[event.pylot_id]:
self._inputs['timeerrorsP'], self._inputs['timeerrorsS']) continue
manupicks = excludeQualityClasses(event.getPicks(), [4], autopicks = excludeQualityClasses(event.getAutopicks(), [4],
self._inputs['timeerrorsP'], self._inputs['timeerrorsS']) self._inputs['timeerrorsP'], self._inputs['timeerrorsS'])
co = Comparison(auto=autopicks, manu=manupicks) manupicks = excludeQualityClasses(event.getPicks(), [4],
comparisons[event.pylot_id] = co self._inputs['timeerrorsP'], self._inputs['timeerrorsS'])
compare_dlg = ComparisonWidget(comparisons[self.get_current_event_name()], self) co = Comparison(auto=autopicks, manu=manupicks)
compare_dlg.show() comparisons[event.pylot_id] = co
eventdict[event.pylot_id] = event
if len(eventdict) < 1:
return
pickoptions = self.pickoptions.copy()
pickoptions.pop(-1)
pickoptions.pop(0)
compare_multi = CompareEventsWidget(self, pickoptions, eventdict, comparisons)
compare_multi.show()
#compare_dlg = ComparisonWidget(comparisons[self.get_current_event_name()], self)
#compare_dlg.show()
def getPlotWidget(self): def getPlotWidget(self):
return self.dataPlot return self.dataPlot
@ -1491,6 +1510,7 @@ class MainWindow(QMainWindow):
self.dataPlot.plotWidget.showAxis('bottom') self.dataPlot.plotWidget.showAxis('bottom')
def finishWaveformDataPlot(self): def finishWaveformDataPlot(self):
self.comparable = self.checkEvents4comparison()
if self.pg: if self.pg:
self.finish_pg_plot() self.finish_pg_plot()
else: else:
@ -1524,15 +1544,31 @@ class MainWindow(QMainWindow):
self.locateEvent.setEnabled(True) self.locateEvent.setEnabled(True)
if event.pylot_autopicks: if event.pylot_autopicks:
self.drawPicks(picktype='auto') self.drawPicks(picktype='auto')
if event.pylot_picks and event.pylot_autopicks: if True in self.comparable.values():
for key in event.pylot_picks: self.compare_action.setEnabled(True)
for akey in event.pylot_autopicks:
if (akey == key) and (event.pylot_autopicks[akey]['P']['spe'] is not None \
or event.pylot_autopicks[akey]['S']['spe'] is not None):
self.compare_action.setEnabled(True)
break
self.draw() self.draw()
def checkEvent4comparison(self, event):
if event.pylot_picks and event.pylot_autopicks:
for station in event.pylot_picks:
if station in event.pylot_autopicks:
autopick_p = event.pylot_autopicks[station]['P']['spe']
manupick_p = event.pylot_picks[station]['P']['spe']
autopick_s = event.pylot_autopicks[station]['S']['spe']
manupick_s = event.pylot_picks[station]['S']['spe']
if autopick_p and manupick_p:
return True
elif autopick_s and manupick_s:
return True
return False
def checkEvents4comparison(self):
# init dict to keep track whether event can be compared
comparable = {}
for event in self.project.eventlist:
comparable[event.pylot_id] = self.checkEvent4comparison(event)
return comparable
def clearWaveformDataPlot(self): def clearWaveformDataPlot(self):
self.disconnectWFplotEvents() self.disconnectWFplotEvents()
if self.pg: if self.pg:
@ -1919,12 +1955,6 @@ class MainWindow(QMainWindow):
"No autoPyLoT output declared!") "No autoPyLoT output declared!")
return return
self.pickoptions =[('current event', self.get_current_event),
('tune events', self.get_ref_events),
('test events', self.get_test_events),
('all (picked) events', self.get_manu_picked_events),
('all events', self.get_all_events)]
self.listWidget = QListWidget() self.listWidget = QListWidget()
self.setDirty(True) self.setDirty(True)
self.apw = AutoPickWidget(self, self.pickoptions) self.apw = AutoPickWidget(self, self.pickoptions)
@ -2096,7 +2126,6 @@ class MainWindow(QMainWindow):
#event.picks.update(picks) MP MP idea #event.picks.update(picks) MP MP idea
elif type == 'auto': elif type == 'auto':
event.addAutopicks(picksdict['auto']) event.addAutopicks(picksdict['auto'])
self.check4Comparison()
def drawPicks(self, station=None, picktype=None): def drawPicks(self, station=None, picktype=None):
# if picktype not specified, draw both # if picktype not specified, draw both
@ -2636,18 +2665,18 @@ class MainWindow(QMainWindow):
def check4Loc(self): def check4Loc(self):
return self.picksNum() >= 4 return self.picksNum() >= 4
def check4Comparison(self): # def check4Comparison(self):
mpicks = self.getPicks() # mpicks = self.getPicks()
apicks = self.getPicks('auto') # apicks = self.getPicks('auto')
for station, phases in mpicks.items(): # for station, phases in mpicks.items():
try: # try:
aphases = apicks[station] # aphases = apicks[station]
for phase in phases.keys(): # for phase in phases.keys():
if phase in aphases.keys(): # if phase in aphases.keys():
return True # return True
except KeyError: # except KeyError:
continue # continue
return False # return False
def picksNum(self, type='manual'): def picksNum(self, type='manual'):
num = 0 num = 0

View File

@ -121,7 +121,7 @@ def createAction(parent, text, slot=None, shortcut=None, icon=None,
class ComparisonWidget(QWidget): class ComparisonWidget(QWidget):
def __init__(self, c, parent=None): def __init__(self, c, parent=None, windowflag=1):
self._data = c self._data = c
self._stats = c.stations self._stats = c.stations
self._canvas = PlotWidget(self) self._canvas = PlotWidget(self)
@ -130,7 +130,7 @@ class ComparisonWidget(QWidget):
histCheckBox=None) histCheckBox=None)
self._phases = 'PS' self._phases = 'PS'
self._plotprops = dict(station=list(self.stations)[0], phase=list(self.phases)[0]) 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.setupUI()
self.resize(1280, 720) self.resize(1280, 720)
self.plotcomparison() self.plotcomparison()
@ -2092,6 +2092,22 @@ class MultiEventWidget(QWidget):
self.main_layout.insertLayout(0, self.rb_layout) self.main_layout.insertLayout(0, self.rb_layout)
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 enable(self, bool): def enable(self, bool):
for rb in self.rb_dict.values(): for rb in self.rb_dict.values():
rb.setEnabled(bool) rb.setEnabled(bool)
@ -2111,6 +2127,7 @@ class AutoPickWidget(MultiEventWidget):
self.init_log_layout() self.init_log_layout()
self.reinitEvents2plot() self.reinitEvents2plot()
self.setWindowTitle('Autopick events interactively') self.setWindowTitle('Autopick events interactively')
self.set_main_stretch()
def connect_buttons(self): def connect_buttons(self):
self.start_button.clicked.connect(self.run) self.start_button.clicked.connect(self.run)
@ -2167,6 +2184,10 @@ class AutoPickWidget(MultiEventWidget):
self.eventbox_layout.setStretch(0, 1) self.eventbox_layout.setStretch(0, 1)
self.plot_layout.insertLayout(0, self.eventbox_layout) 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): def reinitEvents2plot(self):
self.events2plot = {} self.events2plot = {}
self.eventbox.clear() self.eventbox.clear()
@ -2175,119 +2196,59 @@ class AutoPickWidget(MultiEventWidget):
def refresh_plot_tabs(self): def refresh_plot_tabs(self):
self.tab_plots.clear() 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): def run(self):
self.refresh_plot_tabs() self.refresh_plot_tabs()
self.start.emit() self.start.emit()
class CompareEventsWidget(MultiEventWidget): class CompareEventsWidget(MultiEventWidget):
''' '''
''' '''
def __init__(self, parent, pickoptions): def __init__(self, parent, pickoptions, eventdict, comparisons):
MultiEventWidget.__init__(self, pickoptions, parent, 1) MultiEventWidget.__init__(self, pickoptions, parent, 1)
self.eventdict = eventdict
self.comparisons = comparisons
self.init_eventbox()
self.connect_buttons() self.connect_buttons()
self.init_plot_layout() self.setWindowTitle('Compare events')
self.init_log_layout() self.set_main_stretch()
self.reinitEvents2plot()
self.setWindowTitle('Autopick events interactively')
def connect_buttons(self): def connect_buttons(self):
self.start_button.clicked.connect(self.run) self.start_button.clicked.connect(self.run)
self.button_clear.clicked.connect(self.reinitEvents2plot)
def init_plot_layout(self): def init_eventbox(self):
# init tab widget self.eventbox_layout = QtGui.QHBoxLayout()
self.tab_plots = QtGui.QTabWidget() self.eventbox_layout.addWidget(self.eventbox)
self.gb_plots = QtGui.QGroupBox('Plots') self.main_layout.insertLayout(1, self.eventbox_layout)
self.gb_plots.setMinimumSize(100, 100) self.fill_eventbox()
self.main_splitter.insertWidget(1, self.gb_plots) self.eventbox.currentIndexChanged.connect(self.update_comparison)
self.plot_layout = QtGui.QVBoxLayout()
self.plot_layout.insertWidget(1, self.tab_plots)
self.gb_plots.setLayout(self.plot_layout)
def init_log_layout(self): def fill_eventbox(self):
self.gb_log = QtGui.QGroupBox('Log') event_ids = list(self.eventdict.keys())
self.gb_log.setMinimumSize(100, 100) for event_id in sorted(event_ids):
self.main_splitter.insertWidget(0, self.gb_log) self.eventbox.addItem(str(event_id))
self.update_comparison()
def insert_log_widget(self, widget): def update_eventbox(self):
vl = QtGui.QVBoxLayout()
vl.addWidget(widget)
self.gb_log.setLayout(vl)
def add_plot_widget(self, widget, key, eventID):
eventID += ' [picked: {}]'.format(time.strftime('%X %x %z'))
if not eventID in self.events2plot.keys():
self.events2plot[eventID] = {}
self.events2plot[eventID][key] = widget
def generate_combobox(self):
self.eventbox.clear() self.eventbox.clear()
for eventID, widgets in self.events2plot.items(): self.fill_eventbox()
self.eventbox.addItem(str(eventID), widgets)
self.eventbox.currentIndexChanged.connect(self.draw_plots)
self.draw_plots()
def draw_plots(self, index=0): def update_comparison(self, index=0):
self.refresh_plot_tabs() if hasattr(self, 'compare_widget'):
widgets = self.eventbox.itemData(index) self.compare_widget.setParent(None)
if not widgets: self.compare_widget = ComparisonWidget(
return self.comparisons[self.eventbox.currentText()], self, 0)
for key, widget in widgets.items(): self.main_layout.insertWidget(2, self.compare_widget)
self.tab_plots.addTab(widget, str(key)) self.set_main_stretch()
def update_plots(self): def set_main_stretch(self):
self.refresh_plot_tabs() self.main_layout.setStretch(0, 0)
if len(self.events2plot) > 0: self.main_layout.setStretch(1, 0)
self.eventbox_layout = QtGui.QHBoxLayout() self.main_layout.setStretch(2, 1)
self.generate_combobox() self.main_layout.setStretch(3, 0)
self.eventbox_layout.addWidget(self.eventbox)
self.eventbox_layout.addWidget(self.button_clear)
self.eventbox_layout.setStretch(0, 1)
self.plot_layout.insertLayout(0, self.eventbox_layout)
def reinitEvents2plot(self):
self.events2plot = {}
self.eventbox.clear()
self.refresh_plot_tabs()
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): def run(self):
self.refresh_plot_tabs()
self.start.emit() self.start.emit()