Merge branch 'develop' of ariadne.geophysik.ruhr-uni-bochum.de:/data/git/pylot into develop
Conflicts: pylot/core/util/utils.py
This commit is contained in:
		
						commit
						7921d12c80
					
				@ -9,7 +9,7 @@ matplotlib.rcParams['backend.qt4']='PySide'
 | 
			
		||||
from PySide import QtCore, QtGui
 | 
			
		||||
from pylot.core.active import activeSeismoPick, surveyUtils, fmtomoUtils, seismicArrayPreparation
 | 
			
		||||
from pylot.core.active.gui.asp3d_layout import *
 | 
			
		||||
from pylot.core.active.gui.windows import Gen_SeisArray, Gen_Survey_from_SA, Gen_Survey_from_SR, Call_autopicker, Call_FMTOMO, Call_VTK_dialog
 | 
			
		||||
from pylot.core.active.gui.windows import Gen_SeisArray, Gen_Survey_from_SA, Gen_Survey_from_SR, Call_autopicker, Call_FMTOMO, Call_VTK_dialog, Postprocessing
 | 
			
		||||
from pylot.core.active.gui.windows import openFile, saveFile, browseDir, getMaxCPU
 | 
			
		||||
 | 
			
		||||
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
 | 
			
		||||
@ -43,6 +43,7 @@ class gui_control(object):
 | 
			
		||||
        self.autopicker = None
 | 
			
		||||
        self.fmtomo = None
 | 
			
		||||
        self.vtktools = None
 | 
			
		||||
        self.postprocessing = None
 | 
			
		||||
 | 
			
		||||
    def setInitStates(self):
 | 
			
		||||
        self.setPickState(False)
 | 
			
		||||
@ -362,8 +363,9 @@ class gui_control(object):
 | 
			
		||||
        if not self.checkSurveyState():
 | 
			
		||||
            self.printDialogMessage('No Survey defined.')
 | 
			
		||||
            return
 | 
			
		||||
        self.survey.plotAllPicks()
 | 
			
		||||
        self.refreshPickedWidgets() # wait until finished
 | 
			
		||||
        self.postprocessing = Postprocessing(self.mainwindow, self.survey)
 | 
			
		||||
        #self.survey.plotAllPicks()
 | 
			
		||||
        #self.refreshPickedWidgets() # wait until finished
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
    def load_survey(self):
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,7 @@
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
import math
 | 
			
		||||
import numpy as np
 | 
			
		||||
from pylot.core.active import seismicshot
 | 
			
		||||
from pylot.core.active.surveyUtils import cleanUp
 | 
			
		||||
