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
|
pylot/RELEASE-VERSION
|
||||||
*.idea
|
*.idea
|
||||||
|
autopylot.sh*
|
||||||
|
36
PyLoT.py
36
PyLoT.py
@ -110,21 +110,8 @@ class MainWindow(QMainWindow):
|
|||||||
def __init__(self, parent=None, infile=None):
|
def __init__(self, parent=None, infile=None):
|
||||||
super(MainWindow, self).__init__(parent)
|
super(MainWindow, self).__init__(parent)
|
||||||
|
|
||||||
# check for default pylot.in-file
|
self.init_config_files(infile)
|
||||||
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')
|
|
||||||
|
|
||||||
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._props = None
|
||||||
|
|
||||||
self.dirty = False
|
self.dirty = False
|
||||||
@ -208,6 +195,22 @@ class MainWindow(QMainWindow):
|
|||||||
|
|
||||||
self.loc = False
|
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):
|
def setupUi(self):
|
||||||
try:
|
try:
|
||||||
self.startTime = min(
|
self.startTime = min(
|
||||||
@ -1058,9 +1061,12 @@ class MainWindow(QMainWindow):
|
|||||||
eventlist = ed.selectedFiles()
|
eventlist = ed.selectedFiles()
|
||||||
basepath = eventlist[0].split(os.path.basename(eventlist[0]))[0]
|
basepath = eventlist[0].split(os.path.basename(eventlist[0]))[0]
|
||||||
if check_obspydmt_structure(basepath):
|
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)
|
eventlist = check_all_obspy(eventlist)
|
||||||
else:
|
else:
|
||||||
|
print('Settings Datastructure to PILOT')
|
||||||
|
self.dataStructure = DATASTRUCTURE['PILOT']()
|
||||||
eventlist = check_all_pylot(eventlist)
|
eventlist = check_all_pylot(eventlist)
|
||||||
if not eventlist:
|
if not eventlist:
|
||||||
print('No events found! Expected structure for event folders: [eEVID.DOY.YR],\n'
|
print('No events found! Expected structure for event folders: [eEVID.DOY.YR],\n'
|
||||||
|
@ -733,6 +733,22 @@ class PilotDataStructure(GenericDataStructure):
|
|||||||
self.setExpandFields(['root', 'database'])
|
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):
|
class SeiscompDataStructure(GenericDataStructure):
|
||||||
"""
|
"""
|
||||||
Dictionary containing the data access information for an SDS data archive:
|
Dictionary containing the data access information for an SDS data archive:
|
||||||
|
@ -63,7 +63,7 @@ defaults = {'rootpath': {'type': str,
|
|||||||
|
|
||||||
'ctrfile': {'type': str,
|
'ctrfile': {'type': str,
|
||||||
'tooltip': 'name of autoPyLoT-output control file for NLLoc',
|
'tooltip': 'name of autoPyLoT-output control file for NLLoc',
|
||||||
'value': 'Insheim_min1d2015_auto.in',
|
'value': '',
|
||||||
'namestring': 'Control filename'},
|
'namestring': 'Control filename'},
|
||||||
|
|
||||||
'ttpatter': {'type': str,
|
'ttpatter': {'type': str,
|
||||||
|
@ -48,6 +48,7 @@ class PylotParameter(object):
|
|||||||
self.__init_default_paras()
|
self.__init_default_paras()
|
||||||
self.__init_subsettings()
|
self.__init_subsettings()
|
||||||
self.__filename = fnin
|
self.__filename = fnin
|
||||||
|
self.__parameter = {}
|
||||||
self._verbosity = verbosity
|
self._verbosity = verbosity
|
||||||
self._parFileCont = {}
|
self._parFileCont = {}
|
||||||
# io from parsed arguments alternatively
|
# io from parsed arguments alternatively
|
||||||
@ -273,8 +274,8 @@ class PylotParameter(object):
|
|||||||
:rtype: None
|
:rtype: None
|
||||||
"""
|
"""
|
||||||
defaults = self.get_defaults()
|
defaults = self.get_defaults()
|
||||||
for param in defaults:
|
for param_name, param in defaults.items():
|
||||||
self.setParamKV(param, defaults[param]['value'])
|
self.setParamKV(param_name, param['value'])
|
||||||
|
|
||||||
def from_file(self, fnin=None):
|
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)
|
#result = serial_picking(input_tuples)
|
||||||
|
|
||||||
for pick in result:
|
for pick in result:
|
||||||
if pick:
|
if type(pick) == BaseException:
|
||||||
|
print(pick)
|
||||||
|
elif pick:
|
||||||
station = pick['station']
|
station = pick['station']
|
||||||
pick.pop('station')
|
pick.pop('station')
|
||||||
all_onsets[station] = pick
|
all_onsets[station] = pick
|
||||||
@ -130,7 +132,10 @@ def call_autopickstation(input_tuple):
|
|||||||
"""
|
"""
|
||||||
wfstream, pickparam, verbose, metadata, origin = input_tuple
|
wfstream, pickparam, verbose, metadata, origin = input_tuple
|
||||||
# multiprocessing not possible with interactive plotting
|
# multiprocessing not possible with interactive plotting
|
||||||
|
try:
|
||||||
return autopickstation(wfstream, pickparam, verbose, iplot=0, metadata=metadata, origin=origin)
|
return autopickstation(wfstream, pickparam, verbose, iplot=0, metadata=metadata, origin=origin)
|
||||||
|
except Exception as e:
|
||||||
|
return e
|
||||||
|
|
||||||
|
|
||||||
def get_source_coords(parser, station_id):
|
def get_source_coords(parser, station_id):
|
||||||
|
@ -6,7 +6,7 @@ Created on Wed Jan 26 17:47:25 2015
|
|||||||
@author: sebastianw
|
@author: sebastianw
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from pylot.core.io.data import SeiscompDataStructure, PilotDataStructure
|
from pylot.core.io.data import SeiscompDataStructure, PilotDataStructure, ObspyDMTdataStructure
|
||||||
|
|
||||||
DATASTRUCTURE = {'PILOT': PilotDataStructure, 'SeisComP': SeiscompDataStructure,
|
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