Skip to content

Commit aa62baf

Browse files
author
adelepoulle
committed
Change name of files
1 parent 2c811b8 commit aa62baf

File tree

7 files changed

+65
-190
lines changed

7 files changed

+65
-190
lines changed

src/py_eddy_tracker/grid/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from pyproj import Proj
66
import numpy as np
77
import logging
8-
from ..make_eddy_tracker_list_obj import nearest
8+
from ..tracking_objects import nearest
99

1010

1111
class PyEddyTracker(object):

src/py_eddy_tracker/py_eddy_tracker_classes.py renamed to src/py_eddy_tracker/property_functions.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@
3333
import numpy as np
3434
from datetime import datetime
3535
from pyproj import Proj
36-
from .make_eddy_tracker_list_obj import uniform_resample, nearest
37-
from .py_eddy_tracker_property_classes import Amplitude, EddiesObservations
36+
from .tracking_objects import uniform_resample, nearest
37+
from .observations import EddiesObservations
38+
from .property_objects import Amplitude
3839
from .tools import distance, winding_number_poly, fit_circle_c
3940
from matplotlib.path import Path as BasePath
4041
from scipy.interpolate import griddata
@@ -415,7 +416,11 @@ def collection_loop(contours, grd, rtime, a_list_obj, c_list_obj,
415416
continue
416417

417418
# Instantiate new EddyObservation object
418-
properties = EddiesObservations(size=1)
419+
properties = EddiesObservations(
420+
size=1,
421+
track_array_variables=eddy.track_array_variables_sampling,
422+
array_variables=eddy.track_array_variables
423+
)
419424

420425
# Set indices to bounding box around eddy
421426
eddy.set_bounds(cont.lon, cont.lat, grd)
@@ -467,9 +472,8 @@ def collection_loop(contours, grd, rtime, a_list_obj, c_list_obj,
467472
args = (eddy, contours, centlon_e, centlat_e, cont, grd,
468473
anticyclonic_search)
469474

470-
#~ if eddy.track_array_variables > 10:
471-
#~ print ':)'
472-
#~ exit()
475+
#~ if eddy.track_array_variables > 0:
476+
473477
if not eddy.track_extra_variables:
474478
# (uavg, centlon_s, centlat_s,
475479
# eddy_radius_s, contlon_s, contlat_s,
@@ -518,6 +522,14 @@ def collection_loop(contours, grd, rtime, a_list_obj, c_list_obj,
518522
# See CSS11 section B4
519523
properties.obs['lon'] = centlon_s
520524
properties.obs['lat'] = centlat_s
525+
if 'contour_lon' in eddy.track_array_variables:
526+
properties.obs['contour_lon'], properties.obs['contour_lat'] = uniform_resample(
527+
cont.lon, cont.lat,
528+
fixed_size=eddy.track_array_variables_sampling)
529+
if 'contour_lon_s' in eddy.track_array_variables:
530+
properties.obs['contour_lon_s'], properties.obs['contour_lat_s'] = uniform_resample(
531+
contlon_s, contlat_s,
532+
fixed_size=eddy.track_array_variables_sampling)
521533

522534
if not has_ts: # for AVISO
523535
eddy.update_eddy_properties(properties)

src/py_eddy_tracker/py_eddy_tracker_property_classes.py renamed to src/py_eddy_tracker/property_objects.py

Lines changed: 5 additions & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# -*- coding: utf-8 -*-
2-
32
"""
43
===========================================================================
54
This file is part of py-eddy-tracker.
@@ -37,171 +36,21 @@
3736
from netCDF4 import Dataset
3837
from .tools import index_from_nearest_path, distance_matrix
3938
from . import VAR_DESCR, VAR_DESCR_inv
39+
from .observations import EddiesObservations
4040
import logging
4141

4242

43-
class EddiesObservations(object):
44-
"""
45-
Class to hold eddy properties *amplitude* and counts of
46-
*local maxima/minima* within a closed region of a sea level anomaly field.
47-
48-
Variables:
49-
centlon:
50-
Longitude centroid coordinate
51-
52-
centlat:
53-
Latitude centroid coordinate
54-
55-
eddy_radius_s:
56-
Speed based radius
57-
58-
eddy_radius_e:
59-
Effective radius
60-
61-
amplitude:
62-
Eddy amplitude
63-
64-
uavg:
65-
Average eddy swirl speed
66-
67-
teke:
68-
Average eddy kinetic energy within eddy
69-
70-
rtime:
71-
Time
43+
class VirtualEddiesObservations(EddiesObservations):
44+
"""Class to work with virtual obs
7245
"""
7346

74-
def __init__(self, size=0, track_extra_variables=False):
75-
self.track_extra_variables = track_extra_variables
76-
for elt in self.elements:
77-
if elt not in VAR_DESCR:
78-
raise Exception('Unknown element : %s' % elt)
79-
self.observations = np.zeros(size, dtype=self.dtype)
80-
self.active = True
81-
self.sign_type = None
82-
83-
def __repr__(self):
84-
return str(self.observations)
85-
86-
@property
87-
def dtype(self):
88-
dtype = list()
89-
for elt in self.elements:
90-
dtype.append((elt, VAR_DESCR[elt][
91-
'compute_type' if 'compute_type' in VAR_DESCR[elt] else
92-
'nc_type']))
93-
return dtype
94-
95-
@property
96-
def elements(self):
97-
elements = [
98-
'lon', # 'centlon'
99-
'lat', # 'centlat'
100-
'radius_s', # 'eddy_radius_s'
101-
'radius_e', # 'eddy_radius_e'
102-
'amplitude', # 'amplitude'
103-
'speed_radius', # 'uavg'
104-
'eke', # 'teke'
105-
'time'] # 'rtime'
106-
107-
if self.track_extra_variables:
108-
elements += ['contour_e',
109-
'contour_s',
110-
'uavg_profile',
111-
'shape_error',
112-
]
113-
return elements
114-
115-
def coherence(self, other):
116-
return self.track_extra_variables == other.track_extra_variables
117-
118-
def merge(self, other):
119-
nb_obs_self = len(self)
120-
nb_obs = nb_obs_self + len(other)
121-
eddies = self.__class__(size=nb_obs)
122-
eddies.obs[:nb_obs_self] = self.obs[:]
123-
eddies.obs[nb_obs_self:] = other.obs[:]
124-
eddies.sign_type = self.sign_type
125-
return eddies
126-
127-
def reset(self):
128-
self.observations = np.zeros(0, dtype=self.dtype)
129-
130-
@property
131-
def obs(self):
132-
return self.observations
133-
134-
def __len__(self):
135-
return len(self.observations)
136-
137-
def __iter__(self):
138-
for obs in self.obs:
139-
yield obs
140-
141-
def insert_observations(self, other, index):
142-
if not self.coherence(other):
143-
raise Exception('Observations with no coherence')
144-
insert_size = len(other.obs)
145-
self_size = len(self.obs)
146-
new_size = self_size + insert_size
147-
if self_size == 0:
148-
self.observations = other.obs
149-
return self
150-
elif insert_size == 0:
151-
return self
152-
if index < 0:
153-
index = self_size + index + 1
154-
eddies = self.__class__(new_size, self.track_extra_variables)
155-
eddies.obs[:index] = self.obs[:index]
156-
eddies.obs[index: index + insert_size] = other.obs
157-
eddies.obs[index + insert_size:] = self.obs[index:]
158-
self.observations = eddies.obs
159-
return self
160-
161-
def append(self, other):
162-
return self + other
163-
164-
def __add__(self, other):
165-
return self.insert_observations(other, -1)
166-
167-
def distance_matrix(self, other):
168-
""" Use haversine distance for distance matrix between every old and
169-
new eddy"""
170-
dist_mat = np.empty((len(self), len(other)))
171-
distance_matrix(self.obs['lon'], self.obs['lat'],
172-
other.obs['lon'], other.obs['lat'],
173-
dist_mat)
174-
return dist_mat
175-
176-
def index(self, index):
177-
size = 1
178-
if hasattr(index, '__iter__'):
179-
size = len(index)
180-
eddies = self.__class__(size, self.track_extra_variables)
181-
eddies.obs[:] = self.obs[index]
182-
return eddies
183-
184-
@staticmethod
185-
def load_from_netcdf(filename):
186-
with Dataset(filename) as h_nc:
187-
nb_obs = len(h_nc.dimensions['Nobs'])
188-
eddies = EddiesObservations(size=nb_obs)
189-
for variable in h_nc.variables:
190-
if variable == 'cyc':
191-
continue
192-
eddies.obs[VAR_DESCR_inv[variable]] = h_nc.variables[variable][:]
193-
eddies.sign_type = h_nc.variables['cyc'][0]
194-
return eddies
195-
196-
197-
class VirtualEddiesObservations(EddiesObservations):
198-
19947
@property
20048
def elements(self):
20149
elements = super(VirtualEddiesObservations, self).elements
20250
elements.extend(['track', 'segment_size', 'dlon', 'dlat'])
20351
return elements
204-
52+
53+
20554
class TrackEddiesObservations(EddiesObservations):
20655

20756
def extract_longer_eddies(self, nb_min, nb_obs):

src/py_eddy_tracker/make_eddy_tracker_list_obj.py renamed to src/py_eddy_tracker/tracking_objects.py

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
from . import VAR_DESCR
4343
import numpy as np
4444
import logging
45-
from .py_eddy_tracker_property_classes import EddiesObservations
45+
from .observations import EddiesObservations
4646

4747

4848
def nearest(lon_pt, lat_pt, lon2d, lat2d):
@@ -65,7 +65,8 @@ def nearest(lon_pt, lat_pt, lon2d, lat2d):
6565
return i_x, i_y
6666

6767

68-
def uniform_resample(x_val, y_val, **kwargs):
68+
def uniform_resample(x_val, y_val, method='interp1d', extrapolate=None,
69+
num_fac=2, fixed_size=None):
6970
"""
7071
Resample contours to have (nearly) equal spacing
7172
x_val, y_val : input contour coordinates
@@ -74,20 +75,18 @@ def uniform_resample(x_val, y_val, **kwargs):
7475
(Akima is slightly slower, but may be more accurate)
7576
extrapolate : IS NOT RELIABLE (sometimes nans occur)
7677
"""
77-
method = kwargs.get('method', 'interp1d')
78-
extrapolate = kwargs.get('extrapolate', None)
79-
num_fac = kwargs.get('num_fac', 2)
80-
8178
# Get distances
8279
dist = np.empty_like(x_val)
8380
dist[0] = 0
8481
distance_vector(
8582
x_val[:-1], y_val[:-1], x_val[1:], y_val[1:], dist[1:])
8683
dist.cumsum(out=dist)
8784
# Get uniform distances
85+
if fixed_size is None:
86+
fixed_size = dist.size * num_fac
8887
d_uniform = np.linspace(0,
8988
dist[-1],
90-
num=dist.size * num_fac,
89+
num=fixed_size,
9190
endpoint=True)
9291

9392
# Do 1d interpolations
@@ -478,11 +477,14 @@ def set_global_attr_netcdf(
478477
h_nc.evolve_area_max = self.evolve_area_max
479478

480479
def create_variable(self, handler_nc, kwargs_variable,
481-
attr_variable):
480+
attr_variable, scale_factor=None):
482481
var = handler_nc.createVariable(
483482
zlib=True,
484483
complevel=1,
485484
**kwargs_variable)
485+
if scale_factor is not None:
486+
var.scale_factor = scale_factor
487+
print scale_factor, kwargs_variable
486488
for attr, attr_value in attr_variable.iteritems():
487489
var.setncattr(attr, attr_value)
488490
# var.setncattr('min', var[:].min())
@@ -540,7 +542,8 @@ def create_netcdf(self, directory, savedir, grd=None, ymin=None, ymax=None,
540542
dict(varname=VAR_DESCR[key_name]['nc_name'],
541543
datatype=VAR_DESCR[key_name]['nc_type'],
542544
dimensions=VAR_DESCR[key_name]['nc_dims']),
543-
VAR_DESCR[key_name]['nc_attr']
545+
VAR_DESCR[key_name]['nc_attr'],
546+
scale_factor=VAR_DESCR[key_name].get('scale_factor', None)
544547
)
545548
h_nc.close()
546549

@@ -701,7 +704,11 @@ def __init__(self, sign_type, grd, date, **kwargs):
701704

702705
self.sla = None
703706

704-
self.observations = EddiesObservations(self.track_extra_variables)
707+
self.observations = EddiesObservations(
708+
track_array_variables=self.track_array_variables_sampling,
709+
array_variables=self.track_array_variables
710+
)
711+
705712
self.index = 0 # counter
706713
self.pad = 2
707714
self.pixel_threshold = None
@@ -750,18 +757,20 @@ def set_global_attr_netcdf(self, h_nc):
750757
h_nc.urcrnrlat = self.grd.latmax
751758

752759
def create_variable(self, handler_nc, kwargs_variable,
753-
attr_variable, data, scale_factor=None):
760+
attr_variable, data, scale_factor=None, add_offset=None):
754761
var = handler_nc.createVariable(
755762
zlib=True,
756763
complevel=1,
757764
**kwargs_variable)
758765
for attr, attr_value in attr_variable.iteritems():
759766
var.setncattr(attr, attr_value)
760-
var[:] = data
761-
var.set_auto_maskandscale(False)
762-
if scale_factor is not None:
763-
var.scale_factor = scale_factor
764-
767+
if scale_factor is not None:
768+
var.scale_factor = scale_factor
769+
if add_offset is not None:
770+
var.add_offset = add_offset
771+
else:
772+
var.add_offset = 0
773+
var[:] = data
765774
try:
766775
var.setncattr('min', var[:].min())
767776
var.setncattr('max', var[:].max())
@@ -779,17 +788,22 @@ def write_netcdf(self, path='./'):
779788
# Create dimensions
780789
logging.debug('Create Dimensions "Nobs" : %d', eddy_size)
781790
h_nc.createDimension('Nobs', eddy_size)
791+
if self.track_array_variables_sampling != 0:
792+
h_nc.createDimension('NbSample', self.track_array_variables_sampling)
782793
# Iter on variables to create:
783-
for name, _ in self.observations.dtype:
794+
for dtype in self.observations.dtype:
795+
name = dtype[0]
784796
logging.debug('Create Variable %s', VAR_DESCR[name]['nc_name'])
785797
self.create_variable(
786798
h_nc,
787799
dict(varname=VAR_DESCR[name]['nc_name'],
788-
datatype=VAR_DESCR[name]['nc_type'],
800+
datatype=VAR_DESCR[name]['output_type'],
789801
dimensions=VAR_DESCR[name]['nc_dims']),
790802
VAR_DESCR[name]['nc_attr'],
791803
self.observations.obs[name],
792-
scale_factor=None if 'scale_factor' not in VAR_DESCR[name] else VAR_DESCR[name]['scale_factor'])
804+
scale_factor=VAR_DESCR[name].get('scale_factor', None),
805+
add_offset=VAR_DESCR[name].get('add_offset', None)
806+
)
793807

794808
# Add cyclonic information
795809
self.create_variable(

src/scripts/EddyIdentification

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@ from multiprocessing import Pool
3636
import numpy as np
3737

3838
from py_eddy_tracker import EddyParser
39-
from py_eddy_tracker.py_eddy_tracker_classes import \
39+
from py_eddy_tracker.property_functions import \
4040
collection_loop, func_hann2d_fast
41-
from py_eddy_tracker.py_eddy_tracker_property_classes import SwirlSpeed
41+
from py_eddy_tracker.property_objects import SwirlSpeed
4242
from py_eddy_tracker.grid.aviso import AvisoGrid
43-
from py_eddy_tracker.make_eddy_tracker_list_obj import IdentificationList
43+
from py_eddy_tracker.tracking_objects import IdentificationList
4444

4545

4646
def circle_process(paths):

0 commit comments

Comments
 (0)