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