Merge branch 'develop' of ariadne.geophysik.ruhr-uni-bochum.de:/data/git/pylot into develop
This commit is contained in:
commit
a2eb5868a7
67
autoPyLoT.py
67
autoPyLoT.py
@ -133,14 +133,32 @@ def autoPyLoT(inputfile):
|
|||||||
else:
|
else:
|
||||||
# get theoretical P-onset times from NLLoc-location file
|
# get theoretical P-onset times from NLLoc-location file
|
||||||
locsearch = '%s/loc/%s.????????.??????.grid?.loc.hyp' % (nllocroot, nllocout)
|
locsearch = '%s/loc/%s.????????.??????.grid?.loc.hyp' % (nllocroot, nllocout)
|
||||||
# get latest file if several are available
|
maxnumit = 3 # maximum number of iterations
|
||||||
nllocfile = max(glob.glob(locsearch), key=os.path.getctime)
|
if len(glob.glob(locsearch)) > 0:
|
||||||
if os.path.isfile(nllocfile):
|
# get latest file if several are available
|
||||||
picks = iteratepicker(wfdat, nllocfile, picks, badpicks, parameter)
|
nllocfile = max(glob.glob(locsearch), key=os.path.getctime)
|
||||||
# write phases to NLLoc-phase file
|
nlloccounter = 0
|
||||||
picksExport(picks, 'NLLoc', phasefile)
|
while len(badpicks) > 0 and nlloccounter <= maxnumit:
|
||||||
# locate the event
|
nlloccounter += 1
|
||||||
locate(nlloccall, ctrfile)
|
if nlloccounter > maxnumit:
|
||||||
|
print("autoPyLoT: Number of maximum iterations reached, stop iterative picking!")
|
||||||
|
break
|
||||||
|
print("autoPyLoT: Starting with iteration No. %d ..." % nlloccounter)
|
||||||
|
picks = iteratepicker(wfdat, nllocfile, picks, badpicks, parameter)
|
||||||
|
# write phases to NLLoc-phase file
|
||||||
|
picksExport(picks, 'NLLoc', phasefile)
|
||||||
|
# locate the event
|
||||||
|
locate(nlloccall, ctrfile)
|
||||||
|
print("autoPyLoT: Iteration No. %d finished." % nlloccounter)
|
||||||
|
badpicks = []
|
||||||
|
for key in picks:
|
||||||
|
if picks[key]['P']['weight'] >= 4 or picks[key]['S']['weight'] >= 4:
|
||||||
|
badpicks.append([key, picks[key]['P']['mpp']])
|
||||||
|
print("autoPyLoT: After iteration No. %d: %d bad onsets found ..." % (nlloccounter, \
|
||||||
|
len(badpicks)))
|
||||||
|
if len(badpicks) == 0:
|
||||||
|
print("autoPyLoT: No more bad onsets found, stop iterative picking!")
|
||||||
|
break
|
||||||
else:
|
else:
|
||||||
print("autoPyLoT: No NLLoc-location file available! Stop iteration!")
|
print("autoPyLoT: No NLLoc-location file available! Stop iteration!")
|
||||||
##########################################################
|
##########################################################
|
||||||
@ -195,14 +213,33 @@ def autoPyLoT(inputfile):
|
|||||||
else:
|
else:
|
||||||
# get theoretical P-onset times from NLLoc-location file
|
# get theoretical P-onset times from NLLoc-location file
|
||||||
locsearch = '%s/loc/%s.????????.??????.grid?.loc.hyp' % (nllocroot, nllocout)
|
locsearch = '%s/loc/%s.????????.??????.grid?.loc.hyp' % (nllocroot, nllocout)
|
||||||
# get latest file if several are available
|
|
||||||
nllocfile = max(glob.glob(locsearch), key=os.path.getctime)
|
nllocfile = max(glob.glob(locsearch), key=os.path.getctime)
|
||||||
if os.path.isfile(nllocfile):
|
maxnumit = 3 # maximum number of iterations
|
||||||
picks = iteratepicker(wfdat, nllocfile, picks, badpicks, parameter)
|
if len(glob.glob(locsearch)) > 0:
|
||||||
# write phases to NLLoc-phase file
|
# get latest file if several are available
|
||||||
picksExport(picks, 'NLLoc', phasefile)
|
nllocfile = max(glob.glob(locsearch), key=os.path.getctime)
|
||||||
# locate the event
|
nlloccounter = 0
|
||||||
locate(nlloccall, ctrfile)
|
while len(badpicks) > 0 and nlloccounter <= maxnumit:
|
||||||
|
nlloccounter += 1
|
||||||
|
if nlloccounter > maxnumit:
|
||||||
|
print("autoPyLoT: Number of maximum iterations reached, stop iterative picking!")
|
||||||
|
break
|
||||||
|
print("autoPyLoT: Starting with iteration No. %d ..." % nlloccounter)
|
||||||
|
picks = iteratepicker(wfdat, nllocfile, picks, badpicks, parameter)
|
||||||
|
# write phases to NLLoc-phase file
|
||||||
|
picksExport(picks, 'NLLoc', phasefile)
|
||||||
|
# locate the event
|
||||||
|
locate(nlloccall, ctrfile)
|
||||||
|
print("autoPyLoT: Iteration No. %d finished." % nlloccounter)
|
||||||
|
badpicks = []
|
||||||
|
for key in picks:
|
||||||
|
if picks[key]['P']['weight'] >= 4 or picks[key]['S']['weight'] >= 4:
|
||||||
|
badpicks.append([key, picks[key]['P']['mpp']])
|
||||||
|
print("autoPyLoT: After iteration No. %d: %d bad onsets found ..." % (nlloccounter, \
|
||||||
|
len(badpicks)))
|
||||||
|
if len(badpicks) == 0:
|
||||||
|
print("autoPyLoT: No more bad onsets found, stop iterative picking!")
|
||||||
|
break
|
||||||
else:
|
else:
|
||||||
print("autoPyLoT: No NLLoc-location file available! Stop iteration!")
|
print("autoPyLoT: No NLLoc-location file available! Stop iteration!")
|
||||||
##########################################################
|
##########################################################
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
#main settings#
|
#main settings#
|
||||||
/DATA/Insheim #rootpath# %project path
|
/DATA/Insheim #rootpath# %project path
|
||||||
EVENT_DATA/LOCAL #datapath# %data path
|
EVENT_DATA/LOCAL #datapath# %data path
|
||||||
2013.02_Insheim #database# %name of data base
|
2015.10_Insheim #database# %name of data base
|
||||||
e0019.048.13 #eventID# %event ID for single event processing
|
e0011.280.15 #eventID# %event ID for single event processing
|
||||||
/DATA/Insheim/STAT_INFO #invdir# %full path to inventory or dataless-seed file
|
/DATA/Insheim/STAT_INFO #invdir# %full path to inventory or dataless-seed file
|
||||||
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
|
||||||
@ -39,10 +39,10 @@ AUTOFOCMEC_AIC_HOS4_ARH.in #focmecin# %name of focmec input file co
|
|||||||
300 #Qp# %quality factor for P waves
|
300 #Qp# %quality factor for P waves
|
||||||
100 #Qs# %quality factor for S waves
|
100 #Qs# %quality factor for S waves
|
||||||
#common settings picker#
|
#common settings picker#
|
||||||
15 #pstart# %start time [s] for calculating CF for P-picking
|
15.0 #pstart# %start time [s] for calculating CF for P-picking
|
||||||
60 #pstop# %end time [s] for calculating CF for P-picking
|
60.0 #pstop# %end time [s] for calculating CF for P-picking
|
||||||
-1.0 #sstart# %start time [s] relative to P-onset for calculating CF for S-picking
|
-1.0 #sstart# %start time [s] relative to P-onset for calculating CF for S-picking
|
||||||
7 #sstop# %end time [s] after P-onset for calculating CF for S-picking
|
12.0 #sstop# %end time [s] after P-onset for calculating CF for S-picking
|
||||||
2 20 #bpz1# %lower/upper corner freq. of first band pass filter Z-comp. [Hz]
|
2 20 #bpz1# %lower/upper corner freq. of first band pass filter Z-comp. [Hz]
|
||||||
2 30 #bpz2# %lower/upper corner freq. of second band pass filter Z-comp. [Hz]
|
2 30 #bpz2# %lower/upper corner freq. of second band pass filter Z-comp. [Hz]
|
||||||
2 15 #bph1# %lower/upper corner freq. of first band pass filter H-comp. [Hz]
|
2 15 #bph1# %lower/upper corner freq. of first band pass filter H-comp. [Hz]
|
||||||
@ -95,8 +95,8 @@ ARH #algoS# %choose algorithm for S-onset
|
|||||||
3 #minAICSslope# %below this slope [counts/s] the initial S pick is rejected
|
3 #minAICSslope# %below this slope [counts/s] the initial S pick is rejected
|
||||||
1.5 #minAICSSNR# %below this SNR the initial S pick is rejected
|
1.5 #minAICSSNR# %below this SNR the initial S pick is rejected
|
||||||
#check duration of signal using envelope function#
|
#check duration of signal using envelope function#
|
||||||
5 #minsiglength# %minimum required length of signal [s]
|
4 #minsiglength# %minimum required length of signal [s]
|
||||||
1.8 #noisefactor# %noiselevel*noisefactor=threshold
|
1.5 #noisefactor# %noiselevel*noisefactor=threshold
|
||||||
50 #minpercent# %required percentage of samples higher than threshold
|
50 #minpercent# %required percentage of samples higher than threshold
|
||||||
#check for spuriously picked S-onsets#
|
#check for spuriously picked S-onsets#
|
||||||
2.0 #zfac# %P-amplitude must exceed at least zfac times RMS-S amplitude
|
2.0 #zfac# %P-amplitude must exceed at least zfac times RMS-S amplitude
|
||||||
|
@ -800,6 +800,7 @@ def autopickstation(wfstream, pickparam):
|
|||||||
|
|
||||||
return picks
|
return picks
|
||||||
|
|
||||||
|
|
||||||
def iteratepicker(wf, NLLocfile, picks, badpicks, pickparameter):
|
def iteratepicker(wf, NLLocfile, picks, badpicks, pickparameter):
|
||||||
'''
|
'''
|
||||||
Repicking of bad onsets. Uses theoretical onset times from NLLoc-location file.
|
Repicking of bad onsets. Uses theoretical onset times from NLLoc-location file.
|
||||||
@ -816,8 +817,8 @@ def iteratepicker(wf, NLLocfile, picks, badpicks, pickparameter):
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
print("#######################################################")
|
print("#######################################################")
|
||||||
print("autoPyLoT: Found bad onsets at station(s) %s, starting re-picking them ...") \
|
print("autoPyLoT: Found %d bad onsets at station(s) %s, starting re-picking them ...") \
|
||||||
% badpicks
|
% (len(badpicks), badpicks)
|
||||||
|
|
||||||
newpicks = {}
|
newpicks = {}
|
||||||
for i in range(0, len(badpicks)):
|
for i in range(0, len(badpicks)):
|
||||||
@ -838,19 +839,28 @@ def iteratepicker(wf, NLLocfile, picks, badpicks, pickparameter):
|
|||||||
# modify some picking parameters
|
# modify some picking parameters
|
||||||
pstart_old = pickparameter.getParam('pstart')
|
pstart_old = pickparameter.getParam('pstart')
|
||||||
pstop_old = pickparameter.getParam('pstop')
|
pstop_old = pickparameter.getParam('pstop')
|
||||||
|
sstop_old = pickparameter.getParam('sstop')
|
||||||
pickwinP_old = pickparameter.getParam('pickwinP')
|
pickwinP_old = pickparameter.getParam('pickwinP')
|
||||||
Precalcwin_old = pickparameter.getParam('Precalcwin')
|
Precalcwin_old = pickparameter.getParam('Precalcwin')
|
||||||
|
noisefactor_old = pickparameter.getParam('noisefactor')
|
||||||
|
zfac_old = pickparameter.getParam('zfac')
|
||||||
pickparameter.setParam(pstart=badpicks[i][1] - wf2pick[0].stats.starttime \
|
pickparameter.setParam(pstart=badpicks[i][1] - wf2pick[0].stats.starttime \
|
||||||
- pickparameter.getParam('tlta'))
|
- pickparameter.getParam('tlta'))
|
||||||
pickparameter.setParam(pstop=pickparameter.getParam('pstart') + \
|
pickparameter.setParam(pstop=pickparameter.getParam('pstart') + \
|
||||||
(3 * pickparameter.getParam('tlta')))
|
(3 * pickparameter.getParam('tlta')))
|
||||||
|
pickparameter.setParam(sstop=pickparameter.getParam('sstop') / 2)
|
||||||
pickparameter.setParam(pickwinP=pickparameter.getParam('pickwinP') / 2)
|
pickparameter.setParam(pickwinP=pickparameter.getParam('pickwinP') / 2)
|
||||||
pickparameter.setParam(Precalcwin=pickparameter.getParam('Precalcwin') / 2)
|
pickparameter.setParam(Precalcwin=pickparameter.getParam('Precalcwin') / 2)
|
||||||
|
pickparameter.setParam(noisefactor=1.0)
|
||||||
|
pickparameter.setParam(zfac=1.0)
|
||||||
print("iteratepicker: The following picking parameters have been modified for iterative picking:")
|
print("iteratepicker: The following picking parameters have been modified for iterative picking:")
|
||||||
print("pstart: %fs => %fs" % (pstart_old, pickparameter.getParam('pstart')))
|
print("pstart: %fs => %fs" % (pstart_old, pickparameter.getParam('pstart')))
|
||||||
print("pstop: %fs => %fs" % (pstop_old, pickparameter.getParam('pstop')))
|
print("pstop: %fs => %fs" % (pstop_old, pickparameter.getParam('pstop')))
|
||||||
|
print("sstop: %fs => %fs" % (sstop_old, pickparameter.getParam('sstop')))
|
||||||
print("pickwinP: %fs => %fs" % (pickwinP_old, pickparameter.getParam('pickwinP')))
|
print("pickwinP: %fs => %fs" % (pickwinP_old, pickparameter.getParam('pickwinP')))
|
||||||
print("Precalcwin: %fs => %fs" % (Precalcwin_old, pickparameter.getParam('Precalcwin')))
|
print("Precalcwin: %fs => %fs" % (Precalcwin_old, pickparameter.getParam('Precalcwin')))
|
||||||
|
print("noisefactor: %f => %f" % (noisefactor_old, pickparameter.getParam('noisefactor')))
|
||||||
|
print("zfac: %f => %f" % (zfac_old, pickparameter.getParam('zfac')))
|
||||||
|
|
||||||
# repick station
|
# repick station
|
||||||
newpicks = autopickstation(wf2pick, pickparameter)
|
newpicks = autopickstation(wf2pick, pickparameter)
|
||||||
@ -858,12 +868,15 @@ def iteratepicker(wf, NLLocfile, picks, badpicks, pickparameter):
|
|||||||
# replace old dictionary with new one
|
# replace old dictionary with new one
|
||||||
picks[badpicks[i][0]] = newpicks
|
picks[badpicks[i][0]] = newpicks
|
||||||
|
|
||||||
# reset temporary change of picking parameters
|
# reset temporary change of picking parameters
|
||||||
print("iteratepicker: Resetting picking parameters ...")
|
print("iteratepicker: Resetting picking parameters ...")
|
||||||
pickparameter.setParam(pstart=pstart_old)
|
pickparameter.setParam(pstart=pstart_old)
|
||||||
pickparameter.setParam(pstop=pstop_old)
|
pickparameter.setParam(pstop=pstop_old)
|
||||||
pickparameter.setParam(pickwinP=pickwinP_old)
|
pickparameter.setParam(sstop=sstop_old)
|
||||||
pickparameter.setParam(Precalcwin=Precalcwin_old)
|
pickparameter.setParam(pickwinP=pickwinP_old)
|
||||||
|
pickparameter.setParam(Precalcwin=Precalcwin_old)
|
||||||
|
pickparameter.setParam(noisefactor=noisefactor_old)
|
||||||
|
pickparameter.setParam(zfac=zfac_old)
|
||||||
|
|
||||||
return picks
|
return picks
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ 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
|
QTabWidget, QToolBar, QVBoxLayout, QWidget, QPushButton, QFileDialog
|
||||||
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
|
||||||
@ -789,6 +789,7 @@ class PropertiesDlg(QDialog):
|
|||||||
self.tabWidget.addTab(OutputsTab(self), "Outputs")
|
self.tabWidget.addTab(OutputsTab(self), "Outputs")
|
||||||
self.tabWidget.addTab(PhasesTab(self), "Phases")
|
self.tabWidget.addTab(PhasesTab(self), "Phases")
|
||||||
self.tabWidget.addTab(GraphicsTab(self), "Graphics")
|
self.tabWidget.addTab(GraphicsTab(self), "Graphics")
|
||||||
|
self.tabWidget.addTab(LocalisationTab(self), "Loc Tools")
|
||||||
self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok |
|
self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok |
|
||||||
QDialogButtonBox.Apply |
|
QDialogButtonBox.Apply |
|
||||||
QDialogButtonBox.Close)
|
QDialogButtonBox.Close)
|
||||||
@ -842,10 +843,14 @@ class InputsTab(PropTab):
|
|||||||
|
|
||||||
# get the full name of the actual user
|
# get the full name of the actual user
|
||||||
self.fullNameEdit = QLineEdit()
|
self.fullNameEdit = QLineEdit()
|
||||||
self.fullNameEdit.setText(fulluser)
|
try:
|
||||||
|
self.fullNameEdit.setText(fulluser)
|
||||||
|
except TypeError as e:
|
||||||
|
self.fullNameEdit.setText(fulluser[0])
|
||||||
|
|
||||||
# information about data structure
|
# information about data structure
|
||||||
dataroot = settings.value("data/dataRoot")
|
dataroot = settings.value("data/dataRoot")
|
||||||
|
curstructure = settings.value("data/Structure")
|
||||||
dataDirLabel = QLabel("data root directory: ")
|
dataDirLabel = QLabel("data root directory: ")
|
||||||
self.dataDirEdit = QLineEdit()
|
self.dataDirEdit = QLineEdit()
|
||||||
self.dataDirEdit.setText(dataroot)
|
self.dataDirEdit.setText(dataroot)
|
||||||
@ -857,6 +862,10 @@ class InputsTab(PropTab):
|
|||||||
|
|
||||||
self.structureSelect.addItems(DATASTRUCTURE.keys())
|
self.structureSelect.addItems(DATASTRUCTURE.keys())
|
||||||
|
|
||||||
|
dsind = findComboBoxIndex(self.structureSelect, curstructure)
|
||||||
|
|
||||||
|
self.structureSelect.setCurrentIndex(dsind)
|
||||||
|
|
||||||
layout = QGridLayout()
|
layout = QGridLayout()
|
||||||
layout.addWidget(dataDirLabel, 0, 0)
|
layout.addWidget(dataDirLabel, 0, 0)
|
||||||
layout.addWidget(self.dataDirEdit, 0, 1)
|
layout.addWidget(self.dataDirEdit, 0, 1)
|
||||||
@ -930,13 +939,59 @@ class LocalisationTab(PropTab):
|
|||||||
|
|
||||||
self.locToolComboBox.setCurrentIndex(toolind)
|
self.locToolComboBox.setCurrentIndex(toolind)
|
||||||
|
|
||||||
|
curroot = settings.value("%s/rootPath".format(curtool), None)
|
||||||
|
curbin = settings.value("%s/binPath".format(curtool), None)
|
||||||
|
|
||||||
curroot = settings.value("loc/tool", None)
|
self.rootlabel = QLabel("root directory")
|
||||||
|
self.binlabel = QLabel("bin directory")
|
||||||
|
|
||||||
|
self.rootedit = QLineEdit('')
|
||||||
|
self.binedit = QLineEdit('')
|
||||||
|
|
||||||
|
if curroot is not None:
|
||||||
|
self.rootedit.setText(curroot)
|
||||||
|
if curbin is not None:
|
||||||
|
self.binedit.setText(curbin)
|
||||||
|
|
||||||
|
rootBrowse = QPushButton('...', self)
|
||||||
|
rootBrowse.clicked.connect(lambda: self.selectDirectory(self.rootedit))
|
||||||
|
|
||||||
|
binBrowse = QPushButton('...', self)
|
||||||
|
binBrowse.clicked.connect(lambda: self.selectDirectory(self.binedit))
|
||||||
|
|
||||||
|
self.locToolComboBox.currentIndexChanged.connect(self.updateUi)
|
||||||
|
|
||||||
|
self.updateUi()
|
||||||
|
|
||||||
|
layout = QGridLayout()
|
||||||
|
layout.addWidget(loctoollabel, 0, 0)
|
||||||
|
layout.addWidget(self.locToolComboBox, 0, 1)
|
||||||
|
layout.addWidget(self.rootlabel, 1, 0)
|
||||||
|
layout.addWidget(self.rootedit, 1, 1)
|
||||||
|
layout.addWidget(rootBrowse, 1, 2)
|
||||||
|
layout.addWidget(self.binlabel, 2, 0)
|
||||||
|
layout.addWidget(self.binedit, 2, 1)
|
||||||
|
layout.addWidget(binBrowse, 2, 2)
|
||||||
|
|
||||||
|
self.setLayout(layout)
|
||||||
|
|
||||||
|
def updateUi(self):
|
||||||
|
curtool = self.locToolComboBox.currentText()
|
||||||
if curtool is not None:
|
if curtool is not None:
|
||||||
rootlabel = QLabel("{0} root dircetory".format(curtool))
|
self.rootlabel.setText("{0} root directory".format(curtool))
|
||||||
else:
|
self.binlabel.setText("{0} bin directory".format(curtool))
|
||||||
rootlabel = QLabel("root dircetory")
|
|
||||||
rootlabel.setDisabled()
|
def selectDirectory(self, edit):
|
||||||
|
selected_directory = QFileDialog.getExistingDirectory()
|
||||||
|
edit.setText(selected_directory)
|
||||||
|
|
||||||
|
def getValues(self):
|
||||||
|
loctool = self.locToolComboBox.currentText()
|
||||||
|
values = {"%s/rootPath".format(loctool): self.rootedit.text(),
|
||||||
|
"%s/binPath".format(loctool): self.binedit.text(),
|
||||||
|
"loc/tool": loctool}
|
||||||
|
return values
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class NewEventDlg(QDialog):
|
class NewEventDlg(QDialog):
|
||||||
|
Loading…
Reference in New Issue
Block a user