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

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

misc

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