Skip to content

Commit 2aa6191

Browse files
committed
Add example about tracking
1 parent 5351a17 commit 2aa6191

File tree

7 files changed

+269
-6
lines changed

7 files changed

+269
-6
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
"""
2+
Track in python
3+
===============
4+
5+
This example didn't replace EddyTracking, we remove check that application do and also postprocessing step.
6+
"""
7+
8+
# %%
9+
10+
from py_eddy_tracker.data import get_remote_sample
11+
from py_eddy_tracker.tracking import Correspondances
12+
from py_eddy_tracker.featured_tracking.area_tracker import AreaTracker
13+
from numpy import where, empty
14+
from py_eddy_tracker.gui import GUI
15+
16+
17+
# %%
18+
# Function to have track with contiguous longitude
19+
def wrap_longitude(eddies):
20+
lon = eddies.longitude
21+
first = where(eddies.obs["n"] == 0)[0]
22+
nb_obs = empty(first.shape, dtype="u4")
23+
nb_obs[:-1] = first[1:] - first[:-1]
24+
nb_obs[-1] = lon.shape[0] - first[-1]
25+
lon0 = (lon[first] - 180).repeat(nb_obs)
26+
lon[:] = (lon - lon0) % 360 + lon0
27+
28+
29+
# %%
30+
# Get remote data, we will keep only 180 first days
31+
file_objects = get_remote_sample(
32+
"eddies_med_adt_allsat_dt2018/Anticyclonic_2010_2011_2012"
33+
)[:180]
34+
35+
# %%
36+
# We run a traking with a tracker which use contour overlap
37+
c = Correspondances(datasets=file_objects, class_method=AreaTracker)
38+
c.track()
39+
c.prepare_merging()
40+
# We have now an eddy object
41+
eddies_area_tracker = c.merge(raw_data=False)
42+
wrap_longitude(eddies_area_tracker)
43+
44+
# %%
45+
# We run a traking with default tracker
46+
c = Correspondances(datasets=file_objects)
47+
c.track()
48+
c.prepare_merging()
49+
eddies_default_tracker = c.merge(raw_data=False)
50+
wrap_longitude(eddies_default_tracker)
51+
52+
# %%
53+
# Start GUI to compare tracking
54+
g = GUI(
55+
Acyc_area_tracker=eddies_area_tracker, Acyc_default_tracker=eddies_default_tracker
56+
)
57+
g.now = 22000
58+
g.bbox = 0, 9, 36, 40
59+
g.adjust()
60+
g.show()
61+
62+
# %%
63+
# Start GUI with area tracker
64+
g = GUI(Acyc_area_tracker=eddies_area_tracker)
65+
g.now = 22000
66+
g.bbox = 0, 9, 36, 40
67+
g.adjust()
68+
g.show()
69+
70+
# %%
71+
# Start GUI with default one
72+
g = GUI(Acyc_default_tracker=eddies_default_tracker)
73+
g.now = 22000
74+
g.bbox = 0, 9, 36, 40
75+
g.adjust()
76+
g.show()

