source: FCC2/trunk/source/comp_mip.py @ 64

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/FCC2/trunk/source/comp_mip.py@64
Revision 64, 9.3 KB checked in by mjuckes, 8 years ago (diff)

adapted for SPECS

Line 
1from fcc_utils import mipTableScan
2import re, os, string
3
4ml = ['CORDEX_3h', 'CORDEX_6h', 'CORDEX_Aday', 'CORDEX_day', 'CORDEX_grids', 'CORDEX_mon' ]
5ml = ['CORDEX_3h', 'CORDEX_6h', 'CORDEX_fx', 'CORDEX_day', 'CORDEX_mon', 'CORDEX_sem' ]
6ml = ['CCMI1_Amon_v1_complete']
7ml = ['SPECS_Amon', 'SPECS_fx', 'SPECS_Lmon', 'SPECS_Omon', 'SPECS_6hrLev', 'SPECS_day', 'SPECS_OImon']
8newMip = 'CCMI'
9newMip = 'SPECS'
10ml2 = ['CMIP5_3hr', 'CMIP5_6hrPlev', 'CMIP5_Amon', 'CMIP5_cfDay', 'CMIP5_cfOff', 'CMIP5_day', 'CMIP5_grids', 'CMIP5_Lmon', 'CMIP5_OImon', 'CMIP5_Oyr',
11       'CMIP5_6hrLev', 'CMIP5_aero', 'CMIP5_cf3hr', 'CMIP5_cfMon', 'CMIP5_cfSites', 'CMIP5_fx', 'CMIP5_LImon', 'CMIP5_Oclim', 'CMIP5_Omon'] 
12ml2 = ['CMIP5_3hr', 'CMIP5_6hrPlev', 'CMIP5_Amon', 'CMIP5_cfDay', 'CMIP5_cfOff', 'CMIP5_day', 'CMIP5_grids', 'CMIP5_Lmon',
13       'CMIP5_6hrLev', 'CMIP5_aero', 'CMIP5_cf3hr', 'CMIP5_cfMon', 'CMIP5_cfSites', 'CMIP5_fx', 'CMIP5_LImon'] 
14
15cfsntab = 'cf-standard-name-table.xml'
16cordex_dkrz = 'CORDEX_variables_requirement_table_upgedated-1.csv'
17cordex_dkrz = 'CORDEX_variables_requirement_table_all.csv'
18cordex_dkrz_pat = 'cordex_dkrz/CORDEX_variables_requirement_table_%s.csv'
19cordex_dkrz_pat = 'cordex_dkrz_sep12/CORDEX_variables_requirement_table_%s.csv'
20re_sn = re.compile( 'entry id="(.*)"' )
21re_sna = re.compile( 'alias id="(.*)"' )
22##alias id="atmosphere_water_vapor_content"
23##entry id="age_of_sea_ice"'
24def gen_sn_list( pathn ):
25  assert os.path.isfile( pathn ), '%s not found ' % pathn
26  snl = []
27  snla = []
28  for l in open(pathn).readlines():
29    m = re_sn.findall(l )
30    if len(m) > 0:
31      for i in m:
32        snl.append( i )
33    m = re_sna.findall(l )
34    if len(m) > 0:
35      for i in m:
36        snla.append( i )
37  return (snl,snla)
38
39def tlist_to_dict( ll ):
40
41   ee = {} 
42   for l in ll:
43     ee[l[0]] = ( l[1], l[2] )
44   return ee
45
46class comp:
47
48  def __init__(self, snl, snla=None, ec1=None,tag=None):
49    self.id = 'comp'
50    self.snl = snl
51    self.snla = snla
52    self.ec1 = ec1
53    self.tag=tag
54
55
56  def comp(self, e1, e2,checkCellMethods=False,tag=None ):
57    self.tag=tag
58   
59    ##e1 = tlist_to_dict( t1 )
60    ##e2 = tlist_to_dict( t2 )
61
62    checkAll = True
63    keys = e1.keys()
64    keys.sort()
65    for k in keys:
66      e0 = 0
67      f2 = False
68      f3 = False
69      f4 = False
70      if e1[k][1]['standard_name'] in [None,'None']:
71        print 'ERROR[A]: standard name for %s not set' % k
72      elif e1[k][1]['standard_name'] not in self.snl:
73        if e1[k][1]['standard_name'] not in self.snla:
74          print 'ERROR[0]: standard name %s for %s [%s] not in snl or snla' % (e1[k][1]['standard_name'], k, e1[k][2] )
75        else:
76          print 'WARNING: standard name %s for %s not in snl' % (e1[k][1]['standard_name'], k )
77      if self.ec1 != None:
78        if k not in self.ec1.keys():
79          print 'ERROR[1]: variable %s [%s] not in CORDEX variable requirements list' % (k,e1[k][2])
80          vrln = None
81        else:
82          vrln = self.ec1[k][1]
83          if e1[k][1]['long_name'] != self.ec1[k][1]:
84            f2 = True
85          if checkCellMethods: 
86            if e1[k][1]['cell_methods'] != self.ec1[k][3]:
87              if not (e1[k][1]['cell_methods']=="None" and string.strip(self.ec1[k][3]) == "time:"):
88                f3 = True
89          if checkAll: 
90            if (e1[k][1].has_key( 'positive' ) and self.ec1[k][4] == '') or ( (not e1[k][1].has_key( 'positive' )) and self.ec1[k][4] != ''):
91                f4 = True
92            elif e1[k][1].has_key( 'positive' ):
93              if e1[k][1]['positive'] != self.ec1[k][4]:
94                if not (e1[k][1]['positive']=="None" and string.strip(self.ec1[k][4]) == ""):
95                  f4 = True
96            if (e1[k][1].has_key( 'modeling_realm' ) and self.ec1[k][5] == '') or ( (not e1[k][1].has_key( 'modeling_realm' )) and self.ec1[k][5] != ''):
97                f4 = True
98            elif e1[k][1].has_key( 'modeling_realm' ):
99              if e1[k][1]['modeling_realm'] != self.ec1[k][5]:
100                if not (e1[k][1]['modeling_realm']=="None" and string.strip(self.ec1[k][5]) == ""):
101                  f4 = True
102       
103      cks = ['units', 'long_name', 'standard_name']
104      suppress4B = True
105      if k in e2.keys():
106        if e1[k][1] != e2[k][1]:
107          ne1 = 0
108          nmm = []
109          for k2 in cks:
110             if e1[k][1][k2] != e2[k][1][k2]:
111                ne1 += 1
112                nmm.append(k2)
113          if ne1 > 0:
114                print 'ERROR[4A]: Anomaly between MIP tables: %s:: %s ' % (k, str(nmm) )
115          else:
116             if not suppress4B:
117                print 'ERROR[4B]: Anomaly between MIP tables: %s:: %s -- %s [%s]' % (k, str(e1[k][1]), str( e2[k][1] ), vrln )
118          e0 = 1
119        else:
120          ##print '%s OK -- %s -- %s' % (k,str(e1[k][1]), str( e2[k][1] ) )
121          e0 = 2
122      else:
123        ##print '%s not in table 2' % k
124        e0 = 3
125
126      xxx = k
127      if self.tag != None:
128         xxx += '[%s]' % self.tag
129      if self.ec1 != None:
130        if f2 and (e0 == 2):
131           print 'ERROR[2]: Difference between CORDEX/CMIP5 MIP tables and VR: %s:: %s [%s] --- %s' % (k,e1[k][1]['long_name'],e1[k][2], self.ec1[k][1])
132        elif f2 and (e0 == 3):
133           print 'ERROR[3]: Difference between CORDEX MIP tables and VR: %s:: %s [%s] --- %s' % (k,e1[k][1]['long_name'],e1[k][2], self.ec1[k][1])
134        elif f2:
135           print 'ERROR[5]: Difference between CORDEX MIP tables and VR %s: %s --- %s' % (xxx,e1[k][1]['long_name'], self.ec1[k][1])
136        if f3:
137           print 'ERROR[6]: Difference between CORDEX MIP tables and VR in cell_methods: %s:: %s --- %s' % (k,e1[k][1]['cell_methods'], self.ec1[k][3])
138        if f4:
139           print 'ERROR[7]: Difference between CORDEX MIP tables and VR in positive, realm: %s:: %s,%s --- %s' % (xxx,e1[k][1].get('positive','None'),e1[k][1].get('modeling_realm','None'), self.ec1[k][4:6])
140       
141base='/home/users/prototype/cordex/exarch/FCC2/trunk/work/'
142base='/home/martin/2013/mipML/FCC2/trunk/work/'
143snl,snla = gen_sn_list( base + cfsntab )
144print 'Len snl = %s' % len(snl)
145
146dkrz_cordex_version = 3
147ec1 = {}
148if dkrz_cordex_version == 1:
149  ll = open( base + cordex_dkrz ).readlines()
150  for l in ll[9:74]:
151    bits = string.split( l, ',' )
152    var = bits[1]
153    ln = bits[13]
154    sn = bits[14]
155    if sn not in snl + snla:
156      print 'ERROR: CORDEX DKRZ sn %s for %s not in snl/snla' % (sn, var)
157    ec1[var] = ( sn,ln)
158elif dkrz_cordex_version == 2:
159  for tab in ['3hr','6hr','day','mon','sem','fx']:
160     ll = open( base + cordex_dkrz_pat % tab ).readlines()
161     for l in ll[3:]:
162        bits = string.split( l, ',' )
163        if (tab != 'fx' and len( bits ) != 7) or (tab == 'fx' and len( bits ) != 5):
164          print 'cant safely parse %s [%s]' % (l,tab)
165#1,sund,Duration of Sunshine,duration_of_sunshine,s,sum,
166        var,ln,sn,units = bits[1:5]
167        if tab != 'fx':
168          cm,pos = bits[5:7]
169        else:
170          cm,pos = [None,None]
171        if sn not in snl + snla:
172           print 'ERROR: CORDEX DKRZ [%s] sn %s for %s not in snl/snla' % (tab,sn, var)
173        ec1[var] = ( sn,ln,units,cm,pos)
174elif dkrz_cordex_version == 3:
175  eeee = {}
176  eca = {}
177  ll = open( base + cordex_dkrz_pat % 'all' ).readlines()
178  for l in ll[2:]:
179        bits = string.split( string.strip(l), ',' )
180        if string.strip(bits[0]) == '':
181           break
182#1,sund,Duration of Sunshine,duration_of_sunshine,s,sum,
183        var,units = bits[1:3]
184        ln,sn,pos,realm   = bits[12:16]
185        if sn not in snl + snla:
186           print 'ERROR: CORDEX DKRZ [%s] sn %s for %s not in snl/snla' % ('all',sn, var)
187        assert pos in ['','up','down'], 'Unexpected value for pos [%s] in %s' % (pos,l)
188        eca[var] = ( units,ln,sn,pos,realm )
189
190  for tab in ['3hr','6hr','day','mon','sem','fx']:
191     ee  = {}
192     ll = open( base + cordex_dkrz_pat % tab ).readlines()
193     for l in ll[2:]:
194        bits = string.split( l, ',' )
195        if string.strip(bits[0]) == '':
196           break
197#1,sund,Duration of Sunshine,duration_of_sunshine,s,sum,
198        var,cm = bits[1:3]
199        cm = 'time: ' + cm
200        units,ln,sn,pos,realm = eca[var] 
201        ec1[var] = ( sn,ln,units,cm,pos,realm)
202        ee[var] = ( sn,ln,units,cm,pos,realm)
203     eeee[tab] = ee
204
205newMipDir = '/cordex_vocabs/mip/'
206mpat = 'CORDEX_%s'
207newMipDir = '/ccmi_vocabs/mip/'
208newMipDir = '/specs_vocabs/mip/'
209mpat = 'CCMI1_%s_v1_complete'
210mpat = 'SPECS_%s'
211def validate( t,cc ):
212  if t == 'all':
213    l1 = {}
214    l2 = {}
215    for m in ml:
216      l1 = ms.scan_table( open( base + newMipDir + m ).readlines(), None, asDict=True, appendTo=l1, lax=True, tag=m)
217    for m in ml2:
218      l2 = ms.scan_table( open( base + '/cmip5_vocabs/mip/' + m ).readlines(), None, asDict=True, appendTo=l2, lax=True, tag=m)
219    ccm = False
220  else:
221    l2 = {}
222    for m in ml2:
223      l2 = ms.scan_table( open( base + '/cmip5_vocabs/mip/' + m ).readlines(), None, asDict=True, appendTo=l2, lax=True, tag=m)
224    k = { '3hr':'3h', '6hr':'6h' }.get( t,t )
225    l1 = ms.scan_table( open( base + newMipDir + mpat % k ).readlines(), None, asDict=True)
226    ccm = True
227  cc.comp( l1, l2, checkCellMethods=ccm, tag=t )
228
229tlist = ['3hr','6hr','day','mon','sem','fx']
230tlist = ['Amon']
231tlist = ['Amon', 'fx', 'Lmon', 'Omon', '6hrLev', 'day', 'OImon']
232for tab in tlist:
233  ms = mipTableScan()
234  print 'Validating table %s ' % tab
235  if newMip in ['CCMI','SPECS']:
236    ec1 = None
237  else:
238    ec1=eeee[tab]
239    print eeee[tab].keys()
240  c = comp( snl,snla=snla, ec1=ec1)
241  validate(tab,c)
Note: See TracBrowser for help on using the repository browser.