implementation of reading and plotting seismograms (work in progress)

This commit is contained in:
Sebastian Wehling-Benatelli 2015-02-07 09:05:08 +01:00
parent 7092f6e8b5
commit d3199a5798
2 changed files with 64 additions and 28 deletions

View File

@ -83,7 +83,7 @@ class MainWindow(QMainWindow):
self.filterOptionsS = FilterOptions(**filterOptionsS) self.filterOptionsS = FilterOptions(**filterOptionsS)
# initialize data # initialize data
self.data = None self.data = Data()
self.dirty = False self.dirty = False
self.loadData() self.loadData()
self.updateFilterOptions() self.updateFilterOptions()
@ -248,11 +248,14 @@ class MainWindow(QMainWindow):
def loadData(self, fname=None): def loadData(self, fname=None):
if fname is None: if fname is None:
try:
self.data = Data(evtdata=self.fname)
except AttributeError:
action = self.sender() action = self.sender()
if isinstance(action, QAction): if isinstance(action, QAction):
if action.data() is None: if action.data() is None:
filt = """Supported event formats (*.mat *.qml *.xml *.kor filt = """Supported event formats (*.mat *.qml *.xml
*.evt)""" *.kor *.evt)"""
caption = 'Select event to open' caption = 'Select event to open'
self.fname = QFileDialog().getOpenFileName(self, self.fname = QFileDialog().getOpenFileName(self,
caption=caption, caption=caption,
@ -262,8 +265,6 @@ class MainWindow(QMainWindow):
if not self.okToContinue(): if not self.okToContinue():
return return
else: else:
return
if fname:
self.fname = fname self.fname = fname
self.data = Data(evtdata=self.fname) self.data = Data(evtdata=self.fname)
@ -326,11 +327,16 @@ class MainWindow(QMainWindow):
return True return True
def openWaveformData(self): def openWaveformData(self):
try:
if self.fnames and self.okToContinue(): if self.fnames and self.okToContinue():
self.dirty = True self.dirty = True
self.data.wfdata = self.data.setWFData(self.fnames) self.data.wfdata = self.data.setWFData(self.fnames)
elif self.fnames is None and self.okToContinue(): elif self.fnames is None and self.okToContinue():
self.data.setWFData(self.getWFFnames()) self.data.setWFData(self.getWFFnames())
except AttributeError, e:
print (e)
self.getWFFnames()
self.openWaveformData()
def plotData(self): def plotData(self):
self.getData().plotData(self.getDataWidget()) self.getData().plotData(self.getDataWidget())

View File

@ -4,7 +4,7 @@
import os import os
import numpy as np import numpy as np
from PySide.QtGui import QMessageBox from PySide.QtGui import QMessageBox
from obspy.core import (read, Stream) from obspy.core import (read, Stream, UTCDateTime)
from obspy import readEvents from obspy import readEvents
from obspy.core.event import (Event, Catalog) from obspy.core.event import (Event, Catalog)
from pylot.core.util import fnConstructor from pylot.core.util import fnConstructor
@ -30,7 +30,10 @@ class Data(object):
def __init__(self, parent=None, evtdata=None): def __init__(self, parent=None, evtdata=None):
try: try:
if parent: if parent:
self.wfdata = read(parent.getWFFnames()) self.setWFData(parent.getWFFnames())
self.comp = parent.getComponent()
else:
self.comp = 'Z'
except IOError, e: except IOError, e:
msg = 'An I/O error occured while loading data!' msg = 'An I/O error occured while loading data!'
inform = 'Variable wfdata will be empty.' inform = 'Variable wfdata will be empty.'
@ -50,15 +53,23 @@ class Data(object):
self.newevent = False self.newevent = False
if evtdata is not None and isinstance(evtdata, Event): if evtdata is not None and isinstance(evtdata, Event):
self.evtdata = evtdata self.evtdata = evtdata
elif evtdata is not None and not evtdata.endswith('.mat'): elif evtdata is not None and not isinstance(evtdata, dict):
cat = readEvents(evtdata) cat = readEvents(evtdata)
self.evtdata = cat[0] self.evtdata = cat[0]
elif evtdata is not None: elif evtdata is not None:
cat = self.readMatPhases(evtdata) cat = self.readPILOTEvent(**evtdata)
else: # create an empty Event object else: # create an empty Event object
self.newevent = True self.newevent = True
self.evtdata = Event() self.evtdata = Event()
self.orig = self.wfdata.copy() self.orig = self.wfdata.copy()
min_start = UTCDateTime()
max_end = None
for trace in self.getWFData().select(component = self.getComp()):
if trace.stats.starttime < min_start:
min_start = trace.stats.starttime
if max_end is None or trace.stats.endtime > max_end:
max_end = trace.stats.endtime
self.cuttimes = [min_start, max_end]
def isNew(self): def isNew(self):
return self.newevent return self.newevent
@ -94,10 +105,25 @@ class Data(object):
not implemented: {1}'''.format(evtformat, e)) not implemented: {1}'''.format(evtformat, e))
def plotData(self, widget): def plotData(self, widget):
wfst = self.getWFData() wfst = self.getWFData().select(component = self.getComp())
time_ax = np.arange(0, len(wfst[0].data) / wfst[0].stats.sampling_rate, for n, trace in enumerate(wfst):
wfst[0].stats.delta) stime = trace.stats.starttime - self.cuttimes[0]
widget.axes.plot(time_ax, wfst[0].data) etime = trace.stats.endtime - self.cuttimes[1]
srate = trace.stats.sampling_rate
nsamp = len(trace.data)
tincr = trace.stats.delta
time_ax = np.arange(stime, nsamp / srate, tincr)
trace.normalize()
widget.axes.plot(time_ax, trace.data + n, 'k')
xlabel = 'seconds since {0}'.format(self.cuttimes[0])
ylabel = ''
zne_text = {'Z':'vertical', 'N':'north-south', 'E':'east-west'}
title = 'overview: {0} components'.format(zne_text[self.getComp()])
widget.updateWidget(xlabel, ylabel, title)
def getComp(self):
return self.comp
def getID(self): def getID(self):
try: try:
@ -112,6 +138,10 @@ class Data(object):
for fname in fnames: for fname in fnames:
self.wfdata += read(fname) self.wfdata += read(fname)
def appenWFData(self, fnames):
for fname in fnames:
self.wfdata += read(fname)
def getWFData(self): def getWFData(self):
return self.wfdata return self.wfdata