From 99a999c7400d16e2c8c7e74e03da24a7d4443b25 Mon Sep 17 00:00:00 2001
From: pcain-usgs <pcain@usgs.gov>
Date: Tue, 19 May 2020 17:44:22 -0600
Subject: [PATCH 01/10] Create Diagnostics object in Reading, fix return values

---
 geomagio/residual/Calculation.py | 37 ++++++++++++++++++++++++--------
 geomagio/residual/Diagnostics.py | 28 ++++++++++++++++++++++++
 geomagio/residual/Reading.py     |  2 ++
 3 files changed, 58 insertions(+), 9 deletions(-)
 create mode 100644 geomagio/residual/Diagnostics.py

diff --git a/geomagio/residual/Calculation.py b/geomagio/residual/Calculation.py
index 0d1cec215..a4f6e3e2b 100644
--- a/geomagio/residual/Calculation.py
+++ b/geomagio/residual/Calculation.py
@@ -11,6 +11,7 @@ from .MeasurementType import (
     MARK_TYPES,
 )
 from .Measurement import AverageMeasurement, Measurement, average_measurement
+from .Diagnostics import Diagnostics
 from .Reading import Reading
 
 
@@ -40,7 +41,7 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
         mean=mean,
         reference=adjust_reference and reference or None,
     )
-    absoluteD = calculate_D_absolute(
+    absoluteD, average_mark, meridian, azimuth, mark_azimuth = calculate_D_absolute(
         azimuth=reading.azimuth,
         h_baseline=absoluteH.baseline,
         measurements=reading.measurements,
@@ -55,12 +56,23 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
             inclination=inclination,
             measurements=scale_measurements,
         )
+    diagnostics = Diagnostics(
+        meridian=meridian,
+        mean_mark=average_mark,
+        magnetic_azimuth=azimuth,
+        mark_azimuth=mark_azimuth,
+        declination=absoluteD.absolute,
+        inclination=inclination,
+        h_component=absoluteH.absolute,
+        z_component=absoluteZ.absolute,
+    )
     # create new reading object
     calculated = Reading(
         absolutes=[absoluteD, absoluteH, absoluteZ],
         scale_value=scale_value,
+        diagnostics=diagnostics,
         # copy other attributes
-        **reading.dict(exclude={"absolutes", "scale_value"}),
+        **reading.dict(exclude={"absolutes", "scale_value", "diagnostics"}),
     )
     return calculated
 
@@ -111,6 +123,7 @@ def calculate_D_absolute(
             for m in declination_measurements
         ]
     )
+    mark_azimuth = azimuth
     shift = 0
     if azimuth > 180:
         shift = -180
