Merge branch 'develop' of ariadne.geophysik.ruhr-uni-bochum.de:/data/git/pylot into develop

This commit is contained in:
Marcel Paffrath 2016-06-07 13:39:34 +02:00
commit 661b4d11c0
7 changed files with 155 additions and 39 deletions

View File

@ -53,7 +53,7 @@ from pylot.core.util.utils import fnConstructor, getLogin, \
getGlobalTimes getGlobalTimes
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, \
MPLWidget, PropertiesDlg, HelpForm, createAction, PickDlg WaveformWidget, PropertiesDlg, HelpForm, createAction, PickDlg, getDataType
from pylot.core.util.structure import DATASTRUCTURE from pylot.core.util.structure import DATASTRUCTURE
from pylot.core.util.thread import AutoPickThread from pylot.core.util.thread import AutoPickThread
from pylot.core.util.version import get_git_version as _getVersionString from pylot.core.util.version import get_git_version as _getVersionString
@ -142,7 +142,7 @@ class MainWindow(QMainWindow):
plottitle = "Overview: {0} components ".format(self.getComponent()) plottitle = "Overview: {0} components ".format(self.getComponent())
# create central matplotlib figure canvas widget # create central matplotlib figure canvas widget
self.DataPlot = MPLWidget(parent=self, xlabel=xlab, ylabel=None, self.DataPlot = WaveformWidget(parent=self, xlabel=xlab, ylabel=None,
title=plottitle) title=plottitle)
self.DataPlot.mpl_connect('button_press_event', self.DataPlot.mpl_connect('button_press_event',
self.pickOnStation) self.pickOnStation)
@ -178,6 +178,8 @@ class MainWindow(QMainWindow):
auto_icon.addPixmap(QPixmap(':/icons/sync.png')) auto_icon.addPixmap(QPixmap(':/icons/sync.png'))
locate_icon = QIcon() locate_icon = QIcon()
locate_icon.addPixmap(QPixmap(':/icons/locate.png')) locate_icon.addPixmap(QPixmap(':/icons/locate.png'))
compare_icon = QIcon()
compare_icon.addPixmap(QPixmap(':/icons/compare.png'))
newEventAction = self.createAction(self, "&New event ...", newEventAction = self.createAction(self, "&New event ...",
self.createNewEvent, self.createNewEvent,
@ -244,6 +246,12 @@ class MainWindow(QMainWindow):
"Alt+S", "Alt+S",
s_icon, s_icon,
"Toggle S phase", True) "Toggle S phase", True)
self.compare_action = self.createAction(self, "&Compare picks...",
self.comparePicks, "Alt+C",
compare_icon, "Comparison of "
"manual and "
"automatic pick "
"data.", False)
printAction = self.createAction(self, "&Print event ...", printAction = self.createAction(self, "&Print event ...",
self.printEvent, QKeySequence.Print, self.printEvent, QKeySequence.Print,
print_icon, print_icon,
@ -318,7 +326,7 @@ class MainWindow(QMainWindow):
' displayed!') ' displayed!')
autoPickToolBar = self.addToolBar("autoPyLoT") autoPickToolBar = self.addToolBar("autoPyLoT")
autoPickActions = (auto_pick,) autoPickActions = (auto_pick, self.compare_action)
self.addActions(autoPickToolBar, autoPickActions) self.addActions(autoPickToolBar, autoPickActions)
# pickToolBar = self.addToolBar("PickTools") # pickToolBar = self.addToolBar("PickTools")
@ -389,43 +397,32 @@ class MainWindow(QMainWindow):
settings = QSettings() settings = QSettings()
return settings.value("data/dataRoot") return settings.value("data/dataRoot")
def getType(self):
type = QInputDialog().getItem(self, self.tr("Select phases type"),
self.tr("Type:"), [self.tr("manual"),
self.tr("automatic")])
if type[0].startswith('auto'):
type = 'auto'
else:
type = type[0]
return type
def load_autopicks(self, fname=None): def load_autopicks(self, fname=None):
self.load_data(fname, type='auto') self.load_data(fname, type='auto')
def load_loc(self, fname=None): def load_loc(self, fname=None):
self.load_data(fname, type='loc') type = getDataType(self)
self.load_data(fname, type=type, loc=True)
def load_pilotevent(self): def load_pilotevent(self):
filt = "PILOT location files (*.mat)" filt = "PILOT location files (*LOC*.mat)"
caption = "Select PILOT location file" caption = "Select PILOT location file"
fn_loc = QFileDialog().getOpenFileName(self, caption=caption, fn_loc = QFileDialog().getOpenFileName(self, caption=caption,
filter=filt, dir=self.getRoot()) filter=filt, dir=self.getRoot())
fn_loc = fn_loc[0] fn_loc = fn_loc[0]
loc_dir = os.path.split(fn_loc)[0] loc_dir = os.path.split(fn_loc)[0]
filt = "PILOT phases files (*.mat)" filt = "PILOT phases files (*PHASES*.mat)"
caption = "Select PILOT phases file" caption = "Select PILOT phases file"
fn_phases = QFileDialog().getOpenFileName(self, caption=caption, fn_phases = QFileDialog().getOpenFileName(self, caption=caption,
filter=filt, dir=loc_dir) filter=filt, dir=loc_dir)
fn_phases = fn_phases[0] fn_phases = fn_phases[0]
type = self.getType() type = getDataType(self)
fname_dict = dict(phasfn=fn_phases, locfn=fn_loc) fname_dict = dict(phasfn=fn_phases, locfn=fn_loc)
self.load_data(fname_dict, type=type) self.load_data(fname_dict, type=type)
def load_data(self, fname=None, type='manual'): def load_data(self, fname=None, type='manual', loc=False):
if not self.okToContinue(): if not self.okToContinue():
return return
if fname is None: if fname is None:
@ -435,7 +432,7 @@ class MainWindow(QMainWindow):
self.set_fname(fname, type) self.set_fname(fname, type)
data = dict(auto=self.autodata, manual=self.data) data = dict(auto=self.autodata, manual=self.data)
data[type] += Data(self, evtdata=fname) data[type] += Data(self, evtdata=fname)
if 'loc' not in type: if not loc:
self.updatePicks(type=type) self.updatePicks(type=type)
self.drawPicks(picktype=type) self.drawPicks(picktype=type)
self.draw() self.draw()
@ -485,9 +482,9 @@ class MainWindow(QMainWindow):
filt = "Supported file formats" \ filt = "Supported file formats" \
" (*.mat *.qml *.xml *.kor *.evt)" " (*.mat *.qml *.xml *.kor *.evt)"
caption = "Open an event file" caption = "Open an event file"
fname = QFileDialog().getOpenFileName(self, fname = QFileDialog().getOpenFileName(self, caption=caption,
caption=caption, filter=filt,
filter=filt) dir=self.getRoot())
fname = fname[0] fname = fname[0]
else: else:
fname = str(action.data().toString()) fname = str(action.data().toString())
@ -579,6 +576,10 @@ class MainWindow(QMainWindow):
except KeyError: except KeyError:
return None return None
def comparePicks(self):
if self.check4Comparison():
compare_dlg = ComparisonDialog(self)
def getPlotWidget(self): def getPlotWidget(self):
return self.DataPlot return self.DataPlot
@ -839,6 +840,7 @@ class MainWindow(QMainWindow):
self.picks.update(picks) self.picks.update(picks)
elif type == 'auto': elif type == 'auto':
self.autopicks.update(picks) self.autopicks.update(picks)
self.check4Comparison()
def drawPicks(self, station=None, picktype='manual'): def drawPicks(self, station=None, picktype='manual'):
# if picks to draw not specified, draw all picks available # if picks to draw not specified, draw all picks available
@ -893,9 +895,22 @@ class MainWindow(QMainWindow):
def check4Loc(self): def check4Loc(self):
return self.picksNum() > 4 return self.picksNum() > 4
def picksNum(self): def check4Comparison(self):
mpicks = self.getPicks()
apicks = self.getPicks('auto')
for station, phases in mpicks.items():
try:
aphases = apicks[station]
for phase in phases.keys():
if phase in aphases.keys():
return True
except KeyError:
continue
return False
def picksNum(self, type='manual'):
num = 0 num = 0
for phases in self.getPicks().values(): for phases in self.getPicks(type).values():
num += len(phases) num += len(phases)
return num return num

