non-working commit of autoPyLoT functionality in overview window
This commit is contained in:
parent
120f2743d2
commit
398a25f902
38
QtPyLoT.py
38
QtPyLoT.py
@ -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:
|
||||||
|
@ -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
@ -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,
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user