HWRF  trunk@4391
rocoto_from_hhs.py
1 #! /usr/bin/env python
2 
3 ##@namespace ush.rocoto_from_hhs
4 # This program converts HHS baseline cycle list fix files (sent to
5 # stdin) to XML entities for use with Rocoto (sent to stdout). It was
6 # used to generate the rocoto/storms/H214.ent file. It is unlikely to
7 # be of use for general users, and is only present for historical reasons.
8 
9 import sys, logging, os, collections
10 import produtil.setup
11 import hwrf.numerics
12 
13 from hwrf.numerics import to_datetime, to_timedelta
14 
15 def main():
16  """!Reads stdin, converts data, writes to stdout."""
17  produtil.setup.setup(ologlevel=None) # never log to stdout
18  logger=logging.getLogger('hhs2storms')
19 
20  epsilon=to_timedelta(5)
21  six_hours=to_timedelta(6*3600)
22 
23  storms=collections.defaultdict(set)
24 
25  for line in sys.stdin:
26  # Input line format:
27  # BB NN YYYYMMDDHH model
28  # AL 13 2016091312 H217
29  line=line.rstrip().upper()
30  basin=line[0:2]
31  number=line[4:6]
32  ymdh=line[8:18]
33  storm=basin+number+ymdh[0:4]
34  storms[storm].add(ymdh)
35 
36  sortstorms=[ x for x in storms.iterkeys() ]
37  sortstorms.sort()
38 
39  for storm in sortstorms:
40  unsorted_cycles=storms[storm]
41  cycles=list(unsorted_cycles)
42  cycles = [ to_datetime(x) for x in cycles ]
43  cycles.sort()
44  basin2=storm[0:2].lower()
45  number=storm[2:4]
46  if basin2 == 'al':
47  basin1='L'
48  elif basin2 == 'ep':
49  basin1='E'
50  elif basin2 == 'cp':
51  basin1='C'
52  elif basin2 == 'wp':
53  basin1='W'
54  else:
55  raise Exception(
56  "Unsupported basin %s: only AL, EP, CP and WP have unambiguous "
57  "one letter basins."%(basin2,))
58  sys.stdout.write('<!ENTITY %ssid "%s%s">\n'%(storm,number,basin1))
59  sys.stdout.write('<!ENTITY %ssidlc "%s%s">\n'
60  %(storm,number,basin1.lower()))
61  sys.stdout.write('<!ENTITY %scyc "'%(storm,))
62  first=cycles[0]
63  last=cycles[0]
64  sent=cycles[0]-six_hours
65  for cycle in cycles:
66  if to_datetime(cycle) > to_datetime(last)+six_hours+epsilon:
67  # Found a break in the cycles
68  sys.stdout.write('<cycledef>%s00 %s00 06:00:00</cycledef> '
69  %(first.strftime('%Y%m%d%H'),
70  last.strftime('%Y%m%d%H')))
71  first=cycle
72  last=cycle
73  sent=cycle
74  else:
75  last=cycle
76  if sent+epsilon < last:
77  # Need to send the last group of cycles
78  sys.stdout.write('<cycledef>%s00 %s00 06:00:00</cycledef> '
79  %(first.strftime('%Y%m%d%H'),
80  last.strftime('%Y%m%d%H')))
81  sys.stdout.write('">\n')
82 
83 if __name__=='__main__': main()
Contains setup(), which initializes the produtil package.
Definition: setup.py:1
def setup(ignore_hup=False, dbnalert_logger=None, jobname=None, cluster=None, send_dbn=None, thread_logger=False, thread_stack=2 **24, kwargs)
Initializes the produtil package.
Definition: setup.py:15
Time manipulation and other numerical routines.
Definition: numerics.py:1