From 37b4b3bf17be0a0ab6efc146b84a2124a3bfeacb Mon Sep 17 00:00:00 2001
From: lsachuk <lsachuk@contractor.usgs.gov>
Date: Tue, 11 Apr 2023 17:44:47 -0600
Subject: [PATCH 1/6] updating the diagnostics base model, part one

---
 geomagio/residual/Calculation.py | 182 ++++++++++++++++++++++++++++++-
 geomagio/residual/Diagnostics.py |  13 +++
 geomagio/residual/Reading.py     |   1 -
 3 files changed, 189 insertions(+), 7 deletions(-)

diff --git a/geomagio/residual/Calculation.py b/geomagio/residual/Calculation.py
index dbce845d0..22b2f0a54 100644
--- a/geomagio/residual/Calculation.py
+++ b/geomagio/residual/Calculation.py
@@ -50,11 +50,22 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
         measurements=reading.measurements,
         reference=reference,
     )
-    # populate diagnostics object with averaged measurements
-    diagnostics = Diagnostics(
-        inclination=inclination,
-        meridian=meridian,
+
+    d_computed=calculate_D_computed(
+        measurements=reading.measurements,
+        h_baseline=absoluteH.baseline,
     )
+
+
+    r_computed=calculate_R_computed(
+         measurements=reading.measurements,
+        h_baseline=absoluteH.baseline,
+    )
+
+    magnetic_south_meridian=calculate_magnetic_south_meridian(
+        measurements=reading.measurements,
+    )
+
     # calculate scale
     scale_value = None
     scale_measurements = reading[mt.NORTH_DOWN_SCALE]
@@ -64,14 +75,42 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
             inclination=inclination,
             measurements=scale_measurements,
         )
+
+    mean_mark = calculate_mean_mark(
+         measurements=reading.measurements,
+    )
+
+    magnetic_azimuth_of_mark=calculate_magnetic_azimuth_of_mark(
+        mean_mark=mean_mark,
+        magnetic_south_meridian=magnetic_south_meridian
+    )
+
+    # populate diagnostics object with averaged measurements
+    diagnostics = Diagnostics(
+        inclination=inclination,
+        meridian=meridian,
+        d_computed=d_computed,
+        r_computed=r_computed,
+        magnetic_south_meridian=magnetic_south_meridian,
+        corrected_f=corrected_f,
+        scale_value=scale_value,
+        mean_mark=mean_mark,
+        magnetic_azimuth_of_mark=magnetic_azimuth_of_mark,
+    )
+
     # 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", "diagnostics"}),
+        **reading.dict(exclude={"absolutes", "diagnostics"}),
     )
+    print("*******************************************")
+    print()
+    print("\033[91mPRINT:\033[0m", calculated.diagnostics)
+    print("\033[91mPRINT:\033[0m", reading)
+    print()
+    print("*******************************************")
     return calculated
 
 
