WIP autopicker tuning

added default parameters and widget to show/edit them
This commit is contained in:
Marcel Paffrath 2017-05-10 13:16:54 +02:00
parent aeaa13e277
commit 7d56e15ccf
4 changed files with 449 additions and 75 deletions

View File

@ -1 +1 @@
2991-dirty aeaa-dirty

View File

@ -0,0 +1,363 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
defaults = {'rootpath': {'type': str,
'tooltip': 'project path',
'value': ''},
'datapath': {'type': str,
'tooltip': 'data path',
'value': ''},
'database': {'type': str,
'tooltip': 'name of data base',
'value': ''},
'eventID': {'type': str,
'tooltip': 'event ID for single event processing',
'value': ''},
'invdir': {'type': str,
'tooltip': 'full path to inventory or dataless-seed file',
'value': ''},
'datastructure': {'type': str,
'tooltip': 'choose data structure',
'value': 'PILOT'},
'apverbose': {'type': bool,
'tooltip': "choose 'True' or 'False' for terminal output",
'value': True},
'nllocbin': {'type': str,
'tooltip': 'path to NLLoc executable',
'value': ''},
'nllocroot': {'type': str,
'tooltip': 'root of NLLoc-processing directory',
'value': ''},
'phasefile': {'type': str,
'tooltip': 'name of autoPyLoT-output phase file for NLLoc',
'value': 'AUTOPHASES.obs'},
'ctrfile': {'type': str,
'tooltip': 'name of autoPyLoT-output control file for NLLoc',
'value': 'Insheim_min1d2015_auto.in'},
'ttpatter': {'type': str,
'tooltip': 'pattern of NLLoc ttimes from grid',
'value': 'ttime'},
'outpatter': {'type': str,
'tooltip': 'pattern of NLLoc-output file',
'value': 'AUTOLOC_nlloc'},
'vp': {'type': float,
'tooltip': 'average P-wave velocity',
'value': 3530.},
'rho': {'type': float,
'tooltip': 'average rock density [kg/m^3]',
'value': 2500.},
'Qp': {'type': (float, float),
'tooltip': 'quality factor for P waves (Qp*f^a); list(Qp, a)',
'value': (300., 0.8)},
'focmecin': {'type': str,
'tooltip': 'name of focmec input file containing derived polarities',
'value': 'AUTOFOCMEC_AIC_HOS4_ARH.in'},
'pstart': {'type': float,
'tooltip': 'start time [s] for calculating CF for P-picking',
'value': 15.0},
'pstop': {'type': float,
'tooltip': 'end time [s] for calculating CF for P-picking',
'value': 60.0},
'sstart': {'type': float,
'tooltip': 'start time [s] relative to P-onset for calculating CF for S-picking',
'value': -1.0},
'sstop': {'type': float,
'tooltip': 'end time [s] after P-onset for calculating CF for S-picking',
'value': 10.0},
'bpz1': {'type': (float, float),
'tooltip': 'lower/upper corner freq. of first band pass filter Z-comp. [Hz]',
'value': (2, 20)},
'bpz2': {'type': (float, float),
'tooltip': 'lower/upper corner freq. of second band pass filter Z-comp. [Hz]',
'value': (2, 30)},
'bph1': {'type': (float, float),
'tooltip': 'lower/upper corner freq. of first band pass filter H-comp. [Hz]',
'value': (2, 15)},
'bph2': {'type': (float, float),
'tooltip': 'lower/upper corner freq. of second band pass filter z-comp. [Hz]',
'value': (2, 20)},
'algoP': {'type': str,
'tooltip': 'choose algorithm for P-onset determination (HOS, ARZ, or AR3)',
'value': 'HOS'},
'tlta': {'type': float,
'tooltip': 'for HOS-/AR-AIC-picker, length of LTA window [s]',
'value': 7.0},
'hosorder': {'type': int,
'tooltip': 'for HOS-picker, order of Higher Order Statistics',
'value': 4},
'Parorder': {'type': int,
'tooltip': 'for AR-picker, order of AR process of Z-component',
'value': 2},
'tdet1z': {'type': float,
'tooltip': 'for AR-picker, length of AR determination window [s] for Z-component, 1st pick',
'value': 1.2},
'tpred1z': {'type': float,
'tooltip': 'for AR-picker, length of AR prediction window [s] for Z-component, 1st pick',
'value': 0.4},
'tdet2z': {'type': float,
'tooltip': 'for AR-picker, length of AR determination window [s] for Z-component, 2nd pick',
'value': 0.6},
'tpred2z': {'type': float,
'tooltip': 'for AR-picker, length of AR prediction window [s] for Z-component, 2nd pick',
'value': 0.2},
'addnoise': {'type': float,
'tooltip': 'add noise to seismogram for stable AR prediction',
'value': 0.001},
'tsnrz': {'type': (float, float, float, float),
'tooltip': 'for HOS/AR, window lengths for SNR-and slope estimation [tnoise, tsafetey, tsignal, tslope] [s]',
'value': (3, 0.1, 0.5, 1.0)},
'pickwinP': {'type': float,
'tooltip': 'for initial AIC pick, length of P-pick window [s]',
'value': 3.0},
'Precalcwin': {'type': float,
'tooltip': 'for HOS/AR, window length [s] for recalculation of CF (relative to 1st pick)',
'value': 6.0},
'aictsmooth': {'type': float,
'tooltip': 'for HOS/AR, take average of samples for smoothing of AIC-function [s]',
'value': 0.2},
'tsmoothP': {'type': float,
'tooltip': 'for HOS/AR, take average of samples for smoothing CF [s]',
'value': 0.1},
'ausP': {'type': float,
'tooltip': 'for HOS/AR, artificial uplift of samples (aus) of CF (P)',
'value': 0.001},
'nfacP': {'type': float,
'tooltip': 'for HOS/AR, noise factor for noise level determination (P)',
'value': 1.3},
'algoS': {'type': str,
'tooltip': 'choose algorithm for S-onset determination (ARH or AR3)',
'value': 'ARH'},
'tdet1h': {'type': float,
'tooltip': 'for HOS/AR, length of AR-determination window [s], H-components, 1st pick',
'value': 0.8},
'tpred1h': {'type': float,
'tooltip': 'for HOS/AR, length of AR-prediction window [s], H-components, 1st pick',
'value': 0.4},
'tdet2h': {'type': float,
'tooltip': 'for HOS/AR, length of AR-determinaton window [s], H-components, 2nd pick',
'value': 0.6},
'tpred2h': {'type': float,
'tooltip': 'for HOS/AR, length of AR-prediction window [s], H-components, 2nd pick',
'value': 0.3},
'Sarorder': {'type': int,
'tooltip': 'for AR-picker, order of AR process of H-components',
'value': 4},
'Srecalcwin': {'type': float,
'tooltip': 'for AR-picker, window length [s] for recalculation of CF (2nd pick) (H)',
'value': 5.0},
'pickwinS': {'type': float,
'tooltip': 'for initial AIC pick, length of S-pick window [s]',
'value': 3.0},
'tsnrh': {'type': (float, float, float, float),
'tooltip': 'for ARH/AR3, window lengths for SNR-and slope estimation [tnoise, tsafetey, tsignal, tslope] [s]',
'value': (2, 0.2, 1.5, 0.5)},
'aictsmoothS': {'type': float,
'tooltip': 'for AIC-picker, take average of samples for smoothing of AIC-function [s]',
'value': 0.5},
'tsmoothS': {'type': float,
'tooltip': 'for AR-picker, take average of samples for smoothing CF [s] (S)',
'value': 0.7},
'ausS': {'type': float,
'tooltip': 'for HOS/AR, artificial uplift of samples (aus) of CF (S)',
'value': 0.9},
'nfacS': {'type': float,
'tooltip': 'for AR-picker, noise factor for noise level determination (S)',
'value': 1.5},
'minfmweight': {'type': int,
'tooltip': 'minimum required P weight for first-motion determination',
'value': 1},
'minFMSNR': {'type': float,
'tooltip': 'miniumum required SNR for first-motion determination',
'value': 2.},
'fmpickwin': {'type': float,
'tooltip': 'pick window around P onset for calculating zero crossings',
'value': 0.2},
'timeerrorsP': {'type': (float, float, float, float),
'tooltip': 'discrete time errors [s] corresponding to picking weights [0 1 2 3] for P',
'value': (0.01, 0.02, 0.04, 0.08)},
'timeerrorsS': {'type': (float, float, float, float),
'tooltip': 'discrete time errors [s] corresponding to picking weights [0 1 2 3] for S',
'value': (0.04, 0.08, 0.16, 0.32)},
'minAICPslope': {'type': float,
'tooltip': 'below this slope [counts/s] the initial P pick is rejected',
'value': 0.8},
'minAICPSNR': {'type': float,
'tooltip': 'below this SNR the initial P pick is rejected',
'value': 1.1},
'minAICSslope': {'type': float,
'tooltip': 'below this slope [counts/s] the initial S pick is rejected',
'value': 1.},
'minAICSSNR': {'type': float,
'tooltip': 'below this SNR the initial S pick is rejected',
'value': 1.5},
'minsiglength': {'type': float,
'tooltip': 'length of signal part for which amplitudes must exceed noiselevel [s]',
'value': 1.},
'noisefactor': {'type': float,
'tooltip': 'noiselevel*noisefactor=threshold',
'value': 1.0},
'minpercent': {'type': float,
'tooltip': 'required percentage of amplitudes exceeding threshold',
'value': 10.},
'zfac': {'type': float,
'tooltip': 'P-amplitude must exceed at least zfac times RMS-S amplitude',
'value': 1.5},
'mdttolerance': {'type': float,
'tooltip': 'maximum allowed deviation of P picks from median [s]',
'value': 6.0},
'wdttolerance': {'type': float,
'tooltip': 'maximum allowed deviation from Wadati-diagram',
'value': 1.0}
}
settings_main={
'dirs':[
'rootpath',
'datapath',
'database',
'eventID',
'invdir',
'datastructure',
'apverbose'],
'nlloc':[
'nllocbin',
'nllocroot',
'phasefile',
'ctrfile',
'ttpatter',
'outpatter'],
'smoment':[
'vp',
'rho',
'Qp'],
'focmec':[
'focmecin'],
'pick':[
'pstart',
'pstop',
'sstart',
'sstop',
'bpz1',
'bpz2',
'bph1',
'bph2']
}
settings_special_pick={
'z':[
'algoP',
'tlta',
'hosorder',
'Parorder',
'tdet1z',
'tpred1z',
'tdet2z',
'tpred2z',
'addnoise',
'tsnrz',
'pickwinP',
'Precalcwin',
'aictsmooth',
'tsmoothP',
'ausP',
'nfacP'],
'h':[
'algoS',
'tdet1h',
'tpred1h',
'tdet2h',
'tpred2h',
'Sarorder',
'Srecalcwin',
'pickwinS',
'tsnrh',
'aictsmoothS',
'tsmoothS',
'ausS',
'nfacS'],
'fm':[
'minfmweight',
'minFMSNR',
'fmpickwin'],
'quality':[
'timeerrorsP',
'timeerrorsS',
'minAICPslope',
'minAICPSNR',
'minAICSslope',
'minAICSSNR',
'minsiglength',
'noisefactor',
'minpercent',
'zfac',
'mdttolerance',
'wdttolerance']
}