@ -672,10 +673,29 @@ class Survey(object):
 | 
			
		||||
        '''
 | 
			
		||||
 | 
			
		||||
        import matplotlib.pyplot as plt
 | 
			
		||||
        import math
 | 
			
		||||
        plt.interactive(True)
 | 
			
		||||
        from pylot.core.active.surveyPlotTools import regions
 | 
			
		||||
 | 
			
		||||
        dist, pick, snrlog, pickerror, spe = self.preparePlotAllPicks(plotRemoved)
 | 
			
		||||
        
 | 
			
		||||
        color = {'log10SNR': snrlog,
 | 
			
		||||
                 'pickerror': pickerror,
 | 
			
		||||
                 'spe': spe}
 | 
			
		||||
        self.color = color
 | 
			
		||||
        if refreshPlot is False:
 | 
			
		||||
            ax, cbar, sc = self.createPlot(dist, pick, color[colorByVal],
 | 
			
		||||
                                       label='%s' % colorByVal)
 | 
			
		||||
            region = regions(ax, cbar, self)
 | 
			
		||||
            ax.legend()
 | 
			
		||||
            return (ax, region)
 | 
			
		||||
        if refreshPlot is True:
 | 
			
		||||
            ax, cbar, sc = self.createPlot(dist, pick, color[colorByVal],
 | 
			
		||||
                                       label='%s' % colorByVal, ax=ax,
 | 
			
		||||
                                       cbar=cbar)
 | 
			
		||||
            ax.legend()
 | 
			
		||||
            return ax
 | 
			
		||||
 | 
			
		||||
    def preparePlotAllPicks(self, plotRemoved = False):
 | 
			
		||||
        dist = []
 | 
			
		||||
        pick = []
 | 
			
		||||
        snrlog = []
 | 
			
		||||
@ -693,29 +713,15 @@ class Survey(object):
 | 
			
		||||
                        pickerror.append(shot.getPickError(traceID))
 | 
			
		||||
                        spe.append(shot.getSymmetricPickError(traceID))
 | 
			
		||||
 | 
			
		||||
        color = {'log10SNR': snrlog,
 | 
			
		||||
                 'pickerror': pickerror,
 | 
			
		||||
                 'spe': spe}
 | 
			
		||||
        self.color = color
 | 
			
		||||
        if refreshPlot is False:
 | 
			
		||||
            ax, cbar = self.createPlot(dist, pick, color[colorByVal],
 | 
			
		||||
                                       label='%s' % colorByVal)
 | 
			
		||||
            region = regions(ax, cbar, self)
 | 
			
		||||
            ax.legend()
 | 
			
		||||
            return (ax, region)
 | 
			
		||||
        if refreshPlot is True:
 | 
			
		||||
            ax, cbar = self.createPlot(dist, pick, color[colorByVal],
 | 
			
		||||
                                       label='%s' % colorByVal, ax=ax,
 | 
			
		||||
                                       cbar=cbar)
 | 
			
		||||
            ax.legend()
 | 
			
		||||
            return ax
 | 
			
		||||
        return dist, pick, snrlog, pickerror, spe
 | 
			
		||||
 | 
			
		||||
                            
 | 
			
		||||
    def createPlot(self, dist, pick, inkByVal, label, ax=None, cbar=None):
 | 
			
		||||
        '''
 | 
			
		||||
        Used by plotAllPicks.
 | 
			
		||||
        '''
 | 
			
		||||
        import matplotlib.pyplot as plt
 | 
			
		||||
        plt.interactive(True)
 | 
			
		||||
        #plt.interactive(True)
 | 
			
		||||
        cm = plt.cm.jet
 | 
			
		||||
        if ax is None:
 | 
			
		||||
            print('Generating new plot...')
 | 
			
		||||
@ -723,7 +729,7 @@ class Survey(object):
 | 
			
		||||
            ax = fig.add_subplot(111)
 | 
			
		||||
            sc = ax.scatter(dist, pick, cmap=cm, c=inkByVal, s=5,
 | 
			
		||||
                            edgecolors='none', label=label)
 | 
			
		||||
            cbar = plt.colorbar(sc, fraction=0.05)
 | 
			
		||||
            cbar = fig.colorbar(sc, fraction=0.05)
 | 
			
		||||
            cbar.set_label(label)
 | 
			
		||||
            ax.set_xlabel('Distance [m]')
 | 
			
		||||
            ax.set_ylabel('Time [s]')
 | 
			
		||||
@ -732,14 +738,16 @@ class Survey(object):
 | 
			
		||||
        else:
 | 
			
		||||
            sc = ax.scatter(dist, pick, cmap=cm, c=inkByVal, s=5,
 | 
			
		||||
                            edgecolors='none', label=label)
 | 
			
		||||
            cbar = plt.colorbar(sc, cax=cbar.ax)
 | 
			
		||||
            cbar.set_label(label)
 | 
			
		||||
            if cbar is not None:
 | 
			
		||||
                cbar.ax.clear()
 | 
			
		||||
                cbar = ax.figure.colorbar(sc, cax=cbar.ax)
 | 
			
		||||
                cbar.set_label(label)
 | 
			
		||||
            ax.set_xlabel('Distance [m]')
 | 
			
		||||
            ax.set_ylabel('Time [s]')
 | 
			
		||||
            ax.text(0.5, 0.95, 'Plot of all picks', transform=ax.transAxes,
 | 
			
		||||
                    horizontalalignment='center')
 | 
			
		||||
        return (ax, cbar)
 | 
			
		||||
 | 
			
		||||
        return ax, cbar, sc
 | 
			
		||||
    
 | 
			
		||||
    def _update_progress(self, shotname, tend, progress):
 | 
			
		||||
        sys.stdout.write(
 | 
			
		||||
            'Working on shot %s. ETC is %02d:%02d:%02d [%2.2f %%]\r' % (
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
# Form implementation generated from reading ui file 'asp3d_layout.ui'
 | 
			
		||||
#
 | 
			
		||||
# Created: Thu Aug  4 13:55:47 2016
 | 
			
		||||
# Created: Wed Aug 10 14:11:07 2016
 | 
			
		||||
#      by: pyside-uic 0.2.15 running on PySide 1.2.2
 | 
			
		||||
#
 | 
			
		||||
# WARNING! All changes made in this file will be lost!
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
# Form implementation generated from reading ui file 'fmtomo_parameters_layout.ui'
 | 
			
		||||
#
 | 
			
		||||
# Created: Thu Aug  4 13:55:47 2016
 | 
			
		||||
# Created: Wed Aug 10 14:11:07 2016
 | 
			
		||||
#      by: pyside-uic 0.2.15 running on PySide 1.2.2
 | 
			
		||||
#
 | 
			
		||||
# WARNING! All changes made in this file will be lost!
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
# Form implementation generated from reading ui file 'generate_seisarray_layout.ui'
 | 
			
		||||
#
 | 
			
		||||
# Created: Thu Aug  4 13:55:47 2016
 | 
			
		||||
# Created: Wed Aug 10 14:11:07 2016
 | 
			
		||||
#      by: pyside-uic 0.2.15 running on PySide 1.2.2
 | 
			
		||||
#
 | 
			
		||||
# WARNING! All changes made in this file will be lost!
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
# Form implementation generated from reading ui file 'generate_survey_layout.ui'
 | 
			
		||||
#
 | 
			
		||||
# Created: Thu Aug  4 13:55:47 2016
 | 
			
		||||
# Created: Wed Aug 10 14:11:07 2016
 | 
			
		||||
#      by: pyside-uic 0.2.15 running on PySide 1.2.2
 | 
			
		||||
#
 | 
			
		||||
# WARNING! All changes made in this file will be lost!
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
# Form implementation generated from reading ui file 'generate_survey_layout_minimal.ui'
 | 
			
		||||
#
 | 
			
		||||
# Created: Thu Aug  4 13:55:47 2016
 | 
			
		||||
# Created: Wed Aug 10 14:11:07 2016
 | 
			
		||||
#      by: pyside-uic 0.2.15 running on PySide 1.2.2
 | 
			
		||||
#
 | 
			
		||||
# WARNING! All changes made in this file will be lost!
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
# Form implementation generated from reading ui file 'picking_parameters_layout.ui'
 | 
			
		||||
#
 | 
			
		||||
# Created: Thu Aug  4 13:55:47 2016
 | 
			
		||||
# Created: Wed Aug 10 14:11:07 2016
 | 
			
		||||
#      by: pyside-uic 0.2.15 running on PySide 1.2.2
 | 
			
		||||
#
 | 
			
		||||
# WARNING! All changes made in this file will be lost!
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
# Form implementation generated from reading ui file 'postprocessing_layout.ui'
 | 
			
		||||
#
 | 
			
		||||
# Created: Tue Aug  9 10:36:58 2016
 | 
			
		||||
# Created: Wed Aug 10 14:11:08 2016
 | 
			
		||||
#      by: pyside-uic 0.2.15 running on PySide 1.2.2
 | 
			
		||||
#
 | 
			
		||||
# WARNING! All changes made in this file will be lost!
 | 
			
		||||
@ -12,34 +12,13 @@ from PySide import QtCore, QtGui
 | 
			
		||||
class Ui_postprocessing(object):
 | 
			
		||||
    def setupUi(self, postprocessing):
 | 
			
		||||
        postprocessing.setObjectName("postprocessing")
 | 
			
		||||
        postprocessing.resize(640, 479)
 | 
			
		||||
        self.verticalLayout_2 = QtGui.QVBoxLayout(postprocessing)
 | 
			
		||||
        self.verticalLayout_2.setObjectName("verticalLayout_2")
 | 
			
		||||
        self.verticalLayout = QtGui.QVBoxLayout()
 | 
			
		||||
        postprocessing.resize(663, 617)
 | 
			
		||||
        self.verticalLayout = QtGui.QVBoxLayout(postprocessing)
 | 
			
		||||
        self.verticalLayout.setObjectName("verticalLayout")
 | 
			
		||||
        self.gridLayout = QtGui.QGridLayout()
 | 
			
		||||
        self.gridLayout.setObjectName("gridLayout")
 | 
			
		||||
        self.horizontalLayout = QtGui.QHBoxLayout()
 | 
			
		||||
        self.horizontalLayout.setObjectName("horizontalLayout")
 | 
			
		||||
        self.pushButton_rect = QtGui.QPushButton(postprocessing)
 | 
			
		||||
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
 | 
			
		||||
        sizePolicy.setHorizontalStretch(0)
 | 
			
		||||
        sizePolicy.setVerticalStretch(0)
 | 
			
		||||
        sizePolicy.setHeightForWidth(self.pushButton_rect.sizePolicy().hasHeightForWidth())
 | 
			
		||||
        self.pushButton_rect.setSizePolicy(sizePolicy)
 | 
			
		||||
        self.pushButton_rect.setMaximumSize(QtCore.QSize(16777215, 30))
 | 
			
		||||
        self.pushButton_rect.setObjectName("pushButton_rect")
 | 
			
		||||
        self.horizontalLayout.addWidget(self.pushButton_rect)
 | 
			
		||||
        self.pushButton_poly = QtGui.QPushButton(postprocessing)
 | 
			
		||||
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
 | 
			
		||||
        sizePolicy.setHorizontalStretch(0)
 | 
			
		||||
        sizePolicy.setVerticalStretch(0)
 | 
			
		||||
        sizePolicy.setHeightForWidth(self.pushButton_poly.sizePolicy().hasHeightForWidth())
 | 
			
		||||
        self.pushButton_poly.setSizePolicy(sizePolicy)
 | 
			
		||||
        self.pushButton_poly.setMaximumSize(QtCore.QSize(16777215, 30))
 | 
			
		||||
        self.pushButton_poly.setObjectName("pushButton_poly")
 | 
			
		||||
        self.horizontalLayout.addWidget(self.pushButton_poly)
 | 
			
		||||
        self.gridLayout.addLayout(self.horizontalLayout, 1, 0, 1, 1)
 | 
			
		||||
        self.horizontalLayout_2 = QtGui.QHBoxLayout()
 | 
			
		||||
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
 | 
			
		||||
        self.verticalLayout_3 = QtGui.QVBoxLayout()
 | 
			
		||||
        self.verticalLayout_3.setObjectName("verticalLayout_3")
 | 
			
		||||
        self.label = QtGui.QLabel(postprocessing)
 | 
			
		||||
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)
 | 
			
		||||
        sizePolicy.setHorizontalStretch(0)
 | 
			
		||||
@ -49,7 +28,42 @@ class Ui_postprocessing(object):
 | 
			
		||||
        self.label.setMinimumSize(QtCore.QSize(0, 20))
 | 
			
		||||
        self.label.setMaximumSize(QtCore.QSize(16777215, 30))
 | 
			
		||||
        self.label.setObjectName("label")
 | 
			
		||||
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
 | 
			
		||||
        self.verticalLayout_3.addWidget(self.label)
 | 
			
		||||
        self.horizontalLayout_4 = QtGui.QHBoxLayout()
 | 
			
		||||
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
 | 
			
		||||
        self.pushButton_rect = QtGui.QPushButton(postprocessing)
 | 
			
		||||
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
 | 
			
		||||
        sizePolicy.setHorizontalStretch(0)
 | 
			
		||||
        sizePolicy.setVerticalStretch(0)
 | 
			
		||||
        sizePolicy.setHeightForWidth(self.pushButton_rect.sizePolicy().hasHeightForWidth())
 | 
			
		||||
        self.pushButton_rect.setSizePolicy(sizePolicy)
 | 
			
		||||
        self.pushButton_rect.setMaximumSize(QtCore.QSize(16777215, 30))
 | 
			
		||||
        self.pushButton_rect.setObjectName("pushButton_rect")
 | 
			
		||||
        self.horizontalLayout_4.addWidget(self.pushButton_rect)
 | 
			
		||||
        self.pushButton_poly = QtGui.QPushButton(postprocessing)
 | 
			
		||||
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
 | 
			
		||||
        sizePolicy.setHorizontalStretch(0)
 | 
			
		||||
        sizePolicy.setVerticalStretch(0)
 | 
			
		||||
        sizePolicy.setHeightForWidth(self.pushButton_poly.sizePolicy().hasHeightForWidth())
 | 
			
		||||
        self.pushButton_poly.setSizePolicy(sizePolicy)
 | 
			
		||||
        self.pushButton_poly.setMaximumSize(QtCore.QSize(16777215, 30))
 | 
			
		||||
        self.pushButton_poly.setObjectName("pushButton_poly")
 | 
			
		||||
        self.horizontalLayout_4.addWidget(self.pushButton_poly)
 | 
			
		||||
        self.pushButton_plot = QtGui.QPushButton(postprocessing)
 | 
			
		||||
        self.pushButton_plot.setCheckable(False)
 | 
			
		||||
        self.pushButton_plot.setDefault(False)
 | 
			
		||||
        self.pushButton_plot.setFlat(False)
 | 
			
		||||
        self.pushButton_plot.setObjectName("pushButton_plot")
 | 
			
		||||
        self.horizontalLayout_4.addWidget(self.pushButton_plot)
 | 
			
		||||
        self.verticalLayout_3.addLayout(self.horizontalLayout_4)
 | 
			
		||||
        self.horizontalLayout_2.addLayout(self.verticalLayout_3)
 | 
			
		||||
        self.line = QtGui.QFrame(postprocessing)
 | 
			
		||||
        self.line.setFrameShape(QtGui.QFrame.VLine)
 | 
			
		||||
        self.line.setFrameShadow(QtGui.QFrame.Sunken)
 | 
			
		||||
        self.line.setObjectName("line")
 | 
			
		||||
        self.horizontalLayout_2.addWidget(self.line)
 | 
			
		||||
        self.verticalLayout_2 = QtGui.QVBoxLayout()
 | 
			
		||||
        self.verticalLayout_2.setObjectName("verticalLayout_2")
 | 
			
		||||
        self.label_2 = QtGui.QLabel(postprocessing)
 | 
			
		||||
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)
 | 
			
		||||
        sizePolicy.setHorizontalStretch(0)
 | 
			
		||||
@ -59,9 +73,9 @@ class Ui_postprocessing(object):
 | 
			
		||||
        self.label_2.setMinimumSize(QtCore.QSize(0, 20))
 | 
			
		||||
        self.label_2.setMaximumSize(QtCore.QSize(16777215, 30))
 | 
			
		||||
        self.label_2.setObjectName("label_2")
 | 
			
		||||
        self.gridLayout.addWidget(self.label_2, 0, 1, 1, 1)
 | 
			
		||||
        self.horizontalLayout_3 = QtGui.QHBoxLayout()
 | 
			
		||||
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
 | 
			
		||||
        self.verticalLayout_2.addWidget(self.label_2)
 | 
			
		||||
        self.horizontalLayout_5 = QtGui.QHBoxLayout()
 | 
			
		||||
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
 | 
			
		||||
        self.pushButton_snr = QtGui.QPushButton(postprocessing)
 | 
			
		||||
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
 | 
			
		||||
        sizePolicy.setHorizontalStretch(0)
 | 
			
		||||
@ -70,7 +84,7 @@ class Ui_postprocessing(object):
 | 
			
		||||
        self.pushButton_snr.setSizePolicy(sizePolicy)
 | 
			
		||||
        self.pushButton_snr.setMaximumSize(QtCore.QSize(16777215, 30))
 | 
			
		||||
        self.pushButton_snr.setObjectName("pushButton_snr")
 | 
			
		||||
        self.horizontalLayout_3.addWidget(self.pushButton_snr)
 | 
			
		||||
        self.horizontalLayout_5.addWidget(self.pushButton_snr)
 | 
			
		||||
        self.pushButton_pe = QtGui.QPushButton(postprocessing)
 | 
			
		||||
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
 | 
			
		||||
        sizePolicy.setHorizontalStretch(0)
 | 
			
		||||
@ -79,7 +93,7 @@ class Ui_postprocessing(object):
 | 
			
		||||
        self.pushButton_pe.setSizePolicy(sizePolicy)
 | 
			
		||||
        self.pushButton_pe.setMaximumSize(QtCore.QSize(16777215, 30))
 | 
			
		||||
        self.pushButton_pe.setObjectName("pushButton_pe")
 | 
			
		||||
        self.horizontalLayout_3.addWidget(self.pushButton_pe)
 | 
			
		||||
        self.horizontalLayout_5.addWidget(self.pushButton_pe)
 | 
			
		||||
        self.pushButton_spe = QtGui.QPushButton(postprocessing)
 | 
			
		||||
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum)
 | 
			
		||||
        sizePolicy.setHorizontalStretch(0)
 | 
			
		||||
@ -88,29 +102,23 @@ class Ui_postprocessing(object):
 | 
			
		||||
        self.pushButton_spe.setSizePolicy(sizePolicy)
 | 
			
		||||
        self.pushButton_spe.setMaximumSize(QtCore.QSize(16777215, 30))
 | 
			
		||||
        self.pushButton_spe.setObjectName("pushButton_spe")
 | 
			
		||||
        self.horizontalLayout_3.addWidget(self.pushButton_spe)
 | 
			
		||||
        self.gridLayout.addLayout(self.horizontalLayout_3, 1, 1, 1, 1)
 | 
			
		||||
        self.verticalLayout.addLayout(self.gridLayout)
 | 
			
		||||
        self.horizontalLayout_plot = QtGui.QHBoxLayout()
 | 
			
		||||
        self.horizontalLayout_plot.setObjectName("horizontalLayout_plot")
 | 
			
		||||
        self.verticalLayout.addLayout(self.horizontalLayout_plot)
 | 
			
		||||
        self.verticalLayout_2.addLayout(self.verticalLayout)
 | 
			
		||||
        self.buttonBox = QtGui.QDialogButtonBox(postprocessing)
 | 
			
		||||
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
 | 
			
		||||
        self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok)
 | 
			
		||||
        self.buttonBox.setObjectName("buttonBox")
 | 
			
		||||
        self.verticalLayout_2.addWidget(self.buttonBox)
 | 
			
		||||
        self.horizontalLayout_5.addWidget(self.pushButton_spe)
 | 
			
		||||
        self.verticalLayout_2.addLayout(self.horizontalLayout_5)
 | 
			
		||||
        self.horizontalLayout_2.addLayout(self.verticalLayout_2)
 | 
			
		||||
        self.verticalLayout.addLayout(self.horizontalLayout_2)
 | 
			
		||||
        self.verticalLayout_plot = QtGui.QVBoxLayout()
 | 
			
		||||
        self.verticalLayout_plot.setObjectName("verticalLayout_plot")
 | 
			
		||||
        self.verticalLayout.addLayout(self.verticalLayout_plot)
 | 
			
		||||
 | 
			
		||||
        self.retranslateUi(postprocessing)
 | 
			
		||||
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), postprocessing.accept)
 | 
			
		||||
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), postprocessing.reject)
 | 
			
		||||
        QtCore.QMetaObject.connectSlotsByName(postprocessing)
 | 
			
		||||
 | 
			
		||||
    def retranslateUi(self, postprocessing):
 | 
			
		||||
        postprocessing.setWindowTitle(QtGui.QApplication.translate("postprocessing", "Postprocessing", None, QtGui.QApplication.UnicodeUTF8))
 | 
			
		||||
        self.label.setText(QtGui.QApplication.translate("postprocessing", "Selection", None, QtGui.QApplication.UnicodeUTF8))
 | 
			
		||||
        self.pushButton_rect.setText(QtGui.QApplication.translate("postprocessing", "Rectangle", None, QtGui.QApplication.UnicodeUTF8))
 | 
			
		||||
        self.pushButton_poly.setText(QtGui.QApplication.translate("postprocessing", "Polygon", None, QtGui.QApplication.UnicodeUTF8))
 | 
			
		||||
        self.label.setText(QtGui.QApplication.translate("postprocessing", "Selection", None, QtGui.QApplication.UnicodeUTF8))
 | 
			
		||||
        self.pushButton_plot.setText(QtGui.QApplication.translate("postprocessing", "Plot", None, QtGui.QApplication.UnicodeUTF8))
 | 
			
		||||
        self.label_2.setText(QtGui.QApplication.translate("postprocessing", "Color by", None, QtGui.QApplication.UnicodeUTF8))
 | 
			
		||||
        self.pushButton_snr.setText(QtGui.QApplication.translate("postprocessing", "SNR", None, QtGui.QApplication.UnicodeUTF8))
 | 
			
		||||
        self.pushButton_pe.setText(QtGui.QApplication.translate("postprocessing", "PE", None, QtGui.QApplication.UnicodeUTF8))
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
# Form implementation generated from reading ui file 'vtk_tools_layout.ui'
 | 
			
		||||
#
 | 
			
		||||
# Created: Thu Aug  4 13:55:47 2016
 | 
			
		||||
# Created: Wed Aug 10 14:11:07 2016
 | 
			
		||||
#      by: pyside-uic 0.2.15 running on PySide 1.2.2
 | 
			
		||||
#
 | 
			
		||||
# WARNING! All changes made in this file will be lost!
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,9 @@
 | 
			
		||||
#!/usr/bin/env python
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
import os
 | 
			
		||||
import numpy as np
 | 
			
		||||
import matplotlib
 | 
			
		||||
import matplotlib.pyplot as plt
 | 
			
		||||
from PySide import QtCore, QtGui
 | 
			
		||||
from pylot.core.active import surveyUtils, activeSeismoPick, seismicArrayPreparation, fmtomoUtils
 | 
			
		||||
from generate_survey_layout import Ui_generate_survey
 | 
			
		||||
@ -8,11 +11,11 @@ from generate_survey_layout_minimal import Ui_generate_survey_minimal
 | 
			
		||||
from generate_seisarray_layout import Ui_generate_seisarray
 | 
			
		||||
from picking_parameters_layout import Ui_picking_parameters
 | 
			
		||||
from fmtomo_parameters_layout import Ui_fmtomo_parameters
 | 
			
		||||
from pylot.core.active.gui.vtk_tools_layout import Ui_vtk_tools
 | 
			
		||||
from vtk_tools_layout import Ui_vtk_tools
 | 
			
		||||
from postprocessing_layout import Ui_postprocessing
 | 
			
		||||
 | 
			
		||||
from pylot.core.active.surveyPlotTools import regions
 | 
			
		||||
 | 
			
		||||
import numpy as np
 | 
			
		||||
import matplotlib
 | 
			
		||||
matplotlib.use('Qt4Agg')
 | 
			
		||||
matplotlib.rcParams['backend.qt4']='PySide'
 | 
			
		||||
 | 
			
		||||
@ -597,3 +600,88 @@ class Call_VTK_dialog(object):
 | 
			
		||||
    def newFileVTK(self):
 | 
			
		||||
        self.ui.lineEdit_vgout.setText(saveFile())
 | 
			
		||||
 | 
			
		||||
class Postprocessing(object):
 | 
			
		||||
    def __init__(self, mainwindow, survey):
 | 
			
		||||
        self.mainwindow = mainwindow
 | 
			
		||||
        self.survey = survey
 | 
			
		||||
        self.init_widget()
 | 
			
		||||
        self.start_widget()
 | 
			
		||||
        
 | 
			
		||||
    def init_widget(self):
 | 
			
		||||
        qwidget = QtGui.QWidget()#
 | 
			
		||||
        ui = Ui_postprocessing()
 | 
			
		||||
        ui.setupUi(qwidget)
 | 
			
		||||
        self.ui = ui
 | 
			
		||||
        self.qwidget = qwidget
 | 
			
		||||
        self.initPlot()
 | 
			
		||||
        self.newPlot()
 | 
			
		||||
        self.connectButtons()
 | 
			
		||||
        self.region = regions(self.ax, self.cbar, self.survey, qt_interface = True)
 | 
			
		||||
        
 | 
			
		||||
    def start_widget(self):
 | 
			
		||||
        self.qwidget.show()
 | 
			
		||||
 | 
			
		||||
    def initPlot(self):
 | 
			
		||||
        self.figure = Figure()
 | 
			
		||||
        self.canvas = FigureCanvas(self.figure)
 | 
			
		||||
        self.ui.verticalLayout_plot.addWidget(self.canvas)
 | 
			
		||||
        self.toolbar = NavigationToolbar(self.canvas, self.mainwindow)
 | 
			
		||||
        self.ui.verticalLayout_plot.addWidget(self.toolbar)
 | 
			
		||||
        
 | 
			
		||||
    def newPlot(self):
 | 
			
		||||
        ax = self.figure.add_subplot(111)
 | 
			
		||||
        dists, picks, snrlog, pe, spe = self.survey.preparePlotAllPicks(plotRemoved = False)
 | 
			
		||||
        self.dists = dists
 | 
			
		||||
        self.picks = picks
 | 
			
		||||
        self.inkDict = {'snrlog': snrlog,
 | 
			
		||||
                        'pe': pe,
 | 
			
		||||
                        'spe': spe}
 | 
			
		||||
                   
 | 
			
		||||
        ax, cbar, sc = self.survey.createPlot(dists, picks, snrlog, 'log10(SNR)', ax = ax, cbar = None)
 | 
			
		||||
        self.cbar = self.figure.colorbar(sc, ax = ax, fraction=0.05)
 | 
			
		||||
        self.ax = ax
 | 
			
		||||
        self.draw()
 | 
			
		||||
 | 
			
		||||
    def refreshPlot(self, inkByVal = 'snrlog'):
 | 
			
		||||
        self.ax.clear()
 | 
			
		||||
        ax = self.ax
 | 
			
		||||
        ax, cbar, sc = self.survey.createPlot(self.dists, self.picks, self.inkDict[inkByVal],
 | 
			
		||||
                                              inkByVal, ax = ax, cbar = self.cbar)
 | 
			
		||||
        #self.cbar = self.figure.colorbar(sc, fraction=0.05)
 | 
			
		||||
        self.draw()
 | 
			
		||||
        
 | 
			
		||||
    def update_survey(self, survey):
 | 
			
		||||
        self.survey = survey
 | 
			
		||||
        
 | 
			
		||||
    def get_survey(self):
 | 
			
		||||
        return self.survey
 | 
			
		||||
 | 
			
		||||
    def draw(self):
 | 
			
		||||
        self.canvas.draw()
 | 
			
		||||
        
 | 
			
		||||
    def connectButtons(self):
 | 
			
		||||
        QtCore.QObject.connect(self.ui.pushButton_rect, QtCore.SIGNAL("clicked()"), self.chooseRect)
 | 
			
		||||
        QtCore.QObject.connect(self.ui.pushButton_poly, QtCore.SIGNAL("clicked()"), self.choosePoly)
 | 
			
		||||
        QtCore.QObject.connect(self.ui.pushButton_plot, QtCore.SIGNAL("clicked()"), self.plotPicks)
 | 
			
		||||
        QtCore.QObject.connect(self.ui.pushButton_snr, QtCore.SIGNAL("clicked()"), self.refrSNR)
 | 
			
		||||
        QtCore.QObject.connect(self.ui.pushButton_pe, QtCore.SIGNAL("clicked()"), self.refrPE)
 | 
			
		||||
        QtCore.QObject.connect(self.ui.pushButton_spe, QtCore.SIGNAL("clicked()"), self.refrSPE)
 | 
			
		||||
 | 
			
		||||
    def chooseRect(self):
 | 
			
		||||
        self.region.chooseRectangles()
 | 
			
		||||
 | 
			
		||||
    def choosePoly(self):
 | 
			
		||||
        self.region.choosePolygon()
 | 
			
		||||
 | 
			
		||||
    def plotPicks(self):
 | 
			
		||||
        self.region.plotTracesInActiveRegions()
 | 
			
		||||
 | 
			
		||||
    def refrSNR(self):
 | 
			
		||||
        self.refreshPlot('snrlog')
 | 
			
		||||
 | 
			
		||||
    def refrPE(self):
 | 
			
		||||
        self.refreshPlot('pe')
 | 
			
		||||
 | 
			
		||||
    def refrSPE(self):
 | 
			
		||||
        self.refreshPlot('spe')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -29,7 +29,7 @@ class regions(object):
 | 
			
		||||
 | 
			
		||||
    '''
 | 
			
		||||
 | 
			
		||||
    def __init__(self, ax, cbar, survey):
 | 
			
		||||
    def __init__(self, ax, cbar, survey, qt_interface = False):
 | 
			
		||||
        self.ax = ax
 | 
			
		||||
        self.cbar = cbar
 | 
			
		||||
        self.cbv = 'log10SNR'
 | 
			
		||||
