Skip to content

Commit 146c578

Browse files
committed
split kernel function for filtering to simplify
1 parent 2780f46 commit 146c578

File tree

6 files changed

+121
-127
lines changed

6 files changed

+121
-127
lines changed

examples/06_grid_manipulation/pet_filter.py

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from py_eddy_tracker.dataset.grid import RegularGridDataset
1111
from py_eddy_tracker import data
1212
from matplotlib import pyplot as plt
13+
from numpy import arange
1314

1415

1516
def start_axes(title):
@@ -35,11 +36,11 @@ def update_axes(ax, mappable=None):
3536
# %%
3637
# Kernel
3738
# ------
38-
# Shape of kernel will increase in x when latitude increase
39+
# Shape of kernel will increase in x, when latitude increase
3940
fig = plt.figure(figsize=(12, 8))
4041
for i, latitude in enumerate((15, 35, 55, 75)):
4142
k = g.kernel_bessel(latitude, 500, order=3).T
42-
ax0 = plt.subplot(
43+
ax0 = fig.add_subplot(
4344
2,
4445
2,
4546
i + 1,
@@ -49,6 +50,26 @@ def update_axes(ax, mappable=None):
4950
m = ax0.pcolormesh(k, vmin=-0.5, vmax=2, cmap="viridis_r")
5051
plt.colorbar(m, cax=fig.add_axes((0.92, 0.05, 0.01, 0.9)))
5152

53+
# %%
54+
# Kernel along latitude
55+
56+
fig = plt.figure(figsize=(12, 8))
57+
ax = fig.add_subplot(
58+
111,
59+
ylabel="Kernel weight",
60+
xlabel="Latitude in °",
61+
title="Kernel in latitude, centered at 0° of latitude ",
62+
)
63+
k = g.kernel_bessel(0, 500, order=3)
64+
k_lat = k[k.shape[0] // 2 + 1]
65+
nb = k_lat.shape[0] // 2
66+
ax.plot(
67+
arange(-nb * g.xstep, (nb + 0.5) * g.xstep, g.xstep), k_lat, label="Bessel kernel"
68+
)
69+
70+
ax.legend()
71+
ax.grid()
72+
5273
# %%
5374
# Kernel applying
5475
# ---------------
@@ -62,28 +83,28 @@ def update_axes(ax, mappable=None):
6283
#
6384
# Low frequency
6485
ax = start_axes("ADT low frequency")
65-
g.copy("adt", "adt_low")
66-
g.bessel_low_filter("adt_low", 300, order=3)
67-
m = g.display(ax, "adt_low", vmin=-0.15, vmax=0.15)
86+
g.copy("adt", "adt_low_300")
87+
g.bessel_low_filter("adt_low_300", 300, order=3)
88+
m = g.display(ax, "adt_low_300", vmin=-0.15, vmax=0.15)
6889
update_axes(ax, m)
6990

7091
# %%
7192
# High frequency
7293
ax = start_axes("ADT high frequency")
73-
g.copy("adt", "adt_high")
74-
g.bessel_high_filter("adt_high", 300, order=3)
75-
m = g.display(ax, "adt_high", vmin=-0.15, vmax=0.15)
94+
g.copy("adt", "adt_high_300")
95+
g.bessel_high_filter("adt_high_300", 300, order=3)
96+
m = g.display(ax, "adt_high_300", vmin=-0.15, vmax=0.15)
7697
update_axes(ax, m)
7798

7899
# %%
79100
# Clues
80101
# -----
81102
# wavelength : 80km
82103

83-
g.copy("adt", "adt_high_80")
84-
g.bessel_high_filter("adt_high_80", 80, order=3)
85-
g.copy("adt", "adt_low_80")
86-
g.bessel_low_filter("adt_low_80", 80, order=3)
104+
g.copy("adt", "adt_high_bessel")
105+
g.bessel_high_filter("adt_high_bessel", 80, order=3)
106+
g.copy("adt", "adt_low_bessel")
107+
g.bessel_low_filter("adt_low_bessel", 80, order=3)
87108

88109
area = dict(llcrnrlon=11.75, urcrnrlon=21, llcrnrlat=33, urcrnrlat=36.75)
89110

@@ -94,17 +115,12 @@ def update_axes(ax, mappable=None):
94115
ax.set_title("Spectrum")
95116
ax.set_xlabel("km")
96117

97-
lon_spec, lat_spec = g.spectrum_lonlat("adt", area=area)
98-
mappable = ax.loglog(*lat_spec, label="lat raw")[0]
99-
ax.loglog(*lon_spec, label="lon raw", color=mappable.get_color(), linestyle="--")
100-
101-
lon_spec, lat_spec = g.spectrum_lonlat("adt_high_80", area=area)
102-
mappable = ax.loglog(*lat_spec, label="lat high")[0]
103-
ax.loglog(*lon_spec, label="lon high", color=mappable.get_color(), linestyle="--")
104-
105-
lon_spec, lat_spec = g.spectrum_lonlat("adt_low_80", area=area)
106-
mappable = ax.loglog(*lat_spec, label="lat low")[0]
107-
ax.loglog(*lon_spec, label="lon low", color=mappable.get_color(), linestyle="--")
118+
for label in ("adt_high_bessel", "adt_low_bessel", "adt"):
119+
lon_spec, lat_spec = g.spectrum_lonlat(label, area=area)
120+
mappable = ax.loglog(*lat_spec, label=f"lat {label}")[0]
121+
ax.loglog(
122+
*lon_spec, label=f"lon {label}", color=mappable.get_color(), linestyle="--"
123+
)
108124

109125
ax.set_xlim(10, 1000)
110126
ax.set_ylim(1e-6, 1)
@@ -119,17 +135,10 @@ def update_axes(ax, mappable=None):
119135
ax.set_title("Spectrum ratio")
120136
ax.set_xlabel("km")
121137

122-
lon_spec, lat_spec = g.spectrum_lonlat(
123-
"adt_high_80", area=area, ref=g, ref_grid_name="adt"
124-
)
125-
mappable = ax.plot(*lat_spec, label="lat high")[0]
126-
ax.plot(*lon_spec, label="lon high", color=mappable.get_color(), linestyle="--")
127-
128-
lon_spec, lat_spec = g.spectrum_lonlat(
129-
"adt_low_80", area=area, ref=g, ref_grid_name="adt"
130-
)
131-
mappable = ax.plot(*lat_spec, label="lat low")[0]
132-
ax.plot(*lon_spec, label="lon low", color=mappable.get_color(), linestyle="--")
138+
for label in ("adt_high_bessel", "adt_low_bessel"):
139+
lon_spec, lat_spec = g.spectrum_lonlat(label, area=area, ref=g, ref_grid_name="adt")
140+
mappable = ax.plot(*lat_spec, label=f"lat {label}")[0]
141+
ax.plot(*lon_spec, label=f"lon {label}", color=mappable.get_color(), linestyle="--")
133142

134143
ax.set_xlim(10, 1000)
135144
ax.set_ylim(0, 1)
@@ -141,4 +150,3 @@ def update_axes(ax, mappable=None):
141150
# Old filter
142151
# ----------
143152
# To do ...
144-

examples/08_tracking_manipulation/pet_run_a_tracking.py

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,9 @@
1010
from py_eddy_tracker.data import get_remote_sample
1111
from py_eddy_tracker.tracking import Correspondances
1212
from py_eddy_tracker.featured_tracking.area_tracker import AreaTracker
13-
from numpy import where, empty
1413
from py_eddy_tracker.gui import GUI
1514

1615

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-
2916
# %%
3017
# Get remote data, we will keep only 180 first days
3118
file_objects = get_remote_sample(
@@ -34,20 +21,22 @@ def wrap_longitude(eddies):
3421

3522
# %%
3623
# We run a traking with a tracker which use contour overlap
37-
c = Correspondances(datasets=file_objects, class_method=AreaTracker)
24+
c = Correspondances(datasets=file_objects, class_method=AreaTracker, virtual=3)
3825
c.track()
3926
c.prepare_merging()
4027
# We have now an eddy object
4128
eddies_area_tracker = c.merge(raw_data=False)
42-
wrap_longitude(eddies_area_tracker)
29+
eddies_area_tracker["virtual"][:] = eddies_area_tracker["time"] == 0
30+
eddies_area_tracker.filled_by_interpolation(eddies_area_tracker["virtual"] == 1)
4331

4432
# %%
4533
# We run a traking with default tracker
46-
c = Correspondances(datasets=file_objects)
34+
c = Correspondances(datasets=file_objects, virtual=3)
4735
c.track()
4836
c.prepare_merging()
4937
eddies_default_tracker = c.merge(raw_data=False)
50-
wrap_longitude(eddies_default_tracker)
38+
eddies_default_tracker["virtual"][:] = eddies_default_tracker["time"] == 0
39+
eddies_default_tracker.filled_by_interpolation(eddies_default_tracker["virtual"] == 1)
5140

5241
# %%
5342
# Start GUI to compare tracking

notebooks/python_module/06_grid_manipulation/pet_filter.ipynb

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
},
2727
"outputs": [],
2828
"source": [
29-
"from py_eddy_tracker.dataset.grid import RegularGridDataset\nfrom py_eddy_tracker import data\nfrom matplotlib import pyplot as plt\n\n\ndef start_axes(title):\n fig = plt.figure(figsize=(13, 5))\n ax = fig.add_axes([0.03, 0.03, 0.90, 0.94])\n ax.set_xlim(-6, 36.5), ax.set_ylim(30, 46)\n ax.set_aspect(\"equal\")\n ax.set_title(title)\n return ax\n\n\ndef update_axes(ax, mappable=None):\n ax.grid()\n if mappable:\n plt.colorbar(m, cax=ax.figure.add_axes([0.95, 0.05, 0.01, 0.9]))"
29+
"from py_eddy_tracker.dataset.grid import RegularGridDataset\nfrom py_eddy_tracker import data\nfrom matplotlib import pyplot as plt\nfrom numpy import arange\n\n\ndef start_axes(title):\n fig = plt.figure(figsize=(13, 5))\n ax = fig.add_axes([0.03, 0.03, 0.90, 0.94])\n ax.set_xlim(-6, 36.5), ax.set_ylim(30, 46)\n ax.set_aspect(\"equal\")\n ax.set_title(title)\n return ax\n\n\ndef update_axes(ax, mappable=None):\n ax.grid()\n if mappable:\n plt.colorbar(m, cax=ax.figure.add_axes([0.95, 0.05, 0.01, 0.9]))"
3030
]
3131
},
3232
{
@@ -51,7 +51,7 @@
5151
"cell_type": "markdown",
5252
"metadata": {},
5353
"source": [
54-
"Kernel\n------\nShape of kernel will increase in x when latitude increase\n\n"
54+
"Kernel\n------\nShape of kernel will increase in x, when latitude increase\n\n"
5555
]
5656
},
5757
{
@@ -62,7 +62,25 @@
6262
},
6363
"outputs": [],
6464
"source": [
65-
"fig = plt.figure(figsize=(12, 8))\nfor i, latitude in enumerate((15, 35, 55, 75)):\n k = g.kernel_bessel(latitude, 500, order=3).T\n ax0 = plt.subplot(\n 2,\n 2,\n i + 1,\n title=f\"Kernel at {latitude}\u00b0 of latitude\\nfor 1/8\u00b0 grid, shape : {k.shape}\",\n aspect=\"equal\",\n )\n m = ax0.pcolormesh(k, vmin=-0.5, vmax=2, cmap=\"viridis_r\")\nplt.colorbar(m, cax=fig.add_axes((0.92, 0.05, 0.01, 0.9)))"
65+
"fig = plt.figure(figsize=(12, 8))\nfor i, latitude in enumerate((15, 35, 55, 75)):\n k = g.kernel_bessel(latitude, 500, order=3).T\n ax0 = fig.add_subplot(\n 2,\n 2,\n i + 1,\n title=f\"Kernel at {latitude}\u00b0 of latitude\\nfor 1/8\u00b0 grid, shape : {k.shape}\",\n aspect=\"equal\",\n )\n m = ax0.pcolormesh(k, vmin=-0.5, vmax=2, cmap=\"viridis_r\")\nplt.colorbar(m, cax=fig.add_axes((0.92, 0.05, 0.01, 0.9)))"
66+
]
67+
},
68+
{
69+
"cell_type": "markdown",
70+
"metadata": {},
71+
"source": [
72+
"Kernel along latitude\n\n"
73+
]
74+
},
75+
{
76+
"cell_type": "code",
77+
"execution_count": null,
78+
"metadata": {
79+
"collapsed": false
80+
},
81+
"outputs": [],
82+
"source": [
83+
"fig = plt.figure(figsize=(12, 8))\nax = fig.add_subplot(\n 111,\n ylabel=\"Kernel weight\",\n xlabel=\"Latitude in \u00b0\",\n title=\"Kernel in latitude, centered at 0\u00b0 of latitude \",\n)\nk = g.kernel_bessel(0, 500, order=3)\nk_lat = k[k.shape[0] // 2 + 1]\nnb = k_lat.shape[0] // 2\nax.plot(\n arange(-nb * g.xstep, (nb + 0.5) * g.xstep, g.xstep), k_lat, label=\"Bessel kernel\"\n)\n\nax.legend()\nax.grid()"
6684
]
6785
},
6886
{
@@ -98,7 +116,7 @@
98116
},
99117
"outputs": [],
100118
"source": [
101-
"ax = start_axes(\"ADT low frequency\")\ng.copy(\"adt\", \"adt_low\")\ng.bessel_low_filter(\"adt_low\", 300, order=3)\nm = g.display(ax, \"adt_low\", vmin=-0.15, vmax=0.15)\nupdate_axes(ax, m)"
119+
"ax = start_axes(\"ADT low frequency\")\ng.copy(\"adt\", \"adt_low_300\")\ng.bessel_low_filter(\"adt_low_300\", 300, order=3)\nm = g.display(ax, \"adt_low_300\", vmin=-0.15, vmax=0.15)\nupdate_axes(ax, m)"
102120
]
103121
},
104122
{
@@ -116,7 +134,7 @@
116134
},
117135
"outputs": [],
118136
"source": [
119-
"ax = start_axes(\"ADT high frequency\")\ng.copy(\"adt\", \"adt_high\")\ng.bessel_high_filter(\"adt_high\", 300, order=3)\nm = g.display(ax, \"adt_high\", vmin=-0.15, vmax=0.15)\nupdate_axes(ax, m)"
137+
"ax = start_axes(\"ADT high frequency\")\ng.copy(\"adt\", \"adt_high_300\")\ng.bessel_high_filter(\"adt_high_300\", 300, order=3)\nm = g.display(ax, \"adt_high_300\", vmin=-0.15, vmax=0.15)\nupdate_axes(ax, m)"
120138
]
121139
},
122140
{
@@ -134,7 +152,7 @@
134152
},
135153
"outputs": [],
136154
"source": [
137-
"g.copy(\"adt\", \"adt_high_80\")\ng.bessel_high_filter(\"adt_high_80\", 80, order=3)\ng.copy(\"adt\", \"adt_low_80\")\ng.bessel_low_filter(\"adt_low_80\", 80, order=3)\n\narea = dict(llcrnrlon=11.75, urcrnrlon=21, llcrnrlat=33, urcrnrlat=36.75)"
155+
"g.copy(\"adt\", \"adt_high_bessel\")\ng.bessel_high_filter(\"adt_high_bessel\", 80, order=3)\ng.copy(\"adt\", \"adt_low_bessel\")\ng.bessel_low_filter(\"adt_low_bessel\", 80, order=3)\n\narea = dict(llcrnrlon=11.75, urcrnrlon=21, llcrnrlat=33, urcrnrlat=36.75)"
138156
]
139157
},
140158
{
@@ -152,7 +170,7 @@
152170
},
153171
"outputs": [],
154172
"source": [
155-
"fig = plt.figure(figsize=(10, 6))\nax = fig.add_subplot(111)\nax.set_title(\"Spectrum\")\nax.set_xlabel(\"km\")\n\nlon_spec, lat_spec = g.spectrum_lonlat(\"adt\", area=area)\nmappable = ax.loglog(*lat_spec, label=\"lat raw\")[0]\nax.loglog(*lon_spec, label=\"lon raw\", color=mappable.get_color(), linestyle=\"--\")\n\nlon_spec, lat_spec = g.spectrum_lonlat(\"adt_high_80\", area=area)\nmappable = ax.loglog(*lat_spec, label=\"lat high\")[0]\nax.loglog(*lon_spec, label=\"lon high\", color=mappable.get_color(), linestyle=\"--\")\n\nlon_spec, lat_spec = g.spectrum_lonlat(\"adt_low_80\", area=area)\nmappable = ax.loglog(*lat_spec, label=\"lat low\")[0]\nax.loglog(*lon_spec, label=\"lon low\", color=mappable.get_color(), linestyle=\"--\")\n\nax.set_xlim(10, 1000)\nax.set_ylim(1e-6, 1)\nax.set_xscale(\"log\")\nax.legend()\nax.grid()"
173+
"fig = plt.figure(figsize=(10, 6))\nax = fig.add_subplot(111)\nax.set_title(\"Spectrum\")\nax.set_xlabel(\"km\")\n\nfor label in (\"adt_high_bessel\", \"adt_low_bessel\", \"adt\"):\n lon_spec, lat_spec = g.spectrum_lonlat(label, area=area)\n mappable = ax.loglog(*lat_spec, label=f\"lat {label}\")[0]\n ax.loglog(\n *lon_spec, label=f\"lon {label}\", color=mappable.get_color(), linestyle=\"--\"\n )\n\nax.set_xlim(10, 1000)\nax.set_ylim(1e-6, 1)\nax.set_xscale(\"log\")\nax.legend()\nax.grid()"
156174
]
157175
},
158176
{
@@ -170,7 +188,7 @@
170188
},
171189
"outputs": [],
172190
"source": [
173-
"fig = plt.figure(figsize=(10, 6))\nax = fig.add_subplot(111)\nax.set_title(\"Spectrum ratio\")\nax.set_xlabel(\"km\")\n\nlon_spec, lat_spec = g.spectrum_lonlat(\n \"adt_high_80\", area=area, ref=g, ref_grid_name=\"adt\"\n)\nmappable = ax.plot(*lat_spec, label=\"lat high\")[0]\nax.plot(*lon_spec, label=\"lon high\", color=mappable.get_color(), linestyle=\"--\")\n\nlon_spec, lat_spec = g.spectrum_lonlat(\n \"adt_low_80\", area=area, ref=g, ref_grid_name=\"adt\"\n)\nmappable = ax.plot(*lat_spec, label=\"lat low\")[0]\nax.plot(*lon_spec, label=\"lon low\", color=mappable.get_color(), linestyle=\"--\")\n\nax.set_xlim(10, 1000)\nax.set_ylim(0, 1)\nax.set_xscale(\"log\")\nax.legend()\nax.grid()"
191+
"fig = plt.figure(figsize=(10, 6))\nax = fig.add_subplot(111)\nax.set_title(\"Spectrum ratio\")\nax.set_xlabel(\"km\")\n\nfor label in (\"adt_high_bessel\", \"adt_low_bessel\"):\n lon_spec, lat_spec = g.spectrum_lonlat(label, area=area, ref=g, ref_grid_name=\"adt\")\n mappable = ax.plot(*lat_spec, label=f\"lat {label}\")[0]\n ax.plot(*lon_spec, label=f\"lon {label}\", color=mappable.get_color(), linestyle=\"--\")\n\nax.set_xlim(10, 1000)\nax.set_ylim(0, 1)\nax.set_xscale(\"log\")\nax.legend()\nax.grid()"
174192
]
175193
},
176194
{

notebooks/python_module/08_tracking_manipulation/pet_run_a_tracking.ipynb

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,25 +26,7 @@
2626
},
2727
"outputs": [],
2828
"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"
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 py_eddy_tracker.gui import GUI"
4830
]
4931
},
5032
{
@@ -80,7 +62,7 @@
8062
},
8163
"outputs": [],
8264
"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)"
65+
"c = Correspondances(datasets=file_objects, class_method=AreaTracker, virtual=3)\nc.track()\nc.prepare_merging()\n# We have now an eddy object\neddies_area_tracker = c.merge(raw_data=False)\neddies_area_tracker[\"virtual\"][:] = eddies_area_tracker[\"time\"] == 0\neddies_area_tracker.filled_by_interpolation(eddies_area_tracker[\"virtual\"] == 1)"
8466
]
8567
},
8668
{
@@ -98,7 +80,7 @@
9880
},
9981
"outputs": [],
10082
"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)"
83+
"c = Correspondances(datasets=file_objects, virtual=3)\nc.track()\nc.prepare_merging()\neddies_default_tracker = c.merge(raw_data=False)\neddies_default_tracker[\"virtual\"][:] = eddies_default_tracker[\"time\"] == 0\neddies_default_tracker.filled_by_interpolation(eddies_default_tracker[\"virtual\"] == 1)"
10284
]
10385
},
10486
{

src/py_eddy_tracker/data/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ def get_path(name):
1111

1212
def get_remote_sample(path):
1313
url = (
14-
f"https://github.com/AntSimi/py-eddy-tracker-sample-id/raw/master/{path}.tar.xz"
14+
f"https://github.com/AntSimi/py-eddy-tracker-sample-id/raw/master/{path}.tar.xz"
1515
)
16+
1617
content = requests.get(url).content
1718

1819
# Tar module could manage lzma tar, but it will apply un compress for each extractfile

0 commit comments

Comments
 (0)