View File

@ -109,10 +109,6 @@ class AutoPickParameter(object):
def __init_subsettings(self): def __init_subsettings(self):
self._settings_main=default_parameters.settings_main self._settings_main=default_parameters.settings_main
self._settings_nlloc=default_parameters.settings_nlloc
self._settings_smoment=default_parameters.settings_smoment
self._settings_focmec=default_parameters.settings_focmec
self._settings_common_pick=default_parameters.settings_common_pick
self._settings_special_pick=default_parameters.settings_special_pick self._settings_special_pick=default_parameters.settings_special_pick
# String representation of the object # String representation of the object
@ -168,45 +164,32 @@ class AutoPickParameter(object):
def get_main_para_names(self): def get_main_para_names(self):
return self._settings_main return self._settings_main
def get_nlloc_para_names(self): def get_special_para_names(self):
return self._settings_nlloc
def get_seis_moment_para_names(self):
return self._settings_smoment
def get_focmec_para_names(self):
return self._settings_focmec
def get_common_pick_names(self):
return self._settings_common_pick
def get_special_pick_names(self):
return self._settings_special_pick return self._settings_special_pick
def get_all_para_names(self):
all_names=[]
all_names += self.get_main_para_names()['dirs']
all_names += self.get_main_para_names()['nlloc']
all_names += self.get_main_para_names()['smoment']
all_names += self.get_main_para_names()['focmec']
all_names += self.get_main_para_names()['pick']
all_names += self.get_special_para_names()['z']
all_names += self.get_special_para_names()['h']
all_names += self.get_special_para_names()['fm']
all_names += self.get_special_para_names()['quality']
return all_names
def checkValue(self, param, value):
is_type = type(value)
expect_type = self.get_defaults()[param]['type']
if not is_type == expect_type and not is_type == tuple:
message = 'Type check failed for param: {}, is type: {}, expected type:{}'
message = message.format(param, is_type, expect_type)
raise TypeError(message)
# main_settings = parameter[:8] def setParam(self, param, value):
# main_settings self.__setitem__(param, value)
# paramter[8]
# parameter[8]
# parameter[8:14]
# nlloc_settings = parameter[8:14]
# len(nlloc_settings)
# sm_settings = parameter[14:17]
# sm_settings
# fmec_settings = parmeter[17]
# fmec_settings = parameter[17]
# fmec_settings
# common_picker_settings = parameter[18:26]
# common_picker_settings
# special_picker_settings = parameter[18:]
def setParam(self, **kwargs):
for param, value in kwargs.items():
self.__setitem__(param, value)
# print(self)
@staticmethod @staticmethod
def _printParameterError(errmsg): def _printParameterError(errmsg):

