non-working commit of autoPyLoT functionality in overview window

This commit is contained in:
Sebastian Wehling-Benatelli 2015-07-09 11:37:03 +02:00
parent 120f2743d2
commit 398a25f902
5 changed files with 80 additions and 28 deletions

View File

@ -34,15 +34,16 @@ from PySide.QtCore import QCoreApplication, QSettings, Signal, QFile, \
from PySide.QtGui import QMainWindow, QInputDialog, QIcon, QFileDialog, \ from PySide.QtGui import QMainWindow, QInputDialog, QIcon, QFileDialog, \
QWidget, QHBoxLayout, QStyle, QKeySequence, QLabel, QFrame, QAction, \ QWidget, QHBoxLayout, QStyle, QKeySequence, QLabel, QFrame, QAction, \
QDialog, QErrorMessage, QApplication, QPixmap, QMessageBox, QSplashScreen, \ QDialog, QErrorMessage, QApplication, QPixmap, QMessageBox, QSplashScreen, \
QActionGroup QActionGroup, QListWidget
import numpy as np import numpy as np
from obspy.core import UTCDateTime from obspy.core import UTCDateTime
from pylot.core.read import Data, FilterOptions from pylot.core.read import Data, FilterOptions, AutoPickParameter
from pylot.core.util import _getVersionString, FILTERDEFAULTS, fnConstructor, \ from pylot.core.util import _getVersionString, FILTERDEFAULTS, fnConstructor, \
checkurl, FormatError, FilterOptionsDialog, \ checkurl, FormatError, FilterOptionsDialog, \
NewEventDlg, createEvent, MPLWidget, PropertiesDlg, HelpForm, \ NewEventDlg, createEvent, MPLWidget, PropertiesDlg, HelpForm, \
DatastructureError, createAction, getLogin, createCreationInfo, PickDlg DatastructureError, createAction, getLogin, createCreationInfo, PickDlg
from pylot.core.util.thread import WorkerThread
from pylot.core.util.structure import DATASTRUCTURE from pylot.core.util.structure import DATASTRUCTURE
import icons_rc import icons_rc
@ -147,11 +148,13 @@ class MainWindow(QMainWindow):
filter_icon = QIcon() filter_icon = QIcon()
filter_icon.addPixmap(QPixmap(':/icons/filter.png')) filter_icon.addPixmap(QPixmap(':/icons/filter.png'))
z_icon = QIcon() z_icon = QIcon()
z_icon.addPixmap((QPixmap(':/icons/key_Z.png'))) z_icon.addPixmap(QPixmap(':/icons/key_Z.png'))
n_icon = QIcon() n_icon = QIcon()
n_icon.addPixmap((QPixmap(':/icons/key_N.png'))) n_icon.addPixmap(QPixmap(':/icons/key_N.png'))
e_icon = QIcon() e_icon = QIcon()
e_icon.addPixmap((QPixmap(':/icons/key_E.png'))) e_icon.addPixmap(QPixmap(':/icons/key_E.png'))
auto_icon = QIcon()
auto_icon.addPixmap(QPixmap(':/icons/sync.png'))
newEventAction = self.createAction(self, "&New event ...", newEventAction = self.createAction(self, "&New event ...",
self.createNewEvent, self.createNewEvent,
@ -261,6 +264,17 @@ class MainWindow(QMainWindow):
componentToolBar.setObjectName("PhaseTools") componentToolBar.setObjectName("PhaseTools")
self.addActions(componentToolBar, componentActions) self.addActions(componentToolBar, componentActions)
auto_pick = self.createAction(parent=self, text='autoPick',
slot=self.autoPick, shortcut='Alt+Ctrl+A',
icon=auto_icon, tip='Automatically pick'
' the entire dataset'
' displayed!',
checkable=False)
autoPickToolBar = self.addToolBar("autoPyLoT")
autoPickActions = (auto_pick,)
self.addActions(autoPickToolBar, autoPickActions)
# pickToolBar = self.addToolBar("PickTools") # pickToolBar = self.addToolBar("PickTools")
# pickToolActions = (selectStation, ) # pickToolActions = (selectStation, )
# pickToolBar.setObjectName("PickTools") # pickToolBar.setObjectName("PickTools")
@ -570,6 +584,20 @@ class MainWindow(QMainWindow):
else: else:
self.updateStatus('picks discarded ({0})'.format(station)) self.updateStatus('picks discarded ({0})'.format(station))
def autoPick(self):
list = QListWidget()
autopick_parameter = AutoPickParameter('autoPyLoT_local.in')
list.addItem(str(autopick_parameter))
# Create the worker thread and run it
self.thread = WorkerThread(parent=self,
func=autopickevent,
data=self.getData().getWFData(),
param=autopick_parameter)
self.thread.message.connect(list.addItem)
self.thread.start()
def addPicks(self, station, picks): def addPicks(self, station, picks):
stat_picks = self.getPicksOnStation(station) stat_picks = self.getPicksOnStation(station)
if not stat_picks: if not stat_picks:

View File

@ -15,6 +15,7 @@
<file>icons/key_W.png</file> <file>icons/key_W.png</file>
<file>icons/key_Z.png</file> <file>icons/key_Z.png</file>
<file>icons/filter.png</file> <file>icons/filter.png</file>
<file>icons/sync.png</file>
<file>icons/zoom_in.png</file> <file>icons/zoom_in.png</file>
<file>icons/zoom_out.png</file> <file>icons/zoom_out.png</file>
<file>splash/splash.png</file> <file>splash/splash.png</file>

File diff suppressed because one or more lines are too long

View File

@ -12,8 +12,25 @@ import numpy as np
import scipy as sc import scipy as sc
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
from obspy.core import Stream, UTCDateTime from obspy.core import Stream, UTCDateTime
from pylot.core.pick.run_autopicking import run_autopicking
import warnings import warnings
import pdb import pdb
def autopickevent(data, param):
stations = []
for n in len(data):
station = data[n].stats.station
if station not in stations:
stations.append(station)
else:
continue
for station in stations:
topick = data.select(station=station)
stat_picks = run_autopicking(topick, param)
def earllatepicker(X, nfac, TSNR, Pick1, iplot=None): def earllatepicker(X, nfac, TSNR, Pick1, iplot=None):
''' '''
Function to derive earliest and latest possible pick after Diehl & Kissling (2009) Function to derive earliest and latest possible pick after Diehl & Kissling (2009)
@ -254,7 +271,7 @@ def fmpicker(Xraw, Xfilt, pickwin, Pick, iplot=None):
FM = '+' FM = '+'
elif P1[0] > 0 and P2[0] <= 0: elif P1[0] > 0 and P2[0] <= 0:
FM = '+' FM = '+'
print 'fmpicker: Found polarity %s' % FM print 'fmpicker: Found polarity %s' % FM
if iplot > 1: if iplot > 1:
@ -530,7 +547,7 @@ def wadaticheck(pickdic, dttolerance, iplot):
print 'wadaticheck: Not enough S-P times available for reliable regression!' print 'wadaticheck: Not enough S-P times available for reliable regression!'
print 'Skip wadati check!' print 'Skip wadati check!'
wfitflag = 1 wfitflag = 1
# plot results # plot results
if iplot > 1: if iplot > 1:
plt.figure(iplot) plt.figure(iplot)
@ -615,12 +632,12 @@ def checksignallength(X, pick, TSNR, minsiglength, nfac, minpercent, iplot):
print 'checksignallength: Signal shorter than required minimum signal length!' print 'checksignallength: Signal shorter than required minimum signal length!'
print 'Presumably picked noise peak, pick is rejected!' print 'Presumably picked noise peak, pick is rejected!'
returnflag = 0 returnflag = 0
if iplot == 2: if iplot == 2:
plt.figure(iplot) plt.figure(iplot)
p1, = plt.plot(t,x, 'k') p1, = plt.plot(t,x, 'k')
p2, = plt.plot(t[inoise], e[inoise], 'c') p2, = plt.plot(t[inoise], e[inoise], 'c')
p3, = plt.plot(t[isignal],e[isignal], 'r') p3, = plt.plot(t[isignal],e[isignal], 'r')
p2, = plt.plot(t[inoise], e[inoise]) p2, = plt.plot(t[inoise], e[inoise])
p3, = plt.plot(t[isignal],e[isignal], 'r') p3, = plt.plot(t[isignal],e[isignal], 'r')
p4, = plt.plot([t[isignal[0]], t[isignal[len(isignal)-1]]], \ p4, = plt.plot([t[isignal[0]], t[isignal[len(isignal)-1]]], \
@ -642,7 +659,7 @@ def checksignallength(X, pick, TSNR, minsiglength, nfac, minpercent, iplot):
def checkPonsets(pickdic, dttolerance, iplot): def checkPonsets(pickdic, dttolerance, iplot):
''' '''
Function to check statistics of P-onset times: Control deviation from Function to check statistics of P-onset times: Control deviation from
median (maximum adjusted deviation = dttolerance) and apply pseudo- median (maximum adjusted deviation = dttolerance) and apply pseudo-
bootstrapping jackknife. bootstrapping jackknife.
@ -722,7 +739,7 @@ def checkPonsets(pickdic, dttolerance, iplot):
for i in range(0, len(Ppicks)): for i in range(0, len(Ppicks)):
plt.text(i, Ppicks[i] + 0.2, stations[i]) plt.text(i, Ppicks[i] + 0.2, stations[i])
plt.xlabel('Number of P Picks') plt.xlabel('Number of P Picks')
plt.ylabel('Onset Time [s] from 1.1.1970') plt.ylabel('Onset Time [s] from 1.1.1970')
plt.legend([p1, p2, p3], ['Skipped P Picks', 'Good P Picks', 'Median'], \ plt.legend([p1, p2, p3], ['Skipped P Picks', 'Good P Picks', 'Median'], \
loc='best') loc='best')
@ -751,7 +768,7 @@ def jackknife(X, phi, h):
: param: h, size of subgroups, optinal, default = 1 : param: h, size of subgroups, optinal, default = 1
: type: integer : type: integer
''' '''
PHI_jack = None PHI_jack = None
PHI_pseudo = None PHI_pseudo = None
PHI_sub = None PHI_sub = None
@ -786,7 +803,7 @@ def jackknife(X, phi, h):
phi_sub = np.var(xx) phi_sub = np.var(xx)
elif phi == 'MED': elif phi == 'MED':
phi_sub = np.median(xx) phi_sub = np.median(xx)
PHI_sub.append(phi_sub) PHI_sub.append(phi_sub)
# pseudo values # pseudo values
phi_pseudo = g * phi_sc - ((g - 1) * phi_sub) phi_pseudo = g * phi_sc - ((g - 1) * phi_sub)
@ -799,21 +816,21 @@ def jackknife(X, phi, h):
def checkZ4S(X, pick, zfac, checkwin, iplot): def checkZ4S(X, pick, zfac, checkwin, iplot):
''' '''
Function to compare energy content of vertical trace with Function to compare energy content of vertical trace with
energy content of horizontal traces to detect spuriously energy content of horizontal traces to detect spuriously
picked S onsets instead of P onsets. Usually, P coda shows picked S onsets instead of P onsets. Usually, P coda shows
larger longitudal energy on vertical trace than on horizontal larger longitudal energy on vertical trace than on horizontal
traces, where the transversal energy is larger within S coda. traces, where the transversal energy is larger within S coda.
Be careful: there are special circumstances, where this is not Be careful: there are special circumstances, where this is not
the case! the case!
: param: X, fitered(!) time series, three traces : param: X, fitered(!) time series, three traces
: type: `~obspy.core.stream.Stream` : type: `~obspy.core.stream.Stream`
: param: pick, initial (AIC) P onset time : param: pick, initial (AIC) P onset time
: type: float : type: float
: param: zfac, factor for threshold determination, : param: zfac, factor for threshold determination,
vertical energy must exceed coda level times zfac vertical energy must exceed coda level times zfac
to declare a pick as P onset to declare a pick as P onset
: type: float : type: float
@ -841,7 +858,7 @@ def checkZ4S(X, pick, zfac, checkwin, iplot):
ndat = X.select(component="N") ndat = X.select(component="N")
if len(ndat) == 0: # check for other components if len(ndat) == 0: # check for other components
ndat = X.select(component="1") ndat = X.select(component="1")
z = zdat[0].data z = zdat[0].data
tz = np.arange(0, zdat[0].stats.npts / zdat[0].stats.sampling_rate, tz = np.arange(0, zdat[0].stats.npts / zdat[0].stats.sampling_rate,
@ -863,7 +880,7 @@ def checkZ4S(X, pick, zfac, checkwin, iplot):
# calculate energy levels # calculate energy levels
zcodalevel = max(absz[isignal]) zcodalevel = max(absz[isignal])
encodalevel = max(absen[isignal]) encodalevel = max(absen[isignal])
# calculate threshold # calculate threshold
minsiglevel = encodalevel * zfac minsiglevel = encodalevel * zfac
@ -873,7 +890,7 @@ def checkZ4S(X, pick, zfac, checkwin, iplot):
print 'checkZ4S: Maybe S onset? Skip this P pick!' print 'checkZ4S: Maybe S onset? Skip this P pick!'
else: else:
print 'checkZ4S: P onset passes checkZ4S test!' print 'checkZ4S: P onset passes checkZ4S test!'
returnflag = 1 returnflag = 1
if iplot > 1: if iplot > 1:
te = np.arange(0, edat[0].stats.npts / edat[0].stats.sampling_rate, te = np.arange(0, edat[0].stats.npts / edat[0].stats.sampling_rate,

View File

@ -4,8 +4,9 @@ from PySide.QtCore import QThread, Signal
class WorkerThread(QThread): class WorkerThread(QThread):
message = Signal(str) message = Signal(str)
def __init__(self, func, data, param): def __init__(self, parent, func, data, param):
super(WorkerThread, self).__init__() super(WorkerThread, self).__init__()
self.setParent(parent)
self.func = func self.func = func
self.data = data self.data = data
self.param = param self.param = param
@ -13,7 +14,12 @@ class WorkerThread(QThread):
def run(self): def run(self):
sys.stdout = self sys.stdout = self
self.func(self.data, self.param) picks = self.func(self.data, self.param)
try:
self.parent().addPicks(picks)
except AttributeError:
print picks
def write(self, text): def write(self, text):
self.message.emit(text) self.message.emit(text)