2727=========================================================================== 
2828
2929""" 
30- from  numpy  import  empty , arange , where , unique , \
31-     interp , ones , bool_ , zeros , array 
30+ from  numpy  import  empty , arange , where , unique , interp , ones , bool_ , zeros , array 
3231from  .. import  VAR_DESCR_inv 
3332import  logging 
3433from  datetime  import  datetime , timedelta 
3938class  TrackEddiesObservations (EddiesObservations ):
4039    """Class to practice Tracking on observations 
4140    """ 
42-     __slots__  =  ('__obs_by_track' , '__first_index_of_track' )
4341
44-     ELEMENTS  =  ['lon' , 'lat' , 'radius_s' , 'radius_e' , 'amplitude' , 'speed_radius' , 'time' , 'shape_error_e' ,
45-                 'shape_error_s' , 'nb_contour_selected' , 'height_max_speed_contour' , 'height_external_contour' ,
46-                 'height_inner_contour' , 'cost_association' ]
42+     __slots__  =  ("__obs_by_track" , "__first_index_of_track" )
43+ 
44+     ELEMENTS  =  [
45+         "lon" ,
46+         "lat" ,
47+         "radius_s" ,
48+         "radius_e" ,
49+         "amplitude" ,
50+         "speed_radius" ,
51+         "time" ,
52+         "shape_error_e" ,
53+         "shape_error_s" ,
54+         "nb_contour_selected" ,
55+         "height_max_speed_contour" ,
56+         "height_external_contour" ,
57+         "height_inner_contour" ,
58+         "cost_association" ,
59+     ]
4760
4861    def  __init__ (self , * args , ** kwargs ):
4962        super (TrackEddiesObservations , self ).__init__ (* args , ** kwargs )
@@ -54,73 +67,80 @@ def filled_by_interpolation(self, mask):
5467        """Filled selected values by interpolation 
5568        """ 
5669        nb_filled  =  mask .sum ()
57-         logging .info (' %d obs will be filled (unobserved)' nb_filled )
70+         logging .info (" %d obs will be filled (unobserved)" nb_filled )
5871
5972        nb_obs  =  len (self )
6073        index  =  arange (nb_obs )
6174
6275        for  field  in  self .obs .dtype .descr :
6376            var  =  field [0 ]
64-             if  var  in  ['n' , 'virtual' , 'track' , 'cost_association' ] or  var  in  self .array_variables :
77+             if  (
78+                 var  in  ["n" , "virtual" , "track" , "cost_association" ]
79+                 or  var  in  self .array_variables 
80+             ):
6581                continue 
6682            # to normalize longitude before interpolation 
67-             if  var  ==  ' lon' 
83+             if  var  ==  " lon" 
6884                lon  =  self .obs [var ]
69-                 first  =  where (self .obs ['n' ] ==  0 )[0 ]
70-                 nb_obs  =  empty (first .shape , dtype = 'u4' )
85+                 first  =  where (self .obs ["n" ] ==  0 )[0 ]
86+                 nb_obs  =  empty (first .shape , dtype = "u4" )
7187                nb_obs [:- 1 ] =  first [1 :] -  first [:- 1 ]
7288                nb_obs [- 1 ] =  lon .shape [0 ] -  first [- 1 ]
7389                lon0  =  (lon [first ] -  180 ).repeat (nb_obs )
7490                self .obs [var ] =  (lon  -  lon0 ) %  360  +  lon0 
75-             self .obs [var ][mask ] =  interp (index [mask ], index [~ mask ], self .obs [var ][~ mask ])
91+             self .obs [var ][mask ] =  interp (
92+                 index [mask ], index [~ mask ], self .obs [var ][~ mask ]
93+             )
7694
7795    def  extract_longer_eddies (self , nb_min , nb_obs , compress_id = True ):
7896        """Select eddies which are longer than nb_min 
7997        """ 
8098        mask  =  nb_obs  >=  nb_min 
8199        nb_obs_select  =  mask .sum ()
82-         logging .info (' Selection of %d observations' nb_obs_select )
100+         logging .info (" Selection of %d observations" nb_obs_select )
83101        eddies  =  TrackEddiesObservations (
84102            size = nb_obs_select ,
85103            track_extra_variables = self .track_extra_variables ,
86104            track_array_variables = self .track_array_variables ,
87-             array_variables = self .array_variables 
105+             array_variables = self .array_variables , 
88106        )
89107        eddies .sign_type  =  self .sign_type 
90108        for  field  in  self .obs .dtype .descr :
91-             logging .debug (' Copy of field %s ...' field )
109+             logging .debug (" Copy of field %s ..." field )
92110            var  =  field [0 ]
93111            eddies .obs [var ] =  self .obs [var ][mask ]
94112        if  compress_id :
95-             list_id  =  unique (eddies .obs [' track' 
113+             list_id  =  unique (eddies .obs [" track" 
96114            list_id .sort ()
97115            id_translate  =  arange (list_id .max () +  1 )
98116            id_translate [list_id ] =  arange (len (list_id )) +  1 
99-             eddies .obs [' track' =  id_translate [eddies .obs [' track' 
117+             eddies .obs [" track" =  id_translate [eddies .obs [" track" 
100118        return  eddies 
101119
102120    @property  
103121    def  elements (self ):
104122        elements  =  super (TrackEddiesObservations , self ).elements 
105-         elements .extend ([' track' ,  'n' ,  ' virtual' 
123+         elements .extend ([" track" ,  "n" ,  " virtual" 
106124        return  list (set (elements ))
107125
108126    def  set_global_attr_netcdf (self , h_nc ):
109127        """Set global attr 
110128        """ 
111-         h_nc .title  =  'Cyclonic'  if  self .sign_type  ==  - 1  else  'Anticyclonic' 
112-         h_nc .Metadata_Conventions  =  'Unidata Dataset Discovery v1.0' 
113-         h_nc .comment  =  'Surface product; mesoscale eddies' 
114-         h_nc .framework_used  =  'https://github.com/AntSimi/py-eddy-tracker' 
115-         h_nc .standard_name_vocabulary  =  'NetCDF Climate and Forecast (CF) Metadata Convention Standard Name Table' 
116-         h_nc .date_created  =  datetime .now ().strftime ('%Y-%m-%dT%H:%M:%SZ' )
117-         t  =  h_nc .variables [VAR_DESCR_inv ['j1' ]]
129+         h_nc .title  =  "Cyclonic"  if  self .sign_type  ==  - 1  else  "Anticyclonic" 
130+         h_nc .Metadata_Conventions  =  "Unidata Dataset Discovery v1.0" 
131+         h_nc .comment  =  "Surface product; mesoscale eddies" 
132+         h_nc .framework_used  =  "https://github.com/AntSimi/py-eddy-tracker" 
133+         h_nc .standard_name_vocabulary  =  (
134+             "NetCDF Climate and Forecast (CF) Metadata Convention Standard Name Table" 
135+         )
136+         h_nc .date_created  =  datetime .now ().strftime ("%Y-%m-%dT%H:%M:%SZ" )
137+         t  =  h_nc .variables [VAR_DESCR_inv ["j1" ]]
118138        delta  =  t .max  -  t .min  +  1 
119-         h_nc .time_coverage_duration  =  ' P%dD' %  delta 
139+         h_nc .time_coverage_duration  =  " P%dD" %  delta 
120140        d_start  =  datetime (1950 , 1 , 1 ) +  timedelta (int (t .min ))
121141        d_end  =  datetime (1950 , 1 , 1 ) +  timedelta (int (t .max ))
122-         h_nc .time_coverage_start  =  d_start .strftime (' %Y-%m-%dT00:00:00Z' 
123-         h_nc .time_coverage_end  =  d_end .strftime (' %Y-%m-%dT00:00:00Z' 
142+         h_nc .time_coverage_start  =  d_start .strftime (" %Y-%m-%dT00:00:00Z" 
143+         h_nc .time_coverage_end  =  d_end .strftime (" %Y-%m-%dT00:00:00Z" 
124144
125145    def  extract_with_area (self , area , ** kwargs ):
126146        """ 
@@ -132,10 +152,10 @@ def extract_with_area(self, area, **kwargs):
132152        Returns: 
133153
134154        """ 
135-         mask  =  (self .latitude  >  area [' llcrnrlat' *  (self .latitude  <  area [' urcrnrlat' 
136-         lon0  =  area [' llcrnrlon' 
155+         mask  =  (self .latitude  >  area [" llcrnrlat" *  (self .latitude  <  area [" urcrnrlat" 
156+         lon0  =  area [" llcrnrlon" 
137157        lon  =  (self .longitude  -  lon0 ) %  360  +  lon0 
138-         mask  *=  (lon  >  lon0 ) *  (lon  <  area [' urcrnrlon' 
158+         mask  *=  (lon  >  lon0 ) *  (lon  <  area [" urcrnrlon" 
139159        return  self .__extract_with_mask (mask , ** kwargs )
140160
141161    def  extract_with_period (self , period , ** kwargs ):
@@ -181,11 +201,11 @@ def compute_index(self):
181201            # Doesn't work => core dump with numba, maybe he wait i8 instead of u4 
182202            # self.__first_index_of_track = -ones(s, self.tracks.dtype) 
183203            # self.__obs_by_track = zeros(s, self.observation_number.dtype) 
184-             self .__first_index_of_track  =  - ones (s , 'i8' )
185-             self .__obs_by_track  =  zeros (s , 'i8' )
186-             logging .debug (' Start computing index ...' 
204+             self .__first_index_of_track  =  - ones (s , "i8" )
205+             self .__obs_by_track  =  zeros (s , "i8" )
206+             logging .debug (" Start computing index ..." 
187207            compute_index (self .tracks , self .__first_index_of_track , self .__obs_by_track )
188-             logging .debug (' ... OK' 
208+             logging .debug (" ... OK" 
189209
190210    @property  
191211    def  index_from_track (self ):
@@ -227,7 +247,9 @@ def __extract_with_mask(self, mask, full_path=False, remove_incomplete=False, co
227247            same object with selected observations 
228248        """ 
229249        if  full_path  and  remove_incomplete :
230-             logging .warning ('Incompatible option, remove_incomplete option will be remove' )
250+             logging .warning (
251+                 "Incompatible option, remove_incomplete option will be remove" 
252+             )
231253            remove_incomplete  =  False 
232254
233255        if  full_path :
@@ -243,22 +265,22 @@ def __extract_with_mask(self, mask, full_path=False, remove_incomplete=False, co
243265            track_extra_variables = self .track_extra_variables ,
244266            track_array_variables = self .track_array_variables ,
245267            array_variables = self .array_variables ,
246-             raw_data = self .raw_data 
268+             raw_data = self .raw_data , 
247269        )
248270        new .sign_type  =  self .sign_type 
249271        if  nb_obs  ==  0 :
250-             logging .warning (' Empty dataset will be created' 
272+             logging .warning (" Empty dataset will be created" 
251273        else :
252274            for  field  in  self .obs .dtype .descr :
253-                 logging .debug (' Copy of field %s ...' field )
275+                 logging .debug (" Copy of field %s ..." field )
254276                var  =  field [0 ]
255277                new .obs [var ] =  self .obs [var ][mask ]
256278            if  compress_id :
257-                 list_id  =  unique (new .obs [' track' 
279+                 list_id  =  unique (new .obs [" track" 
258280                list_id .sort ()
259281                id_translate  =  arange (list_id .max () +  1 )
260282                id_translate [list_id ] =  arange (len (list_id )) +  1 
261-                 new .obs [' track' =  id_translate [new .obs [' track' 
283+                 new .obs [" track" =  id_translate [new .obs [" track" 
262284        return  new 
263285
264286
0 commit comments