@@ -67,8 +67,10 @@ class EddiesObservations(object):
67
67
Time
68
68
"""
69
69
70
- def __init__ (self , size = 0 , track_extra_variables = False ):
70
+ def __init__ (self , size = 0 , track_extra_variables = False , track_array_variables = 0 , array_variables = [] ):
71
71
self .track_extra_variables = track_extra_variables
72
+ self .track_array_variables = track_array_variables
73
+ self .array_variables = array_variables
72
74
for elt in self .elements :
73
75
if elt not in VAR_DESCR :
74
76
raise Exception ('Unknown element : %s' % elt )
@@ -90,9 +92,13 @@ def dtype(self):
90
92
"""
91
93
dtype = list ()
92
94
for elt in self .elements :
93
- dtype . append (( elt , VAR_DESCR [elt ][
95
+ data_type = VAR_DESCR [elt ][
94
96
'compute_type' if 'compute_type' in VAR_DESCR [elt ] else
95
- 'nc_type' ]))
97
+ 'nc_type' ]
98
+ if elt in self .array_variables :
99
+ dtype .append ((elt , data_type , (self .track_array_variables ,)))
100
+ else :
101
+ dtype .append ((elt , data_type ))
96
102
return dtype
97
103
98
104
@property
@@ -108,7 +114,9 @@ def elements(self):
108
114
'speed_radius' , # 'uavg'
109
115
'eke' , # 'teke'
110
116
'time' ] # 'rtime'
111
-
117
+ if self .track_array_variables > 0 :
118
+ elements += self .array_variables
119
+
112
120
if self .track_extra_variables :
113
121
elements += ['contour_e' ,
114
122
'contour_s' ,
@@ -120,7 +128,9 @@ def elements(self):
120
128
def coherence (self , other ):
121
129
"""Check coherence between two dataset
122
130
"""
123
- return self .track_extra_variables == other .track_extra_variables
131
+ test = self .track_array_variables == other .track_array_variables
132
+ test *= self .array_variables == other .array_variables
133
+ return test
124
134
125
135
def merge (self , other ):
126
136
"""Merge two dataset
@@ -133,9 +143,12 @@ def merge(self, other):
133
143
eddies .sign_type = self .sign_type
134
144
return eddies
135
145
146
+ def reset (self ):
147
+ self .observations = np .zeros (0 , dtype = self .dtype )
148
+
136
149
@property
137
150
def obs (self ):
138
- """returan array observations
151
+ """return an array observations
139
152
"""
140
153
return self .observations
141
154
@@ -161,7 +174,10 @@ def insert_observations(self, other, index):
161
174
return self
162
175
if index < 0 :
163
176
index = self_size + index + 1
164
- eddies = self .__class__ (new_size , self .track_extra_variables )
177
+ eddies = self .__class__ (new_size , self .track_extra_variables ,
178
+ track_array_variables = self .track_array_variables ,
179
+ array_variables = self .array_variables
180
+ )
165
181
eddies .obs [:index ] = self .obs [:index ]
166
182
eddies .obs [index : index + insert_size ] = other .obs
167
183
eddies .obs [index + insert_size :] = self .obs [index :]
@@ -198,9 +214,18 @@ def index(self, index):
198
214
199
215
@staticmethod
200
216
def load_from_netcdf (filename ):
217
+ array_dim = 'NbSample'
201
218
with Dataset (filename ) as h_nc :
202
219
nb_obs = len (h_nc .dimensions ['Nobs' ])
203
- eddies = EddiesObservations (size = nb_obs )
220
+ kwargs = dict ()
221
+ if array_dim in h_nc .dimensions :
222
+ kwargs ['track_array_variables' ] = len (h_nc .dimensions [array_dim ])
223
+ kwargs ['array_variables' ] = []
224
+ for variable in h_nc .variables :
225
+ if array_dim in h_nc .variables [variable ].dimensions :
226
+ kwargs ['array_variables' ].append (str (variable ))
227
+
228
+ eddies = EddiesObservations (size = nb_obs , ** kwargs )
204
229
for variable in h_nc .variables :
205
230
if variable == 'cyc' :
206
231
continue
@@ -297,8 +322,9 @@ def filled_by_interpolation(self, mask):
297
322
nb_obs = len (self )
298
323
index = arange (nb_obs )
299
324
300
- for var , _ in self .obs .dtype .descr :
301
- if var in ['n' , 'virtual' , 'track' ]:
325
+ for field in self .obs .dtype .descr :
326
+ var = field [0 ]
327
+ if var in ['n' , 'virtual' , 'track' ] or var in self .array_variables :
302
328
continue
303
329
self .obs [var ][mask ] = interp (index [mask ], index [- mask ],
304
330
self .obs [var ][- mask ])
@@ -309,9 +335,14 @@ def extract_longer_eddies(self, nb_min, nb_obs, compress_id=True):
309
335
mask = nb_obs >= nb_min
310
336
nb_obs_select = mask .sum ()
311
337
logging .info ('Selection of %d observations' , nb_obs_select )
312
- eddies = TrackEddiesObservations (size = nb_obs_select )
338
+ eddies = TrackEddiesObservations (
339
+ size = nb_obs_select ,
340
+ track_array_variables = self .track_array_variables ,
341
+ array_variables = self .array_variables
342
+ )
313
343
eddies .sign_type = self .sign_type
314
- for var , _ in eddies .obs .dtype .descr :
344
+ for field in self .obs .dtype .descr :
345
+ var = field [0 ]
315
346
eddies .obs [var ] = self .obs [var ][mask ]
316
347
if compress_id :
317
348
list_id = unique (eddies .obs ['track' ])
@@ -329,22 +360,20 @@ def elements(self):
329
360
330
361
@staticmethod
331
362
def create_variable (handler_nc , kwargs_variable ,
332
- attr_variable , data , scale_factor = None ):
333
- """Create variable
334
- """
363
+ attr_variable , data , scale_factor = None , add_offset = None ):
335
364
var = handler_nc .createVariable (
336
365
zlib = True ,
337
366
complevel = 1 ,
338
367
** kwargs_variable )
339
368
for attr , attr_value in attr_variable .iteritems ():
340
369
var .setncattr (attr , attr_value )
341
-
342
- var [:] = data
343
-
344
- #~ var.set_auto_maskandscale(False)
345
370
if scale_factor is not None :
346
371
var .scale_factor = scale_factor
347
-
372
+ if add_offset is not None :
373
+ var .add_offset = add_offset
374
+ else :
375
+ var .add_offset = 0
376
+ var [:] = data
348
377
try :
349
378
var .setncattr ('min' , var [:].min ())
350
379
var .setncattr ('max' , var [:].max ())
@@ -362,19 +391,21 @@ def write_netcdf(self, path='./'):
362
391
# Create dimensions
363
392
logging .debug ('Create Dimensions "Nobs" : %d' , eddy_size )
364
393
h_nc .createDimension ('Nobs' , eddy_size )
394
+ if self .track_array_variables != 0 :
395
+ h_nc .createDimension ('NbSample' , self .track_array_variables )
365
396
# Iter on variables to create:
366
- for name , _ in self .observations .dtype .descr :
397
+ for field in self .observations .dtype .descr :
398
+ name = field [0 ]
367
399
logging .debug ('Create Variable %s' , VAR_DESCR [name ]['nc_name' ])
368
400
self .create_variable (
369
401
h_nc ,
370
402
dict (varname = VAR_DESCR [name ]['nc_name' ],
371
- datatype = VAR_DESCR [name ]['nc_type ' ],
403
+ datatype = VAR_DESCR [name ]['output_type ' ],
372
404
dimensions = VAR_DESCR [name ]['nc_dims' ]),
373
405
VAR_DESCR [name ]['nc_attr' ],
374
406
self .observations [name ],
375
- scale_factor = None
376
- if 'scale_factor' not in VAR_DESCR [name ] else
377
- VAR_DESCR [name ]['scale_factor' ]
407
+ scale_factor = VAR_DESCR [name ].get ('scale_factor' , None ),
408
+ add_offset = VAR_DESCR [name ].get ('add_offset' , None )
378
409
)
379
410
380
411
# Add cyclonic information
0 commit comments