From 8ee075c2b13bb28f2d54b889e4cc3e5ce85eb59f Mon Sep 17 00:00:00 2001 From: Marcel Paffrath Date: Thu, 14 Jul 2016 13:59:52 +0200 Subject: [PATCH] added SNR modification/plot --- pylot/core/active/ActiveSeismoPick3D_GUI.py | 58 ++++++++++++- pylot/core/active/asp3d_layout.py | 2 +- pylot/core/active/fmtomo_parameters_layout.py | 2 +- .../core/active/generate_seisarray_layout.py | 2 +- pylot/core/active/generate_survey_layout.py | 9 +- .../active/generate_survey_layout_minimal.py | 2 +- .../core/active/picking_parameters_layout.py | 86 ++++++++++++++++--- pylot/core/active/surveyUtils.py | 13 +-- pylot/core/active/vtk_tools_layout.py | 2 +- 9 files changed, 148 insertions(+), 28 deletions(-) diff --git a/pylot/core/active/ActiveSeismoPick3D_GUI.py b/pylot/core/active/ActiveSeismoPick3D_GUI.py index 01449aec..f68360a6 100755 --- a/pylot/core/active/ActiveSeismoPick3D_GUI.py +++ b/pylot/core/active/ActiveSeismoPick3D_GUI.py @@ -110,8 +110,7 @@ class gui_control(object): self.initNewSurvey() def initNewSurvey(self): - self.survey.setArtificialPick(0, 0) # artificial pick at source origin - surveyUtils.setDynamicFittedSNR(self.survey.getShotDict()) + self.survey.setArtificialPick(0, 0) # artificial pick at source origin self.setSurveyState(True) self.setPickState(False) @@ -147,7 +146,9 @@ class gui_control(object): self.survey = activeSeismoPick.Survey(obsdir, srcfile, recfile, useDefaultParas = True, fstart = fstart, fend = fend) - self.setConnected2SurveyState(False) + self.setConnected2SurveyState(True) + self.seisarray = self.survey.seisarray + self.setSeisArrayState(True) return True def addArrayPlot(self): @@ -313,11 +314,15 @@ class gui_control(object): self.printSeisArrayTextbox(init = False) def getPickParameters(self, ui, Picking_parameters): + self.initDynSNRplot() + self.plotDynSNR() + if Picking_parameters.exec_(): ncores = int(ui.ncores.value()) vmin = float(ui.lineEdit_vmin.text()) vmax = float(ui.lineEdit_vmax.text()) folm = float(ui.slider_folm.value())/100. + print('folm =', folm) AIC = ui.checkBox_AIC.isChecked() aicwindow = (int(ui.lineEdit_aicleft.text()), int(ui.lineEdit_aicright.text())) return ncores, vmin, vmax, folm, AIC, aicwindow @@ -358,6 +363,10 @@ class gui_control(object): ui.ncores.setMaximum(self.getMaxCPU()) self.picker_ui = ui QtCore.QObject.connect(self.picker_ui.slider_folm, QtCore.SIGNAL("valueChanged(int)"), self.refreshFolm) + QtCore.QObject.connect(self.picker_ui.shift_snr, QtCore.SIGNAL("valueChanged(int)"), self.plotDynSNR) + QtCore.QObject.connect(self.picker_ui.shift_dist, QtCore.SIGNAL("valueChanged(int)"), self.plotDynSNR) + QtCore.QObject.connect(self.picker_ui.p1, QtCore.SIGNAL("valueChanged(double)"), self.plotDynSNR) + QtCore.QObject.connect(self.picker_ui.p2, QtCore.SIGNAL("valueChanged(double)"), self.plotDynSNR) try: ncores, vmin, vmax, folm, AIC, aicwindow = self.getPickParameters(ui, Picking_parameters) except TypeError: @@ -368,12 +377,55 @@ class gui_control(object): else: HosAic = 'hos' + shiftSNR = float(self.picker_ui.shift_snr.value()) + shiftDist = float(self.picker_ui.shift_dist.value()) + p1 = float(self.picker_ui.p1.value()) + p2 = float(self.picker_ui.p2.value()) + + surveyUtils.setDynamicFittedSNR(self.survey.getShotDict(), shiftdist = shiftDist, + shiftSNR = shiftSNR, p1 = p1, p2 = p2) + self.survey.pickAllShots(vmin = vmin, vmax = vmax, folm = folm, HosAic = HosAic, aicwindow = aicwindow, cores = ncores) + QtGui.qApp.processEvents() # test self.setPickState(True) self.printSurveyTextbox(init = False) + def plotDynSNR(self): + fig = self.snrFig + fig.clear() + ax = fig.add_subplot(111) + snrthresholds = [] + dists_p = []; snr_p = [] + shiftSNR = float(self.picker_ui.shift_snr.value()) + shiftDist = float(self.picker_ui.shift_dist.value()) + p1 = float(self.picker_ui.p1.value()) + p2 = float(self.picker_ui.p2.value()) + dists = range(200) + if self.checkPickState(): + for shot in self.survey.data.values(): + for traceID in shot.getTraceIDlist(): + dists_p.append(shot.getDistance(traceID)) + snr_p.append(shot.getSNR(traceID)[0]) + + ax.scatter(dists_p, snr_p, s = 0.5, c='k') + + for dist in dists: + dist += shiftDist + snrthresholds.append(surveyUtils.snr_fit_func(surveyUtils.get_fit_fn(p1, p2), dist, shiftSNR)) + ax.plot(dists, snrthresholds) + ax.set_xlabel('Distance [m]') + ax.set_ylabel('SNR') + self.snrCanvas.draw() + + def initDynSNRplot(self): + self.snrFig = Figure() + self.snrCanvas = FigureCanvas(self.snrFig) + self.picker_ui.vlayout_plot.addWidget(self.snrCanvas) + self.snrToolbar = NavigationToolbar(self.snrCanvas, self.mainwindow) + self.picker_ui.vlayout_plot.addWidget(self.snrToolbar) + def startFMTOMO(self): if not self.checkSurveyState(): self.printDialogMessage('No Survey defined.') diff --git a/pylot/core/active/asp3d_layout.py b/pylot/core/active/asp3d_layout.py index 3392a068..8854e998 100644 --- a/pylot/core/active/asp3d_layout.py +++ b/pylot/core/active/asp3d_layout.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'asp3d_layout.ui' # -# Created: Tue Jul 12 21:41:12 2016 +# Created: Thu Jul 14 13:36:37 2016 # by: pyside-uic 0.2.15 running on PySide 1.2.2 # # WARNING! All changes made in this file will be lost! diff --git a/pylot/core/active/fmtomo_parameters_layout.py b/pylot/core/active/fmtomo_parameters_layout.py index 04f4ad60..285bac94 100644 --- a/pylot/core/active/fmtomo_parameters_layout.py +++ b/pylot/core/active/fmtomo_parameters_layout.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'fmtomo_parameters_layout.ui' # -# Created: Tue Jul 12 21:41:12 2016 +# Created: Thu Jul 14 13:36:37 2016 # by: pyside-uic 0.2.15 running on PySide 1.2.2 # # WARNING! All changes made in this file will be lost! diff --git a/pylot/core/active/generate_seisarray_layout.py b/pylot/core/active/generate_seisarray_layout.py index 98320874..10c297d1 100644 --- a/pylot/core/active/generate_seisarray_layout.py +++ b/pylot/core/active/generate_seisarray_layout.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'generate_seisarray_layout.ui' # -# Created: Tue Jul 12 21:41:13 2016 +# Created: Thu Jul 14 13:36:38 2016 # by: pyside-uic 0.2.15 running on PySide 1.2.2 # # WARNING! All changes made in this file will be lost! diff --git a/pylot/core/active/generate_survey_layout.py b/pylot/core/active/generate_survey_layout.py index f33fe9d7..69591b1e 100644 --- a/pylot/core/active/generate_survey_layout.py +++ b/pylot/core/active/generate_survey_layout.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'generate_survey_layout.ui' # -# Created: Tue Jul 12 21:41:13 2016 +# Created: Thu Jul 14 13:36:38 2016 # by: pyside-uic 0.2.15 running on PySide 1.2.2 # # WARNING! All changes made in this file will be lost! @@ -12,7 +12,7 @@ from PySide import QtCore, QtGui class Ui_generate_survey(object): def setupUi(self, generate_survey): generate_survey.setObjectName("generate_survey") - generate_survey.resize(382, 211) + generate_survey.resize(382, 220) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("../asp3d_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) generate_survey.setWindowIcon(icon) @@ -50,6 +50,11 @@ class Ui_generate_survey(object): self.verticalLayout_2.addLayout(self.gridLayout) self.verticalLayout = QtGui.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") + self.line_2 = QtGui.QFrame(generate_survey) + self.line_2.setFrameShape(QtGui.QFrame.HLine) + self.line_2.setFrameShadow(QtGui.QFrame.Sunken) + self.line_2.setObjectName("line_2") + self.verticalLayout.addWidget(self.line_2) self.label = QtGui.QLabel(generate_survey) self.label.setObjectName("label") self.verticalLayout.addWidget(self.label) diff --git a/pylot/core/active/generate_survey_layout_minimal.py b/pylot/core/active/generate_survey_layout_minimal.py index 1c87cfa8..90956e2a 100644 --- a/pylot/core/active/generate_survey_layout_minimal.py +++ b/pylot/core/active/generate_survey_layout_minimal.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'generate_survey_layout_minimal.ui' # -# Created: Tue Jul 12 21:41:13 2016 +# Created: Thu Jul 14 13:36:38 2016 # by: pyside-uic 0.2.15 running on PySide 1.2.2 # # WARNING! All changes made in this file will be lost! diff --git a/pylot/core/active/picking_parameters_layout.py b/pylot/core/active/picking_parameters_layout.py index 12a41274..7bedfa94 100644 --- a/pylot/core/active/picking_parameters_layout.py +++ b/pylot/core/active/picking_parameters_layout.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'picking_parameters_layout.ui' # -# Created: Tue Jul 12 21:41:13 2016 +# Created: Thu Jul 14 13:36:38 2016 # by: pyside-uic 0.2.15 running on PySide 1.2.2 # # WARNING! All changes made in this file will be lost! @@ -12,10 +12,10 @@ from PySide import QtCore, QtGui class Ui_picking_parameters(object): def setupUi(self, picking_parameters): picking_parameters.setObjectName("picking_parameters") - picking_parameters.resize(321, 254) - picking_parameters.setMinimumSize(QtCore.QSize(0, 0)) - self.verticalLayout_3 = QtGui.QVBoxLayout(picking_parameters) - self.verticalLayout_3.setObjectName("verticalLayout_3") + picking_parameters.resize(400, 550) + picking_parameters.setMinimumSize(QtCore.QSize(0, 550)) + self.verticalLayout_4 = QtGui.QVBoxLayout(picking_parameters) + self.verticalLayout_4.setObjectName("verticalLayout_4") self.label_7 = QtGui.QLabel(picking_parameters) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) @@ -28,7 +28,7 @@ class Ui_picking_parameters(object): font.setBold(True) self.label_7.setFont(font) self.label_7.setObjectName("label_7") - self.verticalLayout_3.addWidget(self.label_7) + self.verticalLayout_4.addWidget(self.label_7) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.label = QtGui.QLabel(picking_parameters) @@ -45,7 +45,7 @@ class Ui_picking_parameters(object): self.ncores.setMaximum(10000) self.ncores.setObjectName("ncores") self.horizontalLayout.addWidget(self.ncores) - self.verticalLayout_3.addLayout(self.horizontalLayout) + self.verticalLayout_4.addLayout(self.horizontalLayout) self.horizontalLayout_3 = QtGui.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.verticalLayout_2 = QtGui.QVBoxLayout() @@ -78,7 +78,7 @@ class Ui_picking_parameters(object): self.lineEdit_vmax.setObjectName("lineEdit_vmax") self.verticalLayout.addWidget(self.lineEdit_vmax) self.horizontalLayout_3.addLayout(self.verticalLayout) - self.verticalLayout_3.addLayout(self.horizontalLayout_3) + self.verticalLayout_4.addLayout(self.horizontalLayout_3) self.horizontalLayout_4 = QtGui.QHBoxLayout() self.horizontalLayout_4.setObjectName("horizontalLayout_4") self.label_4 = QtGui.QLabel(picking_parameters) @@ -110,7 +110,7 @@ class Ui_picking_parameters(object): self.label_folm.setObjectName("label_folm") self.horizontalLayout_2.addWidget(self.label_folm) self.horizontalLayout_4.addLayout(self.horizontalLayout_2) - self.verticalLayout_3.addLayout(self.horizontalLayout_4) + self.verticalLayout_4.addLayout(self.horizontalLayout_4) self.horizontalLayout_5 = QtGui.QHBoxLayout() self.horizontalLayout_5.setObjectName("horizontalLayout_5") self.label_5 = QtGui.QLabel(picking_parameters) @@ -126,7 +126,7 @@ class Ui_picking_parameters(object): self.checkBox_AIC.setChecked(True) self.checkBox_AIC.setObjectName("checkBox_AIC") self.horizontalLayout_5.addWidget(self.checkBox_AIC) - self.verticalLayout_3.addLayout(self.horizontalLayout_5) + self.verticalLayout_4.addLayout(self.horizontalLayout_5) self.horizontalLayout_6 = QtGui.QHBoxLayout() self.horizontalLayout_6.setObjectName("horizontalLayout_6") self.label_6 = QtGui.QLabel(picking_parameters) @@ -148,12 +148,67 @@ class Ui_picking_parameters(object): self.lineEdit_aicright.setObjectName("lineEdit_aicright") self.horizontalLayout_7.addWidget(self.lineEdit_aicright) self.horizontalLayout_6.addLayout(self.horizontalLayout_7) - self.verticalLayout_3.addLayout(self.horizontalLayout_6) + self.verticalLayout_4.addLayout(self.horizontalLayout_6) + self.verticalLayout_snr = QtGui.QVBoxLayout() + self.verticalLayout_snr.setObjectName("verticalLayout_snr") + self.line = QtGui.QFrame(picking_parameters) + self.line.setFrameShape(QtGui.QFrame.HLine) + self.line.setFrameShadow(QtGui.QFrame.Sunken) + self.line.setObjectName("line") + self.verticalLayout_snr.addWidget(self.line) + self.label_8 = QtGui.QLabel(picking_parameters) + self.label_8.setObjectName("label_8") + self.verticalLayout_snr.addWidget(self.label_8) + self.gridLayout_2 = QtGui.QGridLayout() + self.gridLayout_2.setObjectName("gridLayout_2") + self.label_9 = QtGui.QLabel(picking_parameters) + self.label_9.setObjectName("label_9") + self.gridLayout_2.addWidget(self.label_9, 1, 0, 1, 1) + self.label_10 = QtGui.QLabel(picking_parameters) + self.label_10.setObjectName("label_10") + self.gridLayout_2.addWidget(self.label_10, 2, 0, 1, 1) + self.p1 = QtGui.QDoubleSpinBox(picking_parameters) + self.p1.setDecimals(6) + self.p1.setMinimum(-100.0) + self.p1.setMaximum(100.0) + self.p1.setSingleStep(0.0001) + self.p1.setProperty("value", 0.004) + self.p1.setObjectName("p1") + self.gridLayout_2.addWidget(self.p1, 2, 1, 1, 1) + self.label_11 = QtGui.QLabel(picking_parameters) + self.label_11.setObjectName("label_11") + self.gridLayout_2.addWidget(self.label_11, 1, 2, 1, 1) + self.label_12 = QtGui.QLabel(picking_parameters) + self.label_12.setObjectName("label_12") + self.gridLayout_2.addWidget(self.label_12, 2, 2, 1, 1) + self.p2 = QtGui.QDoubleSpinBox(picking_parameters) + self.p2.setDecimals(6) + self.p2.setMinimum(-100.0) + self.p2.setMaximum(100.0) + self.p2.setSingleStep(0.0001) + self.p2.setProperty("value", -0.0007) + self.p2.setObjectName("p2") + self.gridLayout_2.addWidget(self.p2, 2, 3, 1, 1) + self.shift_dist = QtGui.QSpinBox(picking_parameters) + self.shift_dist.setMaximum(10000) + self.shift_dist.setProperty("value", 30) + self.shift_dist.setObjectName("shift_dist") + self.gridLayout_2.addWidget(self.shift_dist, 1, 1, 1, 1) + self.shift_snr = QtGui.QSpinBox(picking_parameters) + self.shift_snr.setMaximum(10000) + self.shift_snr.setProperty("value", 100) + self.shift_snr.setObjectName("shift_snr") + self.gridLayout_2.addWidget(self.shift_snr, 1, 3, 1, 1) + self.verticalLayout_snr.addLayout(self.gridLayout_2) + self.verticalLayout_4.addLayout(self.verticalLayout_snr) + self.vlayout_plot = QtGui.QVBoxLayout() + self.vlayout_plot.setObjectName("vlayout_plot") + self.verticalLayout_4.addLayout(self.vlayout_plot) self.buttonBox = QtGui.QDialogButtonBox(picking_parameters) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName("buttonBox") - self.verticalLayout_3.addWidget(self.buttonBox) + self.verticalLayout_4.addWidget(self.buttonBox) self.retranslateUi(picking_parameters) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), picking_parameters.accept) @@ -167,7 +222,7 @@ class Ui_picking_parameters(object): self.label.setText(QtGui.QApplication.translate("picking_parameters", "nproc [?]", None, QtGui.QApplication.UnicodeUTF8)) self.label_2.setToolTip(QtGui.QApplication.translate("picking_parameters", "Minimum permitted direct velocity (apparent velocity!).", None, QtGui.QApplication.UnicodeUTF8)) self.label_2.setText(QtGui.QApplication.translate("picking_parameters", "vmin [m/s] [?]", None, QtGui.QApplication.UnicodeUTF8)) - self.lineEdit_vmin.setText(QtGui.QApplication.translate("picking_parameters", "333", None, QtGui.QApplication.UnicodeUTF8)) + self.lineEdit_vmin.setText(QtGui.QApplication.translate("picking_parameters", "100", None, QtGui.QApplication.UnicodeUTF8)) self.label_3.setToolTip(QtGui.QApplication.translate("picking_parameters", "Maximum permitted direct velocity (apparent velocity!).", None, QtGui.QApplication.UnicodeUTF8)) self.label_3.setText(QtGui.QApplication.translate("picking_parameters", "vmax [m/s] [?]", None, QtGui.QApplication.UnicodeUTF8)) self.lineEdit_vmax.setText(QtGui.QApplication.translate("picking_parameters", "5000", None, QtGui.QApplication.UnicodeUTF8)) @@ -181,4 +236,9 @@ class Ui_picking_parameters(object): "(only if AIC checked)", None, QtGui.QApplication.UnicodeUTF8)) self.lineEdit_aicleft.setText(QtGui.QApplication.translate("picking_parameters", "15", None, QtGui.QApplication.UnicodeUTF8)) self.lineEdit_aicright.setText(QtGui.QApplication.translate("picking_parameters", "0", None, QtGui.QApplication.UnicodeUTF8)) + self.label_8.setText(QtGui.QApplication.translate("picking_parameters", "SNR threshold (advanced)", None, QtGui.QApplication.UnicodeUTF8)) + self.label_9.setText(QtGui.QApplication.translate("picking_parameters", "Shift distance", None, QtGui.QApplication.UnicodeUTF8)) + self.label_10.setText(QtGui.QApplication.translate("picking_parameters", "p1", None, QtGui.QApplication.UnicodeUTF8)) + self.label_11.setText(QtGui.QApplication.translate("picking_parameters", "Shift SNR", None, QtGui.QApplication.UnicodeUTF8)) + self.label_12.setText(QtGui.QApplication.translate("picking_parameters", "p2", None, QtGui.QApplication.UnicodeUTF8)) diff --git a/pylot/core/active/surveyUtils.py b/pylot/core/active/surveyUtils.py index 0cc22b1b..27cb6e01 100644 --- a/pylot/core/active/surveyUtils.py +++ b/pylot/core/active/surveyUtils.py @@ -1,5 +1,5 @@ from __future__ import print_function - +import numpy as np def readParameters(parfile, parameter): """ @@ -90,10 +90,9 @@ def setDynamicFittedSNR(shot_dict, shiftdist=30, shiftSNR=100, p1=0.004, p2=-0.0 :type p2: float :return: """ - import numpy as np minSNR = 2.5 # fit_fn = fitSNR4dist(shot_dict) - fit_fn = np.poly1d([p1, p2]) + fit_fn = get_fit_fn(p1, p2) for shot in shot_dict.values(): for traceID in shot.getTraceIDlist(): ### IMPROVE dist = shot.getDistance(traceID) + shiftdist @@ -104,13 +103,17 @@ def setDynamicFittedSNR(shot_dict, shiftdist=30, shiftSNR=100, p1=0.004, p2=-0.0 shot.setSNRthreshold(traceID, minSNR) else: shot.setSNRthreshold(traceID, snrthreshold) - print("setDynamicFittedSNR: Finished setting of fitted SNR-threshold") + print("setDynamicFittedSNR: Finished setting of fitted SNR-threshold.\n" + "Parameters: ShiftDist = %s, ShiftSNR = %s, p1 = %s, p2 = %s" + %(shiftdist, shiftSNR, p1, p2)) def snr_fit_func(fit_fn, dist, shiftSNR): - import numpy as np snrthreshold = (1 / (fit_fn(dist) ** 2)) - shiftSNR * np.exp(-0.05 * dist) return snrthreshold +def get_fit_fn(p1, p2): + return np.poly1d([p1, p2]) + def setConstantSNR(shot_dict, snrthreshold=2.5): """ Set a constant SNR value to all Seismicshots in a dictionary (e.g. survey.getShotDict()). diff --git a/pylot/core/active/vtk_tools_layout.py b/pylot/core/active/vtk_tools_layout.py index 49ae3cd0..b7bcf57c 100644 --- a/pylot/core/active/vtk_tools_layout.py +++ b/pylot/core/active/vtk_tools_layout.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'vtk_tools_layout.ui' # -# Created: Tue Jul 12 21:41:13 2016 +# Created: Thu Jul 14 13:36:38 2016 # by: pyside-uic 0.2.15 running on PySide 1.2.2 # # WARNING! All changes made in this file will be lost!