From e8c1c5df130ef4f824450d47bb8a4f565c51df71 Mon Sep 17 00:00:00 2001
From: pcain-usgs <pcain@usgs.gov>
Date: Thu, 21 May 2020 12:45:23 -0600
Subject: [PATCH] Add webservice support

---
 geomagio/api/ws/Element.py |  1 +
 geomagio/api/ws/data.py    | 36 ++++++++++++++++++++++++++++++++----
 2 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/geomagio/api/ws/Element.py b/geomagio/api/ws/Element.py
index eff80cca9..6d0eb7fd6 100644
--- a/geomagio/api/ws/Element.py
+++ b/geomagio/api/ws/Element.py
@@ -36,6 +36,7 @@ ELEMENTS = [
         id="UK3", abbreviation="T-Fluxgate", name="Fluxgate Temperature", units="°C"
     ),
     Element(id="UK4", abbreviation="T-Outside", name="Outside Temperature", units="°C"),
+    Element(id="DDT", abbreviation="DbDt", name="Time Derivative", units="1/s"),
 ]
 
 ELEMENT_INDEX = {e.id: e for e in ELEMENTS}
diff --git a/geomagio/api/ws/data.py b/geomagio/api/ws/data.py
index fdf8e0309..345c47633 100644
--- a/geomagio/api/ws/data.py
+++ b/geomagio/api/ws/data.py
@@ -5,6 +5,7 @@ from fastapi import APIRouter, Depends, Query
 from obspy import UTCDateTime, Stream
 from starlette.responses import Response
 
+from ...algorithm.DbDtAlgorithm import DbDtAlgorithm
 from ... import TimeseriesFactory, TimeseriesUtility
 from ...edge import EdgeFactory
 from ...iaga2002 import IAGA2002Writer
@@ -64,16 +65,43 @@ def get_timeseries(data_factory: TimeseriesFactory, query: DataApiQuery) -> Stre
     data_factory: where to read data
     query: parameters for the data to read
     """
+
+    # gather non-dbdt elements first
+    base_elements = [element for element in query.elements if element[1::] != "_DDT"]
+
+    # gather interval
+    interval = TimeseriesUtility.get_interval_from_delta(query.sampling_period)
     # get data
-    timeseries = data_factory.get_timeseries(
+    base_timeseries = data_factory.get_timeseries(
         starttime=query.starttime,
         endtime=query.endtime,
         observatory=query.id,
-        channels=query.elements,
+        channels=base_elements,
         type=query.data_type,
-        interval=TimeseriesUtility.get_interval_from_delta(query.sampling_period),
+        interval=interval,
     )
-    return timeseries
+
+    if "*_DDT" in query.elements:
+        dbdt_elements = [
+            element[0:1] for element in query.elements if element[1::] == "_DDT"
+        ]
+
+        timeseries = data_factory.get_timeseries(
+            starttime=query.starttime,
+            endtime=query.endtime,
+            observatory=query.id,
+            channels=dbdt_elements,
+            type=query.data_type,
+            interval=interval,
+        )
+
+        dbdt_timeseries = DbDtAlgorithm(
+            inchannels=dbdt_elements, outchannels=dbdt_elements + "_DDT"
+        ).process(timeseries)
+
+        base_timeseries += (trace for trace in dbdt_timeseries)
+
+    return base_timeseries
 
 
 router = APIRouter()
-- 
GitLab