Skip to content

Commit e43c569

Browse files
committed
Add method to create obs from array
Nb obs by network get track slice
1 parent 5b2f6ff commit e43c569

File tree

5 files changed

+74
-13
lines changed

5 files changed

+74
-13
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
Method was described in :
1212

13-
[Pegliasco, C., Delepoulle, A., Morrow, R., Faugère, Y., and Dibarboure, G.: META3.1exp : A new Global Mesoscale Eddy Trajectories Atlas derived from altimetry, Earth Syst. Sci. Data Discuss.](https://doi.org/10.5194/essd-2021-300)
13+
[Pegliasco, C., Delepoulle, A., Morrow, R., Faugère, Y., and Dibarboure, G.: META3.1exp : A new Global Mesoscale Eddy Trajectories Atlas derived from altimetry, Earth Syst. Sci. Data Discuss.](https://doi.org/10.5194/essd-14-1087-2022)
1414

1515
[Mason, E., A. Pascual, and J. C. McWilliams, 2014: A new sea surface height–based code for oceanic mesoscale eddy tracking.](https://doi.org/10.1175/JTECH-D-14-00019.1)
1616

src/py_eddy_tracker/observations/groups.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def get_missing_indices(
6666
return indices
6767

6868

69-
def advect(x, y, c, t0, n_days):
69+
def advect(x, y, c, t0, n_days, u_name='u', v_name='v'):
7070
"""
7171
Advect particles from t0 to t0 + n_days, with data cube.
7272
@@ -75,13 +75,15 @@ def advect(x, y, c, t0, n_days):
7575
:param `~py_eddy_tracker.dataset.grid.GridCollection` c: GridCollection with speed for particles
7676
:param int t0: julian day of advection start
7777
:param int n_days: number of days to advect
78+
:param str u_name: variable name for u component
79+
:param str v_name: variable name for v component
7880
"""
7981

8082
kw = dict(nb_step=6, time_step=86400 / 6)
8183
if n_days < 0:
8284
kw["backward"] = True
8385
n_days = -n_days
84-
p = c.advect(x, y, "u", "v", t_init=t0, **kw)
86+
p = c.advect(x, y, u_name, v_name, t_init=t0, **kw)
8587
for _ in range(n_days):
8688
t, x, y = p.__next__()
8789
return t, x, y
@@ -125,7 +127,6 @@ def particle_candidate(
125127
else:
126128
x, y, i_start = e.create_particles(step_mesh, intern=True)
127129
print("The contour_start was not correct, speed contour is used")
128-
129130
# Advection
130131
t_end, x, y = advect(x, y, c, t_start, **kwargs)
131132

src/py_eddy_tracker/observations/network.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,16 @@ def index_network(self):
161161
self._index_network = build_index(self.track)
162162
return self._index_network
163163

164+
def network_size(self, id_networks):
165+
"""
166+
Return size for specified network
167+
168+
:param list,array id_networks: ids to identify network
169+
"""
170+
i = id_networks - self.index_network[2]
171+
i_start, i_stop = self.index_network[0][i], self.index_network[1][i]
172+
return i_stop - i_start
173+
164174
def network_slice(self, id_network):
165175
"""
166176
Return slice for one network
@@ -679,7 +689,13 @@ def display_timeline(
679689
"""
680690
self.only_one_network()
681691
j = 0
682-
line_kw = dict(ls="-", marker="+", markersize=6, zorder=1, lw=3,)
692+
line_kw = dict(
693+
ls="-",
694+
marker="+",
695+
markersize=6,
696+
zorder=1,
697+
lw=3,
698+
)
683699
line_kw.update(kwargs)
684700
mappables = dict(lines=list())
685701

@@ -912,7 +928,10 @@ def event_map(self, ax, **kwargs):
912928
"""Add the merging and splitting events to a map"""
913929
j = 0
914930
mappables = dict()
915-
symbol_kw = dict(markersize=10, color="k",)
931+
symbol_kw = dict(
932+
markersize=10,
933+
color="k",
934+
)
916935
symbol_kw.update(kwargs)
917936
symbol_kw_split = symbol_kw.copy()
918937
symbol_kw_split["markersize"] += 4
@@ -941,7 +960,13 @@ def event_map(self, ax, **kwargs):
941960
return mappables
942961

943962
def scatter(
944-
self, ax, name="time", factor=1, ref=None, edgecolor_cycle=None, **kwargs,
963+
self,
964+
ax,
965+
name="time",
966+
factor=1,
967+
ref=None,
968+
edgecolor_cycle=None,
969+
**kwargs,
945970
):
946971
"""
947972
This function scatters the path of each network, with the merging and splitting events

src/py_eddy_tracker/observations/observation.py

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ def shifted_ellipsoid_degrees_mask2(lon0, lat0, lon1, lat1, minor=1.5, major=1.5
130130
if dx > major[j]:
131131
m[j, i] = False
132132
continue
133-
d_normalize = dx ** 2 / major[j] ** 2 + dy ** 2 / minor ** 2
133+
d_normalize = dx**2 / major[j] ** 2 + dy**2 / minor**2
134134
m[j, i] = d_normalize < 1.0
135135
return m
136136

@@ -729,7 +729,11 @@ def load_file(cls, filename, **kwargs):
729729
.. code-block:: python
730730
731731
kwargs_latlon_300 = dict(
732-
include_vars=["longitude", "latitude",], indexs=dict(obs=slice(0, 300)),
732+
include_vars=[
733+
"longitude",
734+
"latitude",
735+
],
736+
indexs=dict(obs=slice(0, 300)),
733737
)
734738
small_dataset = TrackEddiesObservations.load_file(
735739
filename, **kwargs_latlon_300
@@ -1047,6 +1051,19 @@ def compare_units(input_unit, output_unit, name):
10471051
output_unit,
10481052
)
10491053

1054+
@classmethod
1055+
def from_array(cls, arrays, **kwargs):
1056+
nb = arrays["time"].size
1057+
# if hasattr(handler, "track_array_variables"):
1058+
# kwargs["track_array_variables"] = handler.track_array_variables
1059+
# kwargs["array_variables"] = handler.array_variables.split(",")
1060+
# if len(handler.track_extra_variables) > 1:
1061+
# kwargs["track_extra_variables"] = handler.track_extra_variables.split(",")
1062+
eddies = cls(size=nb, **kwargs)
1063+
for k, v in arrays.items():
1064+
eddies.obs[k] = v
1065+
return eddies
1066+
10501067
@classmethod
10511068
def from_zarr(cls, handler):
10521069
nb_obs = len(handler.dimensions[cls.obs_dimension(handler)])
@@ -1302,7 +1319,7 @@ def fixed_ellipsoid_mask(
13021319
if isinstance(minor, ndarray):
13031320
minor = minor[index_self]
13041321
# focal distance
1305-
f_degree = ((major ** 2 - minor ** 2) ** 0.5) / (
1322+
f_degree = ((major**2 - minor**2) ** 0.5) / (
13061323
111.2 * cos(radians(self.lat[index_self]))
13071324
)
13081325

@@ -2010,7 +2027,11 @@ def bins_stat(self, xname, bins=None, yname=None, method=None, mask=None):
20102027

20112028
def format_label(self, label):
20122029
t0, t1 = self.period
2013-
return label.format(t0=t0, t1=t1, nb_obs=len(self),)
2030+
return label.format(
2031+
t0=t0,
2032+
t1=t1,
2033+
nb_obs=len(self),
2034+
)
20142035

20152036
def display(self, ax, ref=None, extern_only=False, intern_only=False, **kwargs):
20162037
"""Plot the speed and effective (dashed) contour of the eddies
@@ -2381,7 +2402,14 @@ def grid_count_pixel_in(
23812402
x_, y_ = reduce_size(x_, y_)
23822403
v = create_vertice(x_, y_)
23832404
(x_start, x_stop), (y_start, y_stop) = bbox_indice_regular(
2384-
v, x_bounds, y_bounds, xstep, ystep, N, is_circular, x_size,
2405+
v,
2406+
x_bounds,
2407+
y_bounds,
2408+
xstep,
2409+
ystep,
2410+
N,
2411+
is_circular,
2412+
x_size,
23852413
)
23862414
i, j = get_pixel_in_regular(v, x_c, y_c, x_start, x_stop, y_start, y_stop)
23872415
grid_count_(grid, i, j)

src/py_eddy_tracker/observations/tracking.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ def __init__(self, *args, **kwargs):
6868
self.__obs_by_track = None
6969
self.__nb_track = None
7070

71+
def track_slice(self, track):
72+
i0 = self.index_from_track[track]
73+
return slice(i0, i0 + self.nb_obs_by_track[track])
74+
7175
def iter_track(self):
7276
"""
7377
Yield track
@@ -582,7 +586,10 @@ def close_tracks(self, other, nb_obs_min=10, **kwargs):
582586
def format_label(self, label):
583587
t0, t1 = self.period
584588
return label.format(
585-
t0=t0, t1=t1, nb_obs=len(self), nb_tracks=(self.nb_obs_by_track != 0).sum(),
589+
t0=t0,
590+
t1=t1,
591+
nb_obs=len(self),
592+
nb_tracks=(self.nb_obs_by_track != 0).sum(),
586593
)
587594

588595
def plot(self, ax, ref=None, **kwargs):

0 commit comments

Comments
 (0)