@@ -292,3 +331,134 @@ def calculate_scale_value(
     residual_change = m2.residual - m1.residual
     scale_value = corrected_f * field_change / np.abs(residual_change)
     return scale_value
+
+
+def calculate_magnetic_south_meridian(
+    measurements: List[Measurement]) -> float:
+    """Calculate magnetic_south_meridian.
+
+    Parameters
+    ----------
+    measurements: measurements, should have type WEST_DOWN, EAST_DOWN, WEST_UP, EAST_UP.
+
+    Returns
+    -------
+    Calculated magnetic_south_meridian.
+    """
+     # declination measurements
+    declination_measurements = [
+        average_measurement(measurements, [t]) for t in DECLINATION_TYPES
+    ]
+
+    magnetic_south_meridian = np.average(
+        [
+            m.angle
+
+            for m in declination_measurements
+        ]
+    )
+    return magnetic_south_meridian
+
+
+def calculate_D_computed(
+    measurements: List[Measurement],
+     h_baseline: float,) -> float:
+    """Calculate d_computed.
+
+    Parameters
+    ----------
+    measurements: measurements,
+    h_baseline
+
+    Returns
+    -------
+    Calculated d_computed.
+    """
+     # declination measurements
+    declination_measurements = [
+        average_measurement(measurements, [t]) for t in DECLINATION_TYPES
+    ]
+
+
+    d_computed = np.average(
+        [np.degrees(np.arctan(m.e / (m.h + h_baseline)))
+            for m in declination_measurements
+        ]
+    )
+
+    return d_computed
+
+
+def calculate_R_computed(
+    measurements: List[Measurement],
+     h_baseline: float,) -> float:
+    """Calculate r_computed.
+
+    Parameters
+    ----------
+    measurements: measurements,
+    h_baseline
+
+    Returns
+    -------
+    Calculated r_computed.
+    """
+     # declination measurements
+    declination_measurements = [
+        average_measurement(measurements, [t]) for t in DECLINATION_TYPES
+    ]
+
+
+    r_computed = np.average(
+        [ np.degrees(
+                m.measurement_type.meridian
+                * (np.arcsin(m.residual / np.sqrt((m.h + h_baseline) ** 2 + m.e**2)))
+            )
+            for m in declination_measurements
+        ]
+    )
+
+    return r_computed
+
+
+def calculate_mean_mark(
+     measurements: List[Measurement],
+    ) -> float:
+    """Calculate mean_mark.
+
+    Parameters
+    ----------
+    measurements: measurements,
+
+
+    Returns
+    -------
+    Calculated mean_mark angle.
+    """
+
+    # average mark
+    average_mark = average_measurement(measurements, MARK_TYPES)
+
+    return average_mark.angle
+
+
+def calculate_magnetic_azimuth_of_mark(
+     mean_mark: float,
+     magnetic_south_meridian:float,
+    ) -> float:
+    """Calculate magnetic_azimuth_of_mark.
+
+    Parameters
+    ----------
+    mean_mark: float,
+    magnetic_south_meridian:float,
+
+
+    Returns
+    -------
+    Calculated magnetic_azimuth_of_mark
+    """
+
+    magnetic_azimuth_of_mark = mean_mark - magnetic_south_meridian
+
+    return magnetic_azimuth_of_mark
\ No newline at end of file
diff --git a/geomagio/residual/Diagnostics.py b/geomagio/residual/Diagnostics.py
index 42f8572a7..efeca19e0 100644
--- a/geomagio/residual/Diagnostics.py
+++ b/geomagio/residual/Diagnostics.py
@@ -8,9 +8,22 @@ class Diagnostics(BaseModel):
 
     Attributes
     ----------
+    corrected_f:
+    d_computed:
     inclination: Average of inclination measurements
+    magnetic_south_meridian:
     meridian: Calculated meridian value
+    r_computed:
+    scale_value:
     """
 
+    corrected_f: Optional[float] = None
+    d_computed: Optional[float] = None
+    horizontal_component: Optional[float] = None
     inclination: float
+    magnetic_south_meridian: Optional[float] = None
     meridian: Optional[float] = None
+    r_computed: Optional[float] = None
+    scale_value: Optional[float] = None
+    mean_mark: Optional[float] = None
+    magnetic_azimuth_of_mark: Optional[float] = None
diff --git a/geomagio/residual/Reading.py b/geomagio/residual/Reading.py
index 101ba4b4b..6fe842939 100644
--- a/geomagio/residual/Reading.py
+++ b/geomagio/residual/Reading.py
@@ -37,7 +37,6 @@ class Reading(BaseModel):
     measurements: List[Measurement] = []
     metadata: Dict = {}
     pier_correction: float = 0
-    scale_value: float = None
     diagnostics: Diagnostics = None
 
     def __getitem__(self, measurement_type: MeasurementType):
-- 
GitLab


From 886ebd5e1da3956204efba6e3f08303eb15f7d82 Mon Sep 17 00:00:00 2001
From: lsachuk <lsachuk@contractor.usgs.gov>
Date: Thu, 13 Apr 2023 12:55:58 -0600
Subject: [PATCH 2/6] add list of diagnostics to the reading

---
 geomagio/residual/Calculation.py | 149 +++++++++++++++++++++++++++----
 geomagio/residual/Diagnostics.py |  33 +++++--
 2 files changed, 157 insertions(+), 25 deletions(-)

diff --git a/geomagio/residual/Calculation.py b/geomagio/residual/Calculation.py
index 22b2f0a54..12d67b803 100644
--- a/geomagio/residual/Calculation.py
+++ b/geomagio/residual/Calculation.py
@@ -37,8 +37,8 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
         hemisphere=reading.hemisphere, measurements=reading.measurements
     )
     corrected_f = f + reading.pier_correction
-    # calculate absolutes
-    absoluteH, absoluteZ = calculate_HZ_absolutes(
+    # calculate absolutes, horizontal_component, vertical_component
+    absoluteH, absoluteZ, horizontal_component, vertical_component = calculate_HZ_absolutes(
         corrected_f=corrected_f,
         inclination=inclination,
         mean=i_mean,
@@ -85,17 +85,44 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
         magnetic_south_meridian=magnetic_south_meridian
     )
 
+    ordinate_f=calculate_ordinate_f(
+        corrected_f=corrected_f,
+        pier_correction=reading.pier_correction,
+    )
+
+    ordinate_d=calculate_ordinate_d(
+        absoluteD_absolute=absoluteD.absolute,
+        absoluteD_baseline=absoluteD.baseline,
+    )
+
+    ordinate_h=calculate_ordinate_h(
+        absoluteH_absolute=absoluteH.absolute,
+        absoluteH_baseline=absoluteH.baseline,
+        ordinate_d=ordinate_d,
+    )
+
+    ordinate_z=calculate_ordinate_z(
+        absoluteZ_absolute=absoluteZ.absolute,
+        absoluteZ_baseline=absoluteZ.baseline,
+    )
+
     # populate diagnostics object with averaged measurements
     diagnostics = Diagnostics(
+        corrected_f=corrected_f,
+        d_computed=d_computed,
+        horizontal_component=horizontal_component,
         inclination=inclination,
+        magnetic_azimuth_of_mark=magnetic_azimuth_of_mark,
+        magnetic_south_meridian=magnetic_south_meridian,
+        mean_mark=mean_mark,
         meridian=meridian,
-        d_computed=d_computed,
+        ordinate_d=ordinate_d,
+        ordinate_f=ordinate_f,
+        ordinate_h=ordinate_h,
+        ordinate_z=ordinate_z,
         r_computed=r_computed,
-        magnetic_south_meridian=magnetic_south_meridian,
-        corrected_f=corrected_f,
         scale_value=scale_value,
-        mean_mark=mean_mark,
-        magnetic_azimuth_of_mark=magnetic_azimuth_of_mark,
+        vertical_component=vertical_component,
     )
 
     # create new reading object
@@ -105,12 +132,7 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
         # copy other attributes
         **reading.dict(exclude={"absolutes", "diagnostics"}),
     )
-    print("*******************************************")
-    print()
-    print("\033[91mPRINT:\033[0m", calculated.diagnostics)
-    print("\033[91mPRINT:\033[0m", reading)
-    print()
-    print("*******************************************")
+
     return calculated
 
 
@@ -193,8 +215,8 @@ def calculate_HZ_absolutes(
     corrected_f: float,
     mean: AverageMeasurement,
     reference: Measurement,
-) -> Tuple[Absolute, Absolute]:
-    """Calculate H and Z absolutes.
+) -> Tuple[Absolute, Absolute, float, float]:
+    """Calculate H and Z absolutes, horizontal_component,       vertical_component.
 
     Parameters
     ----------
@@ -208,8 +230,15 @@ def calculate_HZ_absolutes(
     Tuple
         - H Absolute
         - Z Absolute
+        - horizontal_component,
+        - vertical_component
     """