@ -45,12 +45,13 @@ class regions(object):
 | 
			
		||||
        self._y1 = []
 | 
			
		||||
        self._polyx = []
 | 
			
		||||
        self._polyy = []
 | 
			
		||||
        self.buttons = {}
 | 
			
		||||
        self._allpicks = None
 | 
			
		||||
        self.shots_found = {}
 | 
			
		||||
        self.shots_for_deletion = {}
 | 
			
		||||
        self._generateList()
 | 
			
		||||
        self._addButtons()
 | 
			
		||||
        if not qt_interface:
 | 
			
		||||
            self.buttons = {}
 | 
			
		||||
            self._addButtons()
 | 
			
		||||
        self.addTextfield()
 | 
			
		||||
        self.drawFigure()
 | 
			
		||||
 | 
			
		||||
@ -525,4 +526,5 @@ class regions(object):
 | 
			
		||||
        if resetAxes == True:
 | 
			
		||||
            self.ax.set_xlim(self._xlim)
 | 
			
		||||
            self.ax.set_ylim(self._ylim)
 | 
			
		||||
        plt.draw()
 | 
			
		||||
        self.ax.figure.canvas.draw()
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
@ -339,16 +339,30 @@ class PDFDictionary(object):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PDFstatistics(object):
 | 
			
		||||
    '''
 | 
			
		||||
    To do:
 | 
			
		||||
    plots for std, quantiles,
 | 
			
		||||
    '''
 | 
			
		||||
    """
 | 
			
		||||
    This object can be used to get various statistic values from probabillity density functions.
 | 
			
		||||
    Takes a path as argument.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def __init__(self, directory):
 | 
			
		||||
        """Initiates some values needed when dealing with pdfs later"""
 | 
			
		||||
        self.directory = directory
 | 
			
		||||
        self.evtlist = list()
 | 
			
		||||
        self.return_phase = None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def readTheta(self, arname, dir, fnpattern):
 | 
			
		||||
        """
 | 
			
		||||
        Loads an array from file into object instance.
 | 
			
		||||
        :param arname: Name of Array beeing created.
 | 
			
		||||
        :type  arname: string
 | 
			
		||||
        :param dir: Directory where file is to be found.
 | 
			
		||||
        :type  dir: string
 | 
			
		||||
        :param fnpattern: file name pattern for reading multiple files into one array.
 | 
			
		||||
        :type  fnpattern: string
 | 
			
		||||
        :return: a list with all args* from the files.
 | 
			
		||||
        """
 | 
			
		||||
        exec('self.' + arname +' = []')
 | 
			
		||||
        filelist = glob.glob1(dir, fnpattern)
 | 
			
		||||
        for file in filelist:
 | 
			
		||||
@ -359,8 +373,14 @@ class PDFstatistics(object):
 | 
			
		||||
            exec('self.' + arname + ' += list')
 | 
			
		||||
            fid.close()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def makeFileList(self, fn_pattern='*.xml'):
 | 
			
		||||
        evtlist = list()
 | 
			
		||||
        """
 | 
			
		||||
        Takes a file pattern and searches for that recursively in the set path for the object.
 | 
			
		||||
        :param fn_pattern: A pattern that can identify all datafiles. Default Value = '*.xml'
 | 
			
		||||
        :type  fn_pattern: string
 | 
			
		||||
        :return: creates a list of events saved in the PDFstatistics object.
 | 
			
		||||
        """
 | 
			
		||||
        evtlist = glob.glob1((os.path.join(self.directory)), fn_pattern)
 | 
			
		||||
        if not evtlist:
 | 
			
		||||
             for root, _, files in os.walk(self.directory):
 | 
			
		||||
@ -369,7 +389,9 @@ class PDFstatistics(object):
 | 
			
		||||
                         evtlist.append(os.path.join(root, file))
 | 
			
		||||
        self.evtlist = evtlist
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def __iter__(self):
 | 
			
		||||
        """Iterating over the PDFstatistics object yields every single pdf from the list of events"""
 | 
			
		||||
        assert isinstance(self.return_phase, str), 'phase has to be set before being able to iterate over items...'
 | 
			
		||||
        for evt in self.evtlist:
 | 
			
		||||
            self.getPDFDict(self.directory, evt)
 | 
			
		||||
@ -379,13 +401,30 @@ class PDFstatistics(object):
 | 
			
		||||
                except KeyError:
 | 
			
		||||
                    continue
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def set_return_phase(self, type):
 | 
			
		||||
        """
 | 
			
		||||
        Sets the phase typ of event data that is returned on iteration over the object.
 | 
			
		||||
        :param type: can be either p (p-phase) or s (s-phase).
 | 
			
		||||
        :type  type: string
 | 
			
		||||
        :return: -
 | 
			
		||||
        """
 | 
			
		||||
        if type.upper() not in 'PS':
 | 
			
		||||
            raise ValueError("phase type must be either 'P' or 'S'!")
 | 
			
		||||
        else:
 | 
			
		||||
            self.return_phase = type.upper()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def getQD(self,value):
 | 
			
		||||
        """
 | 
			
		||||
        Takes a probability value and and returns the distance
 | 
			
		||||
        between two complementary quantiles.
 | 
			
		||||
        For example: getQD(0.3) yields Quantile(1-0.3) - Quantile(0.3)
 | 
			
		||||
        :param value: 0 < value < 0.5
 | 
			
		||||
        :type  value: float
 | 
			
		||||
        :return: returns a list of all quantile distances for all pdfs in
 | 
			
		||||
                 the list of events.
 | 
			
		||||
        """
 | 
			
		||||
        QDlist = []
 | 
			
		||||
        for pdf in self:
 | 
			
		||||
            QD = pdf.quantile_distance(value)
 | 
			
		||||
@ -394,6 +433,16 @@ class PDFstatistics(object):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def getQDQ(self,value):
 | 
			
		||||
        """
 | 
			
		||||
        Takes a probability value and and returns the fraction of
 | 
			
		||||
        two quantile distances.
 | 
			
		||||
        For example:
 | 
			
		||||
        getQDQ(x) = getQD(0.5-x)/getQD(x)
 | 
			
		||||
        (Quantile(1-0.5-x) - Quantile(x)) / (Quantile(1-x) - Quantile(x))
 | 
			
		||||
        :param value: 0 < value < 0.25
 | 
			
		||||
        :return: returns a list of all quantile fractions for all pdfs in
 | 
			
		||||
                 the list of events.
 | 
			
		||||
        """
 | 
			
		||||
        QDQlist = []
 | 
			
		||||
        for pdf in self:
 | 
			
		||||
            QDQ = pdf.qtile_dist_quot(value)
 | 
			
		||||
@ -402,6 +451,12 @@ class PDFstatistics(object):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def getSTD(self):
 | 
			
		||||
        """
 | 
			
		||||
        Iterates over PDFstatistics object and returns the standard
 | 
			
		||||
        deviation of all pdfs in the list of events.
 | 
			
		||||
        :return: saves an instance of self.p_stdarray or
 | 
			
		||||
                 self.s_stdarray, depending on set phase.
 | 
			
		||||
        """
 | 
			
		||||
        std = []
 | 
			
		||||
        for pdf in self:
 | 
			
		||||
            try:
 | 
			
		||||
@ -413,6 +468,10 @@ class PDFstatistics(object):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def set_stdarray(self, array):
 | 
			
		||||
        """
 | 
			
		||||
        Helper function for self.getSTD(). This function
 | 
			
		||||
        should not be called directly.
 | 
			
		||||
        """
 | 
			
		||||
        if self.return_phase == 'P':
 | 
			
		||||
            self.p_stdarray = array
 | 
			
		||||
        elif self.return_phase == 'S':
 | 
			
		||||
@ -423,6 +482,22 @@ class PDFstatistics(object):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def getBinList(self,l_boundary,u_boundary,nbins = 100):
 | 
			
		||||
        """
 | 
			
		||||
        Helper function for self.histplot(). Takes in two boundaries and
 | 
			
		||||
        a number of bins and creates a list of bins which can be passed
 | 
			
		||||
        to self.histplot().
 | 
			
		||||
        :param l_boundary: Any number.
 | 
			
		||||
        :type  l_boundary: float
 | 
			
		||||
        :param u_boundary: Any number that is greater than l_boundary.
 | 
			
		||||
        :type  u_boundary: float
 | 
			
		||||
        :param nbins: Any positive integer.
 | 
			
		||||
        :type  nbins: int
 | 
			
		||||
        :return: A list of equidistant bins.
 | 
			
		||||
        """
 | 
			
		||||
        if u_boundary <= l_boundary:
 | 
			
		||||
            raise ValueError('Upper boundary must be greather than lower!')
 | 
			
		||||
        elif nbins <= 0:
 | 
			
		||||
            raise ValueError('Number of bins is not valid.')
 | 
			
		||||
        binlist = []
 | 
			
		||||
        for i in range(nbins):
 | 
			
		||||
            binlist.append(l_boundary + i*(u_boundary-l_boundary)/nbins)
 | 
			
		||||
@ -430,24 +505,57 @@ class PDFstatistics(object):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def histplot(self, array, binlist, xlab = 'Values',
 | 
			
		||||
                 ylab = 'Frequency', title = None, label=None):
 | 
			
		||||
                 ylab = 'Frequency', title = None, fnout = None):
 | 
			
		||||
        """
 | 
			
		||||
        Method to quickly show some distribution of data. Takes array like data,
 | 
			
		||||
        and a list of bins. Editing detail and inserting a legend is not possible.
 | 
			
		||||
        :param array: List of values.
 | 
			
		||||
        :type  array: Array like
 | 
			
		||||
        :param binlist: List of bins.
 | 
			
		||||
        :type  binlist: list
 | 
			
		||||
        :param xlab: A label for the x-axes.
 | 
			
		||||
        :type  xlab: str
 | 
			
		||||
        :param ylab: A label for the y-axes.
 | 
			
		||||
        :type  ylab: str
 | 
			
		||||
        :param title: A title for the Plot.
 | 
			
		||||
        :type  title: str
 | 
			
		||||
        :param fnout: A path to save the plot instead of showing.
 | 
			
		||||
                      Has to contain filename and type. Like: 'path/to/file.png'
 | 
			
		||||
        :type  fnout. str
 | 
			
		||||
        :return: -
 | 
			
		||||
        """
 | 
			
		||||
        import matplotlib.pyplot as plt
 | 
			
		||||
        plt.hist(array,bins = binlist)
 | 
			
		||||
        plt.xlabel('Values')
 | 
			
		||||
        plt.ylabel('Frequency')
 | 
			
		||||
        plt.xlabel(xlab)
 | 
			
		||||
        plt.ylabel(ylab)
 | 
			
		||||
        if title:
 | 
			
		||||
            title_str = 'Quantile distance quotient distribution'
 | 
			
		||||
            if label:
 | 
			
		||||
                title_str += ' (' + label + ')'
 | 
			
		||||
            plt.title(title_str)
 | 
			
		||||
        plt.show()
 | 
			
		||||
            plt.title(title)
 | 
			
		||||
        if fnout:
 | 
			
		||||
            plt.savefig(fnout)
 | 
			
		||||
        else:
 | 
			
		||||
            plt.show()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def getPDFDict(self, month, evt):
 | 
			
		||||
        """
 | 
			
		||||
        Helper function for __iter__(). Should not be called directly.
 | 
			
		||||
        """
 | 
			
		||||
        self.pdfdict = PDFDictionary.from_quakeml(os.path.join(self.directory,month,evt))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def getStatistics(self):
 | 
			
		||||
        """
 | 
			
		||||
        On call function will get mean, median and standard deviation values
 | 
			
		||||
        from self.p_stdarray and self.s_stdarray. Both must be
 | 
			
		||||
        instances before calling this function.
 | 
			
		||||
        :return: Creates instances of self.p_mean, self.p_std_std and self.p_median
 | 
			
		||||
                 for both phases (simultaneously) for the PDFstatistics object.
 | 
			
		||||
        """
 | 
			
		||||
        if not self.p_stdarray or not self.s_stdarray:
 | 
			
		||||
            raise NotImplementedError('Arrays are not properly set yet!')
 | 
			
		||||
        elif type(self.p_stdarray) != type(np.zeros(1)) or type(self.s_stdarray) != type(np.zeros(1)):
 | 
			
		||||
            raise TypeError('Array is not a proper numpy array.')
 | 
			
		||||
 | 
			
		||||
        self.p_mean = self.p_stdarray.mean()
 | 
			
		||||
        self.p_std_std = self.p_stdarray.std()
 | 
			
		||||
        self.p_median = np.median(self.p_stdarray)
 | 
			
		||||
@ -456,12 +564,22 @@ class PDFstatistics(object):
 | 
			
		||||
        self.s_median = np.median(self.s_stdarray)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def writeThetaToFile(self,array,out_dir,filename = None):
 | 
			
		||||
        fid = open(os.path.join(out_dir,filename), 'w')
 | 
			
		||||
    def writeThetaToFile(self,array,out_dir):
 | 
			
		||||
        """
 | 
			
		||||
        Method to write array like data to file. Useful since acquiring can take
 | 
			
		||||
        serious amount of time when dealing with large databases.
 | 
			
		||||
        :param array: List of values.
 | 
			
		||||
        :type  array: list
 | 
			
		||||
        :param out_dir: Path to save file to including file name.
 | 
			
		||||
        :type  out_dir: str
 | 
			
		||||
        :return: Saves a file at given output directory.
 | 
			
		||||
        """
 | 
			
		||||
        fid = open(os.path.join(out_dir), 'w')
 | 
			
		||||
        for val in array:
 | 
			
		||||
            fid.write(str(val)+'\n')
 | 
			
		||||
        fid.close()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    root_dir ='/home/sebastianp/Codetesting/xmls/'
 | 
			
		||||
    Insheim = PDFstatistics(root_dir)
 | 
			
		||||
 | 
			
		||||
@ -363,13 +363,15 @@ class ProbabilityDensityFunction(object):
 | 
			
		||||
        return m
 | 
			
		||||
 | 
			
		||||
    def quantile_distance(self, prob_value):
 | 
			
		||||
        if 0 >= prob_value or prob_value >= 0.5:
 | 
			
		||||
            raise ValueError('Value out of range.')
 | 
			
		||||
        ql = self.quantile(prob_value)
 | 
			
		||||
        qu = self.quantile(1 - prob_value)
 | 
			
		||||
        return qu - ql
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def qtile_dist_quot(self,x):
 | 
			
		||||
        if x <= 0 or x >= 0.5:
 | 
			
		||||
        if x <= 0 or x >= 0.25:
 | 
			
		||||
            raise ValueError('Value out of range.')
 | 
			
		||||
        return self.quantile_distance(0.5-x)/self.quantile_distance(x)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -82,8 +82,8 @@ def clims(lim1, lim2):
 | 
			
		||||
 | 
			
		||||
def demeanTrace(trace, window):
 | 
			
		||||
    """
 | 
			
		||||
    returns the DATA where each trace is demean by the average value within
 | 
			
		||||
    WINDOW
 | 
			
		||||
    takes a trace object and returns the same trace object but with data
 | 
			
		||||
    demeaned within a certain time window
 | 
			
		||||
    :param trace: waveform trace object
 | 
			
		||||
    :type trace: `~obspy.core.stream.Trace`
 | 
			
		||||
    :param window:
 | 
			
		||||
