#! /usr/bin/env python
import sys, logging, collections
import produtil.setup
import hwrf.revital, hwrf.numerics
from hwrf.numerics import to_timedelta, to_datetime
##@namespace ush.rocoto_from_vitals
# Reads the tcvitals, and generates Rocoto XML entities for storm cycle lists.
#
# Call as follows:
# @code{.sh}
# rocoto-from-vitals.py [-n] /path/to/vitals-file1 [/path/to/vitals-file2 [...]]
# @endcode
#
# Where:
# * -n --- disable storm renumbering (use this for running Invests)
# * /path/to/vitals/file --- a tcvitals database file to read
def main():
produtil.setup.setup()
renumber=True
args=sys.argv[1:]
if args[0]=='-n':
renumber=False
args=args[1:]
if len(args)<1:
print("""ERROR: Format: rocoto-from-vitals.py [-n] /path/to/vitals-file1 [/path/to/vitals-file2 [...]]
-n = disable renumbering (do this for invests)
ERROR: Script requires at least one argument.""", file=sys.stderr)
sys.exit(1)
logger=logging.getLogger('rocoto_from_vitals')
revital=hwrf.revital.Revital(logger=logger)
logger.info('Read input files: '+repr(args))
revital.readfiles(args,raise_all=False)
if renumber:
logger.info('Renumber invests.')
revital.renumber()
else:
logger.info('Not renumbering vitals. Just clean them up')
revital.clean_up_vitals()
basins=dict()
numbers=dict()
storms=collections.defaultdict(set)
epsilon=to_timedelta(5)
six_hours=to_timedelta(6*3600)
for vit in revital:
storms[vit.longstormid].add(vit.when.strftime('%Y%m%d%H'))
basins[vit.longstormid]=vit.basin1.upper()
numbers[vit.longstormid]=vit.stnum
sortstorms=[ x for x in storms.keys() ]
sortstorms.sort()
for storm in sortstorms:
unsorted_cycles=storms[storm]
cycles=list(unsorted_cycles)
cycles = [ to_datetime(x) for x in cycles ]
cycles.sort()
basin1=basins[storm]
number=numbers[storm]
if number>=50:
sys.stderr.write("Skipping %02d%s\n"%(number,basin1))
continue
sys.stdout.write('\n'%(storm,number,basin1))
sys.stdout.write('\n'
%(storm,number,basin1.lower()))
sys.stdout.write(' to_datetime(last)+six_hours+epsilon:
# Found a break in the cycles
sys.stdout.write('%s00 %s00 06:00:00 '
%(first.strftime('%Y%m%d%H'),
last.strftime('%Y%m%d%H')))
first=cycle
last=cycle
sent=cycle
else:
last=cycle
if sent+epsilon < last:
# Need to send the last group of cycles
sys.stdout.write('%s00 %s00 06:00:00 '
%(first.strftime('%Y%m%d%H'),
last.strftime('%Y%m%d%H')))
sys.stdout.write('">\n')
if __name__=='__main__': main()