source: CMIP6dreqbuild/trunk/srcMisc/fcc_utils2.py @ 681

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/srcMisc/fcc_utils2.py@1105
Revision 681, 7.8 KB checked in by mjuckes, 4 years ago (diff)

near release

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','valid_min', 'valid_max', 'ok_min_mean_abs', 'ok_max_mean_abs'] ):
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        vn = l[2].get( 'out_name', l[0] )
101        if vn != l[0]:
102          print 'INFO.outname.00001: ',l[0],vn
103        ff[vn] = ( l[1], l[2], l[3] )
104      self.adict = {}
105## l[0] = axis name, l[1] = attributes, l[2] = tag
106      for l in fff:
107        self.adict[l[0]] = ( l[1], l[2] )
108      if appendTo != None:
109        for k in ff.keys():
110          assert ff[k][1].has_key( 'standard_name' ), 'No standard name in %s:: %s' % (k,str(ff[k][1].keys()))
111          if appendTo.has_key(k):
112            if lax:
113              if ff[k][1]['standard_name'] != appendTo[k][1]['standard_name']:
114                if warn:
115                  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])
116              if ff[k][1]['long_name'] != appendTo[k][1]['long_name']:
117                if warn:
118                  k3 = min( 3, len(appendTo[k])-1 )
119                  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'])
120
121              p1 = ff[k][1].get('positive','not set')
122              p2 = appendTo[k][1].get('positive','not set')
123              if p1 != p2:
124                if warn:
125                  k3 = min( 3, len(appendTo[k])-1 )
126                  print 'WARNING[X1]%s -- %s: Inconsistent positive attributes %s:: %s --- %s' % (tag,appendTo[k][k3],k,p1,p2)
127
128              for k2 in ff[k][1].keys():
129                if k2 not in ['standard_name','long_name','positive']:
130                    p1 = ff[k][1].get(k2,'not set')
131                    p2 = appendTo[k][1].get(k2,'not set')
132                    if p1 != p2:
133                      if warn:
134                        k3 = min( 3, len(appendTo[k])-1 )
135                        print 'WARNING[Y1]%s -- %s: Inconsistent %s attributes %s:: %s --- %s' % (tag,appendTo[k][k3],k2,k,p1,p2)
136
137            if not lax:
138              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])
139          else:
140            appendTo[k] = ff[k]
141        return appendTo
142      else:
143        return ff
144
145  def scan_entry_01(self,s,tag):
146      assert s[0] in ['variable_entry','axis_entry'],'scan_entry_01 called with unsupported entry type: %s' % s[0]
147      bits = string.split(s[1][0],':')
148      assert len(bits) == 2, 'Can not unpack: %s' % str(s[1])
149      k,var =  map( string.strip, string.split(s[1][0],':') )
150      nal = []
151      if s[0] == 'variable_entry':
152         aa = {'standard_name':None, 'long_name':None,'units':None,'cell_methods':None }
153         ds = 'scalar'
154      else:
155         aa = {'standard_name':None, 'long_name':None,'units':None }
156         ds = None
157      for l in s[1][1:]:
158           bits = string.split(l,':')
159           k = string.strip(bits[0])
160           v = string.strip( string.join( bits[1:], ':' ) )
161           if k == 'dimensions':
162             ds = string.split(v)
163           else:
164             aa[k] = v
165             nal.append(k)
166      if self.project == 'CMIP5':
167           if var == 'tos':
168             if aa['standard_name'] != 'sea_surface_temperature':
169               print 'Overriding incorrect CMIP5 standard_name for %s' % var
170               aa['standard_name'] = 'sea_surface_temperature'
171           elif var == 'ps':
172             if aa['long_name'] != 'Surface Air Pressure':
173               print 'Overriding inconsistent CMIP5 long_name for %s' % var
174               aa['long_name'] = 'Surface Air Pressure'
175      if s[0] == 'variable_entry':
176        return ((var,ds,aa,tag), nal)
177      else:
178        return ((var,aa,tag), nal)
179
180class snlist:
181
182  def __init__(self,dir=None,tab='cf-standard-name-table.xml' ):
183    if dir  == None:
184      dir = os.path.join(CC_CONFIG_DIR, 'cf/')
185    self.re_sn = re.compile( 'entry id="(.*)"' )
186    self.re_sna = re.compile( 'alias id="(.*)"' )
187    self.dir = dir
188    self.tab = tab
189
190##alias id="atmosphere_water_vapor_content"
191##entry id="age_of_sea_ice"'
192
193  def gen_sn_list(self ):
194    pathn = self.dir + self.tab
195    assert os.path.isfile( pathn ), '%s not found ' % pathn
196    snl = []
197    snla = []
198    for l in open(pathn).readlines():
199      m = self.re_sn.findall(l )
200      if len(m) > 0:
201        for i in m:
202          snl.append( i )
203      m = self.re_sna.findall(l )
204      if len(m) > 0:
205        for i in m:
206          snla.append( i )
207    return (snl,snla)
208
209class tupsort:
210   def __init__(self,k=0):
211     self.k = k
212   def cmp(self,x,y):
213     return cmp( x[self.k], y[self.k] )
214
215class tupsort2:
216   def __init__(self,k0,k1):
217     self.k0 = k0
218     self.k1 = k1
219   def cmp(self,x,y):
220     if x[self.k0] == y[self.k0]:
221       return cmp( x[self.k1], y[self.k1] )
222     return cmp( x[self.k0], y[self.k0] )
223
224class tupsort3:
225   def __init__(self,k0,k1,k2):
226     self.k0 = k0
227     self.k1 = k1
228     self.k2 = k2
229   def cmp(self,x,y):
230     if x[self.k0] == y[self.k0]:
231       if x[self.k1] == y[self.k1]:
232         return cmp( x[self.k2], y[self.k2] )
233       return cmp( x[self.k1], y[self.k1] )
234     return cmp( x[self.k0], y[self.k0] )
Note: See TracBrowser for help on using the repository browser.