Skip to content
Snippets Groups Projects
Commit 75836cb9 authored by arigdon-usgs's avatar arigdon-usgs
Browse files

Fixed npts issues in create missing and channels as well as a unit test. Also...

Fixed npts issues in create missing and channels as well as a unit test. Also cleaned up the unit test code for syntax and linting.
parent c251b8e0
No related branches found
No related tags found
No related merge requests found
...@@ -221,7 +221,6 @@ class EdgeFactory(TimeseriesFactory): ...@@ -221,7 +221,6 @@ class EdgeFactory(TimeseriesFactory):
trace_starttime = obspy.core.UTCDateTime(trace.stats.starttime) trace_starttime = obspy.core.UTCDateTime(trace.stats.starttime)
trace_endtime = obspy.core.UTCDateTime(trace.stats.endtime) trace_endtime = obspy.core.UTCDateTime(trace.stats.endtime)
trace_delta = trace.stats.delta trace_delta = trace.stats.delta
if trace_starttime > starttime: if trace_starttime > starttime:
cnt = int((trace_starttime - starttime) / trace_delta) cnt = int((trace_starttime - starttime) / trace_delta)
if cnt > 0: if cnt > 0:
...@@ -230,15 +229,12 @@ class EdgeFactory(TimeseriesFactory): ...@@ -230,15 +229,12 @@ class EdgeFactory(TimeseriesFactory):
trace.data]) trace.data])
trace_starttime = trace_starttime - trace_delta * cnt trace_starttime = trace_starttime - trace_delta * cnt
trace.stats.starttime = trace_starttime trace.stats.starttime = trace_starttime
if trace_endtime < endtime: if trace_endtime < endtime:
cnt = int((endtime - trace_endtime) / trace.stats.delta) cnt = int((endtime - trace_endtime) / trace.stats.delta)
if cnt > 0: if cnt > 0:
trace.data = numpy.concatenate([ trace.data = numpy.concatenate([
trace.data, trace.data,
numpy.full(cnt, numpy.nan, dtype=numpy.float64)]) numpy.full(cnt, numpy.nan, dtype=numpy.float64)])
trace_endtime = trace_endtime + trace_delta * cnt
trace.stats.endttime = trace_endtime
def _convert_timeseries_to_decimal(self, stream): def _convert_timeseries_to_decimal(self, stream):
"""convert geomag edge timeseries data stored as ints, to decimal by """convert geomag edge timeseries data stored as ints, to decimal by
...@@ -326,24 +322,28 @@ class EdgeFactory(TimeseriesFactory): ...@@ -326,24 +322,28 @@ class EdgeFactory(TimeseriesFactory):
obspy.core.Stream obspy.core.Stream
stream of the requested channel data stream of the requested channel data
""" """
stats = obspy.core.Stats()
stats.channel = channel
stats.starttime = starttime
stats.network = network
stats.station = station
stats.location = location
if interval == 'second': if interval == 'second':
stats.sampling_rate = 1. delta = 1.
elif interval == 'minute': elif interval == 'minute':
stats.sampling_rate = 1. / 60. delta = 60.
elif interval == 'hourly': elif interval == 'hourly':
stats.sampling_rate = 1. / 3600. delta = 3600.
elif interval == 'daily': elif interval == 'daily':
stats.sampling_rate = 1. / 86400. delta = 86400.
length = int((endtime - starttime) * stats.sampling_rate) stats = obspy.core.Stats()
stats.network = network
stats.station = station
stats.location = location
stats.channel = channel
# Calculate first valid sample time based on interval
trace_starttime = obspy.core.UTCDateTime(
numpy.ceil(starttime.timestamp / delta) * delta)
stats.starttime = trace_starttime
stats.delta = delta
# Calculate number of valid samples up to or before endtime
length = int((endtime - trace_starttime) / delta)
stats.npts = length + 1 stats.npts = length + 1
data = numpy.full(stats.npts, numpy.nan, dtype=numpy.float64)
data = numpy.full(length, numpy.nan, dtype=numpy.float64)
return obspy.core.Stream(obspy.core.Trace(data, stats)) return obspy.core.Stream(obspy.core.Trace(data, stats))
def _get_edge_channel(self, observatory, channel, type, interval): def _get_edge_channel(self, observatory, channel, type, interval):
......
...@@ -99,28 +99,78 @@ def test_clean_timeseries(): ...@@ -99,28 +99,78 @@ def test_clean_timeseries():
""" """
edge_factory = EdgeFactory() edge_factory = EdgeFactory()
trace1 = _create_trace([1, 1, 1, 1, 1], 'H', UTCDateTime("2018-01-01")) trace1 = _create_trace([1, 1, 1, 1, 1], 'H', UTCDateTime("2018-01-01"))
trace2 = _create_trace([2, 2],'E',UTCDateTime("2018-01-01")) trace2 = _create_trace([2, 2], 'E', UTCDateTime("2018-01-01"))
timeseries = Stream(traces=[trace1, trace2]) timeseries = Stream(traces=[trace1, trace2])
edge_factory._clean_timeseries(timeseries,trace1.stats.starttime,trace1.stats.endtime) edge_factory._clean_timeseries(
assert_equals(len(trace1.data),len(trace2.data)) timeseries=timeseries,
assert_equals(trace1.stats.starttime,trace2.stats.starttime) starttime=trace1.stats.starttime,
assert_equals(trace1.stats.endtime,trace2.stats.endtime) endtime=trace1.stats.endtime)
assert_equals(len(trace1.data), len(trace2.data))
assert_equals(trace1.stats.starttime, trace2.stats.starttime)
assert_equals(trace1.stats.endtime, trace2.stats.endtime)
# change starttime by less than 1 delta # change starttime by less than 1 delta
starttime = trace1.stats.starttime starttime = trace1.stats.starttime
endtime = trace1.stats.endtime endtime = trace1.stats.endtime
edge_factory._clean_timeseries(timeseries,starttime-30,endtime+30) edge_factory._clean_timeseries(timeseries, starttime - 30, endtime + 30)
assert_equals(trace1.stats.starttime,starttime) assert_equals(trace1.stats.starttime, starttime)
# Change starttime by more than 1 delta # Change starttime by more than 1 delta
edge_factory._clean_timeseries(timeseries,starttime-90,endtime+90) edge_factory._clean_timeseries(timeseries, starttime - 90, endtime + 90)
assert_equals(trace1.stats.starttime,starttime-60) assert_equals(trace1.stats.starttime, starttime - 60)
assert_equals(np.isnan(trace1.data[0]),np.isnan(np.NaN)) assert_equals(np.isnan(trace1.data[0]), np.isnan(np.NaN))
def _create_trace(data,channel,starttime,delta=60.): def test_create_missing_channel():
"""edge_test.EdgeFactory_test.test_create_missing_channel()
"""
edge_factory = EdgeFactory()
trace1 = _create_trace([1, 1, 1, 1, 1], 'H', UTCDateTime("2018-01-01"))
trace2 = _create_trace([2, 2], 'E', UTCDateTime("2018-01-01"))
observatory = 'Test'
type = 'variation'
interval = 'minute'
network = 'NT'
location = 'R0'
trace3 = edge_factory._create_missing_channel(
starttime=trace1.stats.starttime,
endtime=trace1.stats.endtime,
observatory=observatory,
channel='F',
type=type,
interval=interval,
network=network,
station=trace1.stats.station,
location=location)
timeseries = Stream(traces=[trace1, trace2])
# For continuity set stats to be same for all traces
for trace in timeseries:
trace.stats.observatory = observatory
trace.stats.type = type
trace.stats.interval = interval
trace.stats.network = network
trace.stats.station = trace1.stats.station
trace.stats.location = location
timeseries += trace3
assert_equals(len(trace3[0].data), trace3[0].stats.npts)
assert_equals(timeseries[0].stats.starttime, timeseries[2].stats.starttime)
edge_factory._clean_timeseries(
timeseries=timeseries,
starttime=trace1.stats.starttime,
endtime=trace1.stats.endtime)
assert_equals(len(trace3[0].data), trace3[0].stats.npts)
assert_equals(timeseries[0].stats.starttime, timeseries[2].stats.starttime)
# Change starttime by more than 1 delta
starttime = trace1.stats.starttime
endtime = trace1.stats.endtime
edge_factory._clean_timeseries(timeseries, starttime - 90, endtime + 90)
assert_equals(len(trace3[0].data), trace3[0].stats.npts)
assert_equals(timeseries[0].stats.starttime, timeseries[2].stats.starttime)
def _create_trace(data, channel, starttime, delta=60.):
stats = Stats() stats = Stats()
stats.channel = channel stats.channel = channel
stats.delta = delta stats.delta = delta
stats.starttime = starttime stats.starttime = starttime
stats.npts = len(data) stats.npts = len(data)
data = np.array(data,dtype=np.float64) data = np.array(data, dtype=np.float64)
return Trace(data,stats) return Trace(data, stats)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment