Skip to content
Snippets Groups Projects
Commit 8dd4a31b authored by Jeremy M Fee's avatar Jeremy M Fee
Browse files

Merge branch 'residual-diagnostics' into 'master'

Residual diagnostics

See merge request !33
parents b57f6d66 197c7d13
No related branches found
No related tags found
2 merge requests!146Release CMO metadata to production,!33Residual diagnostics
Pipeline #36243 passed
...@@ -11,6 +11,7 @@ from .MeasurementType import ( ...@@ -11,6 +11,7 @@ from .MeasurementType import (
MARK_TYPES, MARK_TYPES,
) )
from .Measurement import AverageMeasurement, Measurement, average_measurement from .Measurement import AverageMeasurement, Measurement, average_measurement
from .Diagnostics import Diagnostics
from .Reading import Reading from .Reading import Reading
...@@ -29,7 +30,7 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading: ...@@ -29,7 +30,7 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
# reference measurement, used to adjust absolutes # reference measurement, used to adjust absolutes
reference = reading[mt.WEST_DOWN][0] reference = reading[mt.WEST_DOWN][0]
# calculate inclination # calculate inclination
inclination, f, mean = calculate_I( inclination, f, i_mean = calculate_I(
hemisphere=reading.hemisphere, measurements=reading.measurements hemisphere=reading.hemisphere, measurements=reading.measurements
) )
corrected_f = f + reading.pier_correction corrected_f = f + reading.pier_correction
...@@ -37,15 +38,20 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading: ...@@ -37,15 +38,20 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
absoluteH, absoluteZ = calculate_HZ_absolutes( absoluteH, absoluteZ = calculate_HZ_absolutes(
corrected_f=corrected_f, corrected_f=corrected_f,
inclination=inclination, inclination=inclination,
mean=mean, mean=i_mean,
reference=adjust_reference and reference or None, reference=adjust_reference and reference or None,
) )
absoluteD = calculate_D_absolute( absoluteD, meridian = calculate_D_absolute(
azimuth=reading.azimuth, azimuth=reading.azimuth,
h_baseline=absoluteH.baseline, h_baseline=absoluteH.baseline,
measurements=reading.measurements, measurements=reading.measurements,
reference=adjust_reference and reference or None, reference=adjust_reference and reference or None,
) )
# populate diagnostics object with averaged measurements
diagnostics = Diagnostics(
inclination=inclination,
meridian=meridian,
)
# calculate scale # calculate scale
scale_value = None scale_value = None
scale_measurements = reading[mt.NORTH_DOWN_SCALE] scale_measurements = reading[mt.NORTH_DOWN_SCALE]
...@@ -59,8 +65,9 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading: ...@@ -59,8 +65,9 @@ def calculate(reading: Reading, adjust_reference: bool = True) -> Reading:
calculated = Reading( calculated = Reading(
absolutes=[absoluteD, absoluteH, absoluteZ], absolutes=[absoluteD, absoluteH, absoluteZ],
scale_value=scale_value, scale_value=scale_value,
diagnostics=diagnostics,
# copy other attributes # copy other attributes
**reading.dict(exclude={"absolutes", "scale_value"}), **reading.dict(exclude={"absolutes", "scale_value", "diagnostics"}),
) )
return calculated return calculated
...@@ -70,7 +77,7 @@ def calculate_D_absolute( ...@@ -70,7 +77,7 @@ def calculate_D_absolute(
azimuth: float, azimuth: float,
h_baseline: float, h_baseline: float,
reference: Measurement, reference: Measurement,
) -> Absolute: ) -> Tuple[Absolute, Diagnostics]:
"""Calculate D absolute. """Calculate D absolute.
Parameters Parameters
...@@ -87,14 +94,14 @@ def calculate_D_absolute( ...@@ -87,14 +94,14 @@ def calculate_D_absolute(
mean = average_measurement(measurements, DECLINATION_TYPES) mean = average_measurement(measurements, DECLINATION_TYPES)
reference = reference or mean reference = reference or mean
# average mark # average mark
average_mark = average_measurement(measurements, MARK_TYPES).angle average_mark = average_measurement(measurements, MARK_TYPES)
# adjust based on which is larger # adjust based on which is larger
mark_up = average_measurement(measurements, [mt.FIRST_MARK_UP]).angle mark_up = average_measurement(measurements, [mt.FIRST_MARK_UP]).angle
mark_down = average_measurement(measurements, [mt.FIRST_MARK_DOWN]).angle mark_down = average_measurement(measurements, [mt.FIRST_MARK_DOWN]).angle
if mark_up < mark_down: if mark_up < mark_down:
average_mark += 90 average_mark.angle += 90
else: else:
average_mark -= 90 average_mark.angle -= 90
# declination measurements # declination measurements
declination_measurements = [ declination_measurements = [
average_measurement(measurements, [t]) for t in DECLINATION_TYPES average_measurement(measurements, [t]) for t in DECLINATION_TYPES
...@@ -116,16 +123,20 @@ def calculate_D_absolute( ...@@ -116,16 +123,20 @@ def calculate_D_absolute(
shift = -180 shift = -180
# add subtract average mark angle from average meridian angle and add # add subtract average mark angle from average meridian angle and add
# azimuth to get the declination baseline # azimuth to get the declination baseline
d_b = (meridian - average_mark) + azimuth + shift d_b = (meridian - average_mark.angle) + azimuth + shift
# calculate absolute # calculate absolute
d_abs = d_b + np.degrees(np.arctan(reference.e / (reference.h + h_baseline))) d_abs = d_b + np.degrees(np.arctan(reference.e / (reference.h + h_baseline)))
return Absolute(
element="D", return (
absolute=d_abs, Absolute(
baseline=d_b, element="D",
shift=shift, absolute=d_abs,
starttime=mean.time, baseline=d_b,
endtime=mean.endtime, shift=shift,
starttime=mean.time,
endtime=mean.endtime,
),
meridian,
) )
......
from typing import Optional
from .Measurement import Measurement
from pydantic import BaseModel
class Diagnostics(BaseModel):
"""Computed diagnostics during calculation.
Attributes
----------
inclination: Average of inclination measurements
meridian: Calculated meridian value
"""
inclination: float
meridian: float
...@@ -9,6 +9,7 @@ from .. import TimeseriesUtility ...@@ -9,6 +9,7 @@ from .. import TimeseriesUtility
from ..TimeseriesFactory import TimeseriesFactory from ..TimeseriesFactory import TimeseriesFactory
from .Absolute import Absolute from .Absolute import Absolute
from .Measurement import Measurement, average_measurement from .Measurement import Measurement, average_measurement
from .Diagnostics import Diagnostics
from .MeasurementType import MeasurementType from .MeasurementType import MeasurementType
...@@ -33,6 +34,7 @@ class Reading(BaseModel): ...@@ -33,6 +34,7 @@ class Reading(BaseModel):
metadata: Dict = {} metadata: Dict = {}
pier_correction: float = 0 pier_correction: float = 0
scale_value: float = None scale_value: float = None
diagnostics: Diagnostics = None
def __getitem__(self, measurement_type: MeasurementType): def __getitem__(self, measurement_type: MeasurementType):
"""Provide access to measurements by type. """Provide access to measurements by type.
......
...@@ -6,6 +6,13 @@ from obspy.core import UTCDateTime ...@@ -6,6 +6,13 @@ from obspy.core import UTCDateTime
import openpyxl import openpyxl
from .Absolute import Absolute from .Absolute import Absolute
from .Calculation import (
DECLINATION_TYPES,
MARK_TYPES,
INCLINATION_TYPES,
average_measurement,
)
from .Diagnostics import Diagnostics
from .Measurement import Measurement from .Measurement import Measurement
from .MeasurementType import MeasurementType as mt from .MeasurementType import MeasurementType as mt
from .Reading import Reading from .Reading import Reading
...@@ -299,6 +306,7 @@ class SpreadsheetAbsolutesFactory(object): ...@@ -299,6 +306,7 @@ class SpreadsheetAbsolutesFactory(object):
metadata=metadata, metadata=metadata,
pier_correction=metadata["pier_correction"], pier_correction=metadata["pier_correction"],
scale_value=numpy.degrees(metadata["scale_value"]), scale_value=numpy.degrees(metadata["scale_value"]),
diagnostics=self._parse_diagnostics(calculation_sheet),
) )
def _parse_absolutes( def _parse_absolutes(
...@@ -402,6 +410,18 @@ class SpreadsheetAbsolutesFactory(object): ...@@ -402,6 +410,18 @@ class SpreadsheetAbsolutesFactory(object):
"precision": measurement_sheet["H8"].value, "precision": measurement_sheet["H8"].value,
} }
def _parse_diagnostics(
self,
sheet: openpyxl.worksheet,
) -> Diagnostics:
"""
Gather diagnostics from list of measurements
"""
return Diagnostics(
inclination=sheet["H40"].value,
meridian=sheet["E36"].value,
)
def convert_precision(angle, precision="DMS"): def convert_precision(angle, precision="DMS"):
""" """
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment