Merge branch 'feature/obspy_dmt_interface' into develop
This commit is contained in:
@@ -15,7 +15,7 @@ from pylot.core.util.event import Event
|
||||
from pylot.core.util.utils import fnConstructor, full_range, remove_underscores, check4gaps, check4doubled, \
|
||||
check4rotated, trim_station_components
|
||||
import pylot.core.loc.velest as velest
|
||||
|
||||
from pylot.core.util.obspyDMT_interface import qml_from_obspyDMT
|
||||
|
||||
class Data(object):
|
||||
"""
|
||||
@@ -60,6 +60,8 @@ class Data(object):
|
||||
raise NotImplementedError('PILOT location information '
|
||||
'read support not yet '
|
||||
'implemeted.')
|
||||
elif 'event.pkl' in evtdata:
|
||||
evtdata = qml_from_obspyDMT(evtdata)
|
||||
else:
|
||||
raise e
|
||||
else:
|
||||
@@ -72,6 +74,7 @@ class Data(object):
|
||||
self.wforiginal = None
|
||||
self.cuttimes = None
|
||||
self.dirty = False
|
||||
self.processed = None
|
||||
|
||||
def __str__(self):
|
||||
return str(self.wfdata)
|
||||
@@ -379,8 +382,14 @@ class Data(object):
|
||||
self.wfsyn = Stream()
|
||||
wffnames = None
|
||||
wffnames_syn = None
|
||||
wfdir = 'processed' if 'processed' in [fname.split('/')[-1] for fname in fnames] else 'raw'
|
||||
if obspy_dmt:
|
||||
wfdir = 'raw'
|
||||
self.processed = False
|
||||
for fname in fnames:
|
||||
if fname.endswith('processed'):
|
||||
wfdir = 'processed'
|
||||
self.processed = True
|
||||
break
|
||||
for fpath in fnames:
|
||||
if fpath.endswith(wfdir):
|
||||
wffnames = [os.path.join(fpath, fname) for fname in os.listdir(fpath)]
|
||||
@@ -398,9 +407,6 @@ class Data(object):
|
||||
# various pre-processing steps:
|
||||
# remove possible underscores in station names
|
||||
self.wfdata = remove_underscores(self.wfdata)
|
||||
# check for gaps and doubled channels
|
||||
check4gaps(self.wfdata)
|
||||
check4doubled(self.wfdata)
|
||||
# check for stations with rotated components
|
||||
if checkRotated and metadata is not None:
|
||||
self.wfdata = check4rotated(self.wfdata, metadata, verbosity=0)
|
||||
|
||||
@@ -7,6 +7,7 @@ from obspy import UTCDateTime
|
||||
from obspy.core.event import Event as ObsPyEvent
|
||||
from obspy.core.event import Origin, ResourceIdentifier
|
||||
from pylot.core.io.phases import picks_from_picksdict
|
||||
from pylot.core.util.obspyDMT_interface import qml_from_obspyDMT
|
||||
|
||||
|
||||
class Event(ObsPyEvent):
|
||||
@@ -33,6 +34,7 @@ class Event(ObsPyEvent):
|
||||
self._testEvent = False
|
||||
self._refEvent = False
|
||||
self.get_notes()
|
||||
self.get_obspy_event_info()
|
||||
|
||||
def get_notes_path(self):
|
||||
"""
|
||||
@@ -43,6 +45,18 @@ class Event(ObsPyEvent):
|
||||
notesfile = os.path.join(self.path, 'notes.txt')
|
||||
return notesfile
|
||||
|
||||
def get_obspy_event_info(self):
|
||||
infile_pickle = os.path.join(self.path, 'info/event.pkl')
|
||||
if not os.path.isfile(infile_pickle):
|
||||
return
|
||||
try:
|
||||
event_dmt = qml_from_obspyDMT(infile_pickle)
|
||||
except Exception as e:
|
||||
print('Could not get obspy event info: {}'.format(e))
|
||||
return
|
||||
self.magnitudes = event_dmt.magnitudes
|
||||
self.origins = event_dmt.origins
|
||||
|
||||
def get_notes(self):
|
||||
"""
|
||||
set self.note attribute to content of notes file
|
||||
|
||||
@@ -25,4 +25,20 @@ def check_obspydmt_eventfolder(folder):
|
||||
except Exception as e:
|
||||
return False, e
|
||||
|
||||
check_obspydmt_eventfolder('20110311_054623.a')
|
||||
def qml_from_obspyDMT(path):
|
||||
import pickle
|
||||
from obspy.core.event import Event, Magnitude, Origin
|
||||
|
||||
if not os.path.exists(path):
|
||||
return IOError('Could not find Event at {}'.format(path))
|
||||
infile = open(path, 'rb')
|
||||
event_dmt = pickle.load(infile)
|
||||
ev = Event(resource_id=event_dmt['event_id'])
|
||||
origin = Origin(resource_id=event_dmt['origin_id'], time=event_dmt['datetime'], longitude=event_dmt['longitude'],
|
||||
latitude=event_dmt['latitude'], depth=event_dmt['depth'])
|
||||
mag = Magnitude(mag=event_dmt['magnitude'], magnitude_type=event_dmt['magnitude_type'],
|
||||
origin_id=event_dmt['origin_id'])
|
||||
ev.magnitudes.append(mag)
|
||||
ev.origins.append(origin)
|
||||
return ev
|
||||
|
||||
|
||||
@@ -447,23 +447,25 @@ class WaveformWidgetPG(QtGui.QWidget):
|
||||
self.orig_parent = parent
|
||||
# attribute plotdict is a dictionary connecting position and a name
|
||||
self.plotdict = dict()
|
||||
# init labels
|
||||
self.xlabel = None
|
||||
self.ylabel = None
|
||||
self.title = None
|
||||
# create plot
|
||||
self.main_layout = QtGui.QVBoxLayout()
|
||||
self.label_layout = QtGui.QHBoxLayout()
|
||||
self.status_label = QtGui.QLabel()
|
||||
self.perm_label = QtGui.QLabel()
|
||||
self.setLayout(self.main_layout)
|
||||
self.add_labels()
|
||||
self.plotWidget = self.pg.PlotWidget(self.parent(), title=title)
|
||||
self.main_layout.addWidget(self.plotWidget)
|
||||
self.main_layout.addLayout(self.label_layout)
|
||||
self.label_layout.addWidget(self.status_label)
|
||||
self.label_layout.addWidget(self.perm_label)
|
||||
self.label_layout.addWidget(self.perm_label_mid)
|
||||
self.label_layout.addWidget(self.perm_label_right)
|
||||
self.plotWidget.showGrid(x=False, y=True, alpha=0.3)
|
||||
self.plotWidget.hideAxis('bottom')
|
||||
self.plotWidget.hideAxis('left')
|
||||
self.wfstart, self.wfend = 0, 0
|
||||
self.pen_multicursor = self.pg.mkPen(self.parent()._style['multicursor']['rgba'])
|
||||
self.pen_linecolor = self.pg.mkPen(self.parent()._style['linecolor']['rgba'])
|
||||
self.pen_linecolor_highlight = self.pg.mkPen((255, 100, 100, 255))
|
||||
self.pen_linecolor_syn = self.pg.mkPen((100, 0, 255, 255))
|
||||
self.reinitMoveProxy()
|
||||
self._proxy = self.pg.SignalProxy(self.plotWidget.scene().sigMouseMoved, rateLimit=60, slot=self.mouseMoved)
|
||||
@@ -489,12 +491,24 @@ class WaveformWidgetPG(QtGui.QWidget):
|
||||
self.vLine.setPos(mousePoint.x())
|
||||
self.hLine.setPos(mousePoint.y())
|
||||
|
||||
def add_labels(self):
|
||||
self.status_label = QtGui.QLabel()
|
||||
self.perm_label_mid = QtGui.QLabel()
|
||||
self.perm_label_mid.setAlignment(4)
|
||||
self.perm_label_right = QtGui.QLabel()
|
||||
self.perm_label_right.setAlignment(2)
|
||||
self.setLayout(self.main_layout)
|
||||
|
||||
def getPlotDict(self):
|
||||
return self.plotdict
|
||||
|
||||
def setPermText(self, text=None, color='black'):
|
||||
self.perm_label.setText(text)
|
||||
self.perm_label.setStyleSheet('color: {}'.format(color))
|
||||
def setPermTextMid(self, text=None, color='black'):
|
||||
self.perm_label_mid.setText(text)
|
||||
self.perm_label_mid.setStyleSheet('color: {}'.format(color))
|
||||
|
||||
def setPermTextRight(self, text=None, color='black'):
|
||||
self.perm_label_right.setText(text)
|
||||
self.perm_label_right.setStyleSheet('color: {}'.format(color))
|
||||
|
||||
def setPlotDict(self, key, value):
|
||||
self.plotdict[key] = value
|
||||
@@ -529,6 +543,14 @@ class WaveformWidgetPG(QtGui.QWidget):
|
||||
else:
|
||||
st_select = wfdata
|
||||
|
||||
gaps = st_select.get_gaps()
|
||||
if gaps:
|
||||
merged = ['{}.{}.{}.{}'.format(*gap[:4]) for gap in gaps]
|
||||
st_select.merge()
|
||||
print('Merged the following stations because of gaps:')
|
||||
for merged_station in merged:
|
||||
print(merged_station)
|
||||
|
||||
# list containing tuples of network, station, channel (for sorting)
|
||||
nsc = []
|
||||
for trace in st_select:
|
||||
@@ -552,6 +574,8 @@ class WaveformWidgetPG(QtGui.QWidget):
|
||||
st_syn = wfsyn.select(network=network, station=station, channel=channel)
|
||||
if st_syn:
|
||||
trace_syn = st_syn[0].copy()
|
||||
else:
|
||||
trace_syn = Trace()
|
||||
if mapping:
|
||||
comp = channel[-1]
|
||||
n = compclass.getPlotPosition(str(comp))
|
||||
@@ -568,9 +592,11 @@ class WaveformWidgetPG(QtGui.QWidget):
|
||||
time_ax_syn = prepTimeAxis(stime_syn, trace_syn)
|
||||
|
||||
if method == 'fast':
|
||||
trace.data, time_ax = self.minMax(trace, time_ax)
|
||||
trace.data, time_ax = self.minMax(trace, time_ax)
|
||||
if trace_syn:
|
||||
trace_syn.data, time_ax_syn = self.minMax(trace_syn, time_ax_syn)
|
||||
|
||||
if time_ax not in [None, []]:
|
||||
if len(time_ax) > 0:
|
||||
if not scaleddata:
|
||||
trace.detrend('constant')
|
||||
trace.normalize(np.max(np.abs(trace.data)) * 2)
|
||||
@@ -581,16 +607,16 @@ class WaveformWidgetPG(QtGui.QWidget):
|
||||
times = np.array([time for index, time in enumerate(time_ax) if not index % nth_sample])
|
||||
times_syn = np.array([time for index, time in enumerate(time_ax_syn) if not index % nth_sample] if st_syn else [])
|
||||
trace.data = np.array([datum + n for index, datum in enumerate(trace.data) if not index % nth_sample])
|
||||
trace.data_syn = np.array([datum + n for index, datum in enumerate(trace.data_syn)
|
||||
trace_syn.data = np.array([datum + n for index, datum in enumerate(trace_syn.data)
|
||||
if not index % nth_sample] if st_syn else [])
|
||||
plots.append((times, trace.data,
|
||||
times_syn, trace.data_syn))
|
||||
times_syn, trace_syn.data))
|
||||
self.setPlotDict(n, (station, channel, network))
|
||||
self.xlabel = 'seconds since {0}'.format(self.wfstart)
|
||||
self.ylabel = ''
|
||||
self.setXLims([0, self.wfend - self.wfstart])
|
||||
self.setYLims([0.5, nmax + 0.5])
|
||||
return plots
|
||||
return plots, gaps
|
||||
|
||||
def minMax(self, trace, time_ax):
|
||||
'''
|
||||
@@ -1013,6 +1039,14 @@ class PylotCanvas(FigureCanvas):
|
||||
if mapping:
|
||||
plot_positions = self.calcPlotPositions(st_select, compclass)
|
||||
|
||||
gaps = st_select.get_gaps()
|
||||
if gaps:
|
||||
merged = ['{}.{}.{}.{}'.format(*gap[:4]) for gap in gaps]
|
||||
st_select.merge()
|
||||
print('Merged the following stations because of gaps:')
|
||||
for merged_station in merged:
|
||||
print(merged_station)
|
||||
|
||||
# list containing tuples of network, station, channel and plot position (for sorting)
|
||||
nsc = []
|
||||
for plot_pos, trace in enumerate(st_select):
|
||||
|
||||
Reference in New Issue
Block a user