diff --git a/geomagio/TimeseriesFactory.py b/geomagio/TimeseriesFactory.py index 7446f81ee6cc4877dde540044c53c742e9a3564f..064b868d6618b2d8cfedf2a8b12df342169cfe88 100644 --- a/geomagio/TimeseriesFactory.py +++ b/geomagio/TimeseriesFactory.py @@ -67,6 +67,7 @@ class TimeseriesFactory(object): channels=None, type=None, interval=None, + add_empty_channels: bool = True, ): """Get timeseries data. @@ -93,6 +94,8 @@ class TimeseriesFactory(object): interval : {'day', 'hour', 'minute', 'month', 'second'} data interval, optional. uses default if unspecified. + add_empty_channels + if True, returns channels without data as empty traces Returns ------- diff --git a/geomagio/edge/EdgeFactory.py b/geomagio/edge/EdgeFactory.py index 682d03f733ed2b24fa04269925859f3279f179ed..5dbde248fe229a42b9b68072c97337bdeb62ba94 100644 --- a/geomagio/edge/EdgeFactory.py +++ b/geomagio/edge/EdgeFactory.py @@ -91,7 +91,6 @@ class EdgeFactory(TimeseriesFactory): ): TimeseriesFactory.__init__(self, observatory, channels, type, interval) self.client = earthworm.Client(host, port) - self.observatoryMetadata = observatoryMetadata or ObservatoryMetadata() self.tag = tag self.locationCode = locationCode @@ -111,6 +110,7 @@ class EdgeFactory(TimeseriesFactory): channels=None, type=None, interval=None, + add_empty_channels: bool = True, ): """Get timeseries data @@ -128,6 +128,8 @@ class EdgeFactory(TimeseriesFactory): data type. interval: {'day', 'hour', 'minute', 'second', 'tenhertz'} data interval. + add_empty_channels + if True, returns channels without data as empty traces Returns ------- @@ -159,8 +161,16 @@ class EdgeFactory(TimeseriesFactory): timeseries = obspy.core.Stream() for channel in channels: data = self._get_timeseries( - starttime, endtime, observatory, channel, type, interval + starttime, + endtime, + observatory, + channel, + type, + interval, + add_empty_channels, ) + if len(data) == 0: + continue timeseries += data finally: # restore stdout @@ -278,7 +288,16 @@ class EdgeFactory(TimeseriesFactory): trace.data = numpy.ma.masked_invalid(trace.data) return stream - def _get_timeseries(self, starttime, endtime, observatory, channel, type, interval): + def _get_timeseries( + self, + starttime, + endtime, + observatory, + channel, + type, + interval, + add_empty_channels: bool = True, + ): """get timeseries data for a single channel. Parameters @@ -295,6 +314,8 @@ class EdgeFactory(TimeseriesFactory): data type {definitive, quasi-definitive, variation} interval : str interval length {minute, second} + add_empty_channels + if True, returns channels without data as empty traces Returns ------- @@ -325,7 +346,7 @@ class EdgeFactory(TimeseriesFactory): for trace in data: trace.data = trace.data.astype("i4") data.merge() - if data.count() == 0: + if data.count() == 0 and add_empty_channels: data += TimeseriesUtility.create_empty_trace( starttime, endtime, diff --git a/geomagio/edge/MiniSeedFactory.py b/geomagio/edge/MiniSeedFactory.py index abcf8b261a501132f9e210a76c2efb670287eaaf..d708b30f47b7c21907b415b6e817c0e2b15f5024 100644 --- a/geomagio/edge/MiniSeedFactory.py +++ b/geomagio/edge/MiniSeedFactory.py @@ -97,6 +97,7 @@ class MiniSeedFactory(TimeseriesFactory): channels=None, type=None, interval=None, + add_empty_channels: bool = True, ): """Get timeseries data @@ -114,6 +115,8 @@ class MiniSeedFactory(TimeseriesFactory): data type. interval: {'day', 'hour', 'minute', 'second', 'tenhertz'} data interval. + add_empty_channels + if True, returns channels without data as empty traces Returns ------- @@ -150,8 +153,16 @@ class MiniSeedFactory(TimeseriesFactory): ) else: data = self._get_timeseries( - starttime, endtime, observatory, channel, type, interval + starttime, + endtime, + observatory, + channel, + type, + interval, + add_empty_channels, ) + if len(data) == 0: + continue timeseries += data finally: # restore stdout @@ -296,7 +307,16 @@ class MiniSeedFactory(TimeseriesFactory): trace.data = numpy.ma.masked_invalid(trace.data) return stream - def _get_timeseries(self, starttime, endtime, observatory, channel, type, interval): + def _get_timeseries( + self, + starttime, + endtime, + observatory, + channel, + type, + interval, + add_empty_channels: bool = True, + ): """get timeseries data for a single channel. Parameters @@ -313,6 +333,8 @@ class MiniSeedFactory(TimeseriesFactory): data type {definitive, quasi-definitive, variation} interval : str interval length {'day', 'hour', 'minute', 'second', 'tenhertz'} + add_empty_channels + if True, returns channels without data as empty traces Returns ------- @@ -330,7 +352,7 @@ class MiniSeedFactory(TimeseriesFactory): sncl.network, sncl.station, sncl.location, sncl.channel, starttime, endtime ) data.merge() - if data.count() == 0: + if data.count() == 0 and add_empty_channels: data += TimeseriesUtility.create_empty_trace( starttime, endtime, diff --git a/geomagio/iaga2002/StreamIAGA2002Factory.py b/geomagio/iaga2002/StreamIAGA2002Factory.py index 62f6f871c99b61aad9a4ce903f63a99cdbce0d66..eb1625f62c57b309c0f5063e520cb09a437b44d6 100644 --- a/geomagio/iaga2002/StreamIAGA2002Factory.py +++ b/geomagio/iaga2002/StreamIAGA2002Factory.py @@ -31,6 +31,7 @@ class StreamIAGA2002Factory(IAGA2002Factory): channels=None, type=None, interval=None, + add_empty_channels: bool = True, ): """Implements get_timeseries diff --git a/geomagio/imfv122/StreamIMFV122Factory.py b/geomagio/imfv122/StreamIMFV122Factory.py index b868d8dd20318e1587403dda00b6f751876ad1cd..4a9575fc9dba04c986b54e76014477c0e6a0c7ad 100644 --- a/geomagio/imfv122/StreamIMFV122Factory.py +++ b/geomagio/imfv122/StreamIMFV122Factory.py @@ -31,6 +31,7 @@ class StreamIMFV122Factory(IMFV122Factory): channels=None, type=None, interval=None, + add_empty_channels: bool = True, ): """Implements get_timeseries diff --git a/geomagio/imfv283/GOESIMFV283Factory.py b/geomagio/imfv283/GOESIMFV283Factory.py index 29bda1d9b9f912b481ba3b0f8ad9cc0bc5569d4f..195e8710505ea21bd631ec8fdacbb252dfd63947 100644 --- a/geomagio/imfv283/GOESIMFV283Factory.py +++ b/geomagio/imfv283/GOESIMFV283Factory.py @@ -67,6 +67,7 @@ class GOESIMFV283Factory(IMFV283Factory): channels=None, type=None, interval=None, + add_empty_channels: bool = True, ): """Implements get_timeseries diff --git a/geomagio/imfv283/StreamIMFV283Factory.py b/geomagio/imfv283/StreamIMFV283Factory.py index aff52877f6bbe3948acb82fddd31326148fb6854..402f0e2c3199ceb58ddcb9223815e045f582edf8 100644 --- a/geomagio/imfv283/StreamIMFV283Factory.py +++ b/geomagio/imfv283/StreamIMFV283Factory.py @@ -31,6 +31,7 @@ class StreamIMFV283Factory(IMFV283Factory): channels=None, type=None, interval=None, + add_empty_channels: bool = True, ): """Implements get_timeseries diff --git a/test/edge_test/EdgeFactory_test.py b/test/edge_test/EdgeFactory_test.py index 6b524fb318b3fad25afdee0613255d4551ff8aba..55e94f1266fef85c9f6b0cdafa15b781420d656e 100644 --- a/test/edge_test/EdgeFactory_test.py +++ b/test/edge_test/EdgeFactory_test.py @@ -29,3 +29,28 @@ def dont_get_timeseries(): "H", "Expect timeseries stats channel to be equal to H", ) + + +def test_add_empty_channels(): + """edge_test.EdgeFactory_test.test_add_empty_channels()""" + edge_factory = EdgeFactory(host="TODO", port="TODO") + timeseries = edge_factory.get_timeseries( + UTCDateTime(2015, 3, 1, 0, 0, 0), + UTCDateTime(2015, 3, 1, 1, 0, 0), + "BOU", + ("H"), + "variation", + "minute", + add_empty_channels=False, + ) + assert len(timeseries) == 0 + timeseries = edge_factory.get_timeseries( + UTCDateTime(2015, 3, 1, 0, 0, 0), + UTCDateTime(2015, 3, 1, 1, 0, 0), + "BOU", + ("H"), + "variation", + "minute", + add_empty_channels=True, # default + ) + assert len(timeseries) == 1