@@ -119,13 +132,19 @@ def calculate_D_absolute(
     d_b = (meridian - average_mark) + azimuth + shift
     # calculate absolute
     d_abs = d_b + np.degrees(np.arctan(reference.e / (reference.h + h_baseline)))
-    return Absolute(
-        element="D",
-        absolute=d_abs,
-        baseline=d_b,
-        shift=shift,
-        starttime=mean.time,
-        endtime=mean.endtime,
+    return (
+        Absolute(
+            element="D",
+            absolute=d_abs,
+            baseline=d_b,
+            shift=shift,
+            starttime=mean.time,
+            endtime=mean.endtime,
+        ),
+        average_mark,
+        meridian,
+        azimuth,
+        mark_azimuth,
     )
 
 
diff --git a/geomagio/residual/Diagnostics.py b/geomagio/residual/Diagnostics.py
new file mode 100644
index 000000000..793f763ed
--- /dev/null
+++ b/geomagio/residual/Diagnostics.py
@@ -0,0 +1,28 @@
+from typing import Optional
+
+from pydantic import BaseModel
+
+
+class Diagnostics(BaseModel):
+    """Computed diagnostics during calculation.
+
+    Attributes
+    ----------
+    meridian: claculated from declination measurements
+    mean_mark: average mark angles from measurements
+    magnetic_azimuh: after adjustment
+    mark_azimuth: from metadata
+    declination: from declination measurements
+    inclination: from inclination measurements
+    h_component: H baseline from calculations
+    z_component: Z baseline from calculations
+    """
+
+    meridian: float = None
+    mean_mark: float = None
+    magnetic_azimuth: float = None
+    mark_azimuth: float = None
+    declination: float = None
+    inclination: float = None
+    h_component: float = None
+    z_component: float = None
diff --git a/geomagio/residual/Reading.py b/geomagio/residual/Reading.py
index c91fcd6cc..06c8efb97 100644
--- a/geomagio/residual/Reading.py
+++ b/geomagio/residual/Reading.py
@@ -9,6 +9,7 @@ from .. import TimeseriesUtility
 from ..TimeseriesFactory import TimeseriesFactory
 from .Absolute import Absolute
 from .Measurement import Measurement, average_measurement
+from .Diagnostics import Diagnostics
 from .MeasurementType import MeasurementType
 
 
@@ -33,6 +34,7 @@ class Reading(BaseModel):
     metadata: Dict = {}
     pier_correction: float = 0
     scale_value: float = None
+    diagnostics: Diagnostics = None
 
     def __getitem__(self, measurement_type: MeasurementType):
         """Provide access to measurements by type.
-- 
GitLab


From 86040c1524ed691d039b3679632e5e440a82a669 Mon Sep 17 00:00:00 2001
From: pcain-usgs <pcain@usgs.gov>
Date: Wed, 20 May 2020 14:15:35 -0600
Subject: [PATCH 02/10] Set magnetic_azimuth to shifted azimuth

---
 geomagio/residual/Calculation.py | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/geomagio/residual/Calculation.py b/geomagio/residual/Calculation.py
index a4f6e3e2b..b94df88d8 100644
--- a/geomagio/residual/Calculation.py
+++ b/geomagio/residual/Calculation.py
@@ -41,7 +41,7 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
         mean=mean,
         reference=adjust_reference and reference or None,
     )
-    absoluteD, average_mark, meridian, azimuth, mark_azimuth = calculate_D_absolute(
+    absoluteD, average_mark, meridian, azimuth, magnetic_azimuth = calculate_D_absolute(
         azimuth=reading.azimuth,
         h_baseline=absoluteH.baseline,
         measurements=reading.measurements,
@@ -59,8 +59,8 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
     diagnostics = Diagnostics(
         meridian=meridian,
         mean_mark=average_mark,
-        magnetic_azimuth=azimuth,
-        mark_azimuth=mark_azimuth,
+        magnetic_azimuth=magnetic_azimuth,
+        mark_azimuth=azimuth,
         declination=absoluteD.absolute,
         inclination=inclination,
         h_component=absoluteH.absolute,
@@ -132,6 +132,11 @@ def calculate_D_absolute(
     d_b = (meridian - average_mark) + azimuth + shift
     # calculate absolute
     d_abs = d_b + np.degrees(np.arctan(reference.e / (reference.h + h_baseline)))
+
+    # for diagnostics
+    if average_mark > 180:
+        average_mark -= 90
+
     return (
         Absolute(
             element="D",
@@ -143,8 +148,8 @@ def calculate_D_absolute(
         ),
         average_mark,
         meridian,
-        azimuth,
         mark_azimuth,
+        azimuth,
     )
 
 
-- 
GitLab


From 5951d57063657e9f257ea97373b61128a2844e49 Mon Sep 17 00:00:00 2001
From: pcain-usgs <pcain@usgs.gov>
Date: Wed, 20 May 2020 14:49:38 -0600
Subject: [PATCH 03/10] Change magnetic meridian calculation

---
 geomagio/residual/Calculation.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/geomagio/residual/Calculation.py b/geomagio/residual/Calculation.py
index b94df88d8..97f7ea9fa 100644
--- a/geomagio/residual/Calculation.py
+++ b/geomagio/residual/Calculation.py
@@ -149,7 +149,7 @@ def calculate_D_absolute(
         average_mark,
         meridian,
         mark_azimuth,
-        azimuth,
+        (average_mark - meridian),
     )
 
 
-- 
GitLab


From a67d4efe97e83696254779b768812bd87421aeab Mon Sep 17 00:00:00 2001
From: pcain-usgs <pcain@usgs.gov>
Date: Wed, 27 May 2020 12:11:14 -0600
Subject: [PATCH 04/10] Calculate south facing meridian

---
 geomagio/residual/Calculation.py | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/geomagio/residual/Calculation.py b/geomagio/residual/Calculation.py
index 97f7ea9fa..e5a770bf9 100644
--- a/geomagio/residual/Calculation.py
+++ b/geomagio/residual/Calculation.py
@@ -123,6 +123,22 @@ def calculate_D_absolute(
             for m in declination_measurements
         ]
     )
+    # calculate south-facing meridian for diagnostics
+    south_meridian = np.average(
+        [
+            m.angle
+            + np.degrees(
+                m.measurement_type.meridian
+                * (np.arcsin(m.residual / np.sqrt((m.h + h_baseline) ** 2 + m.e ** 2)))
+            )
+            - np.degrees(np.arctan(m.e / (m.h + h_baseline)))
+            for m in [
+                average_measurement(measurements, [t])
+                for t in [mt.SOUTH_UP, mt.SOUTH_DOWN]
+            ]
+        ]
+    )
+
     mark_azimuth = azimuth
     shift = 0
     if azimuth > 180:
@@ -147,9 +163,9 @@ def calculate_D_absolute(
             endtime=mean.endtime,
         ),
         average_mark,
-        meridian,
+        south_meridian,
         mark_azimuth,
-        (average_mark - meridian),
+        (meridian - average_mark),
     )
 
 
-- 
GitLab


From 46ab4a8cd50e44bbb6c27fcefea15cb575045e57 Mon Sep 17 00:00:00 2001
From: pcain-usgs <pcain@usgs.gov>
Date: Wed, 27 May 2020 12:47:28 -0600
Subject: [PATCH 05/10] Perform meridian check

---
 geomagio/residual/Calculation.py | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/geomagio/residual/Calculation.py b/geomagio/residual/Calculation.py
index e5a770bf9..d615f69e1 100644
--- a/geomagio/residual/Calculation.py
+++ b/geomagio/residual/Calculation.py
@@ -152,6 +152,8 @@ def calculate_D_absolute(
     # for diagnostics
     if average_mark > 180:
         average_mark -= 90
+    if meridian > 180:
+        meridian -= 90
 
     return (
         Absolute(
@@ -165,7 +167,7 @@ def calculate_D_absolute(
         average_mark,
         south_meridian,
         mark_azimuth,
-        (meridian - average_mark),
+        (average_mark - meridian),
     )
 
 
-- 
GitLab


From 01728d70ba5f4a3169fbe201dc8253a4ce75c297 Mon Sep 17 00:00:00 2001
From: pcain-usgs <pcain@usgs.gov>
Date: Wed, 3 Jun 2020 13:03:39 -0600
Subject: [PATCH 06/10] Fix merididan calculation, populate diagnostics from
 Spreadsheets

---
 geomagio/residual/Calculation.py              | 42 ++++---------------
 geomagio/residual/Diagnostics.py              |  5 ---
 .../residual/SpreadsheetAbsolutesFactory.py   | 22 ++++++++++
 3 files changed, 30 insertions(+), 39 deletions(-)

diff --git a/geomagio/residual/Calculation.py b/geomagio/residual/Calculation.py
index d615f69e1..1ec21a885 100644
--- a/geomagio/residual/Calculation.py
+++ b/geomagio/residual/Calculation.py
@@ -41,7 +41,7 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
         mean=mean,
         reference=adjust_reference and reference or None,
     )
-    absoluteD, average_mark, meridian, azimuth, magnetic_azimuth = calculate_D_absolute(
+    absoluteD, diagnostics = calculate_D_absolute(
         azimuth=reading.azimuth,
         h_baseline=absoluteH.baseline,
         measurements=reading.measurements,
@@ -56,16 +56,6 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
             inclination=inclination,
             measurements=scale_measurements,
         )
-    diagnostics = Diagnostics(
-        meridian=meridian,
-        mean_mark=average_mark,
-        magnetic_azimuth=magnetic_azimuth,
-        mark_azimuth=azimuth,
-        declination=absoluteD.absolute,
-        inclination=inclination,
-        h_component=absoluteH.absolute,
-        z_component=absoluteZ.absolute,
-    )
     # create new reading object
     calculated = Reading(
         absolutes=[absoluteD, absoluteH, absoluteZ],
@@ -82,7 +72,7 @@ def calculate_D_absolute(
     azimuth: float,
     h_baseline: float,
     reference: Measurement,
-) -> Absolute:
+) -> Tuple[Absolute, Diagnostics]:
     """Calculate D absolute.
 
     Parameters
@@ -123,23 +113,6 @@ def calculate_D_absolute(
             for m in declination_measurements
         ]
     )
-    # calculate south-facing meridian for diagnostics
-    south_meridian = np.average(
-        [
-            m.angle
-            + np.degrees(
-                m.measurement_type.meridian
-                * (np.arcsin(m.residual / np.sqrt((m.h + h_baseline) ** 2 + m.e ** 2)))
-            )
-            - np.degrees(np.arctan(m.e / (m.h + h_baseline)))
-            for m in [
-                average_measurement(measurements, [t])
-                for t in [mt.SOUTH_UP, mt.SOUTH_DOWN]
-            ]
-        ]
-    )
-
-    mark_azimuth = azimuth
     shift = 0
     if azimuth > 180:
         shift = -180
@@ -148,8 +121,8 @@ def calculate_D_absolute(
     d_b = (meridian - average_mark) + azimuth + shift
     # calculate absolute
     d_abs = d_b + np.degrees(np.arctan(reference.e / (reference.h + h_baseline)))
-
     # for diagnostics
+    magnetic_azimuth = average_mark - mean.angle
     if average_mark > 180:
         average_mark -= 90
     if meridian > 180:
@@ -164,10 +137,11 @@ def calculate_D_absolute(
             starttime=mean.time,
             endtime=mean.endtime,
         ),
-        average_mark,
-        south_meridian,
-        mark_azimuth,
-        (average_mark - meridian),
+        Diagnostics(
+            meridian=mean.angle,
+            mean_mark=average_mark,
+            magnetic_azimuth=magnetic_azimuth,
+        ),
     )
 
 
diff --git a/geomagio/residual/Diagnostics.py b/geomagio/residual/Diagnostics.py
index 793f763ed..8e5f2c940 100644
--- a/geomagio/residual/Diagnostics.py
+++ b/geomagio/residual/Diagnostics.py
@@ -21,8 +21,3 @@ class Diagnostics(BaseModel):
     meridian: float = None
     mean_mark: float = None
     magnetic_azimuth: float = None
-    mark_azimuth: float = None
-    declination: float = None
-    inclination: float = None
-    h_component: float = None
-    z_component: float = None
diff --git a/geomagio/residual/SpreadsheetAbsolutesFactory.py b/geomagio/residual/SpreadsheetAbsolutesFactory.py
index db8283787..024e27839 100644
--- a/geomagio/residual/SpreadsheetAbsolutesFactory.py
+++ b/geomagio/residual/SpreadsheetAbsolutesFactory.py
@@ -9,6 +9,8 @@ from .Absolute import Absolute
 from .Measurement import Measurement
 from .MeasurementType import MeasurementType as mt
 from .Reading import Reading
+from .Diagnostics import Diagnostics
+from .Calculation import DECLINATION_TYPES, MARK_TYPES, average_measurement
 from . import Angle
 
 
@@ -299,6 +301,7 @@ class SpreadsheetAbsolutesFactory(object):
             metadata=metadata,
             pier_correction=metadata["pier_correction"],
             scale_value=numpy.degrees(metadata["scale_value"]),
+            diagnostics=self._parse_diagnostics(measurements),
         )
 
     def _parse_absolutes(
@@ -402,6 +405,25 @@ class SpreadsheetAbsolutesFactory(object):
             "precision": measurement_sheet["H8"].value,
         }
 
