Skip to content

Commit b2e5291

Browse files
add function correct_close_events
1 parent c4ad072 commit b2e5291

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

src/py_eddy_tracker/observations/network.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,59 @@ def from_split_network(cls, group_dataset, indexs, **kwargs):
240240
def infos(self, label=""):
241241
return f"{len(self)} obs {unique(self.segment).shape[0]} segments"
242242

243+
def correct_close_events(self, nb_days_max=20):
244+
245+
_time = self.time
246+
segment = self.segment.copy()
247+
segments_connexion = dict()
248+
249+
previous_obs, next_obs = self.previous_obs, self.next_obs
250+
251+
# record for every segments, the slice, indice of next obs & indice of previous obs
252+
for i, seg, _ in self.iter_on(self.segment):
253+
if i.start == i.stop:
254+
continue
255+
256+
i_p, i_n = previous_obs[i.start], next_obs[i.stop - 1]
257+
segments_connexion[seg] = [i, i_p, i_n]
258+
259+
for seg in sorted(segments_connexion.keys()):
260+
seg_slice, i_seg_p, i_seg_n = segments_connexion[seg]
261+
n_seg = segment[i_seg_n]
262+
263+
# if segment has splitting
264+
if i_seg_n != -1:
265+
seg2_slice, i2_seg_p, i2_seg_n = segments_connexion[n_seg]
266+
p2_seg = segment[i2_seg_p]
267+
268+
# if it merge on the first in a certain time
269+
if (p2_seg == seg) and (_time[i_seg_n] - _time[i2_seg_p] < nb_days_max):
270+
271+
segment[i_seg_n : seg2_slice.stop] = seg
272+
previous_obs[i_seg_n] = seg_slice.stop - 1
273+
274+
self.segment[:] = segment
275+
self.next_obs[:] = next_obs
276+
self.previous_obs[:] = previous_obs
277+
278+
self.sort()
279+
280+
def sort(self, order=("track", "segment", "time")):
281+
"""
282+
sort observations
283+
284+
:param tuple order: order or sorting. Passed to `np.argsort`
285+
"""
286+
287+
index_order = self.obs.argsort(order=order)
288+
for field in self.elements:
289+
self[field][:] = self[field][index_order]
290+
291+
translate = -ones(index_order.max() + 2, dtype="i4")
292+
translate[index_order] = arange(index_order.shape[0])
293+
self.next_obs[:] = translate[self.next_obs]
294+
self.previous_obs[:] = translate[self.previous_obs]
295+
243296
def obs_relative_order(self, i_obs):
244297
self.only_one_network()
245298
return self.segment_relative_order(self.segment[i_obs])

0 commit comments

Comments
 (0)