View File

@ -5,6 +5,7 @@
<file>icons/locate.png</file> <file>icons/locate.png</file>
<file>icons/printer.png</file> <file>icons/printer.png</file>
<file>icons/delete.png</file> <file>icons/delete.png</file>
<file>icons/compare.png</file>
<file>icons/key_E.png</file> <file>icons/key_E.png</file>
<file>icons/key_N.png</file> <file>icons/key_N.png</file>
<file>icons/key_P.png</file> <file>icons/key_P.png</file>

BIN
icons/compare.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

File diff suppressed because one or more lines are too long

View File

@ -8,6 +8,7 @@
EVENT_DATA/LOCAL #datapath# %data path EVENT_DATA/LOCAL #datapath# %data path
2013.02_Insheim #database# %name of data base 2013.02_Insheim #database# %name of data base
e0019.048.13 #eventID# %certain evnt ID for processing e0019.048.13 #eventID# %certain evnt ID for processing
True #apverbose#
PILOT #datastructure# %choose data structure PILOT #datastructure# %choose data structure
0 #iplot# %flag for plotting: 0 none, 1, partly, >1 everything 0 #iplot# %flag for plotting: 0 none, 1, partly, >1 everything
AUTOPHASES_AIC_HOS4_ARH #phasefile# %name of autoPILOT output phase file AUTOPHASES_AIC_HOS4_ARH #phasefile# %name of autoPILOT output phase file