+    def _parse_diagnostics(self, measurements: List[Measurement],) -> Diagnostics:
+        """
+        Gather diagnostics from list of measurements
+        """
+        mean_mark = average_measurement(measurements, MARK_TYPES).angle
+
+        meridian = average_measurement(measurements, DECLINATION_TYPES).angle
+
+        magnetic_azimuth = mean_mark - meridian
+
+        if meridian > 180:
+            magnetic_azimuth = mean_mark - (meridian - 90)
+        if mean_mark > 180:
+            mean_mark -= 90
+
+        return Diagnostics(
+            meridian=meridian, mean_mark=mean_mark, magnetic_azimuth=magnetic_azimuth,
+        )
+
 
 def convert_precision(angle, precision="DMS"):
     """
-- 
GitLab


From 10c0764d35b0179c234b4e95719b49d5cd69eb23 Mon Sep 17 00:00:00 2001
From: pcain-usgs <pcain@usgs.gov>
Date: Thu, 4 Jun 2020 09:35:21 -0600
Subject: [PATCH 07/10] Fix comments, imports, and spacing. Add diagnostics to
 testing

---
 Calculation_test.py                           | 27 +++++++++++++++++++
 geomagio/residual/Diagnostics.py              |  7 +----
 .../residual/SpreadsheetAbsolutesFactory.py   |  5 ++--
 3 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/Calculation_test.py b/Calculation_test.py
index b62c7a303..013e2949d 100644
--- a/Calculation_test.py
+++ b/Calculation_test.py
@@ -43,3 +43,30 @@ for filename in os.listdir("etc/residual"):
             err_msg="Baselines not within 4 decimals",
             verbose=True,
         )
+    # gather original and resulting diagnostics
+    o_diagnostics = original.diagnostics
+    r_diagnostics = original.diagnostics
+    # test mean mark values
+    assert_almost_equal(
+        o_diagnostics.mean_mark,
+        r_diagnostics.mean_mark,
+        decimal=2,
+        err_msg="Baselines not within 4 decimals",
+        verbose=True,
+    )
+    # test magnetic azimuth values
+    assert_almost_equal(
+        o_diagnostics.magnetic_azimuth,
+        r_diagnostics.magnetic_azimuth,
+        decimal=2,
+        err_msg="Baselines not within 4 decimals",
+        verbose=True,
+    )
+    # test meridian values
+    assert_almost_equal(
+        o_diagnostics.meridian,
+        r_diagnostics.meridian,
+        decimal=2,
+        err_msg="Baselines not within 4 decimals",
+        verbose=True,
+    )
diff --git a/geomagio/residual/Diagnostics.py b/geomagio/residual/Diagnostics.py
index 8e5f2c940..32d773c1f 100644
--- a/geomagio/residual/Diagnostics.py
+++ b/geomagio/residual/Diagnostics.py
@@ -8,14 +8,9 @@ class Diagnostics(BaseModel):
 
     Attributes
     ----------
-    meridian: claculated from declination measurements
+    meridian: calculated from declination measurements
     mean_mark: average mark angles from measurements
     magnetic_azimuh: after adjustment
-    mark_azimuth: from metadata
-    declination: from declination measurements
-    inclination: from inclination measurements
-    h_component: H baseline from calculations
-    z_component: Z baseline from calculations
     """
 
     meridian: float = None
