source: CCCC/tags/0.1/fcc_utils2.py @ 157

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CCCC/tags/0.1/fcc_utils2.py@1241
Revision 157, 4.2 KB checked in by mjuckes, 6 years ago (diff)

adding MIP table comparison code

Line 
1import string, os, re, stat, sys
2
3ncdumpCmd = 'ncdump'
4ncdumpCmd = '/usr/local/5/bin/ncdump'
5##
6
7class mipTableScan:
8
9  def __init__(self, vats = ['standard_name','long_name','units','cell_methods'] ):
10    self.vats = vats
11    self.re_cmor_mip2 = re.compile( 'dimensions:(?P<dims>.*?):::' )
12    self.re_vats = { }
13    self.nn_tab = 0
14    for v in vats:
15      self.re_vats[v] = re.compile( '%s:(?P<dims>.*?):::' % v )
16##
17  def scan_table(self,ll,log,asDict=False,appendTo=None,lax=False,tag=None,warn=True, project='CMIP5'):
18
19    self.project = project
20    lll0 = map( string.strip, ll )
21    lll = []
22    for l in lll0:
23      if len(l) != 0:
24        if l[0] != '!':
25          lll.append(string.split(l,'!')[0])
26    sll = []
27    sll.append( ['header',[]] )
28    for l in lll:
29      k = string.split( l, ':' )[0]
30      if k in ['variable_entry','axis_entry']:
31        sll.append( [k,[]] )
32      sll[-1][1].append(l)
33
34    eee = []
35    for s in sll:
36      if s[0] == 'variable_entry':
37         bits = string.split(s[1][0],':')
38         assert len(bits) == 2, 'Can not unpack: %s' % str(s[1])
39         k,var =  map( string.strip, string.split(s[1][0],':') )
40         aa = {'standard_name':None, 'long_name':None,'units':None,'cell_methods':None }
41         ds = 'scalar'
42         for l in s[1][1:]:
43           bits = string.split(l,':')
44           k = string.strip(bits[0])
45           v = string.strip( string.join( bits[1:], ':' ) )
46           if k == 'dimensions':
47             ds = string.split(v)
48           else:
49             aa[k] = v
50         if self.project == 'CMIP5':
51           if var == 'tos':
52             if aa['standard_name'] != 'sea_surface_temperature':
53               print 'Overriding incorrect CMIP5 standard_name for %s' % var
54               aa['standard_name'] = 'sea_surface_temperature'
55           elif var == 'ps':
56             if aa['long_name'] != 'Surface Air Pressure':
57               print 'Overriding inconsistent CMIP5 long_name for %s' % var
58               aa['long_name'] = 'Surface Air Pressure'
59         eee.append( (var,ds,aa,tag) )
60
61
62    checkOldMethod = False
63    if checkOldMethod:
64      ssss = string.join( lll, ':::' )
65      vitems = string.split( ssss, ':::variable_entry:' )[1:]
66 
67      ee = []
68      for i in vitems:
69        b1 = string.split( i, ':::')[0]
70        var = string.strip( b1 )
71        aa = {}
72        for v in self.vats:
73          mm = self.re_vats[v].findall(i)
74          if len(mm) == 1:
75             aa[v] = string.strip(mm[0])
76          else:
77             aa[v] = 'None'
78 
79        mm = self.re_cmor_mip2.findall( i )
80        if len(mm) == 1:
81          ds = string.split( string.strip(mm[0]) )
82        elif len(mm) == 0:
83          ds = 'scalar'
84        else:
85          if log != None:
86             log.warn(  'Mistake?? in scan_table %s' % str(mm) )
87          ds = mm
88          raise 'Mistake?? in scan_table %s' % str(mm)
89        ee.append( (var,ds,aa,tag) )
90
91      for k in range(len(ee) ):
92        if ee[k][0:2] == eee[k][0:2] and ee[k][2]['standard_name'] == eee[k][2]['standard_name'] and ee[k][2]['long_name'] == eee[k][2]['long_name']:
93          print 'OK:::', ee[k]
94        else:
95          print 'DIFF: ',ee[k],eee[k]
96     
97    if not asDict:
98      return tuple( eee )
99    else:
100      ff = {}
101      for l in eee:
102        ff[l[0]] = ( l[1], l[2], l[3] )
103      if appendTo != None:
104        for k in ff.keys():
105          assert ff[k][1].has_key( 'standard_name' ), 'No standard name in %s:: %s' % (k,str(ff[k][1].keys()))
106          if appendTo.has_key(k):
107            if lax:
108              if ff[k][1]['standard_name'] != appendTo[k][1]['standard_name']:
109                if warn:
110                  print 'ERROR[X1]%s: Inconsistent standard_names %s:: %s [%s] --- %s [%s]' % (tag,k,ff[k][1],ff[k][2], appendTo[k][1], appendTo[k][2])
111              if ff[k][1]['long_name'] != appendTo[k][1]['long_name']:
112                if warn:
113                  print 'WARNING[X1]%s: Inconsistent long_names %s:: %s --- %s' % (tag,k,ff[k][1]['long_name'],appendTo[k][1]['long_name'])
114            if not lax:
115              assert ff[k][1] == appendTo[k][1], 'Inconsistent entry definitions %s:: %s [%s] --- %s [%s]' % (k,ff[k][1],ff[k][2], appendTo[k][1], appendTo[k][2])
116          else:
117            appendTo[k] = ff[k]
118        return appendTo
119      else:
120        return ff
Note: See TracBrowser for help on using the repository browser.