Skip to content

Commit 7a7b8c8

Browse files
committed
Added new tolerance_track_lnn for interpolating eddies to connect tracks, updated track_lnn to load
eddies dynamically.
1 parent 4540965 commit 7a7b8c8

File tree

9 files changed

+982
-155
lines changed

9 files changed

+982
-155
lines changed

track_lnn.m

Lines changed: 0 additions & 154 deletions
This file was deleted.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
function [ amps, geospeeds, lats, lons, pxcounts, pixels, surface_areas ] = get_eddy_attributes( eddy_dir, eddy_file_initial, dates)
2+
%GET_EDDY_ATTRIBUTES Summary of this function goes here
3+
% Detailed explanation goes here
4+
5+
amps = cell(size(dates));
6+
geospeeds = cell(size(dates));
7+
lats = cell(size(dates));
8+
lons = cell(size(dates));
9+
pxcounts = cell(size(dates));
10+
pixels = cell(size(dates));
11+
surface_areas = cell(size(dates));
12+
for i = 1:length(dates)
13+
disp(i)
14+
try
15+
temp = load([eddy_dir eddy_file_initial '_' num2str(dates(i)) '.mat']);
16+
catch
17+
disp(['Error loading file: ', eddy_dir, eddy_file_initial, '_', num2str(dates(i)), '.mat']);
18+
continue;
19+
end
20+
names = fieldnames(temp);
21+
if length(names) == 1
22+
eddies = temp.(names{1});
23+
end
24+
amps{i} = [eddies.Amplitude];
25+
geospeeds{i} = [eddies.MeanGeoSpeed];
26+
surface_areas{i} = [eddies.SurfaceArea];
27+
lats{i} = [eddies.Lat];
28+
lons{i} = [eddies.Lon];
29+
stats = [eddies.Stats];
30+
pxcounts{i} = [stats.Area];
31+
pixels{i} = {stats.PixelIdxList};
32+
end
33+
34+
end
35+

track_lnn/lib/get_eddy_lifetimes.m

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
function [ eddy_lifetimes ] = get_eddy_lifetimes( eddy_counts, tracks )
2+
%GET_EDDY_LIFETIMES Summary of this function goes here
3+
% Detailed explanation goes here
4+
5+
eddy_lifetimes = cell(size(eddy_counts));
6+
for i = 1:length(eddy_counts)
7+
eddy_lifetimes{i} = ones(1, eddy_counts(i));
8+
end
9+
10+
for i = 1:length(tracks)
11+
curr_track = tracks{i};
12+
track_length = size(curr_track, 1);
13+
for j = 1:size(curr_track, 1)
14+
curr_date_index = curr_track(j, 3);
15+
curr_eddy_index = curr_track(j, 4);
16+
eddy_lifetimes{curr_date_index}(curr_eddy_index) = track_length;
17+
end
18+
end
19+
20+
end
21+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
function [ track_indexes ] = get_eddy_track_index( eddy_counts, tracks )
2+
%GET_EDDY_TRACK_INDEX Summary of this function goes here
3+
% Detailed explanation goes here
4+
5+
track_indexes = cell(size(eddy_counts));
6+
for i = 1:length(eddy_counts)
7+
track_indexes{i} = nan(eddy_counts(i), 1);
8+
end
9+
10+
for i = 1:length(tracks)
11+
curr_track = tracks{i};
12+
for j = 1:size(curr_track, 1)
13+
curr_date_index = curr_track(j, 3);
14+
curr_eddy_index = curr_track(j, 4);
15+
track_indexes{curr_date_index}(curr_eddy_index) = i;
16+
end
17+
end
18+
19+
end
20+

