From a52e18ebdf2d8facdfa731a8dd7e5aece7625987 Mon Sep 17 00:00:00 2001 From: pcain-usgs <pcain@usgs.gov> Date: Fri, 10 Apr 2020 16:48:45 -0600 Subject: [PATCH] Make comprehensions populate Calculations --- geomagio/residual/Calculation.py | 111 +++++++++++-------------------- 1 file changed, 39 insertions(+), 72 deletions(-) diff --git a/geomagio/residual/Calculation.py b/geomagio/residual/Calculation.py index f81d30895..a6e942c82 100644 --- a/geomagio/residual/Calculation.py +++ b/geomagio/residual/Calculation.py @@ -17,6 +17,9 @@ MARK_TYPES = [ # define measurement types used to calculate inclination INCLINATION_TYPES = [mt.NORTH_DOWN, mt.NORTH_UP, mt.SOUTH_DOWN, mt.SOUTH_UP] +# define measurement types used to calculate declination +DECLINATION_TYPES = [mt.EAST_UP, mt.EAST_DOWN, mt.WEST_UP, mt.WEST_DOWN] + class Calculate(BaseModel): """ @@ -100,41 +103,18 @@ def calculate_I(measurements, ordinates, ordinates_index, mean, metadata): # -1 if observatory is in southern hemisphere hs = metadata["hemisphere"] # gather calculation objects for each measurement type - southdown = Calculate( - shift=mt.SOUTH_DOWN.shift, - direction=mt.SOUTH_DOWN.direction, - meridian=mt.SOUTH_DOWN.meridian, - angle=average_angle(measurements, mt.SOUTH_DOWN), - residual=average_residual(measurements, mt.SOUTH_DOWN), - ordinate=average_ordinate(ordinates_index, mt.SOUTH_DOWN), - ) - - southup = Calculate( - shift=mt.SOUTH_UP.shift, - direction=mt.SOUTH_UP.direction, - meridian=mt.SOUTH_UP.meridian, - angle=average_angle(measurements, mt.SOUTH_UP), - residual=average_residual(measurements, mt.SOUTH_UP), - ordinate=average_ordinate(ordinates_index, mt.SOUTH_UP), - ) - - northup = Calculate( - shift=mt.NORTH_UP.shift, - direction=mt.NORTH_UP.direction, - meridian=mt.NORTH_UP.meridian, - angle=average_angle(measurements, mt.NORTH_UP), - residual=average_residual(measurements, mt.NORTH_UP), - ordinate=average_ordinate(ordinates_index, mt.NORTH_UP), - ) + inclination_measurements = { + m: Calculate( + angle=average_angle(measurements, m), + residual=average_residual(measurements, m), + ordinate=average_ordinate(ordinates_index, m), + direction=m.direction, + shift=m.shift, + meridian=m.meridian, + ) + for m in INCLINATION_TYPES + } - northdown = Calculate( - shift=mt.NORTH_DOWN.shift, - direction=mt.NORTH_DOWN.direction, - meridian=mt.NORTH_DOWN.meridian, - angle=average_angle(measurements, mt.NORTH_DOWN), - residual=average_residual(measurements, mt.NORTH_DOWN), - ordinate=average_ordinate(ordinates_index, mt.NORTH_DOWN), - ) # set inclination value for looping = Iprime inclination = Iprime # add one to inclination value to enter the loop @@ -144,17 +124,18 @@ def calculate_I(measurements, ordinates, ordinates_index, mean, metadata): # set temporary inclination variable to hold previous step's inclination Inclination = inclination # calculate f for inclination measurement types - southdown.f = calculate_f(southdown.ordinate, mean, inclination) - northdown.f = calculate_f(northdown.ordinate, mean, inclination) - southup.f = calculate_f(southup.ordinate, mean, inclination) - northup.f = calculate_f(northup.ordinate, mean, inclination) - # gather measurements into array(necessary because f were recalculated) - measurements = [southup, southdown, northup, northdown] + for m in INCLINATION_TYPES: + inclination_measurements[m].f = calculate_f( + inclination_measurements[m].ordinate, mean, inclination + ) # average f values for inclination measurement types - f = np.average([i.f for i in measurements]) + f = np.average([inclination_measurements[m].f for m in INCLINATION_TYPES]) # calculation inclination for each inclination measurement type and average inclination = np.average( - [calculate_measurement_inclination(m, hs) for m in measurements] + [ + calculate_measurement_inclination(inclination_measurements[m], hs) + for m in INCLINATION_TYPES + ] ) # loop exits once the difference in average inclination between steps is lower than 0.0001 @@ -188,39 +169,25 @@ def calculate_D(ordinates_index, measurements, measurements_index, azimuth, h_b) average_mark -= 100 # gather calculation objects for each declination measurement type - # note that the meridian(plus minus) multiplier has been repurposed. - # West facing measurements have a multiplier of -1 - # East facing measurements have a multipllier of 1 - westdown = Calculate( - angle=average_angle(measurements_index, mt.WEST_DOWN), - residual=average_residual(measurements_index, mt.WEST_DOWN), - ordinate=average_ordinate(ordinates_index, mt.WEST_DOWN), - meridian=mt.WEST_DOWN.meridian, - ) - westup = Calculate( - angle=average_angle(measurements_index, mt.WEST_UP), - residual=average_residual(measurements_index, mt.WEST_UP), - ordinate=average_ordinate(ordinates_index, mt.WEST_UP), - meridian=mt.WEST_UP.meridian, - ) - eastdown = Calculate( - angle=average_angle(measurements_index, mt.EAST_DOWN), - residual=average_residual(measurements_index, mt.EAST_DOWN), - ordinate=average_ordinate(ordinates_index, mt.EAST_DOWN), - meridian=mt.EAST_DOWN.meridian, - ) - eastup = Calculate( - angle=average_angle(measurements_index, mt.EAST_UP), - residual=average_residual(measurements_index, mt.EAST_UP), - ordinate=average_ordinate(ordinates_index, mt.EAST_UP), - meridian=mt.EAST_UP.meridian, - ) + declination_measurements = { + m: Calculate( + angle=average_angle(measurements_index, m), + residual=average_residual(measurements_index, m), + ordinate=average_ordinate(ordinates_index, m), + meridian=m.meridian, + ) + for m in DECLINATION_TYPES + } + # convert azimuth to geon azimuth = (int(azimuth / 100) + (azimuth % 100) / 60) / 0.9 - # gather declination measurements into array - measurements = [westdown, westup, eastdown, eastup] # average meridian terms calculated from each declination measurements - meridian = np.average([calculate_meridian_term(i, h_b) for i in measurements]) + meridian = np.average( + [ + calculate_meridian_term(declination_measurements[m], h_b) + for m in DECLINATION_TYPES + ] + ) # add subtract average mark angle from average meridian angle and add # azimuth(in geon) to get the declination baseline D_b = (meridian - average_mark) + azimuth -- GitLab