From 366db9aef01e16b278751f6ea7c16755f742fa7c Mon Sep 17 00:00:00 2001 From: Marcel Date: Wed, 4 Apr 2018 14:57:54 +0200 Subject: [PATCH] [initial] first changes to supply an interface to an obspyDMT database --- PyLoT.py | 26 +++++++++++----- pylot/RELEASE-VERSION | 2 +- pylot/core/util/obspyDMT_interface.py | 28 +++++++++++++++++ pylot/core/util/structure.py | 2 +- pylot/core/util/utils.py | 43 +++++++++++++++++++++++++++ 5 files changed, 92 insertions(+), 9 deletions(-) create mode 100644 pylot/core/util/obspyDMT_interface.py diff --git a/PyLoT.py b/PyLoT.py index fc1cf229..7993a4e7 100755 --- a/PyLoT.py +++ b/PyLoT.py @@ -46,6 +46,9 @@ from obspy import UTCDateTime from obspy.core.event import Magnitude, Origin from obspy.core.util import AttribDict +from pylot.core.util.obspyDMT_interface import check_obspydmt_structure + + try: import pyqtgraph as pg except Exception as e: @@ -75,7 +78,8 @@ from pylot.core.util.dataprocessing import read_metadata, restitute_data from pylot.core.util.utils import fnConstructor, getLogin, \ full_range, readFilterInformation, trim_station_components, check4gaps, make_pen, pick_color_plt, \ pick_linestyle_plt, remove_underscores, check4doubled, identifyPhaseID, excludeQualityClasses, has_spe, \ - check4rotated, transform_colors_mpl, transform_colors_mpl_str, getAutoFilteroptions + check4rotated, transform_colors_mpl, transform_colors_mpl_str, getAutoFilteroptions, check_all_obspy, \ + check_all_pylot from pylot.core.util.event import Event from pylot.core.io.location import create_creation_info, create_event from pylot.core.util.widgets import FilterOptionsDialog, NewEventDlg, \ @@ -987,8 +991,14 @@ class MainWindow(QMainWindow): ''' Return waveform filenames from event in eventbox. ''' + # TODO: add dataStructure class for obspyDMT here, this is just a workaround! + eventpath = self.get_current_event_path(eventbox) + basepath = eventpath.split(os.path.basename(eventpath))[0] + if check_obspydmt_structure(basepath): + directory = os.path.join(eventpath, 'raw') + else: + directory = eventpath if self.dataStructure: - directory = self.get_current_event_path(eventbox) if not directory: return fnames = [os.path.join(directory, f) for f in os.listdir(directory)] @@ -1036,13 +1046,15 @@ class MainWindow(QMainWindow): ed = getExistingDirectories(self, 'Select event directories...') if ed.exec_(): eventlist = ed.selectedFiles() - # select only folders that start with 'e', containin two dots and have length 12 - eventlist = [item for item in eventlist if item.split('/')[-1].startswith('e') - and len(item.split('/')[-1].split('.')) == 3 - and len(item.split('/')[-1]) == 12] + basepath = eventlist[0].split(os.path.basename(eventlist[0]))[0] + if check_obspydmt_structure(basepath): + print('Recognized obspyDMT structure in selected files.') + eventlist = check_all_obspy(eventlist) + else: + eventlist = check_all_pylot(eventlist) if not eventlist: print('No events found! Expected structure for event folders: [eEVID.DOY.YR],\n' - ' e.g. eventID=1, doy=2, yr=2016: e0001.002.16') + ' e.g. eventID=1, doy=2, yr=2016: e0001.002.16 or obspyDMT database') return else: return diff --git a/pylot/RELEASE-VERSION b/pylot/RELEASE-VERSION index c687e0f2..ba9652dc 100644 --- a/pylot/RELEASE-VERSION +++ b/pylot/RELEASE-VERSION @@ -1 +1 @@ -39f92-dirty +7941-dirty diff --git a/pylot/core/util/obspyDMT_interface.py b/pylot/core/util/obspyDMT_interface.py new file mode 100644 index 00000000..661e4f5b --- /dev/null +++ b/pylot/core/util/obspyDMT_interface.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +from obspy import UTCDateTime + +def check_obspydmt_structure(path): + ''' + Check path for obspyDMT event structure. + :param path: + :return: + ''' + ev_info = os.path.join(path, 'EVENTS-INFO') + if os.path.isdir(ev_info): + if os.path.isfile(os.path.join(ev_info, 'logger_command.txt')): + return True + return False + +def check_obspydmt_eventfolder(folder): + try: + time = folder.split('.')[0] + time = time.replace('_', 'T') + time = UTCDateTime(time) + return True, time + except Exception as e: + return False, e + +check_obspydmt_eventfolder('20110311_054623.a') \ No newline at end of file diff --git a/pylot/core/util/structure.py b/pylot/core/util/structure.py index 68a16552..f556eb7c 100644 --- a/pylot/core/util/structure.py +++ b/pylot/core/util/structure.py @@ -9,4 +9,4 @@ Created on Wed Jan 26 17:47:25 2015 from pylot.core.io.data import SeiscompDataStructure, PilotDataStructure DATASTRUCTURE = {'PILOT': PilotDataStructure, 'SeisComP': SeiscompDataStructure, - None: None} + 'obspyDMT': None, None: None} diff --git a/pylot/core/util/utils.py b/pylot/core/util/utils.py index 2c93286e..ba6656f7 100644 --- a/pylot/core/util/utils.py +++ b/pylot/core/util/utils.py @@ -6,6 +6,7 @@ import os import platform import re import subprocess +import warnings import numpy as np from obspy import UTCDateTime, read @@ -13,6 +14,8 @@ from obspy.core import AttribDict from obspy.signal.rotate import rotate2zne from obspy.io.xseed.utils import SEEDParserException +from pylot.core.util.obspyDMT_interface import check_obspydmt_eventfolder + from pylot.core.io.inputs import PylotParameter, FilterOptions from pylot.styles import style_settings @@ -1216,6 +1219,46 @@ def has_spe(pick): return pick['spe'] +def check_all_obspy(eventlist): + ev_type = 'obspydmt' + return check_event_folders(eventlist, ev_type) + + +def check_all_pylot(eventlist): + ev_type = 'pylot' + return check_event_folders(eventlist, ev_type) + + +def check_event_folders(eventlist, ev_type): + checklist = [] + clean_eventlist = [] + for path in eventlist: + folder_check = check_event_folder(path) + if not folder_check: + warnings.warn('Unrecognized event folder: {}'.format(path)) + continue + checklist.append(folder_check == ev_type) + clean_eventlist.append(path) + if all(checklist) or len(checklist) == 0: + return clean_eventlist + else: + warnings.warn('Not all selected folders of type {}'.format(ev_type)) + return [] + + +def check_event_folder(path): + ev_type = None + folder = path.split('/')[-1] + # for pylot: select only folders that start with 'e', containin two dots and have length 12 + if (folder.startswith('e') + and len(folder.split('.')) == 3 + and len(folder) == 12): + ev_type = 'pylot' + elif check_obspydmt_eventfolder(folder)[0]: + ev_type = 'obspydmt' + return ev_type + + if __name__ == "__main__": import doctest