#! /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()