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

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

near release

Line 
1import extractMipInfo as e
2import hashlib, collections, string, uuid, sys
3import dreq_cfg
4import dreq_utils
5
6from utils_wb import workbook
7
8l1 = dreq_utils.loadcsv( '20160309' )
9
10eeat = collections.defaultdict( int )
11
12eeatKeys = ['comment', 'deflate_level', 'shuffle', 'ok_max_mean_abs', 'flag_meanings', 'type', 'ok_min_mean_abs', 'standard_name', 'deflate', 'long_name', 'valid_min', 'cell_methods', 'flag_values', 'cell_measures', 'out_name', 'modeling_realm', 'units', '#cell_methods', 'valid_max', 'positive']
13
14shKeys = ['priority', 'long name', 'units', 'comment', 'questions & notes', 'output variable name', 'CF Standard name', 'unconfirmed or proposed standard name', 'unformatted units', 'cell_methods', 'valid min', 'valid max', 'mean absolute min', 'mean absolute max', 'positive', 'type', 'CMOR dimensions', 'CMOR variable name', 'realm', 'frequency', 'cell_measures', 'flag_values', 'flag_meanings' ]
15
16x = [('long name','long_name'),('output variable name','out_name'),('CF Standard name','standard_name'),('valid min','valid_min'),('valid max','valid_max'),('mean absolute min','ok_min_mean_abs'),('mean absolute max','ok_max_mean_abs'),('CMOR dimensions','dims'),('CMOR variable name','var'),('realm','modeling_realm')]
17### sheet columns which have no MIP table equiv.
18y = ['priority', 'questions & notes', 'unconfirmed or proposed standard name','unformatted units','frequency']
19## MIP table entries which have no workbook source.
20y2 = ['deflate_level', 'shuffle', 'deflate', '#cell_methods' ]
21
22eeatKeysPlus = eeatKeys + ['var','mip','dims']
23ktr1 = {}
24for k in eeatKeysPlus:
25  if k in shKeys:
26    ktr1[k] = k
27
28for t in x:
29  ktr1[t[1]] = t[0]
30
31dc = dreq_cfg.rqcfg()
32eeomip = []
33for f in dc.ff['OMIP']:
34  wbx = workbook( dc.dir0 + 'OMIP/' + f )
35  for s in wbx.sns:
36    if s != 'general':
37      sh = wbx.book.sheet_by_name( s )
38      started = False
39      for i in range(sh.nrows):
40        r = map( lambda x: x.value, sh.row(i) )
41        rc = map( lambda x: x.ctype, sh.row(i) )
42        if started:
43          omit = False
44          print r
45          k2 = str( uuid.uuid1() )
46          this = []
47          for k in eeatKeysPlus:
48            if k == 'mip':
49              this.append( 'OMIP.%s' % s )
50            elif ktr1.has_key(k):
51              if k == 'dims':
52                if rc[shKeys.index( ktr1[k] )] == 1:
53                  d0 = string.strip( r[ shKeys.index( ktr1[k] ) ] )
54                  if string.find( d0, ' ' ):
55                    dl = string.split( r[ shKeys.index( ktr1[k] ) ] )
56                    d0 = string.join( dl, '|' )
57                  this.append( d0 )
58                else:
59                  this.append( r[ shKeys.index( ktr1[k] ) ] )
60              elif k == 'var':
61                if rc[shKeys.index( ktr1[k] )] == 1:
62                  v = string.strip( r[ shKeys.index( ktr1[k] ) ] )
63                elif rc[ shKeys.index( ktr1['out_name'] ) ] == 1:
64                  v = string.strip( r[ shKeys.index( ktr1['out_name'] ) ] )
65                else:
66                  omit = True
67                this.append( v )
68              else:
69                this.append( r[ shKeys.index( ktr1[k] ) ] )
70            else:
71              this.append( '' )
72          if not omit:
73            mtab =  'OMIP.%s' % s
74            kcmv = '%s.%s' % (mtab,v)
75            if kcmv in l1.cmv:
76              if len( l1.cmv[kcmv] ) == 1:
77                k2 = l1.cmv[kcmv][0]
78              else:
79                print 'WARN.kcmv.0003: %s multiple entries' % kcmv
80            else:
81              print 'WARN.kcmv.0004: %s not found' % kcmv, r
82            eeomip.append( [k2,] + this )
83        elif r[0] == 'priority':
84          started = True
85
86def mipr2l( dd1 ):
87  oo = []
88  for k in eeatKeysPlus:
89    oo.append( str(dd1.get(k,None)) )
90  return oo
91
92ff = {}
93
94for v in e.s.type1 + e.s.type2:
95  ff[v] = e.m.vdict[v][:]
96
97for v in (e.s.type3 + e.s.type4):
98  tl = []
99  ee = collections.defaultdict( list )
100  for m in e.m.vdict[v]:
101    c = e.m.td[m][v][1].get('comment','unset')
102    l = e.m.td[m][v][1].get('long_name','unset')
103    u = e.m.td[m][v][1].get('units','unset')
104    h = hashlib.md5(c+l+u).hexdigest()
105    ee[h].append( m )
106  k = 0
107  for h in ee:
108    kk = '%s__%2.2i' % (v,k)
109    ff[kk] = ee[h]
110    k += 1
111
112for v in e.s.type5:
113  k = 0
114  for m in e.m.vdict[v]:
115    kk = '%s__%2.2i' % (v,k)
116    ff[kk] = [m,]
117    k += 1
118
119keys = ff.keys()
120keys.sort()
121ee = {}
122## dictionary for full definitions ....
123eel = {}
124eee = collections.defaultdict( list )
125eeh = collections.defaultdict( list )
126def mp(x,df):
127  if x == None:
128    return df
129  else:
130    return x
131
132
133for k in keys:
134  v = string.split( k, '__')[0]
135  m = ff[k][0]
136  for k2 in e.m.td[m][v][1].keys():
137    eeat[k2] += 1
138  c = mp( e.m.td[m][v][1].get('comment','unset'), 'unset' )
139  l = mp( e.m.td[m][v][1].get('long_name','unset'), 'unset' )
140  s = mp( e.m.td[m][v][1].get('standard_name','unset'), 'unset' )
141  vn = mp( e.m.td[m][v][1].get('out_name','unset'), 'unset' )
142  if vn == 'unset':
143    vn = v
144  u = e.m.td[m][v][1].get('units','unset')
145  t = (v,l,s,c,u)
146  z = ff[k]
147  h = hashlib.md5(string.join(t) ).hexdigest()
148  ee[h] = t
149### list of mip tables referencing this item
150  eee[h] += z
151
152## need to add v & m ....
153  for m in ff[k]:
154   if m not in e.m.td:
155     print 'ERROR: %S not in e.m.td' % m
156   else:
157    thisdict = e.m.td[m][v][1].copy()
158    thisdict['var'] = v
159    thisdict['mip'] = m
160    thisdict['dims'] = string.join( e.m.td[m][v][0], '|' )
161    r = mipr2l( thisdict )
162    vv = r[14]
163    if string.strip(vv) == '':
164        vv = r[20]
165    mtab = r[21]
166    kcmv = '%s.%s' % (mtab,vv)
167    k2 = str( uuid.uuid1() )
168    if kcmv in l1.cmv:
169      if len( l1.cmv[kcmv] ) == 1:
170        k2 = l1.cmv[kcmv][0]
171      else:
172        print 'WARN.kcmv.0001: %s multiple entries' % kcmv
173    else:
174      print 'WARN.kcmv.0002: %s not found' % kcmv, r
175### create a uuid reference for each table entry
176    eel[k2] = r
177### for each parameter, create a list of table entries
178    eeh[h].append(k2)
179
180#### this is the wrong use of eeh ---- should be key referencing another ......
181#### h is a hash of var, ln, sn, comment, units, used as key of "ee"
182ee_extra = {}
183for r in eeomip:
184  ##v = r[-3]
185  v = r[15]
186  k2 = r[0]
187  u = r[17]
188  if u == 1.:
189    u = '1'
190  if u == .001:
191    u = '0.001'
192##
193## need to deal with these rogue entries later as well
194##
195  if v not in ['',29]:
196    t = (v,r[10],r[8],r[1],u)
197    h = hashlib.md5(string.join(t) ).hexdigest()
198    eeh[h].append(k2)
199    ee_extra[h] = t
200    eee[h].append( r[-2] )
201
202def mjoin( ll ):
203  oo = ''
204  for i in ll:
205    if type(i) in [type(1.0), type(1)]:
206      oo+=str(i)
207    else:
208      oo+= i
209  return oo
210
211wb = workbook( 'vlsc3_ref_01-04.xls' )
212sh = wb.book.sheet_by_name( 'Sheet1' )
213vref = collections.defaultdict( list )
214vrefh = collections.defaultdict( list )
215for i in range(sh.nrows):
216  k = sh.row(i)[0].value
217  if string.strip(k) != '':
218    r = map( lambda x: x.value, sh.row(i) )
219    try:
220      s = map( str, r[:5] )
221      s[3] = string.strip(s[3],"'" )
222      if s[4][-2:] == '.0':
223        s[4] = s[4][:-2]
224      elif s[4][:4] == '1e-0':
225        s[4] = '1e-' + s[4][4:]
226       
227      h = hashlib.md5(string.join(s) ).hexdigest()
228    except:
229      print r
230      raise
231    vref[h].append( s + r[5:]  )
232    vrefh[k].append( h )
233een = {}
234# verify that every hashed entry associated with a table row in eel has an entry in the variable list
235## eel[<table row uuid>] = contents one row of mip table
236## eeh[<parameter hash>] = list of <table row uuid> values for each parameter hash -- key xref element
237
238idk = 0
239idkh = 0
240ics = 0
241icsh = []
242for h in ee:
243######'''
244  this = list(ee[h])  + [string.join(eee[h],','), ]
245  k = this[0]
246  if not vrefh.has_key(k):
247    een[h] = ee[h]
248    print 'ERR.001.0001: ',str(this)
249    if this[-1] == "CCMI1_satdaily":
250      icsh.append(h)
251      ics += 1
252    idk += 1
253  elif h not in vrefh[k]:
254    idkh += 1
255    print ee[h]
256    print '###############################'
257    for h2 in vrefh[k]:
258      print vref[h2][0][:5]
259    print '+++++++++++++++++++++++++++++++'
260   
261assert idk == 0 or idk == ics, 'NOT FOUND: %s records (%s)' % (idk,ics)
262assert idkh == 0, 'NOT FOUND: %s hash keys' % idkh
263
264## read 2nd ref version ......
265wb2 = workbook( 'vlsc5b_v20150907_v1.xls' )
266sh2 = wb2.book.sheet_by_name( 'Sheet1' )
267ee2 = {}
268for i in range(sh2.nrows):
269  k = sh2.row(i)[7].value
270  r = map( lambda x: x.value, sh2.row(i) )
271  if ee2.has_key(k):
272    nd = 0
273    for j in range(len(r)):
274      if r[j] != ee2[k][j]:
275        nd += 1
276    assert nd == 0, 'ERROR.001.0009: Difference in records for key %s\n%s\n%s' % (k,str(r),str(ee2[k]))
277  else:
278  ##assert not ee2.has_key(k), 'ERROR.001.0010: Duplicate key: %s' % k
279    ee2[k] = r[:]
280
281vrefmissing = []
282for k in vrefh.keys():
283  for h in vrefh[k]:
284    if not ee.has_key(h):
285      vrefmissing.append( (h,k) )
286## ['rsd4co2', 'Downwelling Shortwave Radiation 4XCO2 Atmosphere', 'downwelling_shortwave_flux_in_air', 'unset', 'W m-2', "'CMIP5_cfMon'"]
287####
288def strv(c):
289  c = str(c)
290  c = string.replace( c, '"""', '"' )
291  c = string.replace( c, '""', '"' )
292  return c
293 
294#### want to get additional info from ref: ..... from??
295yyy = '2016mmdd'
296yyy = '20160601'
297oo=open( 'vlsc5b_v%s.csv' % yyy,'w')
298idk = 0
299for h in ee:
300 if h not in icsh:
301  idk += 1
302  this = [h,] + list(ee[h])  + [string.join(eee[h],','), 'mv.001.%4.4i' % idk]
303  assert vref.has_key(h), 'key %s not found' % h
304  for ll in vref[h]:
305    ll[:5] = ee[h][:5]
306    this = '%s\t' % h
307    for c in ll:
308      try:
309        this += '%s\t' % strv(c)
310      except:
311        print c
312        print ll
313        raise
314## need to append trailing columns
315  #oo.write( "%s\t%s\t%s\t%s\t'%s'\t%s\t%s\t%s\t\n" % tuple(this) )
316    oo.write( "%s\n" % this )
317
318eevr = {}
319eevr2 = {}
320for h,k in vrefmissing:
321  assert vref.has_key(h), 'key %s not found [2]' % h
322  for ll in vref[h]:
323    this = '%s\t' % h
324    for c in ll:
325      this += '%s\t' % c
326    kmv = ll[6]
327    assert kmv[:3] == 'mv.', 'ERROR.001.0011: unexpected mv identifier: %s, %s ' % (kmv, str(this))
328    if kmv[:3] == 'mv.':
329      if ee2.has_key(kmv):
330        r = map( str, ee2[kmv] )
331        r2 = map( str, ll )
332        if r[1:5] != r2[:4] or (r[6:9] != r2[5:8]):
333          print str(ll)
334          print str(r)
335          print map( lambda x,y: x == y, r[1:9], r2[:8] )
336          print '------------------------------------------------'
337    hp = '%s.%s' % (h,kmv)
338    if not eevr2.has_key(hp):
339      eevr2[hp] = k
340      eevr[h] = k
341      oo.write( "%s\n" % this )
342## need to output additional rows.
343idkp = 0
344for h in ee_extra.keys():
345  if not (ee.has_key(h) or eevr.has_key(h)):
346    idkp += 1
347    this0 = list(ee_extra[h])  + [string.join(eee[h],','), 'mv.007.%4.4i' % idkp]
348    this = '%s\t' % h
349    for c in this0:
350      try:
351        this += '%s\t' % str(c)
352      except:
353        print c
354        print ll
355        raise
356    oo.write( "%s\n" % this )
357
358oo.close()
359oo=open( 'vlsc5_xref_v%s.csv' % yyy,'w')
360for h in eeh.keys():
361  this = string.join( eeh[h], ',' )
362  oo.write( '%s,%s,\n' % (h,this) )
363oo.close()
364oo=open( 'vlsc5_mip_v%s.csv' % yyy,'w')
365for u in eel.keys():
366  this = string.join( eel[u], '\t' )
367  oo.write( '%s\t%s\n' % (u,this) )
368for r in eeomip:
369  this = string.join( map( str, r), '\t' )
370  oo.write( '%s\n' % (this) )
371oo.close()
372print eeat.keys()
Note: See TracBrowser for help on using the repository browser.