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

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

undated comp_mpi

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