forked from AntSimi/py-eddy-tracker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEddySubSetter
More file actions
167 lines (149 loc) · 5.03 KB
/
EddySubSetter
File metadata and controls
167 lines (149 loc) · 5.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Subset eddy Dataset
"""
import logging
from py_eddy_tracker import EddyParser
from py_eddy_tracker.observations.tracking import TrackEddiesObservations
logger = logging.getLogger("pet")
def id_parser():
parser = EddyParser("Eddy Subsetter")
parser.add_argument("filename")
parser.add_argument("filename_out")
group = parser.add_argument_group("Extraction options")
group.add_argument(
"-p",
"--period",
nargs=2,
type=int,
help="Start day and end day, if it's negative value we will add to day min and add to day max, if 0 it s not use",
)
group.add_argument(
"-l",
"--length",
nargs=2,
type=int,
help="Minimal and maximal quantity of observation for one track, ones bounds could be negative, it will be not use",
)
group.add_argument(
"-f",
"--full_path",
action="store_true",
help="Extract path, if one obs or more are selected",
)
group.add_argument(
"-d",
"--remove_incomplete",
action="store_true",
help="Extract path only if all obs are selected",
)
group.add_argument(
"--reject_virtual",
action="store_true",
help="If there are only virtual observation in selection, we don't select track",
)
group.add_argument(
"-a",
"--area",
nargs=4,
type=float,
metavar=("llcrnrlon", "llcrnrlat", "urcrnrlon", "urcrnrlat"),
help="Coordinates of bounding to extract",
)
group.add_argument(
"--direction",
choices=["E", "W", "S", "N"],
help="Select only track which have an end point which go in this direction",
)
group.add_argument(
"--minimal_degrees_displacement_in_direction",
type=float,
help="Minimal displacement in direction specified in --directio options",
)
group.add_argument(
"--select_first_observation_in_box",
type=float,
help="Select only the first obs in each box for each tracks, value specified must be resolution",
)
group.add_argument(
"--remove_var", nargs="+", type=str, help="remove all listed variable"
)
group.add_argument(
"--include_var",
nargs="+",
type=str,
help="use only listed variable, remove_var will be ignored",
)
group.add_argument(
"-i", "--ids", nargs="+", type=int, help="List of tracks which will be extract"
)
group = parser.add_argument_group("General options")
group.add_argument(
"--sort_time", action="store_true", help="sort all observation with time"
)
parser.add_argument(
"-n",
"--no_raw_mode",
action="store_true",
help="Uncompress all data, could be create a memory error for huge file, but is safer for extern file of py eddy tracker",
)
return parser
if __name__ == "__main__":
args = id_parser().parse_args()
# Original dataset
dataset = TrackEddiesObservations.load_file(
args.filename,
raw_data=False if args.no_raw_mode else True,
remove_vars=args.remove_var,
include_vars=args.include_var,
)
# Select with id
if args.ids is not None:
dataset = dataset.extract_ids(args.ids)
# Select with length
if args.length is not None:
dataset = dataset.extract_with_length(args.length)
# Select with a start date and end date
if args.period is not None:
dataset = dataset.extract_with_period(
args.period,
full_path=args.full_path,
remove_incomplete=args.remove_incomplete,
reject_virtual=args.reject_virtual,
)
# Select track which go through an area
if args.area is not None:
area = dict(
llcrnrlon=args.area[0],
llcrnrlat=args.area[1],
urcrnrlon=args.area[2],
urcrnrlat=args.area[3],
)
dataset = dataset.extract_with_area(
area,
full_path=args.full_path,
remove_incomplete=args.remove_incomplete,
reject_virtual=args.reject_virtual,
)
# Select only track which go in the direction specified
if args.direction:
if args.minimal_degrees_displacement_in_direction:
dataset = dataset.extract_in_direction(
args.direction, value=args.minimal_degrees_displacement_in_direction
)
else:
dataset = dataset.extract_in_direction(args.direction)
if args.select_first_observation_in_box:
dataset = dataset.extract_first_obs_in_box(
res=args.select_first_observation_in_box
)
if args.sort_time:
logger.debug("start sorting ...")
dataset.obs.sort(order=["time", "lon", "lat"])
logger.debug("end sorting")
# if no data, no output will be written
if len(dataset) == 0:
logger.warning("No data are selected, out file couldn't be create")
else:
dataset.write_file(filename=args.filename_out)