From 03d046cda475da44873bddbee9125cc30e29bbed Mon Sep 17 00:00:00 2001
From: Jesse Mapel <jmapel@usgs.gov>
Date: Mon, 24 Feb 2020 14:26:25 -0700
Subject: [PATCH] Fixed covariance clalculations

---
 plio/utils/covariance.py            | 14 +++++++++-----
 plio/utils/tests/test_covariance.py |  8 ++++----
 2 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/plio/utils/covariance.py b/plio/utils/covariance.py
index d4cbb56..ca12526 100644
--- a/plio/utils/covariance.py
+++ b/plio/utils/covariance.py
@@ -1,7 +1,7 @@
 import numpy as np
 import math
 
-def compute_covariance(lat, lon, rad, latsigma=10., lonsigma=10., radsigma=15., semimajor_axis=1737400.0):
+def compute_covariance(lat, lon, rad, latsigma=10., lonsigma=10., radsigma=15., semimajor_axis=None):
     """
     Given geospatial coordinates, desired accuracy sigmas, and an equitorial radius, compute a 2x3
     sigma covariange matrix.
@@ -27,7 +27,8 @@ def compute_covariance(lat, lon, rad, latsigma=10., lonsigma=10., radsigma=15.,
                The desired radius accuracy in meters (Defualt: 15.0)
 
     semimajor_axis : float
-                     The semi-major or equitorial radius in meters (Default: 1737400.0 - Moon)
+                     The semi-major or equitorial radius in meters. If not entered,
+                     the local radius will be used.
 
     Returns
     -------
@@ -37,12 +38,15 @@ def compute_covariance(lat, lon, rad, latsigma=10., lonsigma=10., radsigma=15.,
     """
     lat = math.radians(lat)
     lon = math.radians(lon)
-    
+
+    if semimajor_axis is None:
+        semimajor_axis = rad
+
     # SetSphericalSigmasDistance
     scaled_lat_sigma = latsigma / semimajor_axis
 
     # This is specific to each lon.
-    scaled_lon_sigma = lonsigma * math.cos(lat) / semimajor_axis
+    scaled_lon_sigma = lonsigma / (math.cos(lat) * semimajor_axis)
 
     # SetSphericalSigmas
     cov = np.eye(3,3)
@@ -77,4 +81,4 @@ def compute_covariance(lat, lon, rad, latsigma=10., lonsigma=10., radsigma=15.,
     rectcov[1,0] = mat[1,1]
     rectcov[1,1] = mat[1,2]
     rectcov[1,2] = mat[2,2]
-    return rectcov
\ No newline at end of file
+    return rectcov
diff --git a/plio/utils/tests/test_covariance.py b/plio/utils/tests/test_covariance.py
index 35bc270..a2c921d 100644
--- a/plio/utils/tests/test_covariance.py
+++ b/plio/utils/tests/test_covariance.py
@@ -8,12 +8,12 @@ def test_compute_covariance():
     # This test is using values from an ISIS control network
     lat = 86.235596
     lon = 140.006195
-    rad = 1736777.625 
+    rad = 1736777.625
     sigmalat = 15.0
     sigmalon = 15.0
     sigmarad = 25.0
     semimajor_rad = 1737400.0
     cov = covariance.compute_covariance(lat, lon, rad, sigmalat, sigmalon, sigmarad, semimajor_rad)
-    expected =  np.array([[132.97888775695, -111.55453178747, -20.08405416233],
-                          [93.588991760138, 16.848822261184, 623.27512692323]])
-    np.testing.assert_almost_equal(cov, expected)
\ No newline at end of file
+    expected =  np.array([[225.85120968, -0.84930178, -20.08405416233],
+                          [225.55132129, 16.848822261184, 623.27512692323]])
+    np.testing.assert_almost_equal(cov, expected)
-- 
GitLab