notebooks/python_module/02_eddy_identification/pet_eddy_detection.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@
188188
"cell_type": "markdown",
189189
"metadata": {},
190190
"source": [
191-
"Display detected eddies, dashed lines represent effective contour \nand solid lines represent contour of maximum of speed. See figure 1 of https://doi.org/10.1175/JTECH-D-14-00019.1\n\n"
191+
"Display detected eddies, dashed lines represent effective contour\nand solid lines represent contour of maximum of speed. See figure 1 of https://doi.org/10.1175/JTECH-D-14-00019.1\n\n"
192192
]
193193
},
194194
{
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": null,
6+
"metadata": {
7+
"collapsed": false
8+
},
9+
"outputs": [],
10+
"source": [
11+
"%matplotlib inline"
12+
]
13+
},
14+
{
15+
"cell_type": "markdown",
16+
"metadata": {},
17+
"source": [
18+
"\nTrack in python\n===============\n\nThis example didn't replace EddyTracking, we remove check that application do and also postprocessing step.\n"
19+
]
20+
},
21+
{
22+
"cell_type": "code",
23+
"execution_count": null,
24+
"metadata": {
25+
"collapsed": false
26+
},
27+
"outputs": [],
28+
"source": [
29+
"from py_eddy_tracker.data import get_remote_sample\nfrom py_eddy_tracker.tracking import Correspondances\nfrom py_eddy_tracker.featured_tracking.area_tracker import AreaTracker\nfrom numpy import where, empty\nfrom py_eddy_tracker.gui import GUI"
30+
]
31+
},
32+
{
33+
"cell_type": "markdown",
34+
"metadata": {},
35+
"source": [
36+
"Function to have track with contiguous longitude\n\n"
37+
]
38+
},
39+
{
40+
"cell_type": "code",
41+
"execution_count": null,
42+
"metadata": {
43+
"collapsed": false
44+
},
45+
"outputs": [],
46+
"source": [
47+
"def wrap_longitude(eddies):\n lon = eddies.longitude\n first = where(eddies.obs[\"n\"] == 0)[0]\n nb_obs = empty(first.shape, dtype=\"u4\")\n nb_obs[:-1] = first[1:] - first[:-1]\n nb_obs[-1] = lon.shape[0] - first[-1]\n lon0 = (lon[first] - 180).repeat(nb_obs)\n lon[:] = (lon - lon0) % 360 + lon0"
48+
]
49+
},
50+
{
51+
"cell_type": "markdown",
52+
"metadata": {},
53+
"source": [
54+
"Get remote data, we will keep only 180 first days\n\n"
55+
]
56+
},
57+
{
58+
"cell_type": "code",
59+
"execution_count": null,
60+
"metadata": {
61+
"collapsed": false
62+
},
63+
"outputs": [],
64+
"source": [
65+
"file_objects = get_remote_sample(\n \"eddies_med_adt_allsat_dt2018/Anticyclonic_2010_2011_2012\"\n)[:180]"
66+
]
67+
},
68+
{
69+
"cell_type": "markdown",
70+
"metadata": {},
71+
"source": [
72+
"We run a traking with a tracker which use contour overlap\n\n"
73+
]
74+
},
75+
{
76+
"cell_type": "code",
77+
"execution_count": null,
78+
"metadata": {
79+
"collapsed": false
80+
},
81+
"outputs": [],
82+
"source": [
83+
"c = Correspondances(datasets=file_objects, class_method=AreaTracker)\nc.track()\nc.prepare_merging()\n# We have now an eddy object\neddies_area_tracker = c.merge(raw_data=False)\nwrap_longitude(eddies_area_tracker)"
84+
]
85+
},
86+
{
87+
"cell_type": "markdown",
88+
"metadata": {},
89+
"source": [
90+
"We run a traking with default tracker\n\n"
91+
]
92+
},
93+
{
94+
"cell_type": "code",
95+
"execution_count": null,
96+
"metadata": {
97+
"collapsed": false
98+
},
99+
"outputs": [],
100+
"source": [
101+
"c = Correspondances(datasets=file_objects)\nc.track()\nc.prepare_merging()\neddies_default_tracker = c.merge(raw_data=False)\nwrap_longitude(eddies_default_tracker)"
102+
]
103+
},
104+
{
105+
"cell_type": "markdown",
106+
"metadata": {},
107+
"source": [
108+
"Start GUI to compare tracking\n\n"
109+
]
110+
},
111+
{
112+
"cell_type": "code",
113+
"execution_count": null,
114+
"metadata": {
115+
"collapsed": false
116+
},
117+
"outputs": [],
118+
"source": [
119+
"g = GUI(\n Acyc_area_tracker=eddies_area_tracker, Acyc_default_tracker=eddies_default_tracker\n)\ng.now = 22000\ng.bbox = 0, 9, 36, 40\ng.adjust()\ng.show()"
120+
]
121+
},
122+
{
123+
"cell_type": "markdown",
124+
"metadata": {},
125+
"source": [
126+
"Start GUI with area tracker\n\n"
127+
]
128+
},
129+
{
130+
"cell_type": "code",
131+
"execution_count": null,
132+
"metadata": {
133+
"collapsed": false
134+
},
135+
"outputs": [],
136+
"source": [
137+
"g = GUI(Acyc_area_tracker=eddies_area_tracker)\ng.now = 22000\ng.bbox = 0, 9, 36, 40\ng.adjust()\ng.show()"
138+
]
139+
},
140+
{
141+
"cell_type": "markdown",
142+
"metadata": {},
143+
"source": [
144+
"Start GUI with default one\n\n"
145+
]
146+
},
147+
{
148+
"cell_type": "code",
149+
"execution_count": null,
150+
"metadata": {
151+
"collapsed": false
152+
},
153+
"outputs": [],
154+
"source": [
155+
"g = GUI(Acyc_default_tracker=eddies_default_tracker)\ng.now = 22000\ng.bbox = 0, 9, 36, 40\ng.adjust()\ng.show()"
156+
]
157+
}
158+
],
159+
"metadata": {
160+
"kernelspec": {
161+
"display_name": "Python 3",
162+
"language": "python",
163+
"name": "python3"
164+
},
165+
"language_info": {
166+
"codemirror_mode": {
167+
"name": "ipython",
168+
"version": 3
169+
},
170+
"file_extension": ".py",
171+
"mimetype": "text/x-python",
172+
"name": "python",
173+
"nbconvert_exporter": "python",
174+
"pygments_lexer": "ipython3",
175+
"version": "3.7.7"
176+
}
177+
},
178+
"nbformat": 4,
179+
"nbformat_minor": 0
180+
}