track_lnn/lib/make_track_tags.m

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
function [ tags ] = make_track_tags( tracks, eddy_types )
2+
%MAKE_TRACK_TAGS Make tags for eddy in tracks based on eddy type cell array
3+
% Detailed explanation goes here
4+
5+
tags = cell(size(tracks));
6+
for i = 1:length(tracks);
7+
tags{i} = nan(size(tracks{i}, 1), 1);
8+
for j = 1:size(tracks{i}, 1)
9+
date_index = tracks{i}(j, 3);
10+
eddy_index = tracks{i}(j, 4);
11+
tags{i}(j) = eddy_types{date_index}(eddy_index);
12+
end
13+
end
14+
15+
end
16+
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
function prepare_eddy_data_for_viewer( viewer_data_save_dir, dates, eddy_dir, ...
2+
cyclonic_tracks, anticyclonic_tracks, ssh_dir)
3+
%PREPARE_EDDY_DATA_FOR_VIEWER Prepare data for the viewer
4+
% Input:
5+
% viewer_data_save_dir: where to save data for track viewer
6+
% dates: 1D array of dates for data
7+
% eddy_dir: directory where you save eddy from eddyscan
8+
% cyclonic_tracks: tracks for cyclonic eddies
9+
% anticyclonic_tracks: tracks for anticyclonic eddies
10+
% ssh_dir: directory where you save ssh data slices
11+
addpath('/project/expeditions/alindell/FullEddyViewer/data_code/');
12+
%% Prepare directory for saving
13+
if ~exist(viewer_data_save_dir, 'dir')
14+
mkdir(viewer_data_save_dir);
15+
end
16+
17+
pixel_save_dir = [viewer_data_save_dir 'pixel_data/'];
18+
if ~exist(pixel_save_dir, 'dir')
19+
mkdir(pixel_save_dir);
20+
end
21+
22+
disp('saving pixel data');
23+
load([ssh_dir 'lat.mat']);
24+
load([ssh_dir 'lon.mat']);
25+
save([pixel_save_dir 'lat.mat'], 'lat');
26+
save([pixel_save_dir 'lon.mat'], 'lon');
27+
28+
%% Cyclonic attributes
29+
disp('getting eddies attributes, will take a long time (about 30mins for 900 time slices)');
30+
31+
if ~isempty(cyclonic_tracks)
32+
[ cyc_amps, cyc_geospeeds, cyc_lats, cyc_lons, cyc_pxcounts, cyc_pixels, cyc_surface_areas ] = ...
33+
get_eddy_attributes(eddy_dir, 'cyclonic', dates);
34+
35+
cyc_types = cell(size(dates));
36+
for i = 1:length(dates)
37+
cyc_types{i} = zeros(size(cyc_lats{i}));
38+
end
39+
for i = 1:length(cyclonic_tracks)
40+
for j = 1:size(cyclonic_tracks{i},1)
41+
if length(cyclonic_tracks{i}(1,:)) == 5
42+
if cyclonic_tracks{i}(j,5) ~= 0
43+
flagged_eddy_timestep = cyclonic_tracks{i}(j,3);
44+
flagged_eddy_index = cyclonic_tracks{i}(j,4);
45+
cyc_types{flagged_eddy_timestep}(flagged_eddy_index) = cyclonic_tracks{i}(j,5);
46+
end
47+
end
48+
end
49+
end
50+
51+
cyclonic_tags = make_track_tags(cyclonic_tracks, cyc_types);
52+
save([viewer_data_save_dir 'cyclonic_tags.mat'], 'cyclonic_tags');
53+
54+
cyc_eddy_counts = zeros(length(cyc_lats), 1);
55+
for i = 1:length(cyc_lats)
56+
cyc_eddy_counts(i) = length(cyc_lats{i});
57+
end
58+
59+
cyc_lifetimes = get_eddy_lifetimes(cyc_eddy_counts, cyclonic_tracks);
60+
cyc_eddy_track_indexes = get_eddy_track_index(cyc_eddy_counts, cyclonic_tracks);
61+
62+
attribute_to_save = {'amps', 'geospeeds', 'lats', 'lons', 'pxcounts', 'surface_areas', 'lifetimes', 'eddy_track_indexes', 'types'};
63+
disp('saving cyclonic attributes')
64+
for i = 1:length(attribute_to_save)
65+
curr_attribute = attribute_to_save{i};
66+
save([viewer_data_save_dir 'cyc_' curr_attribute '.mat'], ['cyc_' curr_attribute]);
67+
end
68+
69+
if ~exist([pixel_save_dir 'cyclonic/'], 'dir')
70+
mkdir([pixel_save_dir 'cyclonic/']);
71+
end
72+
73+
disp('saving cyclonic pixels')
74+
for i = 1:length(dates)
75+
data = cyc_pixels{i};
76+
save([pixel_save_dir 'cyclonic/pixels_' num2str(dates(i)) '.mat'], 'data');
77+
end
78+
end
79+
80+
%% Anticyclonic attributes
81+
if ~isempty(anticyclonic_tracks)
82+
[ ant_amps, ant_geospeeds, ant_lats, ant_lons, ant_pxcounts, ant_pixels, ant_surface_areas ] = ...
83+
get_eddy_attributes(eddy_dir, 'anticyc', dates);
84+
85+
ant_types = cell(size(dates));
86+
for i = 1:length(dates)
87+
ant_types{i} = zeros(size(ant_lats{i}));
88+
end
89+
for i = 1:length(anticyclonic_tracks)
90+
for j = 1:size(anticyclonic_tracks{i},1)
91+
if length(anticyclonic_tracks{i}(1,:)) == 5
92+
if anticyclonic_tracks{i}(j,5) ~= 0
93+
flagged_eddy_timestep = anticyclonic_tracks{i}(j,3);
94+
flagged_eddy_index = anticyclonic_tracks{i}(j,4);
95+
ant_types{flagged_eddy_timestep}(flagged_eddy_index) = anticyclonic_tracks{i}(j,5);
96+
end
97+
end
98+
end
99+
end
100+
101+
anticyclonic_tags = make_track_tags(anticyclonic_tracks, ant_types);
102+
save([viewer_data_save_dir 'anticyclonic_tags.mat'], 'anticyclonic_tags');
103+
104+
ant_eddy_counts = zeros(length(ant_lats), 1);
105+
for i = 1:length(ant_lats)
106+
ant_eddy_counts(i) = length(ant_lats{i});
107+
end
108+
109+
ant_lifetimes = get_eddy_lifetimes(ant_eddy_counts, anticyclonic_tracks);
110+
ant_eddy_track_indexes = get_eddy_track_index(ant_eddy_counts, anticyclonic_tracks);
111+
112+
attribute_to_save = {'amps', 'geospeeds', 'lats', 'lons', 'pxcounts', 'surface_areas', 'lifetimes', 'eddy_track_indexes', 'types'};
113+
for i = 1:length(attribute_to_save)
114+
curr_attribute = attribute_to_save{i};
115+
save([viewer_data_save_dir 'ant_' curr_attribute '.mat'], ['ant_' curr_attribute]);
116+
end
117+
118+
if ~exist([pixel_save_dir 'anticyclonic/'], 'dir')
119+
mkdir([pixel_save_dir 'anticyclonic/']);
120+
end
121+
122+
for i = 1:length(dates)
123+
data = ant_pixels{i};
124+
save([pixel_save_dir 'anticyclonic/pixels_' num2str(dates(i)) '.mat'], 'data');
125+
end
126+
end
127+
128+
end

0 commit comments

Comments
 (0)