24
24
from shapely .geometry import box , base
25
25
from stormevents import StormEvent
26
26
from stormevents .nhc import VortexTrack
27
+ from stormevents .nhc .const import RMWFillMethod
27
28
from stormevents .nhc .track import (
28
29
combine_tracks ,
29
30
correct_ofcl_based_on_carq_n_hollandb ,
@@ -144,6 +145,7 @@ def main(args):
144
145
hr_before_landfall = args .hours_before_landfall
145
146
lead_times = args .lead_times
146
147
track_dir = args .preprocessed_tracks_dir
148
+ rmw_fill = RMWFillMethod [args .rmw_fill .lower ()]
147
149
148
150
if hr_before_landfall < 0 :
149
151
hr_before_landfall = 48
@@ -183,7 +185,8 @@ def main(args):
183
185
184
186
advisory = 'OFCL'
185
187
if not local_track_file .is_file ():
186
- # Find and pick a single advisory based on priority
188
+ # Find and pick a single advisory based on priority, the
189
+ # track is only used to get the available advisories
187
190
temp_track = event .track (file_deck = 'a' )
188
191
adv_avail = temp_track .unfiltered_data .advisory .unique ()
189
192
adv_order = ['OFCL' , 'HWRF' , 'HMON' , 'CARQ' ]
@@ -193,41 +196,65 @@ def main(args):
193
196
advisory = adv
194
197
break
195
198
196
- # TODO: THIS IS NO LONGER RELEVANT IF WE FAKE RMWP AS OFCL!
197
199
if advisory == "OFCL" and "CARQ" not in adv_avail :
198
200
raise ValueError (
199
201
"OFCL advisory needs CARQ for fixing missing variables!"
200
202
)
201
203
202
- track = VortexTrack (nhc_code , file_deck = 'a' , advisories = [advisory ])
204
+ track = VortexTrack (
205
+ nhc_code ,
206
+ file_deck = 'a' ,
207
+ advisories = [advisory ],
208
+ rmw_fill = rmw_fill ,
209
+ )
203
210
204
211
else : # read from preprocessed file
212
+
205
213
advisory = 'OFCL'
206
214
207
215
# If a file exists, use the local file
208
216
track_raw = pd .read_csv (local_track_file , header = None , dtype = str )
209
- assert len (track_raw [4 ].unique ()) == 1
217
+ # The provided tracks should have a single advisory type,
218
+ # e.g. in NHC adjusted track files the value is RMWP
219
+ if len (track_raw [4 ].unique ()) != 1 :
220
+ raise RuntimeError (
221
+ "Only single advisory-name track files are supported!"
222
+ )
223
+ # Treat the existing advisory as if it's OFCL so that
224
+ # stormevents supports reading it
210
225
track_raw [4 ] = advisory
211
226
212
227
with tempfile .NamedTemporaryFile () as tmp :
213
228
track_raw .to_csv (tmp .name , header = False , index = False )
214
229
230
+ # Track read from file is NOT corrected because it
231
+ # does NOT have CARQ advisory
215
232
unfixed_track = VortexTrack (
216
233
tmp .name , file_deck = 'a' , advisories = [advisory ]
217
234
)
235
+ # Since we're only getting CARQ, there's no need to
236
+ # pass rmw fill method
218
237
carq_track = event .track (file_deck = 'a' , advisories = ['CARQ' ])
219
238
unfix_dict = {
220
239
** separate_tracks (unfixed_track .data ),
221
240
** separate_tracks (carq_track .data ),
222
241
}
223
242
224
- fix_dict = correct_ofcl_based_on_carq_n_hollandb (unfix_dict )
243
+ # Fix the file track with the fetched CARQ; if RMW
244
+ # is already filled, it fills out other missing values
245
+ fix_dict = correct_ofcl_based_on_carq_n_hollandb (
246
+ unfix_dict , rmw_fill = rmw_fill
247
+ )
225
248
fix_track = combine_tracks (fix_dict )
226
249
250
+ # Create a new VortexTrack object from the datasets.
251
+ # Since the values are already filled in, there's
252
+ # no need to fill the rmw!
227
253
track = VortexTrack (
228
254
fix_track [fix_track .advisory == advisory ],
229
255
file_deck = 'a' ,
230
- advisories = [advisory ]
256
+ advisories = [advisory ],
257
+ rmw_fill = RMWFillMethod .none ,
231
258
)
232
259
233
260
@@ -418,6 +445,12 @@ def cli():
418
445
help = "Existing adjusted track directory" ,
419
446
)
420
447
448
+ parser .add_argument (
449
+ '--rmw-fill' ,
450
+ type = str ,
451
+ help = "Method to use to fill missing RMW data for OFCL track" ,
452
+ )
453
+
421
454
args = parser .parse_args ()
422
455
423
456
main (args )
0 commit comments