@ -100,9 +100,9 @@ def findComboBoxIndex(combo_box, val):
 | 
			
		||||
    Function findComboBoxIndex takes a QComboBox object and a string and
 | 
			
		||||
    returns either 0 or the index throughout all QComboBox items.
 | 
			
		||||
    :param combo_box: Combo box object.
 | 
			
		||||
    :type combo_box: QComboBox
 | 
			
		||||
    :type combo_box: `~QComboBox`
 | 
			
		||||
    :param val: Name of a combo box to search for.
 | 
			
		||||
    :type val:
 | 
			
		||||
    :type val: basestring
 | 
			
		||||
    :return: index value of item with name val or 0
 | 
			
		||||
    """
 | 
			
		||||
    return combo_box.findText(val) if combo_box.findText(val) is not -1 else 0
 | 
			
		||||
@ -110,21 +110,35 @@ def findComboBoxIndex(combo_box, val):
 | 
			
		||||
 | 
			
		||||
def find_nearest(array, value):
 | 
			
		||||
    '''
 | 
			
		||||
    Function find_nearest takes an array and a value and returns the
 | 
			
		||||
    index of the nearest value found in the array.
 | 
			
		||||
    :param array:
 | 
			
		||||
    :param value:
 | 
			
		||||
    :return:
 | 
			
		||||
    function find_nearest takes an array and a value and returns the
 | 
			
		||||
    index of the nearest value found in the array
 | 
			
		||||
    :param array: array containing values
 | 
			
		||||
    :type array: `~numpy.ndarray`
 | 
			
		||||
    :param value: number searched for
 | 
			
		||||
    :return: index of the array item being nearest to the value
 | 
			
		||||
 | 
			
		||||
    >>> a = np.array([ 1.80339578, -0.72546654,  0.95769195, -0.98320759, 0.85922623])
 | 
			
		||||
    >>> find_nearest(a, 1.3)
 | 
			
		||||
    2
 | 
			
		||||
    >>> find_nearest(a, 0)
 | 
			
		||||
    1
 | 
			
		||||
    >>> find_nearest(a, 2)
 | 
			
		||||
    0
 | 
			
		||||
    >>> find_nearest(a, -1)
 | 
			
		||||
    3
 | 
			
		||||
    >>> a = np.array([ 1.1, -0.7,  0.9, -0.9, 0.8])
 | 
			
		||||
    >>> find_nearest(a, 0.849)
 | 
			
		||||
    4
 | 
			
		||||
    '''
 | 
			
		||||
    return (np.abs(array - value)).argmin()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def fnConstructor(s):
 | 
			
		||||
    '''
 | 
			
		||||
 | 
			
		||||
    :param s:
 | 
			
		||||
    :type s:
 | 
			
		||||
    :return:
 | 
			
		||||
    takes a string and returns a valid filename (especially on windows machines)
 | 
			
		||||
    :param s: desired filename
 | 
			
		||||
    :type s: str
 | 
			
		||||
    :return: valid filename
 | 
			
		||||
    '''
 | 
			
		||||
    if type(s) is str:
 | 
			
		||||
        s = s.split(':')[-1]
 | 
			
		||||
@ -142,7 +156,21 @@ def fnConstructor(s):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def four_digits(year):
 | 
			
		||||
    if year + 2000 < UTCDateTime.utcnow().year:
 | 
			
		||||
    """
 | 
			
		||||
    takes a two digit year integer and returns the correct four digit equivalent
 | 
			
		||||
    from the last 100 years
 | 
			
		||||
    :param year: two digit year
 | 
			
		||||
    :type year: int
 | 
			
		||||
    :return: four digit year correspondant
 | 
			
		||||
 | 
			
		||||
    >>> four_digits(20)
 | 
			
		||||
    1920
 | 
			
		||||
    >>> four_digits(16)
 | 
			
		||||
    2016
 | 
			
		||||
    >>> four_digits(00)
 | 
			
		||||
    2000
 | 
			
		||||
    """
 | 
			
		||||
    if year + 2000 <= UTCDateTime.utcnow().year:
 | 
			
		||||
        year += 2000
 | 
			
		||||
    else:
 | 
			
		||||
        year += 1900
 | 
			
		||||
@ -151,10 +179,11 @@ def four_digits(year):
 | 
			
		||||
 | 
			
		||||
def getGlobalTimes(stream):
 | 
			
		||||
    '''
 | 
			
		||||
 | 
			
		||||
    :param stream:
 | 
			
		||||
    :type stream
 | 
			
		||||
    :return:
 | 
			
		||||
    takes a stream object and returns the latest end and the earliest start
 | 
			
		||||
    time of all contained trace objects
 | 
			
		||||
    :param stream: seismological data stream
 | 
			
		||||
    :type stream: `~obspy.core.stream.Stream`
 | 
			
		||||
    :return: minimum start time and maximum end time
 | 
			
		||||
    '''
 | 
			
		||||
    min_start = UTCDateTime()
 | 
			
		||||
    max_end = None
 | 
			
		||||
@ -168,6 +197,8 @@ def getGlobalTimes(stream):
 | 
			
		||||
 | 
			
		||||
def getHash(time):
 | 
			
		||||
    '''
 | 
			
		||||
    takes a time object and returns the corresponding SHA1 hash of the
 | 
			
		||||
    formatted date string
 | 
			
		||||
    :param time: time object for which a hash should be calculated
 | 
			
		||||
    :type time: :class: `~obspy.core.utcdatetime.UTCDateTime` object
 | 
			
		||||
    :return: str
 | 
			
		||||
@ -179,27 +210,27 @@ def getHash(time):
 | 
			
		||||
 | 
			
		||||
def getLogin():
 | 
			
		||||
    '''
 | 
			
		||||
    returns the actual user's login id
 | 
			
		||||
    :return: User ID
 | 
			
		||||
    returns the actual user's login ID
 | 
			
		||||
    :return: login ID
 | 
			
		||||
    '''
 | 
			
		||||
    return pwd.getpwuid(os.getuid())[0]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def getOwner(fn):
 | 
			
		||||
    '''
 | 
			
		||||
    takes filename and returns the User ID of the owner of the file
 | 
			
		||||
    :param fn: filename
 | 
			
		||||
    takes a filename and return the login ID of the actual owner of the file
 | 
			
		||||
    :param fn: filename of the file tested
 | 
			
		||||
    :type fn: str
 | 
			
		||||
    :return: User ID
 | 
			
		||||
    :return: login ID of the file's owner
 | 
			
		||||
    '''
 | 
			
		||||
    return pwd.getpwuid(os.stat(fn).st_uid).pw_name
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def getPatternLine(fn, pattern):
 | 
			
		||||
    """
 | 
			
		||||
    Takes a file name and a pattern string to search for in the file and
 | 
			
		||||
    returns the first line which contains the pattern string otherwise None.
 | 
			
		||||
    :param fn: filename
 | 
			
		||||
    takes a file name and a pattern string to search for in the file and
 | 
			
		||||
    returns the first line which contains the pattern string otherwise 'None'
 | 
			
		||||
    :param fn: file name
 | 
			
		||||
    :type fn: str
 | 
			
		||||
    :param pattern: pattern string to search for
 | 
			
		||||
    :type pattern: str
 | 
			
		||||
