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

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

various

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