share/fig.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from matplotlib import pyplot as plt
22
from py_eddy_tracker.dataset.grid import RegularGridDataset
3+
from datetime import datetime
4+
import logging
35

46
grid_name, lon_name, lat_name = (
57
"nrt_global_allsat_phy_l4_20190223_20190226.nc",
@@ -29,10 +31,7 @@
2931
fig.savefig("png/filter.png")
3032

3133

32-
import logging
33-
3434
logging.getLogger().setLevel("DEBUG") # Values: ERROR, WARNING, INFO, DEBUG
35-
from datetime import datetime
3635

3736
h = RegularGridDataset(grid_name, lon_name, lat_name)
3837
h.bessel_high_filter("adt", 500, order=3)

src/py_eddy_tracker/generic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ def fit_circle(x_vec, y_vec):
185185
datas[:, 0] = 2.0 * (x_vec[1:] - x_mean) / scale
186186
datas[:, 1] = 2.0 * (y_vec[1:] - y_mean) / scale
187187

188-
(center_x, center_y, radius), residuals, rank, s = lstsq(datas, norme / norme_max)
188+
(center_x, center_y, radius), _, _, _ = lstsq(datas, norme / norme_max)
189189

190190
# Unscale data and get circle variables
191191
radius += center_x ** 2 + center_y ** 2

src/py_eddy_tracker/gui.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@ def set_initial_values(self):
108108
def now(self):
109109
return self.settings["now"]
110110

111+
@now.setter
112+
def now(self, value):
113+
self.settings["now"] = value
114+
111115
@property
112116
def period(self):
113117
return self.settings["period"]
@@ -116,6 +120,11 @@ def period(self):
116120
def bbox(self):
117121
return self.map.get_xlim(), self.map.get_ylim()
118122

123+
@bbox.setter
124+
def bbox(self, values):
125+
self.map.set_xlim(values[0], values[1])
126+
self.map.set_ylim(values[2], values[3])
127+
119128
def indexs(self, dataset):
120129
(x0, x1), (y0, y1) = self.bbox
121130
x, y = dataset.longitude, dataset.latitude

tests/test_obs.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from py_eddy_tracker.observations.observation import EddiesObservations
22
from py_eddy_tracker.data import get_path
3-
from netCDF4 import Dataset
43

54
a = EddiesObservations.load_file(get_path("Anticyclonic_20190223.nc"))
65
c = EddiesObservations.load_file(get_path("Cyclonic_20190223.nc"))

0 commit comments

Comments
 (0)