source: CCCC/trunk/ceda_cc/fcc_utils2.py @ 249

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CCCC/trunk/ceda_cc/fcc_utils2.py@249
Revision 249, 7.6 KB checked in by mjuckes, 5 years ago (diff)

new CCMI tables

Line 
1import string, os, re, stat, sys
2from config_c4 import CC_CONFIG_DIR
3
4ncdumpCmd = 'ncdump'
5ncdumpCmd = '/usr/local/5/bin/ncdump'
6##
7
8from xceptions import *
9
10class mipTableScan(object):
11
12  def __init__(self, vats = ['standard_name','long_name','units','cell_methods'] ):
13    self.al = []
14    self.vats = vats
15    self.re_cmor_mip2 = re.compile( 'dimensions:(?P<dims>.*?):::' )
16    self.re_vats = { }
17    self.nn_tab = 0
18    for v in vats:
19      self.re_vats[v] = re.compile( '%s:(?P<dims>.*?):::' % v )
20##
21  def scan_table(self,ll,log,asDict=False,appendTo=None,lax=False,tag=None,warn=True, project='CMIP5'):
22
23    self.project = project
24    lll0 = map( string.strip, ll )
25    lll = []
26    for l in lll0:
27      if len(l) != 0:
28        if l[0] != '!':
29          lll.append(string.split(l,'!')[0])
30    sll = []
31    sll.append( ['header',[]] )
32    for l in lll:
33      k = string.split( l, ':' )[0]
34      if k in ['variable_entry','axis_entry']:
35        sll.append( [k,[]] )
36      sll[-1][1].append(l)
37
38    eee = []
39    fff = []
40    nal = []
41    for s in sll:
42      if s[0] in ['variable_entry','axis_entry']:
43        x = self.scan_entry_01( s,tag )
44        if s[0] == 'variable_entry':
45           eee.append(x[0])
46           nal += x[1]
47        else:
48           fff.append(x[0])
49
50    self.axes = fff
51    nal.sort()
52    nalu = [nal[0],]
53    for a in nal[1:]:
54      if a != nalu[-1]:
55        nalu.append(a)
56        if a not in self.al:
57          self.al.append( a )
58
59    checkOldMethod = False
60    if checkOldMethod:
61      ssss = string.join( lll, ':::' )
62      vitems = string.split( ssss, ':::variable_entry:' )[1:]
63 
64      ee = []
65      for i in vitems:
66        b1 = string.split( i, ':::')[0]
67        var = string.strip( b1 )
68        aa = {}
69        for v in self.vats:
70          mm = self.re_vats[v].findall(i)
71          if len(mm) == 1:
72             aa[v] = string.strip(mm[0])
73          else:
74             aa[v] = 'None'
75 
76        mm = self.re_cmor_mip2.findall( i )
77        if len(mm) == 1:
78          ds = string.split( string.strip(mm[0]) )
79        elif len(mm) == 0:
80          ds = 'scalar'
81        else:
82          if log != None:
83             log.warn(  'Mistake?? in scan_table %s' % str(mm) )
84          ds = mm
85          raise baseException( 'Mistake?? in scan_table %s' % str(mm) )
86        ee.append( (var,ds,aa,tag) )
87
88      for k in range(len(ee) ):
89        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']:
90          print 'OK:::', ee[k]
91        else:
92          print 'DIFF: ',ee[k],eee[k]
93     
94    if not asDict:
95      return tuple( eee )
96    else:
97      ff = {}
98## l[0] = var name, l[1] = dimensions, l[2] = attributes, l[3] = tag
99      for l in eee:
100        ff[l[0]] = ( l[1], l[2], l[3] )
101      self.adict = {}
102## l[0] = axis name, l[1] = attributes, l[2] = tag
103      for l in fff:
104        self.adict[l[0]] = ( l[1], l[2] )
105      if appendTo != None:
106        for k in ff.keys():
107          assert ff[k][1].has_key( 'standard_name' ), 'No standard name in %s:: %s' % (k,str(ff[k][1].keys()))
108          if appendTo.has_key(k):
109            if lax:
110              if ff[k][1]['standard_name'] != appendTo[k][1]['standard_name']:
111                if warn:
112                  print 'ERROR[X1]%s - %s : Inconsistent standard_names %s:: %s [%s] --- %s [%s]' % (tag,appendTo[k][3],k,ff[k][1],ff[k][2], appendTo[k][1], appendTo[k][2])
113              if ff[k][1]['long_name'] != appendTo[k][1]['long_name']:
114                if warn:
115                  k3 = min( 3, len(appendTo[k])-1 )
116                  print 'WARNING[X1]%s -- %s: Inconsistent long_names %s:: %s --- %s' % (tag,appendTo[k][k3],k,ff[k][1]['long_name'],appendTo[k][1]['long_name'])
117
118              p1 = ff[k][1].get('positive','not set')
119              p2 = appendTo[k][1].get('positive','not set')
120              if p1 != p2:
121                if warn:
122                  k3 = min( 3, len(appendTo[k])-1 )
123                  print 'WARNING[X1]%s -- %s: Inconsistent positive attributes %s:: %s --- %s' % (tag,appendTo[k][k3],k,p1,p2)
124
125              for k2 in ff[k][1].keys():
126                if k2 not in ['standard_name','long_name','positive']:
127                    p1 = ff[k][1].get(k2,'not set')
128                    p2 = appendTo[k][1].get(k2,'not set')
129                    if p1 != p2:
130                      if warn:
131                        k3 = min( 3, len(appendTo[k])-1 )
132                        print 'WARNING[Y1]%s -- %s: Inconsistent %s attributes %s:: %s --- %s' % (tag,appendTo[k][k3],k2,k,p1,p2)
133
134            if not lax:
135              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])
136          else:
137            appendTo[k] = ff[k]
138        return appendTo
139      else:
140        return ff
141
142  def scan_entry_01(self,s,tag):
143      assert s[0] in ['variable_entry','axis_entry'],'scan_entry_01 called with unsupported entry type: %s' % s[0]
144      bits = string.split(s[1][0],':')
145      assert len(bits) == 2, 'Can not unpack: %s' % str(s[1])
146      k,var =  map( string.strip, string.split(s[1][0],':') )
147      nal = []
148      if s[0] == 'variable_entry':
149         aa = {'standard_name':None, 'long_name':None,'units':None,'cell_methods':None }
150         ds = 'scalar'
151      else:
152         aa = {'standard_name':None, 'long_name':None,'units':None }
153         ds = None
154      for l in s[1][1:]:
155           bits = string.split(l,':')
156           k = string.strip(bits[0])
157           v = string.strip( string.join( bits[1:], ':' ) )
158           if k == 'dimensions':
159             ds = string.split(v)
160           else:
161             aa[k] = v
162             nal.append(k)
163      if self.project == 'CMIP5':
164           if var == 'tos':
165             if aa['standard_name'] != 'sea_surface_temperature':
166               print 'Overriding incorrect CMIP5 standard_name for %s' % var
167               aa['standard_name'] = 'sea_surface_temperature'
168           elif var == 'ps':
169             if aa['long_name'] != 'Surface Air Pressure':
170               print 'Overriding inconsistent CMIP5 long_name for %s' % var
171               aa['long_name'] = 'Surface Air Pressure'
172      if s[0] == 'variable_entry':
173        return ((var,ds,aa,tag), nal)
174      else:
175        return ((var,aa,tag), nal)
176
177class snlist:
178
179  def __init__(self,dir=None,tab='cf-standard-name-table.xml' ):
180    if dir  == None:
181      dir = os.path.join(CC_CONFIG_DIR, 'cf/')
182    self.re_sn = re.compile( 'entry id="(.*)"' )
183    self.re_sna = re.compile( 'alias id="(.*)"' )
184    self.dir = dir
185    self.tab = tab
186
187##alias id="atmosphere_water_vapor_content"
188##entry id="age_of_sea_ice"'
189
190  def gen_sn_list(self ):
191    pathn = self.dir + self.tab
192    assert os.path.isfile( pathn ), '%s not found ' % pathn
193    snl = []
194    snla = []
195    for l in open(pathn).readlines():
196      m = self.re_sn.findall(l )
197      if len(m) > 0:
198        for i in m:
199          snl.append( i )
200      m = self.re_sna.findall(l )
201      if len(m) > 0:
202        for i in m:
203          snla.append( i )
204    return (snl,snla)
205
206class tupsort:
207   def __init__(self,k=0):
208     self.k = k
209   def cmp(self,x,y):
210     return cmp( x[self.k], y[self.k] )
211
212class tupsort2:
213   def __init__(self,k0,k1):
214     self.k0 = k0
215     self.k1 = k1
216   def cmp(self,x,y):
217     if x[self.k0] == y[self.k0]:
218       return cmp( x[self.k1], y[self.k1] )
219     return cmp( x[self.k0], y[self.k0] )
220
221class tupsort3:
222   def __init__(self,k0,k1,k2):
223     self.k0 = k0
224     self.k1 = k1
225     self.k2 = k2
226   def cmp(self,x,y):
227     if x[self.k0] == y[self.k0]:
228       if x[self.k1] == y[self.k1]:
229         return cmp( x[self.k2], y[self.k2] )
230       return cmp( x[self.k1], y[self.k1] )
231     return cmp( x[self.k0], y[self.k0] )
Note: See TracBrowser for help on using the repository browser.