diff --git a/geomagio/residual/SpreadsheetAbsolutesFactory.py b/geomagio/residual/SpreadsheetAbsolutesFactory.py
index 024e27839..63abcb20b 100644
--- a/geomagio/residual/SpreadsheetAbsolutesFactory.py
+++ b/geomagio/residual/SpreadsheetAbsolutesFactory.py
@@ -6,11 +6,11 @@ from obspy.core import UTCDateTime
 import openpyxl
 
 from .Absolute import Absolute
+from .Calculation import DECLINATION_TYPES, MARK_TYPES, average_measurement
+from .Diagnostics import Diagnostics
 from .Measurement import Measurement
 from .MeasurementType import MeasurementType as mt
 from .Reading import Reading
-from .Diagnostics import Diagnostics
-from .Calculation import DECLINATION_TYPES, MARK_TYPES, average_measurement
 from . import Angle
 
 
@@ -414,7 +414,6 @@ class SpreadsheetAbsolutesFactory(object):
         meridian = average_measurement(measurements, DECLINATION_TYPES).angle
 
         magnetic_azimuth = mean_mark - meridian
-
         if meridian > 180:
             magnetic_azimuth = mean_mark - (meridian - 90)
         if mean_mark > 180:
-- 
GitLab


From 0409f4ba61d83d3a366afbb7b021c2a8bef83a25 Mon Sep 17 00:00:00 2001
From: pcain-usgs <pcain@usgs.gov>
Date: Thu, 4 Jun 2020 11:54:50 -0600
Subject: [PATCH 08/10] Change diagnostic contents, test, and Calculation

