From af3e3abd4dc488bcaca8b69bd1a844a83cf9b115 Mon Sep 17 00:00:00 2001 From: Lionel GUEZ <guez@lmd.ens.fr> Date: Tue, 28 Nov 2023 22:13:25 +0100 Subject: [PATCH] Move functions to `util_eddies.py` Move functions `node_to_date_eddy` and `date_eddy_to_node` from script `report_graph.py` to script `util_eddies.py`. `util_eddies.py` contains more basic functions, it only imports shapefile. `report_graph.py` imports networkx. It was not convenient nor meaningful to require networkx for scripts that use `node_to_date_eddy` or `date_eddy_to_node`. --- Common/util_eddies.py | 19 +++++++++++++++++++ Inst_eddies/Analysis/eddy_dump.py | 3 +-- Overlap/plot_components.py | 6 +++--- Overlap/report_graph.py | 29 +++++------------------------ Trajectories/cost_function.py | 3 +-- Trajectories/draw_segments.py | 5 +++-- Trajectories/filter_traj.py | 4 ++-- Trajectories/plot_traj.py | 8 ++++---- Trajectories/trajectories.py | 6 +++--- 9 files changed, 41 insertions(+), 42 deletions(-) diff --git a/Common/util_eddies.py b/Common/util_eddies.py index abf98881..abf3a903 100644 --- a/Common/util_eddies.py +++ b/Common/util_eddies.py @@ -253,3 +253,22 @@ def other_orient(orientation): return "Anticyclones" else: return "Cyclones" + +def node_to_date_eddy(node_index, e_overestim, only_date = False): + """Convert from node identification in graph to eddy identification in + shapefiles. Return date_index or (date_index, eddy_index). + + """ + k = (node_index - 1) // e_overestim + + if only_date: + return k + else: + return k, node_index - k * e_overestim + +def date_eddy_to_node(date, eddy_index, e_overestim): + """Convert from eddy identification in shapefiles to node + identification in graph. + + """ + return date * e_overestim + eddy_index diff --git a/Inst_eddies/Analysis/eddy_dump.py b/Inst_eddies/Analysis/eddy_dump.py index 6f1ca5d0..a85ae691 100755 --- a/Inst_eddies/Analysis/eddy_dump.py +++ b/Inst_eddies/Analysis/eddy_dump.py @@ -11,7 +11,6 @@ from os import path import pprint import sys import util_eddies -import report_graph import json parser = argparse.ArgumentParser() @@ -28,7 +27,7 @@ if args.ishape: else: if args.node: with open("e_overestim.txt") as f: e_overestim = int(f.read()) - date, eddy_index = report_graph.node_to_date_eddy(args.node, + date, eddy_index = util_eddies.node_to_date_eddy(args.node, e_overestim) else: reply = input("date, eddy_index = ? ").split(",") diff --git a/Overlap/plot_components.py b/Overlap/plot_components.py index 15dd389f..d1b4c738 100755 --- a/Overlap/plot_components.py +++ b/Overlap/plot_components.py @@ -8,6 +8,7 @@ from matplotlib import patches import cartopy.crs as ccrs import report_graph import sys +import util_eddies color_iter = itertools.cycle(('#1f77b4', '#aec7e8', '#ff7f0e', '#ffbb78', '#2ca02c', '#98df8a', @@ -37,8 +38,8 @@ def is_node_type(G, n, label): elif label == "important": return G.in_degree[n] == 0 or G.out_degree[n] == 0 or G.degree[n] >= 3 elif label[0] == "date": - return report_graph.node_to_date_eddy(n, G.graph["e_overestim"], - only_date = True) == label[1] + return util_eddies.node_to_date_eddy(n, G.graph["e_overestim"], + only_date = True) == label[1] elif label[0] == "node": return n in label[1] else: @@ -100,7 +101,6 @@ def animate_nbunch(G, nbunch): if __name__ == "__main__": import argparse from os import path - import util_eddies import time parser = argparse.ArgumentParser(description = __doc__) diff --git a/Overlap/report_graph.py b/Overlap/report_graph.py index 4ca8a169..49d1925c 100755 --- a/Overlap/report_graph.py +++ b/Overlap/report_graph.py @@ -8,25 +8,6 @@ import os import json import util_eddies -def node_to_date_eddy(node_index, e_overestim, only_date = False): - """Convert from node identification in graph to eddy identification in - shapefiles. Return date_index or (date_index, eddy_index). - - """ - k = (node_index - 1) // e_overestim - - if only_date: - return k - else: - return k, node_index - k * e_overestim - -def date_eddy_to_node(date, eddy_index, e_overestim): - """Convert from eddy identification in shapefiles to node - identification in graph. - - """ - return date * e_overestim + eddy_index - def read_eddy_graph(edgelist, shpc_dir = None, orientation = "Cyclones"): if os.access(edgelist, os.R_OK): G = nx.read_edgelist(edgelist, create_using = nx.DiGraph, @@ -50,7 +31,7 @@ def set_attribute(G, SHPC, orientation): if G.number_of_nodes() <= SHPC.get_n_shapes(0, orientation) / 100: for n in G: - date_index, eddy_index = node_to_date_eddy(n, + date_index, eddy_index = util_eddies.node_to_date_eddy(n, G.graph["e_overestim"]) ishape = SHPC.comp_ishape(date_index, eddy_index, 0, orientation) shape_rec = reader.shapeRecord(ishape) @@ -59,7 +40,7 @@ def set_attribute(G, SHPC, orientation): ssh = shape_rec.record.ssh) else: for shape_rec in reader: - n = date_eddy_to_node(shape_rec.record.date, + n = util_eddies.date_eddy_to_node(shape_rec.record.date, shape_rec.record.eddy_index, G.graph["e_overestim"]) @@ -78,7 +59,7 @@ def partition_graph_date(A, e_overestim): my_subgraphs = {} for n in A.iternodes(): - date_index = node_to_date_eddy(int(n), e_overestim, only_date = True) + date_index = util_eddies.node_to_date_eddy(int(n), e_overestim, only_date = True) if date_index in my_subgraphs: my_subgraphs[date_index].append(n) @@ -146,11 +127,11 @@ if __name__ == "__main__": if len_H >= 1: # First and last dates: node_index = min(G.nodes) - my_date = node_to_date_eddy(node_index, G.graph["e_overestim"], + my_date = util_eddies.node_to_date_eddy(node_index, G.graph["e_overestim"], only_date = True) print("First date:", my_date) node_index = max(G.nodes) - my_date = node_to_date_eddy(node_index, G.graph["e_overestim"], + my_date = util_eddies.node_to_date_eddy(node_index, G.graph["e_overestim"], only_date = True) print("Last date:", my_date) diff --git a/Trajectories/cost_function.py b/Trajectories/cost_function.py index 86feaaed..f4b5efd4 100755 --- a/Trajectories/cost_function.py +++ b/Trajectories/cost_function.py @@ -21,7 +21,6 @@ script. import graph_tool import time import math -import report_graph import util_eddies import argparse @@ -67,7 +66,7 @@ def node_to_prop(node_list, e_overestim, SHPC, orientation): properties = [] for n in node_list: - date_index, eddy_index = report_graph.node_to_date_eddy(n, e_overestim) + date_index, eddy_index = util_eddies.node_to_date_eddy(n, e_overestim) i_slice = SHPC.get_slice(date_index) ishape = SHPC.comp_ishape(date_index, eddy_index, i_slice, orientation) shapeRec = SHPC.get_reader(i_slice, orientation, "extremum")\ diff --git a/Trajectories/draw_segments.py b/Trajectories/draw_segments.py index 215976e8..7f6663e6 100755 --- a/Trajectories/draw_segments.py +++ b/Trajectories/draw_segments.py @@ -15,6 +15,7 @@ import argparse import report_graph import itertools +import util_eddies parser = argparse.ArgumentParser() parser.add_argument("input_file", help = "Graph-tool file") parser.add_argument("output_file", help = "Graphviz file") @@ -54,7 +55,7 @@ if args.t: except KeyError: break else: - date_index = report_graph.node_to_date_eddy(segment, + date_index = util_eddies.node_to_date_eddy(segment, g_in.gp.e_overestim, only_date = True) n.attr["label"] = f"{segment} in {i}\n({date_index})" @@ -62,7 +63,7 @@ if args.t: else: for n in g_out.iternodes(): segment = int(n) - date_index = report_graph.node_to_date_eddy(segment, + date_index = util_eddies.node_to_date_eddy(segment, g_in.gp.e_overestim, only_date = True) n.attr["label"] = f"{segment}\n({date_index})" diff --git a/Trajectories/filter_traj.py b/Trajectories/filter_traj.py index 5f00cedf..354ed357 100755 --- a/Trajectories/filter_traj.py +++ b/Trajectories/filter_traj.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import json -import report_graph +import util_eddies import bisect import sys @@ -10,7 +10,7 @@ if len(sys.argv) != 4: last_date = int(sys.argv[1]) with open(sys.argv[2]) as f: expanded_traj = json.load(f) -last_node = report_graph.date_eddy_to_node( +last_node = util_eddies.date_eddy_to_node( last_date, expanded_traj["e_overestim"], expanded_traj["e_overestim"]) filt_traj = [] diff --git a/Trajectories/plot_traj.py b/Trajectories/plot_traj.py index e65aadac..76368d94 100755 --- a/Trajectories/plot_traj.py +++ b/Trajectories/plot_traj.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -import report_graph +import util_eddies import random import numpy as np @@ -14,7 +14,7 @@ def get_extr_coord(traj, e_overestim, SHPC, orientation): y = [] for node in traj: - date_index, eddy_index = report_graph.node_to_date_eddy(node, + date_index, eddy_index = util_eddies.node_to_date_eddy(node, e_overestim) i_slice = SHPC.get_slice(date_index) ishape = SHPC.comp_ishape(date_index, eddy_index, i_slice, orientation) @@ -42,9 +42,9 @@ def get_duration(expanded_traj): duration_list = [] for traj in expanded_traj["traj"]: - init_date = report_graph.node_to_date_eddy( + init_date = util_eddies.node_to_date_eddy( traj[0], expanded_traj["e_overestim"], only_date = True) - final_date = report_graph.node_to_date_eddy( + final_date = util_eddies.node_to_date_eddy( traj[- 1], expanded_traj["e_overestim"], only_date = True) duration_list.append(final_date - init_date) diff --git a/Trajectories/trajectories.py b/Trajectories/trajectories.py index 8458a3ab..bfc2a1e8 100755 --- a/Trajectories/trajectories.py +++ b/Trajectories/trajectories.py @@ -16,7 +16,7 @@ import graph_tool from graph_tool import topology import json import sys -import report_graph +import util_eddies import numpy as np import time @@ -101,9 +101,9 @@ for n in topology.topological_sort(g): # date of the first eddy in segment n and the date of # splitting is the date of the last eddy in segment # n1. - date_merging = report_graph.node_to_date_eddy( + date_merging = util_eddies.node_to_date_eddy( g.vp.name[n], g.gp.e_overestim, only_date = True) - date_splitting = report_graph.node_to_date_eddy( + date_splitting = util_eddies.node_to_date_eddy( g.vp.inst_eddies[n1][- 1], g.gp.e_overestim, only_date = True) -- GitLab