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

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

Extended overview tables, corrected content

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 mmip in ['OMIP','CFMIP']:
34 for f in dc.ff[mmip]:
35  wbx = workbook( '%s%s/%s' % (dc.dir0, mmip, f ) )
36  for s in wbx.sns:
37    if s != 'general':
38      sh = wbx.book.sheet_by_name( s )
39      started = False
40      for i in range(sh.nrows):
41        r = map( lambda x: x.value, sh.row(i) )
42        rc = map( lambda x: x.ctype, sh.row(i) )
43        if started:
44          omit = False
45          print r
46          k2 = str( uuid.uuid1() )
47          this = []
48          for k in eeatKeysPlus:
49            if k == 'mip':
50              this.append( '%s.%s' % (mmip,s) )
51            elif ktr1.has_key(k):
52              if k == 'dims':
53                if rc[shKeys.index( ktr1[k] )] == 1:
54                  d0 = string.strip( r[ shKeys.index( ktr1[k] ) ] )
55                  if string.find( d0, ' ' ):
56                    dl = string.split( r[ shKeys.index( ktr1[k] ) ] )
57                    d0 = string.join( dl, '|' )
58                  this.append( d0 )
59                else:
60                  this.append( r[ shKeys.index( ktr1[k] ) ] )
61              elif k == 'var':
62                if rc[shKeys.index( ktr1[k] )] == 1:
63                  v = string.strip( r[ shKeys.index( ktr1[k] ) ] )
64                elif rc[ shKeys.index( ktr1['out_name'] ) ] == 1:
65                  v = string.strip( r[ shKeys.index( ktr1['out_name'] ) ] )
66                else:
67                  omit = True
68                this.append( v )
69              else:
70                this.append( r[ shKeys.index( ktr1[k] ) ] )
71            else:
72              this.append( '' )
73          if not omit:
74            mtab =  '%s.%s' % (mmip,s)
75            kcmv = '%s.%s' % (mtab,v)
76            if kcmv in l1.cmv:
77              if len( l1.cmv[kcmv] ) == 1:
78                k2 = l1.cmv[kcmv][0]
79              else:
80                print 'WARN.kcmv.0003: %s multiple entries' % kcmv
81            else:
82              print 'WARN.kcmv.0004: %s not found' % kcmv, r
83            eeomip.append( [k2,] + this )
84        elif r[0] == 'priority':
85          started = True
86
87def mipr2l( dd1 ):
88  oo = []
89  for k in eeatKeysPlus:
90    oo.append( str(dd1.get(k,None)) )
91  return oo
92
93ff = {}
94
95for v in e.s.type1 + e.s.type2:
96  ff[v] = e.m.vdict[v][:]
97
98for v in (e.s.type3 + e.s.type4):
99  tl = []
100  ee = collections.defaultdict( list )
101  for m in e.m.vdict[v]:
102    c = e.m.td[m][v][1].get('comment','unset')
103    l = e.m.td[m][v][1].get('long_name','unset')
104    u = e.m.td[m][v][1].get('units','unset')
105    h = hashlib.md5(c+l+u).hexdigest()
106    ee[h].append( m )
107  k = 0
108  for h in ee:
109    kk = '%s__%2.2i' % (v,k)
110    ff[kk] = ee[h]
111    k += 1
112
113for v in e.s.type5:
114  k = 0
115  for m in e.m.vdict[v]:
116    kk = '%s__%2.2i' % (v,k)
117    ff[kk] = [m,]
118    k += 1
119
120keys = ff.keys()
121keys.sort()
122ee = {}
123## dictionary for full definitions ....
124eel = {}
125eee = collections.defaultdict( list )
126eeh = collections.defaultdict( list )
127def mp(x,df):
128  if x == None:
129    return df
130  else:
131    return x
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'
297yyy = '20160801'
298oo=open( 'vlsc5b_v%s.csv' % yyy,'w')
299idk = 0
300for h in ee:
301 if h not in icsh:
302  idk += 1
303  this = [h,] + list(ee[h])  + [string.join(eee[h],','), 'mv.001.%4.4i' % idk]
304  assert vref.has_key(h), 'key %s not found' % h
305  for ll in vref[h]:
306    ll[:5] = ee[h][:5]
307    this = '%s\t' % h
308    for c in ll:
309      try:
310        this += '%s\t' % strv(c)
311      except:
312        print c
313        print ll
314        raise
315    oo.write( "%s\n" % this )
316
317eevr = {}
318eevr2 = {}
319for h,k in vrefmissing:
320  assert vref.has_key(h), 'key %s not found [2]' % h
321  for ll in vref[h]:
322    this = '%s\t' % h
323    for c in ll:
324      this += '%s\t' % c
325    kmv = ll[6]
326    assert kmv[:3] == 'mv.', 'ERROR.001.0011: unexpected mv identifier: %s, %s ' % (kmv, str(this))
327    if kmv[:3] == 'mv.':
328      if ee2.has_key(kmv):
329        r = map( str, ee2[kmv] )
330        r2 = map( str, ll )
331        if r[1:5] != r2[:4] or (r[6:9] != r2[5:8]):
332          print str(ll)
333          print str(r)
334          print map( lambda x,y: x == y, r[1:9], r2[:8] )
335          print '------------------------------------------------'
336    hp = '%s.%s' % (h,kmv)
337    if not eevr2.has_key(hp):
338      eevr2[hp] = k
339      eevr[h] = k
340      oo.write( "%s\n" % this )
341## need to output additional rows.
342idkp = 0
343for h in ee_extra.keys():
344  if not (ee.has_key(h) or eevr.has_key(h)):
345    idkp += 1
346    this0 = list(ee_extra[h])  + [string.join(eee[h],','), 'mv.007.%4.4i' % idkp]
347    this = '%s\t' % h
348    for c in this0:
349      try:
350        this += '%s\t' % str(c)
351      except:
352        print c
353        print ll
354        raise
355    oo.write( "%s\n" % this )
356
357oo.close()
358oo=open( 'vlsc5_xref_v%s.csv' % yyy,'w')
359for h in eeh.keys():
360  this = string.join( eeh[h], ',' )
361  oo.write( '%s,%s,\n' % (h,this) )
362oo.close()
363oo=open( 'vlsc5_mip_v%s.csv' % yyy,'w')
364for u in eel.keys():
365  this = string.join( eel[u], '\t' )
366  oo.write( '%s\t%s\n' % (u,this) )
367for r in eeomip:
368  this = string.join( map( str, r), '\t' )
369  oo.write( '%s\n' % (this) )
370oo.close()
371print eeat.keys()
Note: See TracBrowser for help on using the repository browser.