From 1638edc1a7432d69da5d353509c50a096750f064 Mon Sep 17 00:00:00 2001
From: Hal Simpson <hasimpson@usgs.gov>
Date: Mon, 29 Jun 2015 13:12:24 -0600
Subject: [PATCH] Added update_realitime flag to init.  run_as_update is
 completed up to finding gaps, and backing up to find 'All' new data.  Still
 need to call the algorithm,  and write out the data that's 'new'

---
 geomagio/Controller.py | 75 ++++++++++++++++++++++++++++++++----------
 1 file changed, 58 insertions(+), 17 deletions(-)

diff --git a/geomagio/Controller.py b/geomagio/Controller.py
index d1dd90e9..2f7b3bf3 100644
--- a/geomagio/Controller.py
+++ b/geomagio/Controller.py
@@ -1,6 +1,8 @@
 """Controller class for geomag algorithms"""
 
-import TimeseriesUtilities
+import TimeseriesUtilities as TUtils
+import numpy
+import obspy
 
 
 class Controller(object):
@@ -15,11 +17,14 @@ class Controller(object):
     algorithm: the algorithm(s) that will take procees the timeseries data
     """
 
-    def __init__(self, inputFactory, outputFactory, algorithm, update=False):
+    def __init__(self, inputFactory, outputFactory, algorithm, update=False,
+            interval='minute', update_realtime=False):
         self._inputFactory = inputFactory
         self._algorithm = algorithm
         self._outputFactory = outputFactory
         self._update = update
+        self._interval = interval
+        self._update_realtime = update_realtime
 
     def run(self, starttime, endtime):
         """run an algorithm as setup up by the main script.
@@ -39,24 +44,60 @@ class Controller(object):
     def run_as_update(self, starttime, endtime):
         input_channels = self._algorithm.get_input_channels()
         output_channels = self._algorithm.get_output_channels()
+        seconds_of_interval = TUtils.get_seconds_of_interval(self._interval)
+        backup_start = starttime
+        backup_end = endtime
+        backup = self._update_realtime
 
-        timeseries_in = self._inputFactory.get_timeseries(starttime,
+        # get new input_channel data, and last output data.
+        timeseries_in = self._inputFactory.get_timeseries(backup_start,
                 endtime, channels=input_channels)
-        timeseries_out = self._inputFactory.get_timeseries(starttime,
+        timeseries_update = self._outputFactory.get_timeseries(backup_start,
                 endtime, channels=output_channels)
-
-        #TODO get input gaps
-
-        output_gaps = TimeseriesUtilities.get_timeseries_gaps(
-            timeseries_out, output_channels, starttime, endtime)
-
-        output_merged_gaps = TimeseriesUtilities.get_merged_gaps(output_gaps,
-                output_channels)
-        # TODO compare gaps.
-        #   if there is new data, run algorithm over entire time.
-        #   save any new data.
-
-        #TODO iterate is starttime of gaps is starttime and new data found
+        # repeat until ouput is succesfully backfilled.
+        while backup:
+            first_in_exists = self._first_value_exists(timeseries_in,
+                    input_channels)
+            first_out_exists = self._first_value_exists(timeseries_update,
+                    output_channels)
+            if first_in_exists and not first_out_exists:
+                new_backup_end = backup_start - seconds_of_interval
+                backup_start = backup_start - (backup_end - backup_start)
+                backup_end = new_backup_end
+                timeseries_in += self._inputFactory.get_timeseries(
+                        backup_start, backup_end, channels=input_channels)
+                timeseries_update += self._outputFactory.get_timeseries(
+                        backup_start, backup_end, channels=output_channels)
+                timeseries_in.merge()
+                timeseries_update.merge()
+            else:
+                backup = False
+            print backup_start, backup_end
+        starttime = backup_start
+
+        input_gaps = TUtils.get_timeseries_gaps(
+            timeseries_in, input_channels, starttime, endtime)
+        output_gaps = TUtils.get_timeseries_gaps(
+            timeseries_update, output_channels, starttime, endtime)
+
+        input_merged_gaps = TUtils.get_merged_gaps(
+                input_gaps, input_channels)
+        output_merged_gaps = TUtils.get_merged_gaps(
+                output_gaps, output_channels)
+
+        if TUtils.is_new_data(input_merged_gaps, output_merged_gaps):
+            pass
+
+            # TODO call algorithm
+
+            # TODO call output
+
+    def _first_value_exists(self, timeseries, channels):
+        for channel in channels:
+            stream = timeseries.select(channel=channel)
+            if len(stream[0].data) and not numpy.isnan(stream[0].data[0]):
+                return True
+        return False
 
 
     def run_as_timeseries(self, starttime, endtime):
-- 
GitLab