View File

@ -1589,12 +1589,12 @@ class AutoPickParaBox(QtGui.QWidget):
self.tabs = QtGui.QTabWidget() self.tabs = QtGui.QTabWidget()
self.layout = QtGui.QHBoxLayout() self.layout = QtGui.QHBoxLayout()
self.layout.addWidget(self.tabs) self.layout.addWidget(self.tabs)
self.boxes = {}
self.setLayout(self.layout) self.setLayout(self.layout)
self.add_main_parameters_tab() self.add_main_parameters_tab()
self.add_special_pick_parameters_tab() self.add_special_pick_parameters_tab()
def init_boxes(self, parameter_names, defaults=True): def init_boxes(self, parameter_names, defaults=True):
self.boxes = {}
grid = QtGui.QGridLayout() grid = QtGui.QGridLayout()
for index1, name in enumerate(parameter_names): for index1, name in enumerate(parameter_names):
@ -1603,7 +1603,7 @@ class AutoPickParaBox(QtGui.QWidget):
default_item = self.ap.get_defaults()[name] default_item = self.ap.get_defaults()[name]
tooltip = default_item['tooltip'] tooltip = default_item['tooltip']
tooltip += ' | type: {}'.format(default_item['type']) tooltip += ' | type: {}'.format(default_item['type'])
if type(default_item['type']) == str: if not type(default_item['type']) == tuple:
if defaults: if defaults:
value = default_item['value'] value = default_item['value']
typ = default_item['type'] typ = default_item['type']
@ -1624,21 +1624,22 @@ class AutoPickParaBox(QtGui.QWidget):
return grid return grid
def create_box(self, value, typ, tooltip): def create_box(self, value, typ, tooltip):
if typ == 'str': if typ == str:
box = QtGui.QLineEdit() box = QtGui.QLineEdit()
box.setText(value) box.setText(value)
elif typ == 'float': elif typ == float:
box = QtGui.QDoubleSpinBox()
box.setMaximum(100*value)
box.setValue(value)
elif typ == int:
box = QtGui.QSpinBox() box = QtGui.QSpinBox()
box.setMaximum(100*value) box.setMaximum(100*value)
box.setValue(value) box.setValue(value)
elif typ == 'int': elif typ == bool:
box = QtGui.QSpinBox()
box.setMaximum(100*value)
box.setValue(value)
elif typ == 'bool':
box = QtGui.QCheckBox() box = QtGui.QCheckBox()
box.setChecked(value) box.setChecked(value)
#box.setToolTip(tooltip) else:
raise TypeError('Unrecognized type {}'.format(typ))
return box return box
def create_multi_box(self, boxes): def create_multi_box(self, boxes):
@ -1660,29 +1661,33 @@ class AutoPickParaBox(QtGui.QWidget):
self.tabs.addTab(scrollA, name) self.tabs.addTab(scrollA, name)
def add_main_parameters_tab(self): def add_main_parameters_tab(self):
vb_layout = QtGui.QVBoxLayout() vb_layout = QtGui.QVBoxLayout()
vb_layout.addWidget(self.gen_headline('Directories')) self.add_to_layout(vb_layout, 'Directories',
vb_layout.addLayout(self.init_boxes(self.ap.get_main_para_names())) self.ap.get_main_para_names()['dirs'])
vb_layout.addWidget(self.gen_h_seperator()) self.add_to_layout(vb_layout, 'NLLoc',
self.ap.get_main_para_names()['nlloc'])
vb_layout.addWidget(self.gen_headline('NLLoc')) self.add_to_layout(vb_layout, 'Seismic Moment',
vb_layout.addLayout(self.init_boxes(self.ap.get_nlloc_para_names())) self.ap.get_main_para_names()['smoment'])
vb_layout.addWidget(self.gen_h_seperator()) self.add_to_layout(vb_layout, 'Focal Mechanism',
self.ap.get_main_para_names()['focmec'])
vb_layout.addWidget(self.gen_headline('Seismic Moment')) self.add_to_layout(vb_layout, 'Pick Settings',
vb_layout.addLayout(self.init_boxes(self.ap.get_seis_moment_para_names())) self.ap.get_main_para_names()['pick'],
vb_layout.addWidget(self.gen_h_seperator()) False)
vb_layout.addWidget(self.gen_headline('Focal Mechanism'))
vb_layout.addLayout(self.init_boxes(self.ap.get_focmec_para_names()))
vb_layout.addWidget(self.gen_h_seperator())
vb_layout.addWidget(self.gen_headline('Pick Settings'))
vb_layout.addLayout(self.init_boxes(self.ap.get_common_pick_names()))
self.add_tab(vb_layout, 'Main Settings') self.add_tab(vb_layout, 'Main Settings')
def add_special_pick_parameters_tab(self):
vb_layout = QtGui.QVBoxLayout()
self.add_to_layout(vb_layout, 'Z-component',
self.ap.get_special_para_names()['z'])
self.add_to_layout(vb_layout, 'H-components',
self.ap.get_special_para_names()['h'])
self.add_to_layout(vb_layout, 'First-motion picker',
self.ap.get_special_para_names()['fm'])
self.add_to_layout(vb_layout, 'Quality assessment',
self.ap.get_special_para_names()['quality'],
False)
self.add_tab(vb_layout, 'Advanced Settings')
def gen_h_seperator(self): def gen_h_seperator(self):
seperator = QtGui.QFrame() seperator = QtGui.QFrame()
seperator.setFrameShape(QtGui.QFrame.HLine) seperator.setFrameShape(QtGui.QFrame.HLine)
@ -1695,9 +1700,32 @@ class AutoPickParaBox(QtGui.QWidget):
label.setFont(font) label.setFont(font)
return label return label
def add_special_pick_parameters_tab(self): def add_to_layout(self, layout, name, items, seperator=True):
grid = self.init_boxes(self.ap.get_special_pick_names()) layout.addWidget(self.gen_headline(name))
self.add_tab(grid, 'Advanced Settings') layout.addLayout(self.init_boxes(items))
if seperator:
layout.addWidget(self.gen_h_seperator())
def update_params(self):
for param in self.ap.get_all_para_names():
box = self.boxes[param]
value = self.getValue(box)
self.ap.checkValue(param, value)
self.ap.setParam(param, value)
def getValue(self, box):
if type(box) == QtGui.QLineEdit:
value = str(box.text())
elif type(box) == QtGui.QSpinBox or type(box) == QtGui.QDoubleSpinBox:
value = box.value()
elif type(box) == QtGui.QCheckBox:
value = box.isChecked()
elif type(box) == list:
value = []
for b in box:
value.append(self.getValue(b))
value = tuple(value)
return value
class ParametersTab(PropTab): class ParametersTab(PropTab):