@@ -61,10 +61,26 @@ def load_contour(self, filename):
61
61
62
62
class NetworkObservations (EddiesObservations ):
63
63
64
- __slots__ = tuple ( )
64
+ __slots__ = ( "_index_network" , )
65
65
66
66
NOGROUP = 0
67
67
68
+ def __init__ (self , * args , ** kwargs ):
69
+ super ().__init__ (* args , ** kwargs )
70
+ self ._index_network = None
71
+
72
+ def network_slice (self , id_network ):
73
+ """
74
+ Return slice for one network
75
+
76
+ :param int id_network: id to identify network
77
+ """
78
+ if self ._index_network is None :
79
+ self ._index_network = build_index (self .track )
80
+ i = id_network - self ._index_network [2 ]
81
+ i_start , i_stop = self ._index_network [0 ][i ], self ._index_network [1 ][i ]
82
+ return slice (i_start , i_stop )
83
+
68
84
@property
69
85
def elements (self ):
70
86
elements = super ().elements
@@ -461,9 +477,56 @@ def spliting_event(self):
461
477
indices .append (i .start )
462
478
return self .extract_event (list (set (indices )))
463
479
480
+ def dissociate_network (self ):
481
+ """
482
+ Dissociate network with no known interaction (spliting/merging)
483
+ """
484
+ self .only_one_network ()
485
+ tags = self .tag_segment ()
486
+ # FIXME : Ok if only one network
487
+ self .track [:] = tags [self .segment - 1 ]
488
+
489
+ self .obs .sort (order = ("track" , "segment" , "time" ))
490
+ self ._index_network = None
491
+
492
+ # FIXME
493
+ # n & p must be re-index
494
+ # n, p = self.next_obs[mask], self.previous_obs[mask]
495
+ # we add 2 for -1 index return index -1
496
+ # translate = -ones(len(self) + 1, dtype="i4")
497
+ # translate[:-1][mask] = arange(nb_obs)
498
+ # new.next_obs[:] = translate[n]
499
+ # new.previous_obs[:] = translate[p]
500
+
501
+ def network (self , id_network ):
502
+ return self .extract_with_mask (self .network_slice (id_network ))
503
+
504
+ @classmethod
505
+ def __tag_segment (cls , seg , tag , groups , connexions ):
506
+ if groups [seg ] != 0 :
507
+ return
508
+ groups [seg ] = tag
509
+ segs = connexions .get (seg + 1 , None )
510
+ if segs is not None :
511
+ for seg in segs :
512
+ cls .__tag_segment (seg - 1 , tag , groups , connexions )
513
+
514
+ def tag_segment (self ):
515
+ self .only_one_network ()
516
+ nb = self .segment .max ()
517
+ sub_group = zeros (nb , dtype = "u4" )
518
+ c = self .connexions ()
519
+ j = 1
520
+ for i in range (nb ):
521
+ if sub_group [i ] != 0 :
522
+ continue
523
+ self .__tag_segment (i , j , sub_group , c )
524
+ j += 1
525
+ return sub_group
526
+
464
527
def fully_connected (self ):
465
528
self .only_one_network ()
466
- # TODO
529
+ return self . tag_segment (). shape [ 0 ] == 1
467
530
468
531
def plot (self , ax , ref = None , color_cycle = None , ** kwargs ):
469
532
"""
@@ -545,7 +608,10 @@ def extract_with_mask(self, mask):
545
608
:return: same object with selected observations
546
609
:rtype: self
547
610
"""
548
- nb_obs = mask .sum ()
611
+ if isinstance (mask , slice ):
612
+ nb_obs = mask .stop - mask .start
613
+ else :
614
+ nb_obs = mask .sum ()
549
615
new = self .__class__ .new_like (self , nb_obs )
550
616
new .sign_type = self .sign_type
551
617
if nb_obs == 0 :
0 commit comments