---
 Calculation_test.py                           | 27 ---------------
 geomagio/residual/Calculation.py              | 33 +++++++++----------
 geomagio/residual/Diagnostics.py              | 13 ++++----
 .../residual/SpreadsheetAbsolutesFactory.py   | 25 +++++++-------
 4 files changed, 35 insertions(+), 63 deletions(-)

diff --git a/Calculation_test.py b/Calculation_test.py
index 013e2949d..b62c7a303 100644
--- a/Calculation_test.py
+++ b/Calculation_test.py
@@ -43,30 +43,3 @@ for filename in os.listdir("etc/residual"):
             err_msg="Baselines not within 4 decimals",
             verbose=True,
         )
-    # gather original and resulting diagnostics
-    o_diagnostics = original.diagnostics
-    r_diagnostics = original.diagnostics
-    # test mean mark values
-    assert_almost_equal(
-        o_diagnostics.mean_mark,
-        r_diagnostics.mean_mark,
-        decimal=2,
-        err_msg="Baselines not within 4 decimals",
-        verbose=True,
-    )
-    # test magnetic azimuth values
-    assert_almost_equal(
-        o_diagnostics.magnetic_azimuth,
-        r_diagnostics.magnetic_azimuth,
-        decimal=2,
-        err_msg="Baselines not within 4 decimals",
-        verbose=True,
-    )
-    # test meridian values
-    assert_almost_equal(
-        o_diagnostics.meridian,
-        r_diagnostics.meridian,
-        decimal=2,
-        err_msg="Baselines not within 4 decimals",
-        verbose=True,
-    )
diff --git a/geomagio/residual/Calculation.py b/geomagio/residual/Calculation.py
index 1ec21a885..6d58c0540 100644
--- a/geomagio/residual/Calculation.py
+++ b/geomagio/residual/Calculation.py
@@ -30,7 +30,7 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
     # reference measurement, used to adjust absolutes
     reference = reading[mt.WEST_DOWN][0]
     # calculate inclination
