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

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

merged from branches-mnj (which was branched from branches-sp)

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      for l in eee:
105        ff[l[0]] = ( l[1], l[2], l[3] )
106      if appendTo != None:
107        for k in ff.keys():
108          assert ff[k][1].has_key( 'standard_name' ), 'No standard name in %s:: %s' % (k,str(ff[k][1].keys()))
109          if appendTo.has_key(k):
110            if lax:
111              if ff[k][1]['standard_name'] != appendTo[k][1]['standard_name']:
112                if warn:
113                  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])
114              if ff[k][1]['long_name'] != appendTo[k][1]['long_name']:
115                if warn:
116                  print 'WARNING[X1]%s: Inconsistent long_names %s:: %s --- %s' % (tag,k,ff[k][1]['long_name'],appendTo[k][1]['long_name'])
117            if not lax:
118              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])
119          else:
120            appendTo[k] = ff[k]
121        return appendTo
122      else:
123        return ff
124
125
126class snlist:
127
128  def __init__(self,dir=None,tab='cf-standard-name-table.xml' ):
129    if dir  == None:
130      dir = os.path.join(CC_CONFIG_DIR, 'cf/')
131    self.re_sn = re.compile( 'entry id="(.*)"' )
132    self.re_sna = re.compile( 'alias id="(.*)"' )
133    self.dir = dir
134    self.tab = tab
135
136##alias id="atmosphere_water_vapor_content"
137##entry id="age_of_sea_ice"'
138
139  def gen_sn_list(self ):
140    pathn = self.dir + self.tab
141    assert os.path.isfile( pathn ), '%s not found ' % pathn
142    snl = []
143    snla = []
144    for l in open(pathn).readlines():
145      m = self.re_sn.findall(l )
146      if len(m) > 0:
147        for i in m:
148          snl.append( i )
149      m = self.re_sna.findall(l )
150      if len(m) > 0:
151        for i in m:
152          snla.append( i )
153    return (snl,snla)
154
155class tupsort:
156   def __init__(self,k=0):
157     self.k = k
158   def cmp(self,x,y):
159     return cmp( x[self.k], y[self.k] )
160
161class tupsort2:
162   def __init__(self,k0,k1):
163     self.k0 = k0
164     self.k1 = k1
165   def cmp(self,x,y):
166     if x[self.k0] == y[self.k0]:
167       return cmp( x[self.k1], y[self.k1] )
168     return cmp( x[self.k0], y[self.k0] )
169
170class tupsort3:
171   def __init__(self,k0,k1,k2):
172     self.k0 = k0
173     self.k1 = k1
174     self.k2 = k2
175   def cmp(self,x,y):
176     if x[self.k0] == y[self.k0]:
177       if x[self.k1] == y[self.k1]:
178         return cmp( x[self.k2], y[self.k2] )
179       return cmp( x[self.k1], y[self.k1] )
180     return cmp( x[self.k0], y[self.k0] )
Note: See TracBrowser for help on using the repository browser.