View File

@ -29,7 +29,10 @@ class Comparison(object):
names = list() names = list()
self._pdfs = dict() self._pdfs = dict()
for name, fn in kwargs.items(): for name, fn in kwargs.items():
if not isinstance(PDFDictionary, fn):
self._pdfs[name] = PDFDictionary.from_quakeml(fn) self._pdfs[name] = PDFDictionary.from_quakeml(fn)
else:
self._pdfs[name] = fn
names.append(name) names.append(name)
if len(names) > 2: if len(names) > 2:
raise ValueError('Comparison is only defined for two ' raise ValueError('Comparison is only defined for two '
@ -101,14 +104,19 @@ class Comparison(object):
return compare_pdfs return compare_pdfs
def plot(self): def plot(self, stations=None):
if stations is None:
nstations = self.nstations nstations = self.nstations
stations = self.stations stations = self.stations
else:
nstations = len(stations)
istations = range(nstations) istations = range(nstations)
fig, axarr = plt.subplots(nstations, 2, sharex='col', sharey='row') fig, axarr = plt.subplots(nstations, 2, sharex='col', sharey='row')
for n in istations: for n in istations:
station = stations[n] station = stations[n]
if station not in self.comparison.keys():
continue
compare_pdf = self.comparison[station] compare_pdf = self.comparison[station]
for l, phase in enumerate(compare_pdf.keys()): for l, phase in enumerate(compare_pdf.keys()):
axarr[n, l].plot(compare_pdf[phase].axis, axarr[n, l].plot(compare_pdf[phase].axis,

View File

@ -20,7 +20,8 @@ from matplotlib.widgets import MultiCursor
from PySide.QtGui import QAction, QApplication, QComboBox, QDateTimeEdit, \ from PySide.QtGui import QAction, QApplication, QComboBox, QDateTimeEdit, \
QDialog, QDialogButtonBox, QDoubleSpinBox, QGroupBox, QGridLayout, \ QDialog, QDialogButtonBox, QDoubleSpinBox, QGroupBox, QGridLayout, \
QIcon, QKeySequence, QLabel, QLineEdit, QMessageBox, QPixmap, QSpinBox, \ QIcon, QKeySequence, QLabel, QLineEdit, QMessageBox, QPixmap, QSpinBox, \
QTabWidget, QToolBar, QVBoxLayout, QWidget, QPushButton, QFileDialog QTabWidget, QToolBar, QVBoxLayout, QWidget, QPushButton, QFileDialog, \
QInputDialog
from PySide.QtCore import QSettings, Qt, QUrl, Signal, Slot from PySide.QtCore import QSettings, Qt, QUrl, Signal, Slot
from PySide.QtWebKit import QWebView from PySide.QtWebKit import QWebView
from obspy import Stream, UTCDateTime from obspy import Stream, UTCDateTime
@ -33,6 +34,18 @@ from pylot.core.util.utils import prepTimeAxis, getGlobalTimes, scaleWFData, \
demeanTrace, isSorted, findComboBoxIndex demeanTrace, isSorted, findComboBoxIndex
def getDataType(parent):
type = QInputDialog().getItem(parent, "Select phases type", "Type:",
["manual", "automatic"])
if type[0].startswith('auto'):
type = 'auto'
else:
type = type[0]
return type
def createAction(parent, text, slot=None, shortcut=None, icon=None, def createAction(parent, text, slot=None, shortcut=None, icon=None,
tip=None, checkable=False): tip=None, checkable=False):
""" """
@ -51,8 +64,86 @@ def createAction(parent, text, slot=None, shortcut=None, icon=None,
action.setCheckable(True) action.setCheckable(True)
return action return action
class ComparsionDialog(QDialog):
def __init__(self, c, parent=None):
self._data = c
self._stats = c.keys()
self._canvas = PlotWidget(parent)
super(ComparsionDialog, self).__init__(parent)
self
class MPLWidget(FigureCanvas): def setupUI(self):
pass
@property
def canvas(self):
return self._canvas
@property
def stations(self):
return self._stats
@stations.setter
def stations(self, stations):
self._stats = stations
@property
def data(self):
return self._data
@data.setter
def data(self, data):
self.stations = data.keys()
self._data = data
class PlotWidget(FigureCanvas):
def __init__(self, parent=None, xlabel='x', ylabel='y', title='Title'):
self._parent = parent
self._fig = Figure()
self._xl = xlabel
self._yl = ylabel
self._title = title
super(PlotWidget, self).__init__(self.figure)
@property
def figure(self):
return self._fig
@figure.setter
def figure(self, fig):
self._fig = fig
@property
def xlabel(self):
return self._xl
@xlabel.setter
def xlabel(self, label):
self._xl = label
@property
def ylabel(self):
return self._yl
@ylabel.setter
def ylabel(self, label):
self._yl = label
@property
def title(self):
return self._title
@title.setter
def title(self, title):
self._title = title
@property
def parent(self):
return self._parent
class WaveformWidget(FigureCanvas):
def __init__(self, parent=None, xlabel='x', ylabel='y', title='Title'): def __init__(self, parent=None, xlabel='x', ylabel='y', title='Title'):
self._parent = None self._parent = None
@ -66,7 +157,7 @@ class MPLWidget(FigureCanvas):
# clear axes each time plot is called # clear axes each time plot is called
self.axes.hold(True) self.axes.hold(True)
# initialize super class # initialize super class
super(MPLWidget, self).__init__(self.figure) super(WaveformWidget, self).__init__(self.figure)
# add an cursor for station selection # add an cursor for station selection
self.multiCursor = MultiCursor(self.figure.canvas, (self.axes,), self.multiCursor = MultiCursor(self.figure.canvas, (self.axes,),
horizOn=True, horizOn=True,
@ -210,7 +301,7 @@ class PickDlg(QDialog):
self.stime, self.etime = getGlobalTimes(self.getWFData()) self.stime, self.etime = getGlobalTimes(self.getWFData())
# initialize plotting widget # initialize plotting widget
self.multicompfig = MPLWidget(self) self.multicompfig = WaveformWidget(self)
# setup ui # setup ui
self.setupUi() self.setupUi()