From cf9fefaee65bf9268dcb5fe14265c1ca1c4c6bab Mon Sep 17 00:00:00 2001
From: pcain-usgs <pcain@usgs.gov>
Date: Fri, 29 Jan 2021 10:18:51 -0700
Subject: [PATCH] Create nan matrix/pier correction with invalid readings

---
 geomagio/adjusted/Affine.py         |  6 ++++--
 test/adjusted_test/adjusted_test.py | 27 ++++++++++++++++++---------
 2 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/geomagio/adjusted/Affine.py b/geomagio/adjusted/Affine.py
index 1acc42171..54820455a 100644
--- a/geomagio/adjusted/Affine.py
+++ b/geomagio/adjusted/Affine.py
@@ -267,7 +267,6 @@ class Affine(BaseModel):
         times = self.get_times(readings)
         Ms = []
         weights = []
-        metrics = []
         inputs = ordinates
 
         for transform in self.transforms:
@@ -278,7 +277,10 @@ class Affine(BaseModel):
             )
             # return NaNs if no valid observations
             if np.sum(weights) == 0:
-                raise ValueError(f"No valid observations for {time}")
+                return AdjustedMatrix(
+                    matrix=np.nan * np.ones((4, 4)),
+                    pier_correction=np.nan,
+                )
             # zero out statistically 'bad' baselines
             weights = self.weight_baselines(baselines=baselines, weights=weights)
 
diff --git a/test/adjusted_test/adjusted_test.py b/test/adjusted_test/adjusted_test.py
index 26047cccc..adcd74112 100644
--- a/test/adjusted_test/adjusted_test.py
+++ b/test/adjusted_test/adjusted_test.py
@@ -1,6 +1,6 @@
 import json
 import numpy as np
-from numpy.testing import assert_equal, assert_array_almost_equal, assert_array_less
+from numpy.testing import assert_equal, assert_array_almost_equal, assert_array_equal
 from obspy.core import UTCDateTime
 
 from geomagio.adjusted.SpreadsheetSummaryFactory import SpreadsheetSummaryFactory
@@ -235,7 +235,6 @@ def test_BOU201911202001_short_causal():
     ).calculate(readings=readings)
 
     matrices = format_result([adjusted_matrix.matrix for adjusted_matrix in result])
-    metrics = [adjusted_matrix.metrics for adjusted_matrix in result]
     expected_matrices = get_excpected_matrices("BOU", "short_causal")
     for i in range(len(matrices)):
         assert_array_almost_equal(
@@ -266,7 +265,6 @@ def test_BOU201911202001_short_acausal():
     )
 
     matrices = format_result([adjusted_matrix.matrix for adjusted_matrix in result])
-    metrics = [adjusted_matrix.metrics for adjusted_matrix in result]
     expected_matrices = get_excpected_matrices("BOU", "short_acausal")
     for i in range(len(matrices)):
         assert_array_almost_equal(
@@ -301,7 +299,6 @@ def test_BOU201911202001_infinite_weekly():
     )
 
     matrices = format_result([adjusted_matrix.matrix for adjusted_matrix in result])
-    metrics = [adjusted_matrix.metrics for adjusted_matrix in result]
     expected_matrices = get_excpected_matrices("BOU", "inf_weekly")
     for i in range(len(matrices)):
         assert_array_almost_equal(
@@ -330,7 +327,6 @@ def test_BOU201911202001_infinite_one_interval():
     )
 
     matrices = format_result([adjusted_matrix.matrix for adjusted_matrix in result])
-    metrics = [adjusted_matrix.metrics for adjusted_matrix in result]
     expected_matrices = get_excpected_matrices("BOU", "inf_one_interval")
     for i in range(len(matrices)):
         assert_array_almost_equal(
@@ -342,6 +338,23 @@ def test_BOU201911202001_infinite_one_interval():
     assert_equal(len(matrices), 1)
 
 
+def test_BOU201911202001_invalid_readings():
+    readings = []
+    result = Affine(
+        observatory="BOU",
+        starttime=UTCDateTime("2019-11-01T00:00:00Z"),
+        endtime=UTCDateTime("2020-01-31T23:59:00Z"),
+        acausal=True,
+        transforms=[
+            RotationTranslationXY(memory=np.inf),
+            TranslateOrigins(memory=np.inf),
+        ],
+        update_interval=None,
+    ).calculate(readings=readings,)[0]
+    assert_array_equal(result.matrix, np.nan * np.ones((4, 4)))
+    assert_equal(result.pier_correction, np.nan)
+
+
 def test_CMO2015_causal():
     readings = get_spreadsheet_directory_readings(
         observatory="CMO",
@@ -366,7 +379,6 @@ def test_CMO2015_causal():
     )
 
     matrices = format_result([adjusted_matrix.matrix for adjusted_matrix in result])
-    metrics = [adjusted_matrix.metrics for adjusted_matrix in result]
     expected_matrices = get_excpected_matrices("CMO", "short_causal")
     for i in range(len(matrices)):
         assert_array_almost_equal(
@@ -403,7 +415,6 @@ def test_CMO2015_acausal():
     )
 
     matrices = format_result([adjusted_matrix.matrix for adjusted_matrix in result])
-    metrics = [adjusted_matrix.metrics for adjusted_matrix in result]
     expected_matrices = get_excpected_matrices("CMO", "short_acausal")
     for i in range(len(matrices)):
         assert_array_almost_equal(
@@ -444,7 +455,6 @@ def test_CMO2015_infinite_weekly():
     )
 
     matrices = format_result([adjusted_matrix.matrix for adjusted_matrix in result])
-    metrics = [adjusted_matrix.metrics for adjusted_matrix in result]
     expected_matrices = get_excpected_matrices("CMO", "inf_weekly")
     for i in range(len(matrices)):
         assert_array_almost_equal(
@@ -481,7 +491,6 @@ def test_CMO2015_infinite_one_interval():
     )
 
     matrices = format_result([adjusted_matrix.matrix for adjusted_matrix in result])
-    metrics = [adjusted_matrix.metrics for adjusted_matrix in result]
     expected_matrices = get_excpected_matrices("CMO", "inf_one_interval")
     for i in range(len(matrices)):
         assert_array_almost_equal(
-- 
GitLab