Merge branch 'develop' into feature/metadata_class
This commit is contained in:
commit
afade77922
1
.gitignore
vendored
1
.gitignore
vendored
@ -2,3 +2,4 @@
|
||||
*~
|
||||
pylot/RELEASE-VERSION
|
||||
*.idea
|
||||
autopylot.sh*
|
||||
|
36
PyLoT.py
36
PyLoT.py
@ -110,21 +110,8 @@ class MainWindow(QMainWindow):
|
||||
def __init__(self, parent=None, infile=None):
|
||||
super(MainWindow, self).__init__(parent)
|
||||
|
||||
# check for default pylot.in-file
|
||||
if not infile:
|
||||
infile = os.path.join(os.path.expanduser('~'), '.pylot', 'pylot.in')
|
||||
print('Using default input file {}'.format(infile))
|
||||
if os.path.isfile(infile) == False:
|
||||
infile = QFileDialog().getOpenFileName(caption='Choose PyLoT-input file')
|
||||
self.init_config_files(infile)
|
||||
|
||||
if not os.path.exists(infile[0]):
|
||||
QMessageBox.warning(self, "PyLoT Warning",
|
||||
"No PyLoT-input file declared!")
|
||||
sys.exit(0)
|
||||
self.infile = infile[0]
|
||||
else:
|
||||
self.infile = infile
|
||||
self._inputs = PylotParameter(infile)
|
||||
self._props = None
|
||||
|
||||
self.dirty = False
|
||||
@ -208,6 +195,22 @@ class MainWindow(QMainWindow):
|
||||
|
||||
self.loc = False
|
||||
|
||||
|
||||
def init_config_files(self, infile):
|
||||
pylot_config_dir = os.path.join(os.path.expanduser('~'), '.pylot')
|
||||
if not os.path.exists(pylot_config_dir):
|
||||
os.mkdir(pylot_config_dir)
|
||||
|
||||
self._inputs = PylotParameter(infile)
|
||||
if not infile:
|
||||
self._inputs.reset_defaults()
|
||||
# check for default pylot.in-file
|
||||
infile = os.path.join(pylot_config_dir, '.pylot.in')
|
||||
print('Using default input file {}'.format(infile))
|
||||
self._inputs.export2File(infile)
|
||||
self.infile = infile
|
||||
|
||||
|
||||
def setupUi(self):
|
||||
try:
|
||||
self.startTime = min(
|
||||
@ -1058,9 +1061,12 @@ class MainWindow(QMainWindow):
|
||||
eventlist = ed.selectedFiles()
|
||||
basepath = eventlist[0].split(os.path.basename(eventlist[0]))[0]
|
||||
if check_obspydmt_structure(basepath):
|
||||
print('Recognized obspyDMT structure in selected files.')
|
||||
print('Recognized obspyDMT structure in selected files. Settings Datastructure to ObspyDMT')
|
||||
self.dataStructure = DATASTRUCTURE['obspyDMT']()
|
||||
eventlist = check_all_obspy(eventlist)
|
||||
else:
|
||||
print('Settings Datastructure to PILOT')
|
||||
self.dataStructure = DATASTRUCTURE['PILOT']()
|
||||
eventlist = check_all_pylot(eventlist)
|
||||
if not eventlist:
|
||||
print('No events found! Expected structure for event folders: [eEVID.DOY.YR],\n'
|
||||
|
@ -733,6 +733,22 @@ class PilotDataStructure(GenericDataStructure):
|
||||
self.setExpandFields(['root', 'database'])
|
||||
|
||||
|
||||
class ObspyDMTdataStructure(GenericDataStructure):
|
||||
"""
|
||||
Object containing the data access information for the old PILOT data
|
||||
structure.
|
||||
"""
|
||||
|
||||
def __init__(self, **fields):
|
||||
if not fields:
|
||||
fields = {'database': '',
|
||||
'root': ''}
|
||||
|
||||
GenericDataStructure.__init__(self, **fields)
|
||||
|
||||
self.setExpandFields(['root', 'database'])
|
||||
|
||||
|
||||
class SeiscompDataStructure(GenericDataStructure):
|
||||
"""
|
||||
Dictionary containing the data access information for an SDS data archive:
|
||||
|
@ -63,7 +63,7 @@ defaults = {'rootpath': {'type': str,
|
||||
|
||||
'ctrfile': {'type': str,
|
||||
'tooltip': 'name of autoPyLoT-output control file for NLLoc',
|
||||
'value': 'Insheim_min1d2015_auto.in',
|
||||
'value': '',
|
||||
'namestring': 'Control filename'},
|
||||
|
||||
'ttpatter': {'type': str,
|
||||
|
@ -48,6 +48,7 @@ class PylotParameter(object):
|
||||
self.__init_default_paras()
|
||||
self.__init_subsettings()
|
||||
self.__filename = fnin
|
||||
self.__parameter = {}
|
||||
self._verbosity = verbosity
|
||||
self._parFileCont = {}
|
||||
# io from parsed arguments alternatively
|
||||
@ -273,8 +274,8 @@ class PylotParameter(object):
|
||||
:rtype: None
|
||||
"""
|
||||
defaults = self.get_defaults()
|
||||
for param in defaults:
|
||||
self.setParamKV(param, defaults[param]['value'])
|
||||
for param_name, param in defaults.items():
|
||||
self.setParamKV(param_name, param['value'])
|
||||
|
||||
def from_file(self, fnin=None):
|
||||
"""
|
||||
|
@ -93,7 +93,9 @@ def autopickevent(data, param, iplot=0, fig_dict=None, fig_dict_wadatijack=None,
|
||||
#result = serial_picking(input_tuples)
|
||||
|
||||
for pick in result:
|
||||
if pick:
|
||||
if type(pick) == BaseException:
|
||||
print(pick)
|
||||
elif pick:
|
||||
station = pick['station']
|
||||
pick.pop('station')
|
||||
all_onsets[station] = pick
|
||||
@ -130,7 +132,10 @@ def call_autopickstation(input_tuple):
|
||||
"""
|
||||
wfstream, pickparam, verbose, metadata, origin = input_tuple
|
||||
# multiprocessing not possible with interactive plotting
|
||||
try:
|
||||
return autopickstation(wfstream, pickparam, verbose, iplot=0, metadata=metadata, origin=origin)
|
||||
except Exception as e:
|
||||
return e
|
||||
|
||||
|
||||
def get_source_coords(parser, station_id):
|
||||
|
@ -6,7 +6,7 @@ Created on Wed Jan 26 17:47:25 2015
|
||||
@author: sebastianw
|
||||
"""
|
||||
|
||||
from pylot.core.io.data import SeiscompDataStructure, PilotDataStructure
|
||||
from pylot.core.io.data import SeiscompDataStructure, PilotDataStructure, ObspyDMTdataStructure
|
||||
|
||||
DATASTRUCTURE = {'PILOT': PilotDataStructure, 'SeisComP': SeiscompDataStructure,
|
||||
'obspyDMT': None, None: None}
|
||||
'obspyDMT': ObspyDMTdataStructure, None: PilotDataStructure}
|
||||
|
1
tests/test_Metadata/metadata1/DATALESS.BW.WETR..HHE
Normal file
1
tests/test_Metadata/metadata1/DATALESS.BW.WETR..HHE
Normal file
File diff suppressed because one or more lines are too long
1
tests/test_Metadata/metadata1/DATALESS.BW.WETR..HHN
Normal file
1
tests/test_Metadata/metadata1/DATALESS.BW.WETR..HHN
Normal file
File diff suppressed because one or more lines are too long
1
tests/test_Metadata/metadata1/DATALESS.BW.WETR..HHZ
Normal file
1
tests/test_Metadata/metadata1/DATALESS.BW.WETR..HHZ
Normal file
File diff suppressed because one or more lines are too long
1
tests/test_Metadata/metadata2/DATALESS.GR.GRA1..HHE
Normal file
1
tests/test_Metadata/metadata2/DATALESS.GR.GRA1..HHE
Normal file
File diff suppressed because one or more lines are too long
1
tests/test_Metadata/metadata2/DATALESS.GR.GRA1..HHN
Normal file
1
tests/test_Metadata/metadata2/DATALESS.GR.GRA1..HHN
Normal file
File diff suppressed because one or more lines are too long
1
tests/test_Metadata/metadata2/DATALESS.GR.GRA1..HHZ
Normal file
1
tests/test_Metadata/metadata2/DATALESS.GR.GRA1..HHZ
Normal file
File diff suppressed because one or more lines are too long
1
tests/test_Metadata/metadata2/DATALESS.GR.GRA2..HHE
Normal file
1
tests/test_Metadata/metadata2/DATALESS.GR.GRA2..HHE
Normal file
File diff suppressed because one or more lines are too long
1
tests/test_Metadata/metadata2/DATALESS.GR.GRA2..HHN
Normal file
1
tests/test_Metadata/metadata2/DATALESS.GR.GRA2..HHN
Normal file
File diff suppressed because one or more lines are too long
1
tests/test_Metadata/metadata2/DATALESS.GR.GRA2..HHZ
Normal file
1
tests/test_Metadata/metadata2/DATALESS.GR.GRA2..HHZ
Normal file
File diff suppressed because one or more lines are too long
104
tests/test_Metadata/test_Metadata.py
Normal file
104
tests/test_Metadata/test_Metadata.py
Normal file
@ -0,0 +1,104 @@
|
||||
import unittest
|
||||
import os
|
||||
|
||||
from pylot.core.util.dataprocessing import Metadata
|
||||
|
||||
class TestMetadata(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.station_id = 'BW.WETR..HH'
|
||||
metadata_folder = 'metadata1'
|
||||
self.m = Metadata(metadata_folder)
|
||||
|
||||
def test_get_coordinates_sucess(self):
|
||||
expected = {'Z': {u'elevation': 607.0, u'longitude': 12.87571, u'local_depth': 0.0, u'azimuth': 0.0, u'latitude': 49.14502, u'dip': -90.0},
|
||||
'E': {u'azimuth': 90.0, u'dip': 0.0, u'elevation': 607.0, u'latitude': 49.14502, u'local_depth': 0.0, u'longitude': 12.87571},
|
||||
'N': {u'azimuth': 0.0, u'dip': 0.0, u'elevation': 607.0, u'latitude': 49.14502, u'local_depth': 0.0, u'longitude': 12.87571}
|
||||
}
|
||||
result = {}
|
||||
for channel in ('Z', 'N', 'E'):
|
||||
coords = self.m.get_coordinates(self.station_id+channel)
|
||||
result[channel] = coords
|
||||
self.assertDictEqual(result[channel], expected[channel])
|
||||
|
||||
class TestMetadataAdding(unittest.TestCase):
|
||||
"""Tests if adding files and directories to a metadata object works."""
|
||||
|
||||
def setUp(self):
|
||||
self.station_id = 'BW.WETR..HH'
|
||||
self.metadata_folders = ('metadata1', 'metadata2')
|
||||
self.m = Metadata()
|
||||
|
||||
def test_add_inventory_folder(self):
|
||||
"""Test if add_inventory adds the folder to the list of inventories"""
|
||||
self.m.add_inventory(self.metadata_folders[0])
|
||||
# adding an inventory folder should append it to the list of inventories
|
||||
self.assertDictEqual({}, self.m.inventory_files)
|
||||
self.assertDictEqual({}, self.m.seed_ids)
|
||||
self.assertEqual([self.metadata_folders[0]], self.m.inventories)
|
||||
|
||||
def test_add_inventory_file(self):
|
||||
"""Test if add_inventory_file adds the folder containing the file to the list of inventories and
|
||||
if the files is added to inventory_files"""
|
||||
fpath = os.path.join(self.metadata_folders[0], 'DATALESS.BW.WETR..HHZ')
|
||||
self.m.add_inventory_file(fpath)
|
||||
# adding an inventory file should append its folder to the list of inventories and the file to the
|
||||
self.assertEqual(['metadata1/DATALESS.BW.WETR..HHZ'], self.m.inventory_files.keys()) # does the filename exist in inventory files?
|
||||
self.assertEqual(['data', 'invtype'], self.m.inventory_files['metadata1/DATALESS.BW.WETR..HHZ'].keys()) # is the required information attacht to the filename?
|
||||
self.assertDictEqual({}, self.m.seed_ids)
|
||||
self.assertEqual([self.metadata_folders[0]], self.m.inventories)
|
||||
|
||||
def test_add_inventory_invalid_path(self):
|
||||
"""Test if adding an inventory that is not an existing directory fails with an exception"""
|
||||
with self.assertRaises(Exception):
|
||||
self.m.add_inventory('InvalidDirName')
|
||||
self.assertEqual([], self.m.inventories) # inventory list should still be empty
|
||||
|
||||
def test_add_inventory_file_invalid_path(self):
|
||||
"""Test if adding a inventory file with an invalid path fails with an exception"""
|
||||
with self.assertRaises(Exception):
|
||||
self.m.add_inventory_file('/invalid/file/name')
|
||||
self.assertEqual([], self.m.inventories) # inventory list should still be empty
|
||||
|
||||
|
||||
class TestMetadataRemoval(unittest.TestCase):
|
||||
"""Tests if removing files and directories to a metadata object works."""
|
||||
|
||||
def setUp(self):
|
||||
self.station_id = 'BW.WETR..HH'
|
||||
self.metadata_folders = ('metadata1', 'metadata2')
|
||||
self.m = Metadata()
|
||||
|
||||
def test_remove_all_inventories(self):
|
||||
"""Test if function remove_inventory cleans the Metadata object """
|
||||
# add multiple inventories
|
||||
for folder in self.metadata_folders:
|
||||
self.m.add_inventory(folder)
|
||||
self.m.remove_all_inventories()
|
||||
self.isEmpty(self.m)
|
||||
|
||||
def test_remove_inventory(self):
|
||||
"""Test if remove_inventory removes single inventories"""
|
||||
# add multiple inventories
|
||||
for folder in self.metadata_folders:
|
||||
self.m.add_inventory(folder)
|
||||
self.m.remove_inventory(self.metadata_folders[0])
|
||||
self.assertNotIn(self.metadata_folders[0], self.m.inventories)
|
||||
self.m.remove_inventory(self.metadata_folders[1])
|
||||
self.assertNotIn(self.metadata_folders[1], self.m.inventories)
|
||||
self.isEmpty(self.m)
|
||||
|
||||
def test_remove_inventory_not_in_inventory_list(self):
|
||||
"""Test if remove_inventory does not modify the metadata instance if the given inventory to remove does not
|
||||
exist in the instance."""
|
||||
# add multiple inventories
|
||||
self.m.add_inventory(self.metadata_folders[0])
|
||||
self.m.remove_inventory('metadata_not_existing')
|
||||
self.assertIn(self.metadata_folders[0], self.m.inventories)
|
||||
|
||||
def isEmpty(self, metadata):
|
||||
"""Asserts if the given metadata object is empty"""
|
||||
self.assertDictEqual({}, metadata.inventory_files)
|
||||
self.assertDictEqual({}, metadata.seed_ids)
|
||||
self.assertEqual([], metadata.inventories)
|
||||
|
Loading…
Reference in New Issue
Block a user