class Seishub(GUIElement): """ Class that handles all waveform reading and transforming operations. """ def __init__(self, *args, **kwargs): """ Prepare the object. """ super(Seishub, self).__init__(self, **kwargs) # Set some class variables. self.server = self.env.seishub_server self.cache_dir = self.env.cache_dir self.pickle_file = os.path.join(self.cache_dir, 'pickle_dict') # Connect to server. self.connectToServer() # Load the Index of the SeisHub Server. self.getIndex() # Write to environment. Delete the unnecessary keys. del self.networks['Date'] del self.networks['Server'] self.env.networks = self.networks def getPreview(self, network, station, location, channel, starttime, endtime): if not starttime: starttime = self.win.starttime if not endtime: endtime = self.win.endtime if self.env.debug: print '===========================================================' print 'Requesting %s.%s.%s.%s' % \ (network, station, location, channel) print ' * from %s-%s' % (starttime, endtime) print ' * SeisHub Server = %s' % self.env.seishub_server stream = self.client.waveform.getPreview(network, station, location, channel, starttime, endtime) if self.env.debug: print '' print ' * Received from Seishub:' print stream print '===========================================================' return stream def connectToServer(self): """ Connects to the SeisHub server. """ self.client = Client(base_url = self.server) self.ping() def ping(self): """ Ping the server. """ try: self.client.ping() except: msg = 'No connection to SeisHub server %s' % self.server self.win.default_error = msg def getIndex(self): """ Gets the index if not available or reads the pickled file. """ # Create Cache path if it does not exist. if not os.path.exists(self.cache_dir): os.mkdir(self.cache_dir) if not os.path.exists(self.pickle_file): self.reload_infos() # Read the dict. file = open(self.pickle_file, 'r') self.networks = pickle.load(file) file.close() def reload_infos(self): """ Reads all available networks, stations, ... from the seishub server. """ self.networks = {} networks = self.client.waveform.getNetworkIds() # Get stations. for key in networks: if not key: continue self.networks[key] = {} stations = self.client.waveform.getStationIds(network_id=key) for station in stations: if not station: continue self.networks[key][station] = {} # Get locations. locations = self.client.waveform.getLocationIds(network_id=key, station_id=station) for location in locations: channels = self.client.waveform.getChannelIds(\ network_id=key , station_id=station, location_id=location) self.networks[key][station][location] = [channels] # Add current date to Dictionary. self.networks['Date'] = UTCDateTime() # Also add the server to it. self.networks['Server'] = self.client.base_url # Open file. file = open(self.pickle_file, 'wb') pickle.dump(self.networks, file, protocol = 2) file.close()
class ClientTestCase(unittest.TestCase): """ Test cases for the SeisHub client. """ def setUp(self): self.client = Client(TESTSERVER) # def test_getWaveformApplyFilter(self): # t = UTCDateTime("2009-09-03 00:00:00") # #1 - w/o apply_filter # st = self.client.waveform.getWaveform("BW", "RTPI", "", "EHZ", # t, t + 20, apply_filter=False) # self.assertEqual(len(st), 1) # self.assertEqual(st[0].stats.network, '') # self.assertEqual(st[0].stats.station, 'GP01') # self.assertEqual(st[0].stats.location, '') # self.assertEqual(st[0].stats.channel, 'SHZ') # #2 - w/ apply_filter # st = self.client.waveform.getWaveform("BW", "RTPI", "", "EHZ", # t, t + 20, apply_filter=True) # self.assertEqual(len(st), 1) # self.assertEqual(st[0].stats.network, 'BW') # self.assertEqual(st[0].stats.station, 'RTPI') # self.assertEqual(st[0].stats.location, '') # self.assertEqual(st[0].stats.channel, 'EHZ') def test_getEventList(self): c = self.client.event # UTCDateTimes events = c.getList(min_datetime=UTCDateTime("2009-01-01T00:00:00"), max_datetime=UTCDateTime("2009-01-10T00:00:00")) self.assertEqual(len(events), 4) # time strings with T as separator events = c.getList(min_datetime="2009-01-01T00:00:00", max_datetime="2009-01-10T00:00:00") self.assertEqual(len(events), 4) # time strings with space as separator events = c.getList(min_datetime="2009-01-01 00:00:00", max_datetime="2009-01-10 00:00:00") self.assertEqual(len(events), 4) def test_getNetworkIds(self): items = ['KT', 'BW', 'CZ', 'GR', 'NZ'] data = self.client.waveform.getNetworkIds() for item in items: self.assertTrue(item in data) def test_ping(self): # current server time = self.client.ping() self.assertTrue(isinstance(time, float)) def test_getStationIds(self): # 1 - some selected stations stations = ['FUR', 'FURT', 'ROTZ', 'RTAK', 'MANZ', 'WET'] data = self.client.waveform.getStationIds() for station in stations: self.assertTrue(station in data) # 2 - all stations of network BW stations = ['FURT', 'ROTZ', 'RTAK', 'MANZ'] data = self.client.waveform.getStationIds(network='BW') for station in stations: self.assertTrue(station in data) def test_getLocationIds(self): # 1 - all locations items = ['', '10'] data = self.client.waveform.getLocationIds() for item in items: self.assertTrue(item in data) # 2 - all locations for network BW items = [''] data = self.client.waveform.getLocationIds(network='BW') for item in items: self.assertTrue(item in data) # 3 - all locations for network BW and station MANZ items = [''] data = self.client.waveform.getLocationIds(network='BW', station='MANZ') for item in items: self.assertTrue(item in data) def test_getChannelIds(self): # 1 - all channels items = ['AEX', 'AEY', 'BAN', 'BAZ', 'BHE', 'BHN', 'BHZ', 'EHE', 'EHN', 'EHZ', 'HHE', 'HHN', 'HHZ', 'LHE', 'LHN', 'LHZ', 'SHE', 'SHN', 'SHZ'] data = self.client.waveform.getChannelIds() for item in items: self.assertTrue(item in data) # 2 - all channels for network BW items = ['AEX', 'AEY', 'BAN', 'BAZ', 'BHE', 'BHN', 'BHZ', 'EHE', 'EHN', 'EHZ', 'HHE', 'HHN', 'HHZ', 'SHE', 'SHN', 'SHZ'] data = self.client.waveform.getChannelIds(network='BW') for item in items: self.assertTrue(item in data) # 3 - all channels for network BW and station MANZ items = ['AEX', 'AEY', 'EHE', 'EHN', 'EHZ', 'SHE', 'SHN', 'SHZ'] data = self.client.waveform.getChannelIds(network='BW', station='MANZ') for item in items: self.assertTrue(item in data) # 4 - all channels for network BW, station MANZ and given location items = ['AEX', 'AEY', 'EHE', 'EHN', 'EHZ', 'SHE', 'SHN', 'SHZ'] data = self.client.waveform.getChannelIds(network='BW', station='MANZ', location='') for item in items: self.assertTrue(item in data) def test_getPreview(self): # multiple channels / MiniSEED t1 = UTCDateTime('20080101') t2 = UTCDateTime('20080201') st = self.client.waveform.getPreview("BW", "M*", "", "EHZ", t1, t2) self.assertEqual(len(st), 4) self.assertEqual(st[0].stats.network, 'BW') self.assertEqual(st[0].stats.channel, 'EHZ') self.assertEqual(st[0].stats.delta, 30.0) # single channel / GSE2 t1 = UTCDateTime('20090101') t2 = UTCDateTime('20100101') st = self.client.waveform.getPreview("BW", "RTLI", "", "EHN", t1, t2) self.assertEqual(len(st), 1) self.assertEqual(st[0].id, 'BW.RTLI..EHN') self.assertEqual(st[0].stats.delta, 30.0) self.assertEqual(len(st[0]), 205642) self.assertEqual(st[0].stats.npts, 205642) def test_getPreviewByIds(self): # multiple channels / MiniSEED t1 = UTCDateTime('20080101') t2 = UTCDateTime('20080201') # via list st = self.client.waveform.getPreviewByIds(['BW.MANZ..EHE', 'BW.ROTZ..EHE'], t1, t2) st.sort() self.assertEqual(len(st), 2) self.assertEqual(st[0].id, 'BW.MANZ..EHE') self.assertEqual(st[1].id, 'BW.ROTZ..EHE') # via string st = self.client.waveform.getPreviewByIds('BW.MANZ..EHE,BW.ROTZ..EHE', t1, t2) st.sort() self.assertEqual(len(st), 2) self.assertEqual(st[0].id, 'BW.MANZ..EHE') self.assertEqual(st[1].id, 'BW.ROTZ..EHE') def test_getPAZ(self): t = UTCDateTime('20090808') c = self.client # test the deprecated call too for one/two releases data = c.station.getPAZ('BW.MANZ..EHZ', t) self.assertEqual(data['zeros'], [0j, 0j]) self.assertEqual(data['sensitivity'], 2516800000.0) self.assertEqual(len(data['poles']), 5) self.assertEqual(data['poles'][0], (-0.037004 + 0.037016j)) self.assertEqual(data['poles'][1], (-0.037004 - 0.037016j)) self.assertEqual(data['poles'][2], (-251.33 + 0j)) self.assertEqual(data['poles'][3], (-131.03999999999999 - 467.29000000000002j)) self.assertEqual(data['poles'][4], (-131.03999999999999 + 467.29000000000002j)) self.assertEqual(data['gain'], 60077000.0) # test some not allowed wildcards t = UTCDateTime('20120501') self.assertRaises(ValueError, c.station.getPAZ, "BW.RLAS..BJ*", t) self.assertRaises(ValueError, c.station.getPAZ, "BW.RLAS..*", t) self.assertRaises(ValueError, c.station.getPAZ, "BW.RLAS..BJ?", t) self.assertRaises(ValueError, c.station.getPAZ, "BW.R*..BJZ", t) # test with a XSEED file with a referenced PAZ response info (see #364) t = UTCDateTime("2012-05-10") result = AttribDict( {'gain': 1.0, 'poles': [0j], 'sensitivity': 6319100000000.0, 'digitizer_gain': 1000000.0, 'seismometer_gain': 6319100.0, 'zeros': [0j]}) data = c.station.getPAZ("BW.RLAS..BJZ", t) self.assertEqual(data, result) def test_getCoordinates(self): t = UTCDateTime("2010-05-03T23:59:30") data = self.client.station.getCoordinates(network="BW", station="UH1", datetime=t, location="") result = {'elevation': 500.0, 'latitude': 48.081493000000002, 'longitude': 11.636093000000001} self.assertEqual(data, result) def test_getWaveform_with_metadata(self): # metadata change during t1 -> t2 ! t1 = UTCDateTime("2010-05-03T23:59:30") t2 = UTCDateTime("2010-05-04T00:00:30") client = self.client self.assertRaises(Exception, client.waveform.getWaveform, "BW", "UH1", "", "EH*", t1, t2, getPAZ=True, getCoordinates=True) st = client.waveform.getWaveform("BW", "UH1", "", "EH*", t1, t2, getPAZ=True, getCoordinates=True, metadata_timecheck=False) result = AttribDict({'zeros': [0j, 0j, 0j], 'sensitivity': 251650000.0, 'poles': [(-0.88 + 0.88j), (-0.88 - 0.88j), (-0.22 + 0j)], 'gain': 1.0, 'seismometer_gain': 400.0, 'digitizer_gain': 629121.0}) self.assertEqual(st[0].stats.paz, result) result = AttribDict({'latitude': 48.081493000000002, 'elevation': 500.0, 'longitude': 11.636093000000001}) self.assertEqual(st[0].stats.coordinates, result) def test_getPAZCallChange(self): t = UTCDateTime("2012-05-10") c = self.client datas = [] result = AttribDict( {'gain': 1.0, 'poles': [0j], 'sensitivity': 6319100000000.0, 'digitizer_gain': 1000000.0, 'seismometer_gain': 6319100.0, 'zeros': [0j]}) # test that the old/deprecated call syntax is still working self.assertRaises(SEEDParserException, c.station.getPAZ, "BW", "RLAS", t) datas.append(c.station.getPAZ("BW", "RLAS", t, "", "BJZ")) datas.append(c.station.getPAZ("BW", "RLAS", t, "", channel="BJZ")) datas.append(c.station.getPAZ("BW", "RLAS", t, location="", channel="BJZ")) datas.append(c.station.getPAZ("BW", "RLAS", t, channel="BJZ", location="")) datas.append(c.station.getPAZ("BW", "RLAS", t, channel="BJZ")) for data in datas: self.assertEqual(data, result) def test_localcache(self): """ Tests local 'caching' of xml seed resources and station list coordinate information to avoid repeat requests to server. Tests.. - returned information is stored with client instance in memory - repeat requests do not get stored duplicated locally - repeat requests do not issue a request to server anymore (- right results for example with two different metadata sets at different times) """ net = "BW" sta = "RTSA" netsta = ".".join([net, sta]) seed_id = ".".join([net, sta, "", "EHZ"]) t1 = UTCDateTime("2009-09-01") t2 = UTCDateTime("2012-10-23") coords1 = dict(elevation=1022.0, latitude=47.7673, longitude=12.842417) coords2 = dict(elevation=1066.0, latitude=47.768345, longitude=12.841651) paz1 = {'digitizer_gain': 16000000.0, 'gain': 1.0, 'poles': [(-0.88 + 0.88j), (-0.88 - 0.88j), (-0.22 + 0j)], 'seismometer_gain': 400.0, 'sensitivity': 6400000000.0, 'zeros': [0j, 0j, 0j]} paz2 = {'digitizer_gain': 1677850.0, 'gain': 1.0, 'poles': [(-4.444 + 4.444j), (-4.444 - 4.444j), (-1.083 + 0j)], 'seismometer_gain': 400.0, 'sensitivity': 671140000.0, 'zeros': [0j, 0j, 0j]} c = self.client # before any requests self.assertTrue(len(c.xml_seeds) == 0) self.assertTrue(len(c.station_list) == 0) # after first t1 requests ret = c.station.getCoordinates(net, sta, t1) self.assertTrue(ret == coords1) self.assertTrue(len(c.station_list) == 1) self.assertTrue(len(c.station_list[netsta]) == 1) ret = c.station.getPAZ(seed_id, t1) self.assertTrue(ret == paz1) self.assertTrue(len(c.xml_seeds) == 1) self.assertTrue(len(c.xml_seeds[seed_id]) == 1) # after first t2 requests ret = c.station.getCoordinates(net, sta, t2) self.assertTrue(ret == coords2) self.assertTrue(len(c.station_list) == 1) self.assertTrue(len(c.station_list[netsta]) == 2) ret = c.station.getPAZ(seed_id, t2) self.assertTrue(ret == paz2) self.assertTrue(len(c.xml_seeds) == 1) self.assertTrue(len(c.xml_seeds[seed_id]) == 2) # getList() is called if getPAZ or getCoordinates ends up making a # request to server so we just overwrite it and let it raise to check # that no request is issued c.station.getList = raiseOnCall # after second t1 requests ret = c.station.getCoordinates(net, sta, t1) self.assertTrue(ret == coords1) self.assertTrue(len(c.station_list) == 1) self.assertTrue(len(c.station_list[netsta]) == 2) ret = c.station.getPAZ(seed_id, t1) self.assertTrue(ret == paz1) self.assertTrue(len(c.xml_seeds) == 1) self.assertTrue(len(c.xml_seeds[seed_id]) == 2) # after second t2 requests ret = c.station.getCoordinates(net, sta, t2) self.assertTrue(ret == coords2) self.assertTrue(len(c.station_list) == 1) self.assertTrue(len(c.station_list[netsta]) == 2) ret = c.station.getPAZ(seed_id, t2) self.assertTrue(ret == paz2) self.assertTrue(len(c.xml_seeds) == 1) self.assertTrue(len(c.xml_seeds[seed_id]) == 2) # new request that needs to connect to server, just to make sure the # monkey patch for raising on requests really works self.assertRaises(RequestException, c.station.getCoordinates, "GR", "FUR", t2) self.assertRaises(RequestException, c.station.getPAZ, "GR.FUR..HHZ", t2)
class ClientTestCase(unittest.TestCase): """ Test cases for the SeisHub client. """ def setUp(self): self.client = Client(TESTSERVER) # def test_getWaveformApplyFilter(self): # t = UTCDateTime("2009-09-03 00:00:00") # #1 - w/o apply_filter # st = self.client.waveform.getWaveform("BW", "RTPI", "", "EHZ", # t, t + 20, apply_filter=False) # self.assertEqual(len(st), 1) # self.assertEqual(st[0].stats.network, '') # self.assertEqual(st[0].stats.station, 'GP01') # self.assertEqual(st[0].stats.location, '') # self.assertEqual(st[0].stats.channel, 'SHZ') # #2 - w/ apply_filter # st = self.client.waveform.getWaveform("BW", "RTPI", "", "EHZ", # t, t + 20, apply_filter=True) # self.assertEqual(len(st), 1) # self.assertEqual(st[0].stats.network, 'BW') # self.assertEqual(st[0].stats.station, 'RTPI') # self.assertEqual(st[0].stats.location, '') # self.assertEqual(st[0].stats.channel, 'EHZ') def test_getEventList(self): c = self.client.event # UTCDateTimes events = c.getList(min_datetime=UTCDateTime("2009-01-01T00:00:00"), max_datetime=UTCDateTime("2009-01-10T00:00:00")) self.assertEqual(len(events), 4) # time strings with T as separator events = c.getList(min_datetime="2009-01-01T00:00:00", max_datetime="2009-01-10T00:00:00") self.assertEqual(len(events), 4) # time strings with space as separator events = c.getList(min_datetime="2009-01-01 00:00:00", max_datetime="2009-01-10 00:00:00") self.assertEqual(len(events), 4) def test_getNetworkIds(self): items = ['KT', 'BW', 'CZ', 'GR', 'NZ'] data = self.client.waveform.getNetworkIds() for item in items: self.assertTrue(item in data) def test_ping(self): # current server time = self.client.ping() self.assertTrue(isinstance(time, float)) def test_getStationIds(self): # 1 - some selected stations stations = ['FUR', 'FURT', 'ROTZ', 'RTAK', 'MANZ', 'WET'] data = self.client.waveform.getStationIds() for station in stations: self.assertTrue(station in data) # 2 - all stations of network BW stations = ['FURT', 'ROTZ', 'RTAK', 'MANZ'] data = self.client.waveform.getStationIds(network='BW') for station in stations: self.assertTrue(station in data) def test_getLocationIds(self): # 1 - all locations items = ['', '10'] data = self.client.waveform.getLocationIds() for item in items: self.assertTrue(item in data) # 2 - all locations for network BW items = [''] data = self.client.waveform.getLocationIds(network='BW') for item in items: self.assertTrue(item in data) # 3 - all locations for network BW and station MANZ items = [''] data = self.client.waveform.getLocationIds(network='BW', station='MANZ') for item in items: self.assertTrue(item in data) def test_getChannelIds(self): # 1 - all channels items = [ 'AEX', 'AEY', 'BAN', 'BAZ', 'BHE', 'BHN', 'BHZ', 'EHE', 'EHN', 'EHZ', 'HHE', 'HHN', 'HHZ', 'LHE', 'LHN', 'LHZ', 'SHE', 'SHN', 'SHZ' ] data = self.client.waveform.getChannelIds() for item in items: self.assertTrue(item in data) # 2 - all channels for network BW items = [ 'AEX', 'AEY', 'BAN', 'BAZ', 'BHE', 'BHN', 'BHZ', 'EHE', 'EHN', 'EHZ', 'HHE', 'HHN', 'HHZ', 'SHE', 'SHN', 'SHZ' ] data = self.client.waveform.getChannelIds(network='BW') for item in items: self.assertTrue(item in data) # 3 - all channels for network BW and station MANZ items = ['AEX', 'AEY', 'EHE', 'EHN', 'EHZ', 'SHE', 'SHN', 'SHZ'] data = self.client.waveform.getChannelIds(network='BW', station='MANZ') for item in items: self.assertTrue(item in data) # 4 - all channels for network BW, station MANZ and given location items = ['AEX', 'AEY', 'EHE', 'EHN', 'EHZ', 'SHE', 'SHN', 'SHZ'] data = self.client.waveform.getChannelIds(network='BW', station='MANZ', location='') for item in items: self.assertTrue(item in data) def test_getPreview(self): # multiple channels / MiniSEED t1 = UTCDateTime('20080101') t2 = UTCDateTime('20080201') st = self.client.waveform.getPreview("BW", "M*", "", "EHZ", t1, t2) self.assertEqual(len(st), 4) self.assertEqual(st[0].stats.network, 'BW') self.assertEqual(st[0].stats.channel, 'EHZ') self.assertEqual(st[0].stats.delta, 30.0) # single channel / GSE2 t1 = UTCDateTime('20090101') t2 = UTCDateTime('20100101') st = self.client.waveform.getPreview("BW", "RTLI", "", "EHN", t1, t2) self.assertEqual(len(st), 1) self.assertEqual(st[0].id, 'BW.RTLI..EHN') self.assertEqual(st[0].stats.delta, 30.0) self.assertEqual(len(st[0]), 205642) self.assertEqual(st[0].stats.npts, 205642) def test_getPreviewByIds(self): # multiple channels / MiniSEED t1 = UTCDateTime('20080101') t2 = UTCDateTime('20080201') # via list st = self.client.waveform.getPreviewByIds( ['BW.MANZ..EHE', 'BW.ROTZ..EHE'], t1, t2) st.sort() self.assertEqual(len(st), 2) self.assertEqual(st[0].id, 'BW.MANZ..EHE') self.assertEqual(st[1].id, 'BW.ROTZ..EHE') # via string st = self.client.waveform.getPreviewByIds('BW.MANZ..EHE,BW.ROTZ..EHE', t1, t2) st.sort() self.assertEqual(len(st), 2) self.assertEqual(st[0].id, 'BW.MANZ..EHE') self.assertEqual(st[1].id, 'BW.ROTZ..EHE') def test_getPAZ(self): t = UTCDateTime('20090808') c = self.client # test the deprecated call too for one/two releases data = c.station.getPAZ('BW.MANZ..EHZ', t) self.assertEqual(data['zeros'], [0j, 0j]) self.assertEqual(data['sensitivity'], 2516800000.0) self.assertEqual(len(data['poles']), 5) self.assertEqual(data['poles'][0], (-0.037004 + 0.037016j)) self.assertEqual(data['poles'][1], (-0.037004 - 0.037016j)) self.assertEqual(data['poles'][2], (-251.33 + 0j)) self.assertEqual(data['poles'][3], (-131.03999999999999 - 467.29000000000002j)) self.assertEqual(data['poles'][4], (-131.03999999999999 + 467.29000000000002j)) self.assertEqual(data['gain'], 60077000.0) # test some not allowed wildcards t = UTCDateTime('20120501') self.assertRaises(ValueError, c.station.getPAZ, "BW.RLAS..BJ*", t) self.assertRaises(ValueError, c.station.getPAZ, "BW.RLAS..*", t) self.assertRaises(ValueError, c.station.getPAZ, "BW.RLAS..BJ?", t) self.assertRaises(ValueError, c.station.getPAZ, "BW.R*..BJZ", t) # test with a XSEED file with a referenced PAZ response info (see #364) t = UTCDateTime("2012-05-10") result = AttribDict({ 'gain': 1.0, 'poles': [0j], 'sensitivity': 6319100000000.0, 'digitizer_gain': 1000000.0, 'seismometer_gain': 6319100.0, 'zeros': [0j] }) data = c.station.getPAZ("BW.RLAS..BJZ", t) self.assertEqual(data, result) def test_getCoordinates(self): t = UTCDateTime("2010-05-03T23:59:30") data = self.client.station.getCoordinates(network="BW", station="UH1", datetime=t, location="") result = { 'elevation': 500.0, 'latitude': 48.081493000000002, 'longitude': 11.636093000000001 } self.assertEqual(data, result) def test_getWaveform_with_metadata(self): # metadata change during t1 -> t2 ! t1 = UTCDateTime("2010-05-03T23:59:30") t2 = UTCDateTime("2010-05-04T00:00:30") client = self.client self.assertRaises(Exception, client.waveform.getWaveform, "BW", "UH1", "", "EH*", t1, t2, getPAZ=True, getCoordinates=True) st = client.waveform.getWaveform("BW", "UH1", "", "EH*", t1, t2, getPAZ=True, getCoordinates=True, metadata_timecheck=False) result = AttribDict({ 'zeros': [0j, 0j, 0j], 'sensitivity': 251650000.0, 'poles': [(-0.88 + 0.88j), (-0.88 - 0.88j), (-0.22 + 0j)], 'gain': 1.0, 'seismometer_gain': 400.0, 'digitizer_gain': 629121.0 }) self.assertEqual(st[0].stats.paz, result) result = AttribDict({ 'latitude': 48.081493000000002, 'elevation': 500.0, 'longitude': 11.636093000000001 }) self.assertEqual(st[0].stats.coordinates, result) def test_getPAZCallChange(self): t = UTCDateTime("2012-05-10") c = self.client datas = [] result = AttribDict({ 'gain': 1.0, 'poles': [0j], 'sensitivity': 6319100000000.0, 'digitizer_gain': 1000000.0, 'seismometer_gain': 6319100.0, 'zeros': [0j] }) # test that the old/deprecated call syntax is still working self.assertRaises(SEEDParserException, c.station.getPAZ, "BW", "RLAS", t) datas.append(c.station.getPAZ("BW", "RLAS", t, "", "BJZ")) datas.append(c.station.getPAZ("BW", "RLAS", t, "", channel="BJZ")) datas.append( c.station.getPAZ("BW", "RLAS", t, location="", channel="BJZ")) datas.append( c.station.getPAZ("BW", "RLAS", t, channel="BJZ", location="")) datas.append(c.station.getPAZ("BW", "RLAS", t, channel="BJZ")) for data in datas: self.assertEqual(data, result) def test_localcache(self): """ Tests local 'caching' of xml seed resources and station list coordinate information to avoid repeat requests to server. Tests.. - returned information is stored with client instance in memory - repeat requests do not get stored duplicated locally - repeat requests do not issue a request to server anymore (- right results for example with two different metadata sets at different times) """ net = "BW" sta = "RTSA" netsta = ".".join([net, sta]) seed_id = ".".join([net, sta, "", "EHZ"]) t1 = UTCDateTime("2009-09-01") t2 = UTCDateTime("2012-10-23") coords1 = dict(elevation=1022.0, latitude=47.7673, longitude=12.842417) coords2 = dict(elevation=1066.0, latitude=47.768345, longitude=12.841651) paz1 = { 'digitizer_gain': 16000000.0, 'gain': 1.0, 'poles': [(-0.88 + 0.88j), (-0.88 - 0.88j), (-0.22 + 0j)], 'seismometer_gain': 400.0, 'sensitivity': 6400000000.0, 'zeros': [0j, 0j, 0j] } paz2 = { 'digitizer_gain': 1677850.0, 'gain': 1.0, 'poles': [(-4.444 + 4.444j), (-4.444 - 4.444j), (-1.083 + 0j)], 'seismometer_gain': 400.0, 'sensitivity': 671140000.0, 'zeros': [0j, 0j, 0j] } c = self.client # before any requests self.assertTrue(len(c.xml_seeds) == 0) self.assertTrue(len(c.station_list) == 0) # after first t1 requests ret = c.station.getCoordinates(net, sta, t1) self.assertTrue(ret == coords1) self.assertTrue(len(c.station_list) == 1) self.assertTrue(len(c.station_list[netsta]) == 1) ret = c.station.getPAZ(seed_id, t1) self.assertTrue(ret == paz1) self.assertTrue(len(c.xml_seeds) == 1) self.assertTrue(len(c.xml_seeds[seed_id]) == 1) # after first t2 requests ret = c.station.getCoordinates(net, sta, t2) self.assertTrue(ret == coords2) self.assertTrue(len(c.station_list) == 1) self.assertTrue(len(c.station_list[netsta]) == 2) ret = c.station.getPAZ(seed_id, t2) self.assertTrue(ret == paz2) self.assertTrue(len(c.xml_seeds) == 1) self.assertTrue(len(c.xml_seeds[seed_id]) == 2) # getList() is called if getPAZ or getCoordinates ends up making a # request to server so we just overwrite it and let it raise to check # that no request is issued c.station.getList = raiseOnCall # after second t1 requests ret = c.station.getCoordinates(net, sta, t1) self.assertTrue(ret == coords1) self.assertTrue(len(c.station_list) == 1) self.assertTrue(len(c.station_list[netsta]) == 2) ret = c.station.getPAZ(seed_id, t1) self.assertTrue(ret == paz1) self.assertTrue(len(c.xml_seeds) == 1) self.assertTrue(len(c.xml_seeds[seed_id]) == 2) # after second t2 requests ret = c.station.getCoordinates(net, sta, t2) self.assertTrue(ret == coords2) self.assertTrue(len(c.station_list) == 1) self.assertTrue(len(c.station_list[netsta]) == 2) ret = c.station.getPAZ(seed_id, t2) self.assertTrue(ret == paz2) self.assertTrue(len(c.xml_seeds) == 1) self.assertTrue(len(c.xml_seeds[seed_id]) == 2) # new request that needs to connect to server, just to make sure the # monkey patch for raising on requests really works self.assertRaises(RequestException, c.station.getCoordinates, "GR", "FUR", t2) self.assertRaises(RequestException, c.station.getPAZ, "GR.FUR..HHZ", t2)
class ClientTestCase(unittest.TestCase): """ Test cases for the SeisHub client. """ def setUp(self): self.client = Client("http://teide.geophysik.uni-muenchen.de:8080") # def test_getWaveformApplyFilter(self): # t = UTCDateTime("2009-09-03 00:00:00") # #1 - w/o apply_filter # st = self.client.waveform.getWaveform("BW", "RTPI", "", "EHZ", # t, t + 20, apply_filter=False) # self.assertEqual(len(st), 1) # self.assertEqual(st[0].stats.network, '') # self.assertEqual(st[0].stats.station, 'GP01') # self.assertEqual(st[0].stats.location, '') # self.assertEqual(st[0].stats.channel, 'SHZ') # #2 - w/ apply_filter # st = self.client.waveform.getWaveform("BW", "RTPI", "", "EHZ", # t, t + 20, apply_filter=True) # self.assertEqual(len(st), 1) # self.assertEqual(st[0].stats.network, 'BW') # self.assertEqual(st[0].stats.station, 'RTPI') # self.assertEqual(st[0].stats.location, '') # self.assertEqual(st[0].stats.channel, 'EHZ') def test_getEventList(self): c = self.client.event # UTCDateTimes events = c.getList(min_datetime=UTCDateTime("2009-01-01T00:00:00"), max_datetime=UTCDateTime("2009-01-10T00:00:00")) self.assertEqual(len(events), 4) # time strings with T as separator events = c.getList(min_datetime="2009-01-01T00:00:00", max_datetime="2009-01-10T00:00:00") self.assertEqual(len(events), 4) # time strings with space as separator events = c.getList(min_datetime="2009-01-01 00:00:00", max_datetime="2009-01-10 00:00:00") self.assertEqual(len(events), 4) def test_getNetworkIds(self): items = ['KT', 'BW', 'CZ', 'GR', 'NZ'] data = self.client.waveform.getNetworkIds() for item in items: self.assertTrue(item in data) def test_ping(self): # current server time = self.client.ping() self.assertTrue(isinstance(time, float)) def test_getStationIds(self): #1 - some selected stations stations = ['FUR', 'FURT', 'ROTZ', 'RTAK', 'MANZ', 'WET'] data = self.client.waveform.getStationIds() for station in stations: self.assertTrue(station in data) #2 - all stations of network BW stations = ['FURT', 'ROTZ', 'RTAK', 'MANZ'] data = self.client.waveform.getStationIds(network='BW') for station in stations: self.assertTrue(station in data) def test_getLocationIds(self): #1 - all locations items = ['', '10'] data = self.client.waveform.getLocationIds() for item in items: self.assertTrue(item in data) #2 - all locations for network BW items = [''] data = self.client.waveform.getLocationIds(network='BW') for item in items: self.assertTrue(item in data) #3 - all locations for network BW and station MANZ items = [''] data = self.client.waveform.getLocationIds(network='BW', station='MANZ') for item in items: self.assertTrue(item in data) def test_getChannelIds(self): #1 - all channels items = [ 'AEX', 'AEY', 'BAN', 'BAZ', 'BHE', 'BHN', 'BHZ', 'EHE', 'EHN', 'EHZ', 'HHE', 'HHN', 'HHZ', 'LHE', 'LHN', 'LHZ', 'SHE', 'SHN', 'SHZ' ] data = self.client.waveform.getChannelIds() for item in items: self.assertTrue(item in data) #2 - all channels for network BW items = [ 'AEX', 'AEY', 'BAN', 'BAZ', 'BHE', 'BHN', 'BHZ', 'EHE', 'EHN', 'EHZ', 'HHE', 'HHN', 'HHZ', 'SHE', 'SHN', 'SHZ' ] data = self.client.waveform.getChannelIds(network='BW') for item in items: self.assertTrue(item in data) #3 - all channels for network BW and station MANZ items = ['AEX', 'AEY', 'EHE', 'EHN', 'EHZ', 'SHE', 'SHN', 'SHZ'] data = self.client.waveform.getChannelIds(network='BW', station='MANZ') for item in items: self.assertTrue(item in data) #4 - all channels for network BW, station MANZ and given location items = ['AEX', 'AEY', 'EHE', 'EHN', 'EHZ', 'SHE', 'SHN', 'SHZ'] data = self.client.waveform.getChannelIds(network='BW', station='MANZ', location='') for item in items: self.assertTrue(item in data) def test_getPreview(self): # multiple channels / MiniSEED t1 = UTCDateTime('20080101') t2 = UTCDateTime('20080201') st = self.client.waveform.getPreview("BW", "M*", "", "EHZ", t1, t2) self.assertEqual(len(st), 4) self.assertEqual(st[0].stats.network, 'BW') self.assertEqual(st[0].stats.channel, 'EHZ') self.assertEqual(st[0].stats.delta, 30.0) # single channel / GSE2 t1 = UTCDateTime('20090101') t2 = UTCDateTime('20100101') st = self.client.waveform.getPreview("BW", "RTLI", "", "EHN", t1, t2) self.assertEqual(len(st), 1) self.assertEqual(st[0].id, 'BW.RTLI..EHN') self.assertEqual(st[0].stats.delta, 30.0) self.assertEqual(len(st[0]), 205642) self.assertEqual(st[0].stats.npts, 205642) def test_getPreviewByIds(self): # multiple channels / MiniSEED t1 = UTCDateTime('20080101') t2 = UTCDateTime('20080201') # via list st = self.client.waveform.getPreviewByIds( ['BW.MANZ..EHE', 'BW.ROTZ..EHE'], t1, t2) st.sort() self.assertEqual(len(st), 2) self.assertEqual(st[0].id, 'BW.MANZ..EHE') self.assertEqual(st[1].id, 'BW.ROTZ..EHE') # via string st = self.client.waveform.getPreviewByIds('BW.MANZ..EHE,BW.ROTZ..EHE', t1, t2) st.sort() self.assertEqual(len(st), 2) self.assertEqual(st[0].id, 'BW.MANZ..EHE') self.assertEqual(st[1].id, 'BW.ROTZ..EHE') def test_getPAZ(self): t = UTCDateTime('20090808') c = self.client # test the deprecated call too for one/two releases data = c.station.getPAZ('BW.MANZ..EHZ', t) self.assertEqual(data['zeros'], [0j, 0j]) self.assertEqual(data['sensitivity'], 2516800000.0) self.assertEqual(len(data['poles']), 5) self.assertEqual(data['poles'][0], (-0.037004 + 0.037016j)) self.assertEqual(data['poles'][1], (-0.037004 - 0.037016j)) self.assertEqual(data['poles'][2], (-251.33 + 0j)) self.assertEqual(data['poles'][3], (-131.03999999999999 - 467.29000000000002j)) self.assertEqual(data['poles'][4], (-131.03999999999999 + 467.29000000000002j)) self.assertEqual(data['gain'], 60077000.0) # test some not allowed wildcards t = UTCDateTime('20120501') self.assertRaises(ValueError, c.station.getPAZ, "BW.RLAS..BJ*", t) self.assertRaises(ValueError, c.station.getPAZ, "BW.RLAS..*", t) self.assertRaises(ValueError, c.station.getPAZ, "BW.RLAS..BJ?", t) self.assertRaises(ValueError, c.station.getPAZ, "BW.R*..BJZ", t) # test with a XSEED file with a referenced PAZ response info (see #364) t = UTCDateTime("2012-05-10") result = AttribDict({ 'gain': 1.0, 'poles': [0j], 'sensitivity': 6319100000000.0, 'digitizer_gain': 1000000.0, 'seismometer_gain': 6319100.0, 'zeros': [0j] }) data = c.station.getPAZ("BW.RLAS..BJZ", t) self.assertEqual(data, result) def test_getCoordinates(self): t = UTCDateTime("2010-05-03T23:59:30") data = self.client.station.getCoordinates(network="BW", station="UH1", datetime=t, location="") result = { 'elevation': 500.0, 'latitude': 48.081493000000002, 'longitude': 11.636093000000001 } self.assertEqual(data, result) def test_getWaveform_with_metadata(self): # metadata change during t1 -> t2 ! t1 = UTCDateTime("2010-05-03T23:59:30") t2 = UTCDateTime("2010-05-04T00:00:30") client = self.client self.assertRaises(Exception, client.waveform.getWaveform, "BW", "UH1", "", "EH*", t1, t2, getPAZ=True, getCoordinates=True) st = client.waveform.getWaveform("BW", "UH1", "", "EH*", t1, t2, getPAZ=True, getCoordinates=True, metadata_timecheck=False) result = AttribDict({ 'zeros': [0j, 0j, 0j], 'sensitivity': 251650000.0, 'poles': [(-0.88 + 0.88j), (-0.88 - 0.88j), (-0.22 + 0j)], 'gain': 1.0, 'seismometer_gain': 400.0, 'digitizer_gain': 629121.0 }) self.assertEqual(st[0].stats.paz, result) result = AttribDict({ 'latitude': 48.081493000000002, 'elevation': 500.0, 'longitude': 11.636093000000001 }) self.assertEqual(st[0].stats.coordinates, result) def test_getPAZCallChange(self): t = UTCDateTime("2012-05-10") c = self.client datas = [] result = AttribDict({ 'gain': 1.0, 'poles': [0j], 'sensitivity': 6319100000000.0, 'digitizer_gain': 1000000.0, 'seismometer_gain': 6319100.0, 'zeros': [0j] }) # test that the old/deprecated call syntax is still working self.assertRaises(SEEDParserException, c.station.getPAZ, "BW", "RLAS", t) datas.append(c.station.getPAZ("BW", "RLAS", t, "", "BJZ")) datas.append(c.station.getPAZ("BW", "RLAS", t, "", channel="BJZ")) datas.append( c.station.getPAZ("BW", "RLAS", t, location="", channel="BJZ")) datas.append( c.station.getPAZ("BW", "RLAS", t, channel="BJZ", location="")) datas.append(c.station.getPAZ("BW", "RLAS", t, channel="BJZ")) for data in datas: self.assertEqual(data, result)
class ClientTestCase(unittest.TestCase): """ Test cases for the SeisHub client. """ def setUp(self): self.client = Client("http://teide.geophysik.uni-muenchen.de:8080") # def test_getWaveformApplyFilter(self): # t = UTCDateTime("2009-09-03 00:00:00") # #1 - w/o apply_filter # st = self.client.waveform.getWaveform("BW", "RTPI", "", "EHZ", # t, t + 20, apply_filter=False) # self.assertEqual(len(st), 1) # self.assertEqual(st[0].stats.network, '') # self.assertEqual(st[0].stats.station, 'GP01') # self.assertEqual(st[0].stats.location, '') # self.assertEqual(st[0].stats.channel, 'SHZ') # #2 - w/ apply_filter # st = self.client.waveform.getWaveform("BW", "RTPI", "", "EHZ", # t, t + 20, apply_filter=True) # self.assertEqual(len(st), 1) # self.assertEqual(st[0].stats.network, 'BW') # self.assertEqual(st[0].stats.station, 'RTPI') # self.assertEqual(st[0].stats.location, '') # self.assertEqual(st[0].stats.channel, 'EHZ') def test_getEventList(self): c = self.client.event # UTCDateTimes events = c.getList(min_datetime=UTCDateTime("2009-01-01T00:00:00"), max_datetime=UTCDateTime("2009-01-10T00:00:00")) self.assertEqual(len(events), 4) # time strings with T as separator events = c.getList(min_datetime="2009-01-01T00:00:00", max_datetime="2009-01-10T00:00:00") self.assertEqual(len(events), 4) # time strings with space as separator events = c.getList(min_datetime="2009-01-01 00:00:00", max_datetime="2009-01-10 00:00:00") self.assertEqual(len(events), 4) def test_getNetworkIds(self): items = ['KT', 'BW', 'CZ', 'GR', 'NZ'] data = self.client.waveform.getNetworkIds() for item in items: self.assertTrue(item in data) def test_ping(self): # current server time = self.client.ping() self.assertTrue(isinstance(time, float)) def test_getStationIds(self): #1 - some selected stations stations = ['FUR', 'FURT', 'ROTZ', 'RTAK', 'MANZ', 'WET'] data = self.client.waveform.getStationIds() for station in stations: self.assertTrue(station in data) #2 - all stations of network BW stations = ['FURT', 'ROTZ', 'RTAK', 'MANZ'] data = self.client.waveform.getStationIds(network='BW') for station in stations: self.assertTrue(station in data) def test_getLocationIds(self): #1 - all locations items = ['', '10'] data = self.client.waveform.getLocationIds() for item in items: self.assertTrue(item in data) #2 - all locations for network BW items = [''] data = self.client.waveform.getLocationIds(network='BW') for item in items: self.assertTrue(item in data) #3 - all locations for network BW and station MANZ items = [''] data = self.client.waveform.getLocationIds(network='BW', station='MANZ') for item in items: self.assertTrue(item in data) def test_getChannelIds(self): #1 - all channels items = ['AEX', 'AEY', 'BAN', 'BAZ', 'BHE', 'BHN', 'BHZ', 'EHE', 'EHN', 'EHZ', 'HHE', 'HHN', 'HHZ', 'LHE', 'LHN', 'LHZ', 'SHE', 'SHN', 'SHZ'] data = self.client.waveform.getChannelIds() for item in items: self.assertTrue(item in data) #2 - all channels for network BW items = ['AEX', 'AEY', 'BAN', 'BAZ', 'BHE', 'BHN', 'BHZ', 'EHE', 'EHN', 'EHZ', 'HHE', 'HHN', 'HHZ', 'SHE', 'SHN', 'SHZ'] data = self.client.waveform.getChannelIds(network='BW') for item in items: self.assertTrue(item in data) #3 - all channels for network BW and station MANZ items = ['AEX', 'AEY', 'EHE', 'EHN', 'EHZ', 'SHE', 'SHN', 'SHZ'] data = self.client.waveform.getChannelIds(network='BW', station='MANZ') for item in items: self.assertTrue(item in data) #4 - all channels for network BW, station MANZ and given location items = ['AEX', 'AEY', 'EHE', 'EHN', 'EHZ', 'SHE', 'SHN', 'SHZ'] data = self.client.waveform.getChannelIds(network='BW', station='MANZ', location='') for item in items: self.assertTrue(item in data) def test_getPreview(self): # multiple channels / MiniSEED t1 = UTCDateTime('20080101') t2 = UTCDateTime('20080201') st = self.client.waveform.getPreview("BW", "M*", "", "EHZ", t1, t2) self.assertEqual(len(st), 4) self.assertEqual(st[0].stats.network, 'BW') self.assertEqual(st[0].stats.channel, 'EHZ') self.assertEqual(st[0].stats.delta, 30.0) # single channel / GSE2 t1 = UTCDateTime('20090101') t2 = UTCDateTime('20100101') st = self.client.waveform.getPreview("BW", "RTLI", "", "EHN", t1, t2) self.assertEqual(len(st), 1) self.assertEqual(st[0].id, 'BW.RTLI..EHN') self.assertEqual(st[0].stats.delta, 30.0) self.assertEqual(len(st[0]), 205642) self.assertEqual(st[0].stats.npts, 205642) def test_getPreviewByIds(self): # multiple channels / MiniSEED t1 = UTCDateTime('20080101') t2 = UTCDateTime('20080201') # via list st = self.client.waveform.getPreviewByIds(['BW.MANZ..EHE', 'BW.ROTZ..EHE'], t1, t2) st.sort() self.assertEqual(len(st), 2) self.assertEqual(st[0].id, 'BW.MANZ..EHE') self.assertEqual(st[1].id, 'BW.ROTZ..EHE') # via string st = self.client.waveform.getPreviewByIds('BW.MANZ..EHE,BW.ROTZ..EHE', t1, t2) st.sort() self.assertEqual(len(st), 2) self.assertEqual(st[0].id, 'BW.MANZ..EHE') self.assertEqual(st[1].id, 'BW.ROTZ..EHE') def test_getPAZ(self): t = UTCDateTime('20090808') c = self.client # test the deprecated call too for one/two releases data = c.station.getPAZ('BW.MANZ..EHZ', t) self.assertEqual(data['zeros'], [0j, 0j]) self.assertEqual(data['sensitivity'], 2516800000.0) self.assertEqual(len(data['poles']), 5) self.assertEqual(data['poles'][0], (-0.037004 + 0.037016j)) self.assertEqual(data['poles'][1], (-0.037004 - 0.037016j)) self.assertEqual(data['poles'][2], (-251.33 + 0j)) self.assertEqual(data['poles'][3], (-131.03999999999999 - 467.29000000000002j)) self.assertEqual(data['poles'][4], (-131.03999999999999 + 467.29000000000002j)) self.assertEqual(data['gain'], 60077000.0) # test some not allowed wildcards t = UTCDateTime('20120501') self.assertRaises(ValueError, c.station.getPAZ, "BW.RLAS..BJ*", t) self.assertRaises(ValueError, c.station.getPAZ, "BW.RLAS..*", t) self.assertRaises(ValueError, c.station.getPAZ, "BW.RLAS..BJ?", t) self.assertRaises(ValueError, c.station.getPAZ, "BW.R*..BJZ", t) # test with a XSEED file with a referenced PAZ response info (see #364) t = UTCDateTime("2012-05-10") result = AttribDict({'gain': 1.0, 'poles': [0j], 'sensitivity': 6319100000000.0, 'digitizer_gain': 1000000.0, 'seismometer_gain': 6319100.0, 'zeros': [0j]}) data = c.station.getPAZ("BW.RLAS..BJZ", t) self.assertEqual(data, result) def test_getCoordinates(self): t = UTCDateTime("2010-05-03T23:59:30") data = self.client.station.getCoordinates(network="BW", station="UH1", datetime=t, location="") result = {'elevation': 500.0, 'latitude': 48.081493000000002, 'longitude': 11.636093000000001} self.assertEqual(data, result) def test_getWaveform_with_metadata(self): # metadata change during t1 -> t2 ! t1 = UTCDateTime("2010-05-03T23:59:30") t2 = UTCDateTime("2010-05-04T00:00:30") client = self.client self.assertRaises(Exception, client.waveform.getWaveform, "BW", "UH1", "", "EH*", t1, t2, getPAZ=True, getCoordinates=True) st = client.waveform.getWaveform("BW", "UH1", "", "EH*", t1, t2, getPAZ=True, getCoordinates=True, metadata_timecheck=False) result = AttribDict({'zeros': [0j, 0j, 0j], 'sensitivity': 251650000.0, 'poles': [(-0.88 + 0.88j), (-0.88 - 0.88j), (-0.22 + 0j)], 'gain': 1.0, 'seismometer_gain': 400.0, 'digitizer_gain': 629121.0}) self.assertEqual(st[0].stats.paz, result) result = AttribDict({'latitude': 48.081493000000002, 'elevation': 500.0, 'longitude': 11.636093000000001}) self.assertEqual(st[0].stats.coordinates, result) def test_getPAZCallChange(self): t = UTCDateTime("2012-05-10") c = self.client datas = [] result = AttribDict({'gain': 1.0, 'poles': [0j], 'sensitivity': 6319100000000.0, 'digitizer_gain': 1000000.0, 'seismometer_gain': 6319100.0, 'zeros': [0j]}) # test that the old/deprecated call syntax is still working self.assertRaises(SEEDParserException, c.station.getPAZ, "BW", "RLAS", t) datas.append(c.station.getPAZ("BW", "RLAS", t, "", "BJZ")) datas.append(c.station.getPAZ("BW", "RLAS", t, "", channel="BJZ")) datas.append(c.station.getPAZ("BW", "RLAS", t, location="", channel="BJZ")) datas.append(c.station.getPAZ("BW", "RLAS", t, channel="BJZ", location="")) datas.append(c.station.getPAZ("BW", "RLAS", t, channel="BJZ")) for data in datas: self.assertEqual(data, result)