Skip to content

Commit c434372

Browse files
CoriPegliascoAntSimi
authored andcommitted
Resample contours in output form after fitting circles
- add parameter presampling_multiplier to evenly over-resample before fitting circles - fit circles to get eddy parameters (radius, area, etc) - resample the contours with the output sampling
1 parent c7255e4 commit c434372

File tree

2 files changed

+44
-24
lines changed

2 files changed

+44
-24
lines changed

src/py_eddy_tracker/dataset/grid.py

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,7 @@ def eddy_identification(
607607
date,
608608
step=0.005,
609609
shape_error=55,
610+
presampling_multiplier=10,
610611
sampling=50,
611612
sampling_method="visvalingam",
612613
pixel_limit=None,
@@ -624,8 +625,10 @@ def eddy_identification(
624625
:param datetime.datetime date: Date to be stored in object to date data
625626
:param float,int step: Height between two layers in m
626627
:param float,int shape_error: Maximal error allowed for outermost contour in %
628+
:param int presampling_multiplier:
629+
Evenly oversample the initial number of points in the contour by nb_pts x presampling_multiplier to fit circles
627630
:param int sampling: Number of points to store contours and speed profile
628-
:param str sampling_method: Method to resample, 'uniform' or 'visvalingam'
631+
:param str sampling_method: Method to resample the stored contours, 'uniform' or 'visvalingam'
629632
:param (int,int),None pixel_limit:
630633
Min and max number of pixels inside the inner and the outermost contour to be considered as an eddy
631634
:param float,None precision: Truncate values at the defined precision in m
@@ -849,42 +852,59 @@ def eddy_identification(
849852
obs.amplitude[:] = amp.amplitude
850853
obs.speed_average[:] = max_average_speed
851854
obs.num_point_e[:] = contour.lon.shape[0]
852-
xy_e = resample(contour.lon, contour.lat, **out_sampling)
853-
obs.contour_lon_e[:], obs.contour_lat_e[:] = xy_e
854855
obs.num_point_s[:] = speed_contour.lon.shape[0]
855-
xy_s = resample(
856-
speed_contour.lon, speed_contour.lat, **out_sampling
857-
)
858-
obs.contour_lon_s[:], obs.contour_lat_s[:] = xy_s
859856

860-
# FIXME : we use a contour without resampling
861-
# First, get position based on innermost contour
862-
centlon_i, centlat_i, _, _ = _fit_circle_path(
863-
create_vertice(inner_contour.lon, inner_contour.lat)
857+
# Evenly resample contours with nb_pts = nb_pts_original x presampling_multiplier
858+
xy_i = uniform_resample(
859+
inner_contour.lon,
860+
inner_contour.lat,
861+
num_fac=presampling_multiplier
862+
)
863+
xy_e = uniform_resample(
864+
contour.lon,
865+
contour.lat,
866+
num_fac=presampling_multiplier,
864867
)
865-
# Second, get speed-based radius based on contour of max uavg
868+
xy_s = uniform_resample(
869+
speed_contour.lon,
870+
speed_contour.lat,
871+
num_fac=presampling_multiplier,
872+
)
873+
874+
# First, get position of max SSH based on best fit circle with resampled innermost contour
875+
centlon_i, centlat_i, _, _ = _fit_circle_path(create_vertice(*xy_i))
876+
obs.lon_max[:] = centlon_i
877+
obs.lat_max[:] = centlat_i
878+
879+
# Second, get speed-based radius, shape error, eddy center, area based on resampled contour of max uavg
866880
centlon_s, centlat_s, eddy_radius_s, aerr_s = _fit_circle_path(
867881
create_vertice(*xy_s)
868882
)
869-
# Compute again to use resampled contour
870-
_, _, eddy_radius_e, aerr_e = _fit_circle_path(
871-
create_vertice(*xy_e)
872-
)
873-
874883
obs.radius_s[:] = eddy_radius_s
875-
obs.radius_e[:] = eddy_radius_e
876-
obs.shape_error_e[:] = aerr_e
877884
obs.shape_error_s[:] = aerr_s
878885
obs.speed_area[:] = poly_area(
879886
*coordinates_to_local(*xy_s, lon0=centlon_s, lat0=centlat_s)
880887
)
888+
obs.lon[:] = centlon_s
889+
obs.lat[:] = centlat_s
890+
891+
# Third, compute effective radius, shape error, area from resampled effective contour
892+
_, _, eddy_radius_e, aerr_e = _fit_circle_path(
893+
create_vertice(*xy_e)
894+
)
895+
obs.radius_e[:] = eddy_radius_e
896+
obs.shape_error_e[:] = aerr_e
881897
obs.effective_area[:] = poly_area(
882898
*coordinates_to_local(*xy_e, lon0=centlon_s, lat0=centlat_s)
883899
)
884-
obs.lon[:] = centlon_s
885-
obs.lat[:] = centlat_s
886-
obs.lon_max[:] = centlon_i
887-
obs.lat_max[:] = centlat_i
900+
901+
# Finally, resample contours with output parameters
902+
xy_e_f = resample(*xy_e, **out_sampling)
903+
xy_s_f = resample(*xy_s, **out_sampling)
904+
905+
obs.contour_lon_s[:], obs.contour_lat_s[:] = xy_s_f
906+
obs.contour_lon_e[:], obs.contour_lat_e[:] = xy_e_f
907+
888908
if aerr > 99.9 or aerr_s > 99.9:
889909
logger.warning(
890910
"Strange shape at this step! shape_error : %f, %f",

src/py_eddy_tracker/poly.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def poly_area_vertice(v):
8686
@njit(cache=True)
8787
def poly_area(x, y):
8888
"""
89-
Must be call with local coordinates (in m, to get an area in m²).
89+
Must be called with local coordinates (in m, to get an area in m²).
9090
9191
:param array x:
9292
:param array y:

0 commit comments

Comments
 (0)