-    inclination, f, mean = calculate_I(
+    inclination, f, i_mean = calculate_I(
         hemisphere=reading.hemisphere, measurements=reading.measurements
     )
     corrected_f = f + reading.pier_correction
@@ -38,15 +38,21 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
     absoluteH, absoluteZ = calculate_HZ_absolutes(
         corrected_f=corrected_f,
         inclination=inclination,
-        mean=mean,
+        mean=i_mean,
         reference=adjust_reference and reference or None,
     )
-    absoluteD, diagnostics = calculate_D_absolute(
+    absoluteD, d_mean, m_mean = calculate_D_absolute(
         azimuth=reading.azimuth,
         h_baseline=absoluteH.baseline,
         measurements=reading.measurements,
         reference=adjust_reference and reference or None,
     )
+    # populate diagnostics object with averaged measurements
+    diagnostics = Diagnostics(
+        inclination_measurement=i_mean,
+        declination_measurement=d_mean,
+        mark_measurement=m_mean,
+    )
     # calculate scale
     scale_value = None
     scale_measurements = reading[mt.NORTH_DOWN_SCALE]
@@ -89,14 +95,14 @@ def calculate_D_absolute(
     mean = average_measurement(measurements, DECLINATION_TYPES)
     reference = reference or mean
     # average mark
-    average_mark = average_measurement(measurements, MARK_TYPES).angle
+    average_mark = average_measurement(measurements, MARK_TYPES)
     # adjust based on which is larger
     mark_up = average_measurement(measurements, [mt.FIRST_MARK_UP]).angle
     mark_down = average_measurement(measurements, [mt.FIRST_MARK_DOWN]).angle
     if mark_up < mark_down:
-        average_mark += 90
+        average_mark.angle += 90
     else:
-        average_mark -= 90
+        average_mark.angle -= 90
     # declination measurements
     declination_measurements = [
         average_measurement(measurements, [t]) for t in DECLINATION_TYPES
@@ -118,15 +124,9 @@ def calculate_D_absolute(
         shift = -180
     # add subtract average mark angle from average meridian angle and add
     # azimuth to get the declination baseline
-    d_b = (meridian - average_mark) + azimuth + shift
+    d_b = (meridian - average_mark.angle) + azimuth + shift
     # calculate absolute
     d_abs = d_b + np.degrees(np.arctan(reference.e / (reference.h + h_baseline)))
-    # for diagnostics
-    magnetic_azimuth = average_mark - mean.angle
-    if average_mark > 180:
-        average_mark -= 90
-    if meridian > 180:
-        meridian -= 90
 
     return (
         Absolute(
@@ -137,11 +137,8 @@ def calculate_D_absolute(
             starttime=mean.time,
             endtime=mean.endtime,
         ),
-        Diagnostics(
-            meridian=mean.angle,
-            mean_mark=average_mark,
-            magnetic_azimuth=magnetic_azimuth,
-        ),
+        mean,
+        average_mark,
     )
 
 
diff --git a/geomagio/residual/Diagnostics.py b/geomagio/residual/Diagnostics.py
index 32d773c1f..7cd1bde86 100644
--- a/geomagio/residual/Diagnostics.py
+++ b/geomagio/residual/Diagnostics.py
@@ -1,5 +1,6 @@
 from typing import Optional
 
+from .Measurement import Measurement
 from pydantic import BaseModel
 
 
@@ -8,11 +9,11 @@ class Diagnostics(BaseModel):
 
     Attributes
     ----------
-    meridian: calculated from declination measurements
-    mean_mark: average mark angles from measurements
-    magnetic_azimuh: after adjustment
+    inclination_measurement: Average of inclination measurements
+    declination_measurement: Average of declination measurements
+    mark_measurement: Average of mark measurements
     """
 
-    meridian: float = None
-    mean_mark: float = None
-    magnetic_azimuth: float = None
+    inclination_measurement: Measurement
+    declination_measurement: Measurement
+    mark_measurement: Measurement
diff --git a/geomagio/residual/SpreadsheetAbsolutesFactory.py b/geomagio/residual/SpreadsheetAbsolutesFactory.py
index 63abcb20b..84d3aefaf 100644
--- a/geomagio/residual/SpreadsheetAbsolutesFactory.py
+++ b/geomagio/residual/SpreadsheetAbsolutesFactory.py
@@ -6,7 +6,12 @@ from obspy.core import UTCDateTime
 import openpyxl
 
 from .Absolute import Absolute
-from .Calculation import DECLINATION_TYPES, MARK_TYPES, average_measurement
+from .Calculation import (
+    DECLINATION_TYPES,
+    MARK_TYPES,
+    INCLINATION_TYPES,
+    average_measurement,
+)
 from .Diagnostics import Diagnostics
 from .Measurement import Measurement
 from .MeasurementType import MeasurementType as mt
@@ -409,18 +414,14 @@ class SpreadsheetAbsolutesFactory(object):
         """
         Gather diagnostics from list of measurements
         """
-        mean_mark = average_measurement(measurements, MARK_TYPES).angle
-
-        meridian = average_measurement(measurements, DECLINATION_TYPES).angle
-
-        magnetic_azimuth = mean_mark - meridian
-        if meridian > 180:
-            magnetic_azimuth = mean_mark - (meridian - 90)
-        if mean_mark > 180:
-            mean_mark -= 90
-
         return Diagnostics(
-            meridian=meridian, mean_mark=mean_mark, magnetic_azimuth=magnetic_azimuth,
+            inclination_measurement=average_measurement(
+                measurements, INCLINATION_TYPES
+            ),
+            declination_measurement=average_measurement(
+                measurements, DECLINATION_TYPES
+            ),
+            mark_measurement=average_measurement(measurements, MARK_TYPES),
         )
 
 
-- 
GitLab


From e81d64f9af238cbe4212fb08c55b11be35c73474 Mon Sep 17 00:00:00 2001
From: pcain-usgs <pcain@usgs.gov>
Date: Thu, 4 Jun 2020 14:16:28 -0600
Subject: [PATCH 09/10] Update daignostics for calculation and spreadsheets

---
 geomagio/residual/Calculation.py                 | 11 +++--------
 geomagio/residual/Diagnostics.py                 | 10 ++++------
 geomagio/residual/SpreadsheetAbsolutesFactory.py | 14 +++-----------
 3 files changed, 10 insertions(+), 25 deletions(-)

diff --git a/geomagio/residual/Calculation.py b/geomagio/residual/Calculation.py
index 6d58c0540..b4564260a 100644
--- a/geomagio/residual/Calculation.py
+++ b/geomagio/residual/Calculation.py
@@ -41,18 +41,14 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
         mean=i_mean,
         reference=adjust_reference and reference or None,
     )
-    absoluteD, d_mean, m_mean = calculate_D_absolute(
+    absoluteD, meridian = calculate_D_absolute(
         azimuth=reading.azimuth,
         h_baseline=absoluteH.baseline,
         measurements=reading.measurements,
         reference=adjust_reference and reference or None,
     )
     # populate diagnostics object with averaged measurements
-    diagnostics = Diagnostics(
-        inclination_measurement=i_mean,
-        declination_measurement=d_mean,
-        mark_measurement=m_mean,
-    )
+    diagnostics = Diagnostics(inclination=inclination, meridian=meridian,)
     # calculate scale
     scale_value = None
     scale_measurements = reading[mt.NORTH_DOWN_SCALE]
@@ -137,8 +133,7 @@ def calculate_D_absolute(
             starttime=mean.time,
             endtime=mean.endtime,
         ),
-        mean,
-        average_mark,
+        meridian,
     )
 
 
diff --git a/geomagio/residual/Diagnostics.py b/geomagio/residual/Diagnostics.py
index 7cd1bde86..fd9dac1c9 100644
--- a/geomagio/residual/Diagnostics.py
+++ b/geomagio/residual/Diagnostics.py
@@ -9,11 +9,9 @@ class Diagnostics(BaseModel):
 
     Attributes
     ----------
-    inclination_measurement: Average of inclination measurements
-    declination_measurement: Average of declination measurements
-    mark_measurement: Average of mark measurements
+    inclination: Average of inclination measurements
+    meridian: Calculated meridian value
     """
 
-    inclination_measurement: Measurement
-    declination_measurement: Measurement
-    mark_measurement: Measurement
+    inclination: float
+    meridian: float
diff --git a/geomagio/residual/SpreadsheetAbsolutesFactory.py b/geomagio/residual/SpreadsheetAbsolutesFactory.py
index 84d3aefaf..ea0f300a2 100644
--- a/geomagio/residual/SpreadsheetAbsolutesFactory.py
+++ b/geomagio/residual/SpreadsheetAbsolutesFactory.py
@@ -306,7 +306,7 @@ class SpreadsheetAbsolutesFactory(object):
             metadata=metadata,
             pier_correction=metadata["pier_correction"],
             scale_value=numpy.degrees(metadata["scale_value"]),
-            diagnostics=self._parse_diagnostics(measurements),
+            diagnostics=self._parse_diagnostics(calculation_sheet),
         )
 
     def _parse_absolutes(
@@ -410,19 +410,11 @@ class SpreadsheetAbsolutesFactory(object):
             "precision": measurement_sheet["H8"].value,
         }
 
-    def _parse_diagnostics(self, measurements: List[Measurement],) -> Diagnostics:
+    def _parse_diagnostics(self, sheet: openpyxl.worksheet,) -> Diagnostics:
         """
         Gather diagnostics from list of measurements
         """
-        return Diagnostics(
-            inclination_measurement=average_measurement(
-                measurements, INCLINATION_TYPES
-            ),
-            declination_measurement=average_measurement(
-                measurements, DECLINATION_TYPES
-            ),
-            mark_measurement=average_measurement(measurements, MARK_TYPES),
-        )
+        return Diagnostics(inclination=sheet["H40"].value, meridian=sheet["E36"].value,)
 
 
 def convert_precision(angle, precision="DMS"):
-- 
GitLab


From 197c7d138e5f461514398ef66890e4800a1b11b3 Mon Sep 17 00:00:00 2001
From: pcain-usgs <pcain@usgs.gov>
Date: Tue, 22 Sep 2020 16:11:16 -0600
Subject: [PATCH 10/10] Black reformat

---
 geomagio/residual/Calculation.py                 |  5 ++++-
 geomagio/residual/SpreadsheetAbsolutesFactory.py | 10 ++++++++--
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/geomagio/residual/Calculation.py b/geomagio/residual/Calculation.py
index b4564260a..ddc108a4d 100644
--- a/geomagio/residual/Calculation.py
+++ b/geomagio/residual/Calculation.py
@@ -48,7 +48,10 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
         reference=adjust_reference and reference or None,
     )
     # populate diagnostics object with averaged measurements
-    diagnostics = Diagnostics(inclination=inclination, meridian=meridian,)
+    diagnostics = Diagnostics(
+        inclination=inclination,
+        meridian=meridian,
+    )
     # calculate scale
     scale_value = None
     scale_measurements = reading[mt.NORTH_DOWN_SCALE]
diff --git a/geomagio/residual/SpreadsheetAbsolutesFactory.py b/geomagio/residual/SpreadsheetAbsolutesFactory.py
index ea0f300a2..1f50f794f 100644
--- a/geomagio/residual/SpreadsheetAbsolutesFactory.py
+++ b/geomagio/residual/SpreadsheetAbsolutesFactory.py
@@ -410,11 +410,17 @@ class SpreadsheetAbsolutesFactory(object):
             "precision": measurement_sheet["H8"].value,
         }
 
-    def _parse_diagnostics(self, sheet: openpyxl.worksheet,) -> Diagnostics:
+    def _parse_diagnostics(
+        self,
+        sheet: openpyxl.worksheet,
+    ) -> Diagnostics:
         """
         Gather diagnostics from list of measurements
         """
-        return Diagnostics(inclination=sheet["H40"].value, meridian=sheet["E36"].value,)
+        return Diagnostics(
+            inclination=sheet["H40"].value,
+            meridian=sheet["E36"].value,
+        )
 
 
 def convert_precision(angle, precision="DMS"):
-- 
GitLab