+
+    #  store the pre-shifted h_abs and the pre-shifted z_abs
     inclination_radians = np.radians(inclination)
+    horizontal_component=corrected_f * np.cos(inclination_radians)
+    vertical_component=corrected_f * np.sin(inclination_radians)
+
     h_abs = corrected_f * np.cos(inclination_radians)
     z_abs = corrected_f * np.sin(inclination_radians)
     h_b = np.sqrt(h_abs**2 - mean.e**2) - mean.h
@@ -239,6 +268,8 @@ def calculate_HZ_absolutes(
             starttime=starttime,
             endtime=endtime,
         ),
+        horizontal_component,
+        vertical_component
     )
 
 
@@ -461,4 +492,90 @@ def calculate_magnetic_azimuth_of_mark(
 
     magnetic_azimuth_of_mark = mean_mark - magnetic_south_meridian
 
-    return magnetic_azimuth_of_mark
\ No newline at end of file
+    return magnetic_azimuth_of_mark
+
+def calculate_ordinate_f(
+     corrected_f: float,
+     pier_correction:float,
+    ) -> float:
+    """Calculate ordinate_f.
+
+    Parameters
+    ----------
+    corrected_f: float,
+    pier_correction:float,
+
+
+    Returns
+    -------
+    Calculated ordinate_f
+    """
+
+    ordinate_f = corrected_f - pier_correction
+
+    return ordinate_f
+
+def calculate_ordinate_d(
+     absoluteD_absolute: float,
+     absoluteD_baseline:float,
+    ) -> float:
+    """Calculate ordinate_d.
+
+    Parameters
+    ----------
+    absoluteD_absolute: float,
+    absoluteD_baseline:float,
+
+
+    Returns
+    -------
+    Calculated ordinate_d
+    """
+
+    ordinate_d = absoluteD_absolute - absoluteD_baseline
+
+    return ordinate_d
+
+def calculate_ordinate_z(
+     absoluteZ_absolute: float,
+     absoluteZ_baseline:float,
+    ) -> float:
+    """Calculate ordinate_z.
+
+    Parameters
+    ----------
+    absoluteZ_absolute: float,
+    absoluteZ_baseline:float,
+
+
+    Returns
+    -------
+    Calculated ordinate_z
+    """
+
+    ordinate_z = absoluteZ_absolute - absoluteZ_baseline
+
+    return ordinate_z
+
+def calculate_ordinate_h(
+     absoluteH_absolute: float,
+     absoluteH_baseline:float,
+     ordinate_d:float,
+    ) -> float:
+    """Calculate ordinate_z.
+
+    Parameters
+    ----------
+    absoluteH_absolute: float,
+    absoluteH_baseline:float,
+    ordinate_d:float,
+
+    Returns
+    -------
+    Calculated ordinate_h
+    """
+    ordinate_e = absoluteH_absolute * np.sin(ordinate_d)
+
+    ordinate_h =  np.sqrt(absoluteH_absolute**2 - ordinate_e**2) - absoluteH_baseline
+
+    return ordinate_h
\ No newline at end of file
diff --git a/geomagio/residual/Diagnostics.py b/geomagio/residual/Diagnostics.py
index efeca19e0..9634cd55a 100644
--- a/geomagio/residual/Diagnostics.py
+++ b/geomagio/residual/Diagnostics.py
@@ -8,22 +8,37 @@ class Diagnostics(BaseModel):
 
     Attributes
     ----------
-    corrected_f:
-    d_computed:
-    inclination: Average of inclination measurements
-    magnetic_south_meridian:
-    meridian: Calculated meridian value
-    r_computed:
-    scale_value:
+     corrected_f: Optional[float] = None
+    d_computed: Optional[float] = None
+    horizontal_component: Optional[float] = None
+    horizontal_component: Optional[float] = None
+    inclination: float
+    magnetic_azimuth_of_mark: Optional[float] = None
+    magnetic_south_meridian: Optional[float] = None
+    mean_mark: Optional[float] = None
+    meridian: Optional[float] = None
+    ordinate_d: Optional[float] = None
+    ordinate_f: Optional[float] = None
+    ordinate_h: Optional[float] = None
+    ordinate_z: Optional[float] = None
+    r_computed: Optional[float] = None
+    scale_value: Optional[float] = None
+    vertical_component: Optional[float] = None
     """
 
     corrected_f: Optional[float] = None
     d_computed: Optional[float] = None
     horizontal_component: Optional[float] = None
+    horizontal_component: Optional[float] = None
     inclination: float
+    magnetic_azimuth_of_mark: Optional[float] = None
     magnetic_south_meridian: Optional[float] = None
+    mean_mark: Optional[float] = None
     meridian: Optional[float] = None
+    ordinate_d: Optional[float] = None
+    ordinate_f: Optional[float] = None
+    ordinate_h: Optional[float] = None
+    ordinate_z: Optional[float] = None
     r_computed: Optional[float] = None
     scale_value: Optional[float] = None
-    mean_mark: Optional[float] = None
-    magnetic_azimuth_of_mark: Optional[float] = None
+    vertical_component: Optional[float] = None
-- 
GitLab


From cbdff393af8061f72c43ef2933088090cbf155e2 Mon Sep 17 00:00:00 2001
From: lsachuk <lsachuk@contractor.usgs.gov>
Date: Thu, 13 Apr 2023 14:09:06 -0600
Subject: [PATCH 3/6] moved scale_value up to the reading level

---
 geomagio/residual/Calculation.py | 116 ++++++++++++++++---------------
 geomagio/residual/Diagnostics.py |   1 -
 2 files changed, 59 insertions(+), 58 deletions(-)

diff --git a/geomagio/residual/Calculation.py b/geomagio/residual/Calculation.py
index 12d67b803..5352676b7 100644
--- a/geomagio/residual/Calculation.py
+++ b/geomagio/residual/Calculation.py
@@ -38,7 +38,12 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
     )
     corrected_f = f + reading.pier_correction
     # calculate absolutes, horizontal_component, vertical_component
-    absoluteH, absoluteZ, horizontal_component, vertical_component = calculate_HZ_absolutes(
+    (
+        absoluteH,
+        absoluteZ,
+        horizontal_component,
+        vertical_component,
+    ) = calculate_HZ_absolutes(
         corrected_f=corrected_f,
         inclination=inclination,
         mean=i_mean,
@@ -51,18 +56,17 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
         reference=reference,
     )
 
-    d_computed=calculate_D_computed(
+    d_computed = calculate_D_computed(
         measurements=reading.measurements,
         h_baseline=absoluteH.baseline,
     )
 
-
-    r_computed=calculate_R_computed(
-         measurements=reading.measurements,
+    r_computed = calculate_R_computed(
+        measurements=reading.measurements,
         h_baseline=absoluteH.baseline,
     )
 
-    magnetic_south_meridian=calculate_magnetic_south_meridian(
+    magnetic_south_meridian = calculate_magnetic_south_meridian(
         measurements=reading.measurements,
     )
 
@@ -77,31 +81,30 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
         )
 
     mean_mark = calculate_mean_mark(
-         measurements=reading.measurements,
+        measurements=reading.measurements,
     )
 
-    magnetic_azimuth_of_mark=calculate_magnetic_azimuth_of_mark(
-        mean_mark=mean_mark,
-        magnetic_south_meridian=magnetic_south_meridian
+    magnetic_azimuth_of_mark = calculate_magnetic_azimuth_of_mark(
+        mean_mark=mean_mark, magnetic_south_meridian=magnetic_south_meridian
     )
 
-    ordinate_f=calculate_ordinate_f(
+    ordinate_f = calculate_ordinate_f(
         corrected_f=corrected_f,
         pier_correction=reading.pier_correction,
     )
 
-    ordinate_d=calculate_ordinate_d(
+    ordinate_d = calculate_ordinate_d(
         absoluteD_absolute=absoluteD.absolute,
         absoluteD_baseline=absoluteD.baseline,
     )
 
-    ordinate_h=calculate_ordinate_h(
+    ordinate_h = calculate_ordinate_h(
         absoluteH_absolute=absoluteH.absolute,
         absoluteH_baseline=absoluteH.baseline,
         ordinate_d=ordinate_d,
     )
 
-    ordinate_z=calculate_ordinate_z(
+    ordinate_z = calculate_ordinate_z(
         absoluteZ_absolute=absoluteZ.absolute,
         absoluteZ_baseline=absoluteZ.baseline,
     )
@@ -121,7 +124,6 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
         ordinate_h=ordinate_h,
         ordinate_z=ordinate_z,
         r_computed=r_computed,
-        scale_value=scale_value,
         vertical_component=vertical_component,
     )
 
@@ -129,8 +131,9 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
     calculated = Reading(
         absolutes=[absoluteD, absoluteH, absoluteZ],
         diagnostics=diagnostics,
+        scale_value=scale_value,
         # copy other attributes
-        **reading.dict(exclude={"absolutes", "diagnostics"}),
+        **reading.dict(exclude={"absolutes", "diagnostics", "scale_value"}),
     )
 
     return calculated
@@ -236,8 +239,8 @@ def calculate_HZ_absolutes(
 
     #  store the pre-shifted h_abs and the pre-shifted z_abs
     inclination_radians = np.radians(inclination)
-    horizontal_component=corrected_f * np.cos(inclination_radians)
-    vertical_component=corrected_f * np.sin(inclination_radians)
+    horizontal_component = corrected_f * np.cos(inclination_radians)
+    vertical_component = corrected_f * np.sin(inclination_radians)
 
     h_abs = corrected_f * np.cos(inclination_radians)
     z_abs = corrected_f * np.sin(inclination_radians)
@@ -269,7 +272,7 @@ def calculate_HZ_absolutes(
             endtime=endtime,
         ),
         horizontal_component,
-        vertical_component
+        vertical_component,
     )
 
 
@@ -364,8 +367,7 @@ def calculate_scale_value(
     return scale_value
 
 
-def calculate_magnetic_south_meridian(
-    measurements: List[Measurement]) -> float:
+def calculate_magnetic_south_meridian(measurements: List[Measurement]) -> float:
     """Calculate magnetic_south_meridian.
 
     Parameters
@@ -376,24 +378,19 @@ def calculate_magnetic_south_meridian(
     -------
     Calculated magnetic_south_meridian.
     """
-     # declination measurements
+    # declination measurements
     declination_measurements = [
         average_measurement(measurements, [t]) for t in DECLINATION_TYPES
     ]
 
-    magnetic_south_meridian = np.average(
-        [
-            m.angle
-
-            for m in declination_measurements
-        ]
-    )
+    magnetic_south_meridian = np.average([m.angle for m in declination_measurements])
     return magnetic_south_meridian
 
 
 def calculate_D_computed(
     measurements: List[Measurement],
-     h_baseline: float,) -> float:
+    h_baseline: float,
+) -> float:
     """Calculate d_computed.
 
     Parameters
@@ -405,14 +402,14 @@ def calculate_D_computed(
     -------
     Calculated d_computed.
     """
-     # declination measurements
+    # declination measurements
     declination_measurements = [
         average_measurement(measurements, [t]) for t in DECLINATION_TYPES
     ]
 
-
     d_computed = np.average(
-        [np.degrees(np.arctan(m.e / (m.h + h_baseline)))
+        [
+            np.degrees(np.arctan(m.e / (m.h + h_baseline)))
             for m in declination_measurements
         ]
     )
@@ -422,7 +419,8 @@ def calculate_D_computed(
 
 def calculate_R_computed(
     measurements: List[Measurement],
-     h_baseline: float,) -> float:
+    h_baseline: float,
+) -> float:
     """Calculate r_computed.
 
     Parameters
@@ -434,14 +432,14 @@ def calculate_R_computed(
     -------
     Calculated r_computed.
     """
-     # declination measurements
+    # declination measurements
     declination_measurements = [
         average_measurement(measurements, [t]) for t in DECLINATION_TYPES
     ]
 
-
     r_computed = np.average(
-        [ np.degrees(
+        [
+            np.degrees(
                 m.measurement_type.meridian
                 * (np.arcsin(m.residual / np.sqrt((m.h + h_baseline) ** 2 + m.e**2)))
             )
@@ -453,8 +451,8 @@ def calculate_R_computed(
 
 
 def calculate_mean_mark(
-     measurements: List[Measurement],
-    ) -> float:
+    measurements: List[Measurement],
+) -> float:
     """Calculate mean_mark.
 
     Parameters
@@ -474,9 +472,9 @@ def calculate_mean_mark(
 
 
 def calculate_magnetic_azimuth_of_mark(
-     mean_mark: float,
-     magnetic_south_meridian:float,
-    ) -> float:
+    mean_mark: float,
+    magnetic_south_meridian: float,
+) -> float:
     """Calculate magnetic_azimuth_of_mark.
 
     Parameters
@@ -494,10 +492,11 @@ def calculate_magnetic_azimuth_of_mark(
 
     return magnetic_azimuth_of_mark
 
+
 def calculate_ordinate_f(
-     corrected_f: float,
-     pier_correction:float,
-    ) -> float:
+    corrected_f: float,
+    pier_correction: float,
+) -> float:
     """Calculate ordinate_f.
 
     Parameters
@@ -515,10 +514,11 @@ def calculate_ordinate_f(
 
     return ordinate_f
 
+
 def calculate_ordinate_d(
-     absoluteD_absolute: float,
-     absoluteD_baseline:float,
-    ) -> float:
+    absoluteD_absolute: float,
+    absoluteD_baseline: float,
+) -> float:
     """Calculate ordinate_d.
 
     Parameters
@@ -536,10 +536,11 @@ def calculate_ordinate_d(
 
     return ordinate_d
 
+
 def calculate_ordinate_z(
-     absoluteZ_absolute: float,
-     absoluteZ_baseline:float,
-    ) -> float:
+    absoluteZ_absolute: float,
+    absoluteZ_baseline: float,
+) -> float:
     """Calculate ordinate_z.
 
     Parameters
@@ -557,11 +558,12 @@ def calculate_ordinate_z(
 
     return ordinate_z
 
+
 def calculate_ordinate_h(
-     absoluteH_absolute: float,
-     absoluteH_baseline:float,
-     ordinate_d:float,
-    ) -> float:
+    absoluteH_absolute: float,
+    absoluteH_baseline: float,
+    ordinate_d: float,
+) -> float:
     """Calculate ordinate_z.
 
     Parameters
@@ -576,6 +578,6 @@ def calculate_ordinate_h(
     """
     ordinate_e = absoluteH_absolute * np.sin(ordinate_d)
 
-    ordinate_h =  np.sqrt(absoluteH_absolute**2 - ordinate_e**2) - absoluteH_baseline
+    ordinate_h = np.sqrt(absoluteH_absolute**2 - ordinate_e**2) - absoluteH_baseline
 
-    return ordinate_h
\ No newline at end of file
+    return ordinate_h
diff --git a/geomagio/residual/Diagnostics.py b/geomagio/residual/Diagnostics.py
index 9634cd55a..7844cb7b6 100644
--- a/geomagio/residual/Diagnostics.py
+++ b/geomagio/residual/Diagnostics.py
@@ -40,5 +40,4 @@ class Diagnostics(BaseModel):
     ordinate_h: Optional[float] = None
     ordinate_z: Optional[float] = None
     r_computed: Optional[float] = None
-    scale_value: Optional[float] = None
     vertical_component: Optional[float] = None
-- 
GitLab


From 0ae3aaec47bf55b2046be18d265a23b2028d30c2 Mon Sep 17 00:00:00 2001
From: lsachuk <lsachuk@contractor.usgs.gov>
Date: Thu, 13 Apr 2023 14:34:11 -0600
Subject: [PATCH 4/6] added back scale_value to the reading class

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

diff --git a/geomagio/residual/Reading.py b/geomagio/residual/Reading.py
index 6fe842939..a52adb9ca 100644
--- a/geomagio/residual/Reading.py
+++ b/geomagio/residual/Reading.py
@@ -33,11 +33,12 @@ class Reading(BaseModel):
 
     absolutes: List[Absolute] = []
     azimuth: float = 0
+    diagnostics: Diagnostics = None
     hemisphere: Literal[-1, 1] = 1
     measurements: List[Measurement] = []
     metadata: Dict = {}
     pier_correction: float = 0
-    diagnostics: Diagnostics = None
+    scale_value:float = None
 
     def __getitem__(self, measurement_type: MeasurementType):
         """Provide access to measurements by type.
-- 
GitLab


From 3096602b42c1758625fc7aa2c0974845c548a623 Mon Sep 17 00:00:00 2001
From: lsachuk <lsachuk@contractor.usgs.gov>
Date: Thu, 13 Apr 2023 14:38:13 -0600
Subject: [PATCH 5/6] lint fixes

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

diff --git a/geomagio/residual/Reading.py b/geomagio/residual/Reading.py
index a52adb9ca..752ffc4b0 100644
--- a/geomagio/residual/Reading.py
+++ b/geomagio/residual/Reading.py
@@ -38,7 +38,7 @@ class Reading(BaseModel):
     measurements: List[Measurement] = []
     metadata: Dict = {}
     pier_correction: float = 0
-    scale_value:float = None
+    scale_value: float = None
 
     def __getitem__(self, measurement_type: MeasurementType):
         """Provide access to measurements by type.
-- 
GitLab


From 3564a2712b473bcd337f2e32de91aa8817183858 Mon Sep 17 00:00:00 2001
From: lsachuk <lsachuk@contractor.usgs.gov>
Date: Fri, 14 Apr 2023 11:31:35 -0600
Subject: [PATCH 6/6] added calculate_* methods for horizontal and vertical
 component

---
 geomagio/residual/Calculation.py | 100 +++++++++++++++++--------------
 geomagio/residual/Diagnostics.py |  10 +---
 2 files changed, 57 insertions(+), 53 deletions(-)

diff --git a/geomagio/residual/Calculation.py b/geomagio/residual/Calculation.py
index 5352676b7..72708859b 100644
--- a/geomagio/residual/Calculation.py
+++ b/geomagio/residual/Calculation.py
@@ -37,18 +37,23 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
         hemisphere=reading.hemisphere, measurements=reading.measurements
     )
     corrected_f = f + reading.pier_correction
-    # calculate absolutes, horizontal_component, vertical_component
-    (
-        absoluteH,
-        absoluteZ,
-        horizontal_component,
-        vertical_component,
-    ) = calculate_HZ_absolutes(
+
+    # calculate absolutes,
+    (absoluteH, absoluteZ) = calculate_HZ_absolutes(
         corrected_f=corrected_f,
         inclination=inclination,
         mean=i_mean,
         reference=reference,
     )
+
+    horizontal_component = calculate_horizontal_component(
+        inclination=inclination, corrected_f=corrected_f
+    )
+
+    vertical_component = calculate_vertical_component(
+        inclination=inclination, corrected_f=corrected_f
+    )
+
     absoluteD, meridian = calculate_D_absolute(
         azimuth=reading.azimuth,
         h_baseline=absoluteH.baseline,
@@ -88,10 +93,7 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
         mean_mark=mean_mark, magnetic_south_meridian=magnetic_south_meridian
     )
 
-    ordinate_f = calculate_ordinate_f(
-        corrected_f=corrected_f,
-        pier_correction=reading.pier_correction,
-    )
+    ordinate_f = f
 
     ordinate_d = calculate_ordinate_d(
         absoluteD_absolute=absoluteD.absolute,
@@ -118,7 +120,6 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
         magnetic_azimuth_of_mark=magnetic_azimuth_of_mark,
         magnetic_south_meridian=magnetic_south_meridian,
         mean_mark=mean_mark,
-        meridian=meridian,
         ordinate_d=ordinate_d,
         ordinate_f=ordinate_f,
         ordinate_h=ordinate_h,
@@ -219,7 +220,7 @@ def calculate_HZ_absolutes(
     mean: AverageMeasurement,
     reference: Measurement,
 ) -> Tuple[Absolute, Absolute, float, float]:
-    """Calculate H and Z absolutes, horizontal_component,       vertical_component.
+    """Calculate H and Z absolutes
 
     Parameters
     ----------
@@ -233,15 +234,8 @@ def calculate_HZ_absolutes(
     Tuple
         - H Absolute
         - Z Absolute
-        - horizontal_component,
-        - vertical_component
     """
-
-    #  store the pre-shifted h_abs and the pre-shifted z_abs
     inclination_radians = np.radians(inclination)
-    horizontal_component = corrected_f * np.cos(inclination_radians)
-    vertical_component = corrected_f * np.sin(inclination_radians)
-
     h_abs = corrected_f * np.cos(inclination_radians)
     z_abs = corrected_f * np.sin(inclination_radians)
     h_b = np.sqrt(h_abs**2 - mean.e**2) - mean.h
@@ -271,8 +265,6 @@ def calculate_HZ_absolutes(
             starttime=starttime,
             endtime=endtime,
         ),
-        horizontal_component,
-        vertical_component,
     )
 
 
@@ -409,7 +401,7 @@ def calculate_D_computed(
 
     d_computed = np.average(
         [
-            np.degrees(np.arctan(m.e / (m.h + h_baseline)))
+            -1 * np.degrees(np.arctan(m.e / (m.h + h_baseline)))
             for m in declination_measurements
         ]
     )
@@ -493,28 +485,6 @@ def calculate_magnetic_azimuth_of_mark(
     return magnetic_azimuth_of_mark
 
 
-def calculate_ordinate_f(
-    corrected_f: float,
-    pier_correction: float,
-) -> float:
-    """Calculate ordinate_f.
-
-    Parameters
-    ----------
-    corrected_f: float,
-    pier_correction:float,
-
-
-    Returns
-    -------
-    Calculated ordinate_f
-    """
-
-    ordinate_f = corrected_f - pier_correction
-
-    return ordinate_f
-
-
 def calculate_ordinate_d(
     absoluteD_absolute: float,
     absoluteD_baseline: float,
@@ -576,8 +546,46 @@ def calculate_ordinate_h(
     -------
     Calculated ordinate_h
     """
-    ordinate_e = absoluteH_absolute * np.sin(ordinate_d)
+    ordinate_e = absoluteH_absolute * np.sin(np.radians(ordinate_d))
 
     ordinate_h = np.sqrt(absoluteH_absolute**2 - ordinate_e**2) - absoluteH_baseline
 
     return ordinate_h
+
+
+def calculate_horizontal_component(inclination: float, corrected_f: float) -> float:
+    """Calculate horizontal_component.
+
+    Parameters
+    ----------
+    inclination: calculated inclination.
+    corrected_f: calculated f with pier correction.
+
+    Returns
+    -------
+    Calculated horizontal_component
+    """
+
+    inclination_radians = np.radians(inclination)
+    horizontal_component = corrected_f * np.cos(inclination_radians)
+
+    return horizontal_component
+
+
+def calculate_vertical_component(inclination: float, corrected_f: float) -> float:
+    """Calculate vertical_component.
+
+    Parameters
+    ----------
+    inclination: calculated inclination.
+    corrected_f: calculated f with pier correction.
+
+    Returns
+    -------
+    Calculated vertical_component
+    """
+
+    inclination_radians = np.radians(inclination)
+    vertical_component = corrected_f * np.sin(inclination_radians)
+
+    return vertical_component
diff --git a/geomagio/residual/Diagnostics.py b/geomagio/residual/Diagnostics.py
index 7844cb7b6..7c75de631 100644
--- a/geomagio/residual/Diagnostics.py
+++ b/geomagio/residual/Diagnostics.py
@@ -8,11 +8,10 @@ class Diagnostics(BaseModel):
 
     Attributes
     ----------
-     corrected_f: Optional[float] = None
+    corrected_f: Optional[float] = None
     d_computed: Optional[float] = None
     horizontal_component: Optional[float] = None
-    horizontal_component: Optional[float] = None
-    inclination: float
+    inclination: Optional[float] = None
     magnetic_azimuth_of_mark: Optional[float] = None
     magnetic_south_meridian: Optional[float] = None
     mean_mark: Optional[float] = None
@@ -22,19 +21,16 @@ class Diagnostics(BaseModel):
     ordinate_h: Optional[float] = None
     ordinate_z: Optional[float] = None
     r_computed: Optional[float] = None
-    scale_value: Optional[float] = None
     vertical_component: Optional[float] = None
     """
 
     corrected_f: Optional[float] = None
     d_computed: Optional[float] = None
     horizontal_component: Optional[float] = None
-    horizontal_component: Optional[float] = None
-    inclination: float
+    inclination: Optional[float] = None
     magnetic_azimuth_of_mark: Optional[float] = None
     magnetic_south_meridian: Optional[float] = None
     mean_mark: Optional[float] = None
-    meridian: Optional[float] = None
     ordinate_d: Optional[float] = None
     ordinate_f: Optional[float] = None
     ordinate_h: Optional[float] = None
-- 
GitLab