@@ -60,8 +60,7 @@ def __init__(self, datasets, virtual=0):
6060        self .datasets  =  datasets 
6161        self .previous2_obs  =  None 
6262        self .previous_obs  =  None 
63-         self .current_obs  =  EddiesObservations .load_from_netcdf (
64-             self .datasets [0 ])
63+         self .current_obs  =  None 
6564
6665        # To use virtual obs 
6766        # Number of obs which can prolongate real observations 
@@ -82,21 +81,48 @@ def __init__(self, datasets, virtual=0):
8281        self .nb_obs  =  0 
8382        self .eddies  =  None 
8483
84+     def  reset_dataset_cache (self ):
85+         self .previous2_obs  =  None 
86+         self .previous_obs  =  None 
87+         self .current_obs  =  None 
88+ 
8589    def  swap_dataset (self , dataset ):
8690        """ 
8791        """ 
8892        self .previous2_obs  =  self .previous_obs 
8993        self .previous_obs  =  self .current_obs 
9094        self .current_obs  =  EddiesObservations .load_from_netcdf (dataset )
9195
92-     def  store_correspondance (self , i_previous , i_current ):
93-         correspondance  =  array (
94-             i_previous ,
95-             dtype = self .correspondance_dtype )
96+     def  store_correspondance (self , i_previous , i_current , nb_real_obs ):
97+         """Storing correspondance in an array 
98+         """ 
99+         # Create array to store correspondance data 
100+         correspondance  =  array (i_previous , dtype = self .correspondance_dtype )
101+         # index from current_obs 
96102        correspondance ['out' ] =  i_current 
97103
98104        if  self .virtual :
105+             # if index in previous dataset is bigger than real obs number 
106+             # it's a virtual data 
99107            correspondance ['virtual' ] =  i_previous  >=  nb_real_obs 
108+         
109+         if  self .previous2_obs  is  None :
110+             # First time we set ID (Program starting) 
111+             nb_match  =  i_previous .shape [0 ]
112+             # Set an id for each match 
113+             correspondance ['id' ] =  self .id_generator (nb_match )
114+             self .append (correspondance )
115+             return 
116+ 
117+         # We set all id to UINT32_MAX 
118+         id_previous  =  ones (len (self .previous_obs ),
119+                            dtype = self .ID_DTYPE ) *  self .UINT32_MAX 
120+         # We get old id for previously eddies tracked 
121+         id_previous [self [- 1 ]['out' ]] =  self [- 1 ]['id' ]
122+         # We store ID in correspondance if the ID is UINT32_MAX, we never 
123+         # track it before 
124+         correspondance ['id' ] =  id_previous [correspondance ['in' ]]
125+ 
100126
101127    def  id_generator (self , nb_id ):
102128        """Generation id and incrementation 
@@ -153,6 +179,8 @@ def track(self):
153179        """ 
154180        START  =  True 
155181        FLG_VIRTUAL  =  False 
182+         self .reset_dataset_cache ()
183+         self .swap_dataset (self .datasets [0 ])
156184        # We begin with second file, first one is in previous 
157185        for  file_name  in  self .datasets [1 :]:
158186            self .swap_dataset (file_name )
@@ -169,7 +197,7 @@ def track(self):
169197            i_previous , i_current  =  self .previous_obs .tracking (self .current_obs )
170198            nb_match  =  i_previous .shape [0 ]
171199
172-             #~ self.store_correspondance(i_previous, i_current) 
200+             #~ self.store_correspondance(i_previous, i_current, nb_real_obs ) 
173201            correspondance  =  array (i_previous , dtype = self .correspondance_dtype )
174202            correspondance ['out' ] =  i_current 
175203
@@ -204,7 +232,7 @@ def track(self):
204232
205233            # new_id is equal to UINT32_MAX we must add a new ones 
206234            # we count the number of new 
207-             mask_new_id  =  correspondance ['id' ] ==  UINT32_MAX 
235+             mask_new_id  =  correspondance ['id' ] ==  self . UINT32_MAX 
208236            nb_new_tracks  =  mask_new_id .sum ()
209237            logging .debug ('%d birth in this step' , nb_new_tracks )
210238            # Set new id 
@@ -247,77 +275,80 @@ def prepare_merging(self):
247275        # Compute index of each tracks 
248276        self .i_current_by_tracks  =  self .nb_obs_by_tracks .cumsum () -  self .nb_obs_by_tracks 
249277        # Number of global obs 
250-         self .nb_obs  =  nb_obs_by_tracks .sum ()
278+         self .nb_obs  =  self . nb_obs_by_tracks .sum ()
251279        logging .info ('%d tracks identified' , self .current_id )
252280        logging .info ('%d observations will be join' , self .nb_obs )
253281
254282    def  merge (self ):
283+         """Merge all the correspondance in one array with all fields 
284+         """ 
255285        # Start create netcdf to agglomerate all eddy 
256-         self . eddies  =  TrackEddiesObservations (size = self .nb_obs )
286+         eddies  =  TrackEddiesObservations (size = self .nb_obs )
257287
258288        # Calculate the index in each tracks, we compute in u4 and translate 
259289        # in u2 (which are limited to 65535) 
260290        logging .debug ('Compute global index array (N)' )
261-         n  =  arange (nb_obs ,
291+         n  =  arange (self . nb_obs ,
262292                   dtype = 'u4' ) -  self .i_current_by_tracks .repeat (self .nb_obs_by_tracks )
263-         self . eddies ['n' ][:] =  uint16 (n )
293+         eddies ['n' ][:] =  uint16 (n )
264294        logging .debug ('Compute global track array' )
265-         self . eddies ['track' ][:] =  arange (self .current_id ).repeat (self .nb_obs_by_tracks )
295+         eddies ['track' ][:] =  arange (self .current_id ).repeat (self .nb_obs_by_tracks )
266296
267297        # Start loading identification again to save in the finals tracks 
268298        # Load first file 
269-         eddies_previous   =   EddiesObservations . load_from_netcdf (self .datasets [0 ])
299+         self . swap_dataset (self .datasets [0 ])
270300        # Set type of eddy with first file 
271-         self .eddies .sign_type  =  eddies_previous .sign_type 
301+         eddies .sign_type  =  self .current_obs .sign_type 
302+         # Fields to copy 
303+         fields  =  self .current_obs .obs .dtype .descr 
272304
273305        # To know if the track start 
274-         first_obs_save_in_tracks  =  zeros (i_current_by_tracks .shape ,
306+         first_obs_save_in_tracks  =  zeros (self . i_current_by_tracks .shape ,
275307                                            dtype = bool_ )
276308
277-         for  i , file_name  in  enumerate (FILENAMES [1 :]):
309+         for  i , file_name  in  enumerate (self . datasets [1 :]):
278310            # Load current file (we begin with second one) 
279-             self .current_obs   =   EddiesObservations . load_from_netcdf (file_name )
311+             self .swap_dataset (file_name )
280312            # We select the list of id which are involve in the correspondance 
281313            i_id  =  self [i ]['id' ]
282314            # Index where we will write in the final object 
283-             index_final  =  i_current_by_tracks [i_id ]
315+             index_final  =  self . i_current_by_tracks [i_id ]
284316
285317            # First obs of eddies 
286318            m_first_obs  =  - first_obs_save_in_tracks [i_id ]
287319            if  m_first_obs .any ():
288-                 # Index in the current  file 
320+                 # Index in the previous  file 
289321                index_in  =  self [i ]['in' ][m_first_obs ]
290322                # Copy all variable 
291-                 for  var , _  in  eddies_current . obs . dtype . descr :
292-                     self . eddies [var ][index_final [m_first_obs ]
293-                         ] =  eddies_previous [var ][index_in ]
323+                 for  var , _  in  fields :
324+                     eddies [var ][index_final [m_first_obs ]
325+                         ] =  self . previous_obs [var ][index_in ]
294326                # Increment 
295-                 i_current_by_tracks [i_id [m_first_obs ]] +=  1 
327+                 self . i_current_by_tracks [i_id [m_first_obs ]] +=  1 
296328                # Active this flag, we have only one first by tracks 
297329                first_obs_save_in_tracks [i_id ] =  True 
298-                 index_final  =  i_current_by_tracks [i_id ]
299- 
300-             # Index in the current file 
301-             index_current  =  self [i ]['out' ]
330+                 index_final  =  self .i_current_by_tracks [i_id ]
302331
303332            if  self .virtual :
304333                # If the flag virtual in correspondance is active, 
305334                # the previous is virtual 
306335                m_virtual  =  self [i ]['virtual' ]
307336                if  m_virtual .any ():
308-                     index_virtual  =  index_final [m_virtual ]
309337                    # Incrementing index 
310-                     i_current_by_tracks [i_id [m_virtual ]
338+                     self . i_current_by_tracks [i_id [m_virtual ]
311339                        ] +=  self [i ]['virtual_length' ][m_virtual ]
312340                    # Get new index 
313-                     index_final  =  i_current_by_tracks [i_id ]
341+                     index_final  =  self . i_current_by_tracks [i_id ]
314342
343+             # Index in the current file 
344+             index_current  =  self [i ]['out' ]
345+             
315346            # Copy all variable 
316-             for  var , _  in  eddies_current . obs . dtype . descr :
317-                 self . eddies [var ][index_final 
318-                     ] =  eddies_current [var ][index_current ]
347+             for  var , _  in  fields :
348+                 eddies [var ][index_final 
349+                     ] =  self . current_obs [var ][index_current ]
319350
320351            # Add increment for each index used 
321-             i_current_by_tracks [i_id ] +=  1 
322-             eddies_previous  =  eddies_current 
323- 
352+             self . i_current_by_tracks [i_id ] +=  1 
353+             self . previous_obs  =  self . current_obs 
354+          return   eddies 
0 commit comments