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

This commit is contained in:
Marcel Paffrath 2015-11-24 12:38:16 +01:00
commit a2eb5868a7
4 changed files with 144 additions and 39 deletions

View File

@ -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!")
########################################################## ##########################################################

View File

@ -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

View File

@ -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

View File

@ -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):