@ -221,22 +252,52 @@ def getPatternLine(fn, pattern):
 | 
			
		||||
 | 
			
		||||
def isSorted(iterable):
 | 
			
		||||
    '''
 | 
			
		||||
    takes a python variable and returns True if the iterable is sorted and False otherwise
 | 
			
		||||
    :param iterable: a python variable
 | 
			
		||||
    takes an iterable and returns 'True' if the items are in order otherwise
 | 
			
		||||
    'False'
 | 
			
		||||
    :param iterable: an iterable object
 | 
			
		||||
    :type iterable:
 | 
			
		||||
    :return:
 | 
			
		||||
    :return: Boolean
 | 
			
		||||
 | 
			
		||||
    >>> isSorted(1)
 | 
			
		||||
    Traceback (most recent call last):
 | 
			
		||||
    ...
 | 
			
		||||
    AssertionError: object is not iterable; object: 1
 | 
			
		||||
    >>> isSorted([1,2,3,4])
 | 
			
		||||
    True
 | 
			
		||||
    >>> isSorted('abcd')
 | 
			
		||||
    True
 | 
			
		||||
    >>> isSorted('bcad')
 | 
			
		||||
    False
 | 
			
		||||
    >>> isSorted([2,3,1,4])
 | 
			
		||||
    False
 | 
			
		||||
    '''
 | 
			
		||||
    assert isIterable(iterable), 'object is not iterable; object: {' \
 | 
			
		||||
                                 '0}'.format(iterable)
 | 
			
		||||
    if type(iterable) is str:
 | 
			
		||||
        iterable = [s for s in iterable]
 | 
			
		||||
    return sorted(iterable) == iterable
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def isIterable(obj):
 | 
			
		||||
    """
 | 
			
		||||
    takes a python object and returns 'True' is the object is iterable and
 | 
			
		||||
    'False' otherwise
 | 
			
		||||
    :param obj: a python object
 | 
			
		||||
    :return: True of False
 | 
			
		||||
    """
 | 
			
		||||
    try:
 | 
			
		||||
        iterator = iter(obj)
 | 
			
		||||
    except TypeError as te:
 | 
			
		||||
        return False
 | 
			
		||||
    return True
 | 
			
		||||
 | 
			
		||||
def prepTimeAxis(stime, trace):
 | 
			
		||||
    '''
 | 
			
		||||
    takes a starttime 'stime' and a trace object 'trace' and return a vector containing as much time stamps as data values in the trace object are available
 | 
			
		||||
    :param stime:
 | 
			
		||||
    :type stime:
 | 
			
		||||
    :param trace:
 | 
			
		||||
    :type trace:
 | 
			
		||||
    :return: time axis
 | 
			
		||||
    takes a starttime and a trace object and returns a valid time axis for
 | 
			
		||||
    plotting
 | 
			
		||||
    :param stime: start time of the actual seismogram as UTCDateTime
 | 
			
		||||
    :param trace: seismic trace object
 | 
			
		||||
    :return: valid numpy array with time stamps for plotting
 | 
			
		||||
    '''
 | 
			
		||||
    nsamp = trace.stats.npts
 | 
			
		||||
    srate = trace.stats.sampling_rate
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user