source: CMIP6dreqbuild/trunk/src/framework/ing02/loadcf.py @ 1241

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/ing02/loadcf.py@1241
Revision 1241, 3.1 KB checked in by mjuckes, 16 months ago (diff)

cand. 01.00.27

Line 
1"""loadcf
2------
3The loadcf module reads the cf standard name table into two dictionaries:
4  names[<standard_name>] = (description, canonical units)
5  alias[<alias>] = standard_name
6"""
7
8import xml, shelve
9import xml.dom, xml.dom.minidom
10import utils_wb
11import cf as cfpython
12import config
13
14class cf(object):
15  def __init__(self,version=57,base='./'):
16    self.version = version
17    vocabs = xml.dom.minidom.parse( '%sinputs/cf-standard-name-table_v%s.xml' % (base,version) )
18
19    el = vocabs.getElementsByTagName( 'entry' )
20    self.names = {}
21    self.alias = {}
22
23    nbu = 0
24    for e in el:
25      sn = e.getAttribute('id')
26      unitsE = e.getElementsByTagName( 'canonical_units' )
27      u = ''
28      if len(unitsE) > 0 and type( unitsE[0] ) != type(None):
29        c1 = unitsE[0].firstChild
30        if type( c1 ) != type(None):
31          u = str( c1.data )
32      descE = e.getElementsByTagName( 'description' )
33      d = ''
34      if len(descE) > 0 and type( descE[0] ) != type(None):
35        c1 = descE[0].firstChild
36        if type( c1 ) != type(None):
37          d = c1.data
38   
39
40      uid = str(sn)
41      if uid.find( ' ' ) != -1:
42         print 'SEVERE.sn.00001: BAD SN: %s' % uid
43      uid = uid.replace( ' ', '' )
44      title = uid.replace( '_', ' ' ).title()
45      label = title.replace( ' ', '' )
46      for w in ['Of','In','On','By','The','Due','To','From']:
47        ww = ' %s ' % w
48        title = title.replace( ww, ww.lower() )
49      self.names[uid] = (label,title, utils_wb.uniCleanFunc( d ),u )
50      try:
51          a = cfpython.units.Units( u )
52      except:
53          print ( 'WARN.001.0004: bad units %s: %s (%s)' % (label,u,str(u)) )
54          nbu += 1
55          if nbu > 5:
56            raise
57
58    el = vocabs.getElementsByTagName( 'alias' )
59    for e in el:
60      sn = str( e.getAttribute('id') )
61      if sn.find( ' ' ) != -1:
62         print 'SEVERE.sn.00001: BAD SN ALIAS: %s' % sn
63      else:
64        x = e.getElementsByTagName( 'entry_id' )
65        self.alias[sn] = str( x[0].firstChild.data )
66
67  def write(self,ofile='exports/l1sh/standardname'):
68    sh = shelve.open( ofile, 'n' )
69    sh['__info__'] = {'label':'standardname', 'title':'Data Request Section, CF standard name list', 'version':self.version}
70    sh['__cols__'] = ['label','title','description','units','uid']
71    for k in sorted( self.names.keys() ):
72      sh[k] = list( self.names[k] ) + [k,]
73    for k in sorted( self.alias.keys() ):
74      k1 = self.alias[k]
75      lab,title,d,u = self.names[k1]
76      title += ' [alias]'
77      d = 'alias::%s' % k
78      sh[k] = (lab,title,d,u,k1)
79    print 'INFO.standardnames.00001: names written to shelve: %s [%s]' % (len(self.names.keys()),len(self.alias.keys()))
80    sh.close()
81     
82
83if __name__ == '__main__':
84  import sys
85  if len(sys.argv) == 1:
86    c = cf()
87    c.write( ofile='exports/%ssh/standardname' % config.lev)
88  else:
89    if sys.argv[1] == '--diff':
90      v1 = sys.argv[2]
91      v2 = sys.argv[3]
92      cf1 = cf( version=v1 )
93      cf2 = cf( version=v2 )
94      s1 = [k for k in cf1.names if k not in cf2.names and k not in cf2.alias]
95      for s in sorted(s1):
96        print s
Note: See TracBrowser for help on using the repository browser.