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

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

intermediate

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