source: CCCC/tags/1.2.5/ceda_cc/fcc_utils2.py @ 236

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CCCC/tags/1.2.5/ceda_cc/fcc_utils2.py@1241
Revision 236, 7.4 KB checked in by mjuckes, 5 years ago (diff)

fixed bug in json dump to Rec code

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