WIP: Simplify data structure #39
10
autoPyLoT.py
10
autoPyLoT.py
@ -28,7 +28,7 @@ from pylot.core.util.dataprocessing import restitute_data, Metadata
|
|||||||
from pylot.core.util.defaults import SEPARATOR
|
from pylot.core.util.defaults import SEPARATOR
|
||||||
from pylot.core.util.event import Event
|
from pylot.core.util.event import Event
|
||||||
from pylot.core.util.structure import DATASTRUCTURE
|
from pylot.core.util.structure import DATASTRUCTURE
|
||||||
from pylot.core.util.utils import get_None, trim_station_components, check4gapsAndRemove, check4doubled, \
|
from pylot.core.util.utils import get_none, trim_station_components, check4gapsAndRemove, check4doubled, \
|
||||||
check4rotated
|
check4rotated
|
||||||
from pylot.core.util.version import get_git_version as _getVersionString
|
from pylot.core.util.version import get_git_version as _getVersionString
|
||||||
|
|
||||||
@ -91,9 +91,9 @@ def autoPyLoT(input_dict=None, parameter=None, inputfile=None, fnames=None, even
|
|||||||
sp=sp_info)
|
sp=sp_info)
|
||||||
print(splash)
|
print(splash)
|
||||||
|
|
||||||
parameter = get_None(parameter)
|
parameter = get_none(parameter)
|
||||||
inputfile = get_None(inputfile)
|
inputfile = get_none(inputfile)
|
||||||
eventid = get_None(eventid)
|
eventid = get_none(eventid)
|
||||||
|
|
||||||
fig_dict = None
|
fig_dict = None
|
||||||
fig_dict_wadatijack = None
|
fig_dict_wadatijack = None
|
||||||
@ -154,7 +154,7 @@ def autoPyLoT(input_dict=None, parameter=None, inputfile=None, fnames=None, even
|
|||||||
datastructure.setExpandFields(exf)
|
datastructure.setExpandFields(exf)
|
||||||
|
|
||||||
# check if default location routine NLLoc is available and all stations are used
|
# check if default location routine NLLoc is available and all stations are used
|
||||||
if get_None(parameter['nllocbin']) and station == 'all':
|
if get_none(parameter['nllocbin']) and station == 'all':
|
||||||
locflag = 1
|
locflag = 1
|
||||||
# get NLLoc-root path
|
# get NLLoc-root path
|
||||||
nllocroot = parameter.get('nllocroot')
|
nllocroot = parameter.get('nllocroot')
|
||||||
|
@ -22,7 +22,7 @@ from pylot.core.pick.picker import AICPicker, PragPicker
|
|||||||
from pylot.core.pick.utils import checksignallength, checkZ4S, earllatepicker, \
|
from pylot.core.pick.utils import checksignallength, checkZ4S, earllatepicker, \
|
||||||
getSNR, fmpicker, checkPonsets, wadaticheck, get_quality_class, PickingFailedException, MissingTraceException
|
getSNR, fmpicker, checkPonsets, wadaticheck, get_quality_class, PickingFailedException, MissingTraceException
|
||||||
from pylot.core.util.utils import getPatternLine, gen_Pool, \
|
from pylot.core.util.utils import getPatternLine, gen_Pool, \
|
||||||
get_bool, identifyPhaseID, get_None, correct_iplot
|
get_bool, identifyPhaseID, get_none, correct_iplot
|
||||||
|
|
||||||
|
|
||||||
def autopickevent(data, param, iplot=0, fig_dict=None, fig_dict_wadatijack=None, ncores=0, metadata=None, origin=None):
|
def autopickevent(data, param, iplot=0, fig_dict=None, fig_dict_wadatijack=None, ncores=0, metadata=None, origin=None):
|
||||||
@ -258,7 +258,7 @@ class AutopickStation(object):
|
|||||||
self.pickparams = copy.deepcopy(pickparam)
|
self.pickparams = copy.deepcopy(pickparam)
|
||||||
self.verbose = verbose
|
self.verbose = verbose
|
||||||
self.iplot = correct_iplot(iplot)
|
self.iplot = correct_iplot(iplot)
|
||||||
self.fig_dict = get_None(fig_dict)
|
self.fig_dict = get_none(fig_dict)
|
||||||
self.metadata = metadata
|
self.metadata = metadata
|
||||||
self.origin = origin
|
self.origin = origin
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ import numpy as np
|
|||||||
from obspy.core import Stream, UTCDateTime
|
from obspy.core import Stream, UTCDateTime
|
||||||
from scipy.signal import argrelmax
|
from scipy.signal import argrelmax
|
||||||
|
|
||||||
from pylot.core.util.utils import get_bool, get_None, SetChannelComponents
|
from pylot.core.util.utils import get_bool, get_none, SetChannelComponents
|
||||||
|
|
||||||
|
|
||||||
def earllatepicker(X, nfac, TSNR, Pick1, iplot=0, verbosity=1, fig=None, linecolor='k'):
|
def earllatepicker(X, nfac, TSNR, Pick1, iplot=0, verbosity=1, fig=None, linecolor='k'):
|
||||||
@ -136,7 +136,7 @@ def earllatepicker(X, nfac, TSNR, Pick1, iplot=0, verbosity=1, fig=None, linecol
|
|||||||
PickError = symmetrize_error(diffti_te, diffti_tl)
|
PickError = symmetrize_error(diffti_te, diffti_tl)
|
||||||
|
|
||||||
if iplot > 1:
|
if iplot > 1:
|
||||||
if get_None(fig) is None:
|
if get_none(fig) is None:
|
||||||
fig = plt.figure() # iplot)
|
fig = plt.figure() # iplot)
|
||||||
plt_flag = 1
|
plt_flag = 1
|
||||||
fig._tight = True
|
fig._tight = True
|
||||||
@ -344,7 +344,7 @@ def fmpicker(Xraw, Xfilt, pickwin, Pick, iplot=0, fig=None, linecolor='k'):
|
|||||||
print("fmpicker: Found polarity %s" % FM)
|
print("fmpicker: Found polarity %s" % FM)
|
||||||
|
|
||||||
if iplot > 1:
|
if iplot > 1:
|
||||||
if get_None(fig) is None:
|
if get_none(fig) is None:
|
||||||
fig = plt.figure() # iplot)
|
fig = plt.figure() # iplot)
|
||||||
plt_flag = 1
|
plt_flag = 1
|
||||||
fig._tight = True
|
fig._tight = True
|
||||||
@ -868,7 +868,7 @@ def checksignallength(X, pick, minsiglength, pickparams, iplot=0, fig=None, line
|
|||||||
returnflag = 0
|
returnflag = 0
|
||||||
|
|
||||||
if iplot > 1:
|
if iplot > 1:
|
||||||
if get_None(fig) is None:
|
if get_none(fig) is None:
|
||||||
fig = plt.figure() # iplot)
|
fig = plt.figure() # iplot)
|
||||||
plt_flag = 1
|
plt_flag = 1
|
||||||
fig._tight = True
|
fig._tight = True
|
||||||
@ -1213,14 +1213,14 @@ def checkZ4S(X, pick, pickparams, iplot, fig=None, linecolor='k'):
|
|||||||
t = np.linspace(diff_dict[key], trace.stats.endtime - trace.stats.starttime + diff_dict[key],
|
t = np.linspace(diff_dict[key], trace.stats.endtime - trace.stats.starttime + diff_dict[key],
|
||||||
trace.stats.npts)
|
trace.stats.npts)
|
||||||
if i == 0:
|
if i == 0:
|
||||||
if get_None(fig) is None:
|
if get_none(fig) is None:
|
||||||
fig = plt.figure() # self.iplot) ### WHY? MP MP
|
fig = plt.figure() # self.iplot) ### WHY? MP MP
|
||||||
plt_flag = 1
|
plt_flag = 1
|
||||||
ax1 = fig.add_subplot(3, 1, i + 1)
|
ax1 = fig.add_subplot(3, 1, i + 1)
|
||||||
ax = ax1
|
ax = ax1
|
||||||
ax.set_title('CheckZ4S, Station %s' % zdat[0].stats.station)
|
ax.set_title('CheckZ4S, Station %s' % zdat[0].stats.station)
|
||||||
else:
|
else:
|
||||||
if get_None(fig) is None:
|
if get_none(fig) is None:
|
||||||
fig = plt.figure() # self.iplot) ### WHY? MP MP
|
fig = plt.figure() # self.iplot) ### WHY? MP MP
|
||||||
plt_flag = 1
|
plt_flag = 1
|
||||||
ax = fig.add_subplot(3, 1, i + 1, sharex=ax1)
|
ax = fig.add_subplot(3, 1, i + 1, sharex=ax1)
|
||||||
@ -1494,7 +1494,7 @@ def getQualityFromUncertainty(uncertainty, Errors):
|
|||||||
# set initial quality to 4 (worst) and change only if one condition is hit
|
# set initial quality to 4 (worst) and change only if one condition is hit
|
||||||
quality = 4
|
quality = 4
|
||||||
|
|
||||||
if get_None(uncertainty) is None:
|
if get_none(uncertainty) is None:
|
||||||
return quality
|
return quality
|
||||||
|
|
||||||
if uncertainty <= Errors[0]:
|
if uncertainty <= Errors[0]:
|
||||||
|
@ -315,15 +315,32 @@ def fnConstructor(s):
|
|||||||
return fn
|
return fn
|
||||||
|
|
||||||
|
|
||||||
def get_None(value):
|
def get_none(value):
|
||||||
"""
|
"""
|
||||||
Convert "None" to None
|
Convert "None" to None
|
||||||
:param value:
|
:param value:
|
||||||
:type value: str, bool
|
:type value: str, NoneType
|
||||||
:return:
|
:return:
|
||||||
:rtype: bool
|
:rtype: type(value) or NoneType
|
||||||
|
|
||||||
|
>>> st = read()
|
||||||
|
>>> print(get_none(st))
|
||||||
|
3 Trace(s) in Stream:
|
||||||
|
BW.RJOB..EHZ | 2009-08-24T00:20:03.000000Z - 2009-08-24T00:20:32.990000Z | 100.0 Hz, 3000 samples
|
||||||
|
BW.RJOB..EHN | 2009-08-24T00:20:03.000000Z - 2009-08-24T00:20:32.990000Z | 100.0 Hz, 3000 samples
|
||||||
|
BW.RJOB..EHE | 2009-08-24T00:20:03.000000Z - 2009-08-24T00:20:32.990000Z | 100.0 Hz, 3000 samples
|
||||||
|
>>> get_none('Stream')
|
||||||
|
'Stream'
|
||||||
|
>>> get_none(0)
|
||||||
|
0
|
||||||
|
>>> get_none(0.)
|
||||||
|
0.0
|
||||||
|
>>> print(get_none('None'))
|
||||||
|
None
|
||||||
|
>>> print(get_none(None))
|
||||||
|
None
|
||||||
"""
|
"""
|
||||||
if value == 'None':
|
if value is None or (type(value) is str and value == 'None'):
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
return value
|
return value
|
||||||
|
@ -53,7 +53,7 @@ from pylot.core.util.utils import prepTimeAxis, full_range, demeanTrace, isSorte
|
|||||||
pick_linestyle_plt, pick_color_plt, \
|
pick_linestyle_plt, pick_color_plt, \
|
||||||
check4rotated, check4doubled, check_for_gaps_and_merge, check_for_nan, identifyPhase, \
|
check4rotated, check4doubled, check_for_gaps_and_merge, check_for_nan, identifyPhase, \
|
||||||
loopIdentifyPhase, trim_station_components, transformFilteroptions2String, \
|
loopIdentifyPhase, trim_station_components, transformFilteroptions2String, \
|
||||||
identifyPhaseID, get_bool, get_None, pick_color, getAutoFilteroptions, SetChannelComponents, \
|
identifyPhaseID, get_bool, get_none, pick_color, getAutoFilteroptions, SetChannelComponents, \
|
||||||
station_id_remove_channel, get_pylot_eventfile_with_extension, get_possible_pylot_eventfile_extensions
|
station_id_remove_channel, get_pylot_eventfile_with_extension, get_possible_pylot_eventfile_extensions
|
||||||
from autoPyLoT import autoPyLoT
|
from autoPyLoT import autoPyLoT
|
||||||
from pylot.core.util.thread import Thread
|
from pylot.core.util.thread import Thread
|
||||||
@ -860,26 +860,13 @@ class WaveformWidgetPG(QtWidgets.QWidget):
|
|||||||
def clearPlotDict(self):
|
def clearPlotDict(self):
|
||||||
self.plotdict = dict()
|
self.plotdict = dict()
|
||||||
|
|
||||||
def plotWFData(self, wfdata, wfsyn=None, title=None, scaleddata=False, mapping=True,
|
def plotWFData(self, wfdata, wfsyn=None, title=None, zoomx=None, zoomy=None,
|
||||||
component='*', nth_sample=1, verbosity=0, method='normal', gain=1., shift_syn=0.2):
|
noiselevel=None, scaleddata=False, mapping=True,
|
||||||
def station_sort(nslc):
|
component='*', nth_sample=1, iniPick=None, verbosity=0,
|
||||||
"""Try to sort after station integer in case of a line array (e.g. active seismics)"""
|
method='normal', gain=1.):
|
||||||
try:
|
|
||||||
rval = sorted(nslc, key=lambda x: int(x.split('.')[1]))
|
|
||||||
return rval
|
|
||||||
except ValueError as e:
|
|
||||||
# this is the standard case for seismological stations
|
|
||||||
pass
|
|
||||||
except Exception as e:
|
|
||||||
print(f'Sorting by station integer failed with unknown exception: {e}')
|
|
||||||
|
|
||||||
# fallback to default sorting
|
|
||||||
return sorted(nslc)
|
|
||||||
|
|
||||||
if not wfdata:
|
if not wfdata:
|
||||||
print('Nothing to plot.')
|
print('Nothing to plot.')
|
||||||
return
|
return
|
||||||
|
|
||||||
self.title = title
|
self.title = title
|
||||||
self.clearPlotDict()
|
self.clearPlotDict()
|
||||||
self.wfstart, self.wfend = full_range(wfdata)
|
self.wfstart, self.wfend = full_range(wfdata)
|
||||||
@ -897,12 +884,14 @@ class WaveformWidgetPG(QtWidgets.QWidget):
|
|||||||
else:
|
else:
|
||||||
st_select = wfdata
|
st_select = wfdata
|
||||||
|
|
||||||
|
st_select, gaps = merge_stream(st_select)
|
||||||
|
|
||||||
# list containing tuples of network, station, channel (for sorting)
|
# list containing tuples of network, station, channel (for sorting)
|
||||||
nslc = []
|
nslc = []
|
||||||
for trace in st_select:
|
for trace in st_select:
|
||||||
nslc.append(
|
nslc.append(
|
||||||
trace.get_id()) # (trace.stats.network, trace.stats.station, trace.stats.location trace.stats.channel))
|
trace.get_id()) # (trace.stats.network, trace.stats.station, trace.stats.location trace.stats.channel))
|
||||||
nslc = station_sort(nslc)
|
nslc.sort()
|
||||||
nslc.reverse()
|
nslc.reverse()
|
||||||
plots = []
|
plots = []
|
||||||
|
|
||||||
@ -966,7 +955,7 @@ class WaveformWidgetPG(QtWidgets.QWidget):
|
|||||||
self.ylabel = ''
|
self.ylabel = ''
|
||||||
self.setXLims([0, self.wfend - self.wfstart])
|
self.setXLims([0, self.wfend - self.wfstart])
|
||||||
self.setYLims([0.5, nmax + 0.5])
|
self.setYLims([0.5, nmax + 0.5])
|
||||||
return plots
|
return plots, gaps
|
||||||
|
|
||||||
def minMax(self, trace, time_ax):
|
def minMax(self, trace, time_ax):
|
||||||
'''
|
'''
|
||||||
@ -988,7 +977,7 @@ class WaveformWidgetPG(QtWidgets.QWidget):
|
|||||||
min_ = data.min(axis=1)
|
min_ = data.min(axis=1)
|
||||||
max_ = data.max(axis=1)
|
max_ = data.max(axis=1)
|
||||||
if remaining_samples:
|
if remaining_samples:
|
||||||
extreme_values = np.empty((npixel + 1, 2), dtype=float)
|
extreme_values = np.empty((npixel + 1, 2), dtype=np.float)
|
||||||
extreme_values[:-1, 0] = min_
|
extreme_values[:-1, 0] = min_
|
||||||
extreme_values[:-1, 1] = max_
|
extreme_values[:-1, 1] = max_
|
||||||
extreme_values[-1, 0] = \
|
extreme_values[-1, 0] = \
|
||||||
@ -996,7 +985,7 @@ class WaveformWidgetPG(QtWidgets.QWidget):
|
|||||||
extreme_values[-1, 1] = \
|
extreme_values[-1, 1] = \
|
||||||
trace.data[-remaining_samples:].max()
|
trace.data[-remaining_samples:].max()
|
||||||
else:
|
else:
|
||||||
extreme_values = np.empty((npixel, 2), dtype=float)
|
extreme_values = np.empty((npixel, 2), dtype=np.float)
|
||||||
extreme_values[:, 0] = min_
|
extreme_values[:, 0] = min_
|
||||||
extreme_values[:, 1] = max_
|
extreme_values[:, 1] = max_
|
||||||
data = extreme_values.flatten()
|
data = extreme_values.flatten()
|
||||||
@ -1566,114 +1555,6 @@ class PylotCanvas(FigureCanvas):
|
|||||||
self.draw()
|
self.draw()
|
||||||
|
|
||||||
|
|
||||||
class SearchFileByExtensionDialog(QtWidgets.QDialog):
|
|
||||||
def __init__(self, parent=None, label='Text: ', default_text='.xml', events=None):
|
|
||||||
super(SearchFileByExtensionDialog, self).__init__(parent)
|
|
||||||
self.events = events
|
|
||||||
self.filepaths = []
|
|
||||||
self.file_extensions = []
|
|
||||||
self.default_text = default_text
|
|
||||||
self.label = label
|
|
||||||
self.setButtons()
|
|
||||||
self.setupUi()
|
|
||||||
self.connectSignals()
|
|
||||||
self.showPaths()
|
|
||||||
self.refreshSelectionBox()
|
|
||||||
self.refresh_timer = QTimer(self)
|
|
||||||
self.refresh_timer.timeout.connect(self.showPaths)
|
|
||||||
self.refresh_timer.start(10000)
|
|
||||||
|
|
||||||
self.resize(800, 450)
|
|
||||||
|
|
||||||
|
|
||||||
def setupUi(self):
|
|
||||||
self.main_layout = QtWidgets.QVBoxLayout()
|
|
||||||
self.header_layout = QtWidgets.QHBoxLayout()
|
|
||||||
#
|
|
||||||
self.setLayout(self.main_layout)
|
|
||||||
|
|
||||||
# widgets inside the dialog
|
|
||||||
self.textLabel = QtWidgets.QLabel(self.label)
|
|
||||||
self.comboBox = QtWidgets.QComboBox()
|
|
||||||
self.comboBox.addItem(self.default_text)
|
|
||||||
self.comboBox.setEditable(True)
|
|
||||||
|
|
||||||
# optional search button, currently disabled. List refreshed when text changes
|
|
||||||
self.searchButton = QtWidgets.QPushButton('Search')
|
|
||||||
self.searchButton.setVisible(False)
|
|
||||||
|
|
||||||
self.tableWidget = QtWidgets.QTableWidget()
|
|
||||||
tableWidget = self.tableWidget
|
|
||||||
tableWidget.setColumnCount(3)
|
|
||||||
tableWidget.setRowCount(len(self.events))
|
|
||||||
tableWidget.setHorizontalHeaderLabels(('Event ID', 'Filename', 'Last modified'))
|
|
||||||
tableWidget.setEditTriggers(tableWidget.NoEditTriggers)
|
|
||||||
tableWidget.setSortingEnabled(True)
|
|
||||||
header = tableWidget.horizontalHeader()
|
|
||||||
header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)
|
|
||||||
header.setStretchLastSection(True)
|
|
||||||
|
|
||||||
self.statusText = QtWidgets.QLabel()
|
|
||||||
|
|
||||||
self.header_layout.addWidget(self.textLabel)
|
|
||||||
self.header_layout.addWidget(self.comboBox)
|
|
||||||
self.header_layout.addWidget(self.searchButton)
|
|
||||||
|
|
||||||
self.main_layout.addLayout(self.header_layout)
|
|
||||||
self.main_layout.addWidget(self.tableWidget)
|
|
||||||
self.main_layout.addWidget(self.statusText)
|
|
||||||
self.main_layout.addWidget(self._buttonbox)
|
|
||||||
|
|
||||||
def showPaths(self):
|
|
||||||
self.filepaths = []
|
|
||||||
fext = self.comboBox.currentText()
|
|
||||||
self.tableWidget.clearContents()
|
|
||||||
for index, event in enumerate(self.events):
|
|
||||||
filename = get_pylot_eventfile_with_extension(event, fext)
|
|
||||||
self.tableWidget.setItem(index, 0, QtWidgets.QTableWidgetItem(f'{event.pylot_id}'))
|
|
||||||
if filename:
|
|
||||||
self.filepaths.append(filename)
|
|
||||||
ts = int(os.path.getmtime(filename))
|
|
||||||
|
|
||||||
# create QTableWidgetItems of filepath and last modification time
|
|
||||||
fname_item = QtWidgets.QTableWidgetItem(f'{os.path.split(filename)[-1]}')
|
|
||||||
ts_item = QtWidgets.QTableWidgetItem(f'{datetime.datetime.fromtimestamp(ts)}')
|
|
||||||
self.tableWidget.setItem(index, 1, fname_item)
|
|
||||||
self.tableWidget.setItem(index, 2, ts_item)
|
|
||||||
|
|
||||||
# TODO: Idea -> only refresh if table contents changed. Use selection to load only a subset of files
|
|
||||||
if len(self.filepaths) > 0:
|
|
||||||
status_text = f'Found {len(self.filepaths)} eventfiles. Do you want to load them?'
|
|
||||||
else:
|
|
||||||
status_text = 'Did not find any files for specified file mask.'
|
|
||||||
self.statusText.setText(status_text)
|
|
||||||
|
|
||||||
def refreshSelectionBox(self):
|
|
||||||
fext = self.comboBox.currentText()
|
|
||||||
self.file_extensions = [fext]
|
|
||||||
|
|
||||||
for event in self.events:
|
|
||||||
extensions = get_possible_pylot_eventfile_extensions(event, '*.xml')
|
|
||||||
for ext in extensions:
|
|
||||||
if not ext in self.file_extensions:
|
|
||||||
self.file_extensions.append(ext)
|
|
||||||
|
|
||||||
self.comboBox.clear()
|
|
||||||
for ext in sorted(self.file_extensions):
|
|
||||||
self.comboBox.addItem(ext)
|
|
||||||
|
|
||||||
def setButtons(self):
|
|
||||||
self._buttonbox = QDialogButtonBox(QDialogButtonBox.Ok |
|
|
||||||
QDialogButtonBox.Cancel)
|
|
||||||
|
|
||||||
def connectSignals(self):
|
|
||||||
self._buttonbox.accepted.connect(self.accept)
|
|
||||||
self._buttonbox.rejected.connect(self.reject)
|
|
||||||
self.comboBox.editTextChanged.connect(self.showPaths)
|
|
||||||
self.searchButton.clicked.connect(self.showPaths)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SingleTextLineDialog(QtWidgets.QDialog):
|
class SingleTextLineDialog(QtWidgets.QDialog):
|
||||||
def __init__(self, parent=None, label='Text: ', default_text='.xml'):
|
def __init__(self, parent=None, label='Text: ', default_text='.xml'):
|
||||||
super(SingleTextLineDialog, self).__init__(parent)
|
super(SingleTextLineDialog, self).__init__(parent)
|
||||||
@ -1905,7 +1786,7 @@ class PickDlg(QDialog):
|
|||||||
|
|
||||||
# init expected picks using obspy Taup
|
# init expected picks using obspy Taup
|
||||||
try:
|
try:
|
||||||
if self.metadata and model != "None":
|
if self.metadata and model is not None:
|
||||||
self.model = TauPyModel(model)
|
self.model = TauPyModel(model)
|
||||||
self.get_arrivals()
|
self.get_arrivals()
|
||||||
self.drawArrivals()
|
self.drawArrivals()
|
||||||
@ -2632,9 +2513,7 @@ class PickDlg(QDialog):
|
|||||||
data.normalize()
|
data.normalize()
|
||||||
if not data:
|
if not data:
|
||||||
QtWidgets.QMessageBox.warning(self, 'No channel to plot',
|
QtWidgets.QMessageBox.warning(self, 'No channel to plot',
|
||||||
'No channel to plot for phase: {}. '
|
'No channel to plot for phase: {}.'.format(phase))
|
||||||
'Make sure to select the correct channels for P and S '
|
|
||||||
'in the menu in the top panel.'.format(phase))
|
|
||||||
self.leave_picking_mode()
|
self.leave_picking_mode()
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -2774,7 +2653,7 @@ class PickDlg(QDialog):
|
|||||||
minFMSNR = parameter.get('minFMSNR')
|
minFMSNR = parameter.get('minFMSNR')
|
||||||
quality = get_quality_class(spe, parameter.get('timeerrorsP'))
|
quality = get_quality_class(spe, parameter.get('timeerrorsP'))
|
||||||
if quality <= minFMweight and snr >= minFMSNR:
|
if quality <= minFMweight and snr >= minFMSNR:
|
||||||
FM = fmpicker(self.getWFData().select(channel=channel).copy(), wfdata.copy(), parameter.get('fmpickwin'),
|
FM = fmpicker(self.getWFData().select(channel=channel), wfdata, parameter.get('fmpickwin'),
|
||||||
pick - stime_diff)
|
pick - stime_diff)
|
||||||
|
|
||||||
# save pick times for actual phase
|
# save pick times for actual phase
|
||||||
@ -3687,9 +3566,8 @@ class TuneAutopicker(QWidget):
|
|||||||
# wfdat = remove_underscores(wfdat)
|
# wfdat = remove_underscores(wfdat)
|
||||||
# rotate misaligned stations to ZNE
|
# rotate misaligned stations to ZNE
|
||||||
# check for gaps and doubled channels
|
# check for gaps and doubled channels
|
||||||
wfdat, _ = check_for_gaps_and_merge(wfdat)
|
wfdat, gaps = merge_stream(wfdat)
|
||||||
# check for nans
|
# check4gaps(wfdat)
|
||||||
check_for_nan(wfdat)
|
|
||||||
check4doubled(wfdat)
|
check4doubled(wfdat)
|
||||||
wfdat = check4rotated(wfdat, self.parent().metadata, verbosity=0)
|
wfdat = check4rotated(wfdat, self.parent().metadata, verbosity=0)
|
||||||
# trim station components to same start value
|
# trim station components to same start value
|
||||||
@ -3733,14 +3611,14 @@ class TuneAutopicker(QWidget):
|
|||||||
self.listWidget.scrollToBottom()
|
self.listWidget.scrollToBottom()
|
||||||
|
|
||||||
def get_current_event(self):
|
def get_current_event(self):
|
||||||
path = self.get_current_event_fp()
|
path = self.eventBox.currentText()
|
||||||
return self.parent().project.getEventFromPath(path)
|
return self.parent().project.getEventFromPath(path)
|
||||||
|
|
||||||
def get_current_event_name(self):
|
def get_current_event_name(self):
|
||||||
return self.eventBox.currentText().split('/')[-1].rstrip('*')
|
return self.eventBox.currentText().split('/')[-1].split('*')[0]
|
||||||
|
|
||||||
def get_current_event_fp(self):
|
def get_current_event_fp(self):
|
||||||
return self.eventBox.currentText().rstrip('*')
|
return self.eventBox.currentText().split('*')[0]
|
||||||
|
|
||||||
def get_current_event_picks(self, station):
|
def get_current_event_picks(self, station):
|
||||||
event = self.get_current_event()
|
event = self.get_current_event()
|
||||||
@ -3844,7 +3722,6 @@ class TuneAutopicker(QWidget):
|
|||||||
st = self.data.getWFData()
|
st = self.data.getWFData()
|
||||||
tr = st.select(station=self.get_current_station())[0]
|
tr = st.select(station=self.get_current_station())[0]
|
||||||
starttime = tr.stats.starttime
|
starttime = tr.stats.starttime
|
||||||
# create two lists with figure names and subindices (for subplots) to get the correct axes
|
|
||||||
p_axes = [
|
p_axes = [
|
||||||
('mainFig', 0),
|
('mainFig', 0),
|
||||||
('aicFig', 0),
|
('aicFig', 0),
|
||||||
@ -4792,8 +4669,8 @@ class InputsTab(PropTab):
|
|||||||
self.tstopBox = QSpinBox()
|
self.tstopBox = QSpinBox()
|
||||||
for spinbox in [self.tstartBox, self.tstopBox]:
|
for spinbox in [self.tstartBox, self.tstopBox]:
|
||||||
spinbox.setRange(-99999, 99999)
|
spinbox.setRange(-99999, 99999)
|
||||||
self.tstartBox.setValue(float(settings.value('tstart')) if get_None(settings.value('tstart')) else 0)
|
self.tstartBox.setValue(float(settings.value('tstart')) if get_none(settings.value('tstart')) else 0)
|
||||||
self.tstopBox.setValue(float(settings.value('tstop')) if get_None(settings.value('tstop')) else 1e6)
|
self.tstopBox.setValue(float(settings.value('tstop')) if get_none(settings.value('tstop')) else 1e6)
|
||||||
self.cuttimesLayout.addWidget(self.tstartBox, 10)
|
self.cuttimesLayout.addWidget(self.tstartBox, 10)
|
||||||
self.cuttimesLayout.addWidget(QLabel('[s] and'), 0)
|
self.cuttimesLayout.addWidget(QLabel('[s] and'), 0)
|
||||||
self.cuttimesLayout.addWidget(self.tstopBox, 10)
|
self.cuttimesLayout.addWidget(self.tstopBox, 10)
|
||||||
@ -5786,20 +5663,9 @@ class ChooseWaveFormWindow(QWidget):
|
|||||||
def submit(self):
|
def submit(self):
|
||||||
matplotlib.pyplot.close(self.currentSpectro)
|
matplotlib.pyplot.close(self.currentSpectro)
|
||||||
t = self.chooseBoxTraces.currentText() + " " + self.chooseBoxComponent.currentText()
|
t = self.chooseBoxTraces.currentText() + " " + self.chooseBoxComponent.currentText()
|
||||||
self.applyFFT()
|
self.currentSpectro = self.traces[
|
||||||
|
self.chooseBoxTraces.currentText()[3:]][self.chooseBoxComponent.currentText()].spectrogram(show=False, title=t)
|
||||||
def applyFFT(self, trace):
|
self.currentSpectro.show()
|
||||||
tra = self.traces[self.chooseBoxTraces.currentText()[3:]]['Z']
|
|
||||||
transformed = abs(np.fft.rfft(tra.data))
|
|
||||||
print ( transformed )
|
|
||||||
matplotlib.pyplot.plot ( transformed )
|
|
||||||
matplotlib.pyplot.show()
|
|
||||||
|
|
||||||
def applyFFTs(self, tra):
|
|
||||||
transformed = abs(np.fft.rfft(tra.data))
|
|
||||||
print ( transformed )
|
|
||||||
matplotlib.pyplot.plot ( transformed )
|
|
||||||
matplotlib.pyplot.show()
|
|
||||||
|
|
||||||
def submitN(self):
|
def submitN(self):
|
||||||
matplotlib.pyplot.close(self.currentSpectro)
|
matplotlib.pyplot.close(self.currentSpectro)
|
||||||
@ -5815,6 +5681,13 @@ class ChooseWaveFormWindow(QWidget):
|
|||||||
self.chooseBoxTraces.currentText()[3:]]['E'].spectrogram(show=False, title=t)
|
self.chooseBoxTraces.currentText()[3:]]['E'].spectrogram(show=False, title=t)
|
||||||
self.currentSpectro.show()
|
self.currentSpectro.show()
|
||||||
|
|
||||||
|
def submitZ(self):
|
||||||
|
matplotlib.pyplot.close(self.currentSpectro)
|
||||||
|
t = self.chooseBoxTraces.currentText() + " " + self.chooseBoxComponent.currentText()
|
||||||
|
self.currentSpectro = self.traces[
|
||||||
|
self.chooseBoxTraces.currentText()[3:]]['Z'].spectrogram(show=False, title=t)
|
||||||
|
self.currentSpectro.show()
|
||||||
|
|
||||||
# Creates a QComboBox and adds all traces provided
|
# Creates a QComboBox and adds all traces provided
|
||||||
def createComboBoxTraces(self):
|
def createComboBoxTraces(self):
|
||||||
if len(self.wFs) <= 0:
|
if len(self.wFs) <= 0:
|
||||||
@ -5841,55 +5714,6 @@ class ChooseWaveFormWindow(QWidget):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class SpectrogramTab(QWidget):
|
|
||||||
def __init__(self, traces, wfdata, parent=None):
|
|
||||||
super(SpectrogramTab, self).__init__(parent)
|
|
||||||
self.setupUi()
|
|
||||||
self.traces = traces
|
|
||||||
self.wfdata = wfdata
|
|
||||||
|
|
||||||
def setupUi(self):
|
|
||||||
pass
|
|
||||||
def makeSpecFig(self, direction = 'Z', height = 0, width = 0, parent = None):
|
|
||||||
|
|
||||||
i = 0
|
|
||||||
grams = []
|
|
||||||
figure, axis = matplotlib.pyplot.subplots(len(self.traces), sharex=True)
|
|
||||||
|
|
||||||
start, end = full_range(self.wfdata)
|
|
||||||
|
|
||||||
if height != 0 and width != 0:
|
|
||||||
figure.figsize = (width, height)
|
|
||||||
figure.set_figwidth = width
|
|
||||||
figure.set_figheight = height
|
|
||||||
|
|
||||||
#figure.tight_layout()
|
|
||||||
|
|
||||||
for t in self.traces:
|
|
||||||
tra = self.traces[t][direction]
|
|
||||||
#print(start, end)
|
|
||||||
|
|
||||||
# Set Title
|
|
||||||
if i == 0:
|
|
||||||
if direction == 'Z':
|
|
||||||
figure.suptitle("section: vertical components")
|
|
||||||
elif direction == 'E':
|
|
||||||
figure.suptitle("section: east-west components")
|
|
||||||
elif direction == 'N':
|
|
||||||
figure.suptitle("section: north-south components")
|
|
||||||
axis[i].vlines(0, axis[i].get_ylim()[0], axis[i].get_ylim()[1],
|
|
||||||
colors='m', linestyles='dashed',
|
|
||||||
linewidth=2)
|
|
||||||
|
|
||||||
grams.append(tra.spectrogram(show=False, axes=axis[i]))
|
|
||||||
i+=1
|
|
||||||
|
|
||||||
#figure.setXLims([0, end - start])
|
|
||||||
figure.set_tight_layout(True)
|
|
||||||
fC = FigureCanvas(figure)
|
|
||||||
return fC
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
import doctest
|
import doctest
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user