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

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

misc

Line 
1
2##
3## still missing map from new groups to old table variables.
4## need a key lookup by variable in each table.
5##
6
7import collections, string, hashlib, uuid, os, sys
8import shelve
9import dreqSX as sx
10from sets import Set
11odir = 'sh20150827'
12
13vdate = '20150907'
14if not os.path.isdir( odir ):
15  os.mkdir( odir )
16
17sh1 = shelve.open( '%s/cmip5Groups' % odir, 'n' )
18for k in sx.cmip5so.sop.keys():
19  sh1[k] = sx.cmip5so.sop[k][:]
20sh1.close()
21#### 'uuid', 'mip', 'label','title','ref','refNote'
22####  i, "CMIP6",  key, ...., "CMIP5", ''
23cmip5tbs = []
24cmip5gps = []
25cmip5gplk = {}
26for k in sx.cmip5so.so.keys():
27  u = str( uuid.uuid1() )
28  cmip5gplk[k] = u
29  cmip5tbs.append( [u,"CMIP6",k,"CMIP6 CMOR Table: %s" % k, "CMIP5", "CMIP5 MIP Table: %s" % k] )
30for k in sx.cmip5so.sop.keys():
31  u = str( uuid.uuid1() )
32  cmip5gplk[k] = u
33  t,s = string.split( k, '_' )
34  assert sx.cmip5so.so.has_key(t), 'Table for group %s not found' % k
35  u2 = cmip5gplk[t]
36  cmip5gps.append( [u,u2,"CMIP6",k,"CMIP6 Variable Group: %s" % k, "CMIP5", "CMIP5 MIP Table section: %s" % k] )
37  u3 = str( uuid.uuid1() )
38### section link .... variables in sections are linked to a section which carries a link to the group.
39### request links can refer to a section or a group .....
40
41cmip5vgr = ['Omon','fx','Oyr','Oclim','Omon_3d','Omon_oth','Amon','Lmon','LImon','OImon','aero_3d','aero_oth','cfDay_2d','cfDay_3d','cfMon_3dstd','cfMon_3dmod','cfMon_2dmod','cfMon_sim','day_oth','day_ss','cfOff','cfSites','6hrLev','6hrPlev','3hr','cf3hr_grid','cf3hr_sim']
42ccmivgrdict = {'fixed':'fx','annual':'yr','monthly':'mon','daily':'day','hourly':'hr'}
43specsvgr =  ['fx','mon','day','6hr']
44
45ee_nv1 = collections.defaultdict( list )
46ee_var_nv1 = collections.defaultdict( list )
47ee_tabs = collections.defaultdict( list )
48ee_grps = collections.defaultdict( list )
49ee_usedVars = collections.defaultdict( list )
50
51kmap = { 'cfday':'cfDay', 'Limon':'LImon', 'CMIP5_Llmon':'CMIP5_LImon', 'CMIP5 day':'CMIP5_day', 'NEW':'new', 'New':'new', \
52         'CCMI monthly mean 3d':'CCMI1_monthly', \
53         'CCMI Daily zonal mean 2d':'CCMI1_daily', \
54         'CCMI monthly mean zonal mean 2d':'CCMI1_monthly', \
55         'PMIP-LImon':'PMIP_LImon', 'CMIP5 Amon':'CMIP5_Amon', 'CCMI monthly':'CCMI1_monthly', 'PMIP-OImon':'PMIP_OImon'}
56
57for k in sx.eenv.keys():
58  mip = string.strip(sx.eenv[k][1])
59  var = string.strip(sx.eenv[k][5])
60  uid = sx.eenv[k][-1]
61  ee_nv1[uid].append( k )
62  ee_var_nv1[var].append( k )
63  assert uid == k, 'mismatch in uid in record %s' % k
64
65def tabref1( ti ):
66  if ti == 'new BUT':
67    return 'CMIP5_Lmon'
68  elif ti == 'new':
69    return 'new'
70  else:
71    return ti
72
73for k in sx.ee0.keys():
74  r = sx.ee0[k]
75  mip = r[-2]
76  tab = r[2]
77  grp = r[0]
78  thistab = tabref1(tab)
79  ##ee_tabs[tab].append(k)
80  ee_tabs[thistab].append(k)
81  ee_grps[grp].append(k)
82
83kf = []
84kfn = []
85kfxx = []
86kfgp = []
87knf = []
88kmapmap = {}
89for k in ee_tabs.keys():
90  k1 = kmap.get( k,k)
91  if string.find( k1, ' ' ) != -1:
92    k2 = string.split(k1)[0]
93  else:
94    k2 = k
95
96  k2 = kmap.get( k2,k2)
97
98  if k2 in ['new','']:
99     kfn.append(k)
100     kmapmap[k] = 'new'
101  elif sx.ee_miptables_old.has_key(k2):
102     kf.append(k)
103     kmapmap[k] = k2
104  elif ee_grps.has_key(k2):
105     kfgp.append(k)
106     kmapmap[k] = k2
107  else:
108    if sx.ee_miptables_old.has_key('CMIP5_%s' % k2 ):
109      kfxx.append(k)
110      kmapmap[k] = 'CMIP5_%s' % k2
111    else:
112      knf.append(k)
113
114thisd = {}
115print 'Missing groups'
116for k in knf:
117  thise = collections.defaultdict( int )
118  for k2 in ee_tabs[k]:
119    thise[sx.ee0[k2][-2]] += 1
120  keys = thise.keys()
121  keys.sort()
122  thisd[k] = keys[:]
123  print 'ERROR.020.0001: Missing Group: %s :: %s' % (k, keys)
124   
125### look for new variables in variable groups.
126class d1(object):
127  def __init__(self):
128    self.d = collections.defaultdict( list )
129    self.onItemNotFound = 'error'
130
131  def keys(self):
132    return self.d.keys()
133
134  def __setitem__(self,k,v):
135    self.d[k].append(v)
136
137  def __itemNotFound__(self,k):
138    if self.onItemNotFound == 'error':
139      raise  KeyError( 'Key %s not found in dictionary keys' % k)
140   
141  def __getitem__(self,k):
142    if self.d.has_key(k):
143      return self.d[k]
144    else:
145      return self.__itemNotFound__(k)
146
147## look up table, giving uuid from old mip tables for each mip, var combination.
148mvlookup = collections.defaultdict( d1 )
149mvlookup2 = collections.defaultdict( list )
150
151ee_unusedVars = []
152nok = 0
153nn = 0
154ee0_null = collections.defaultdict( list )
155ee0_xref = collections.defaultdict( list )
156ee0_xref_old = collections.defaultdict( list )
157for t in sx.ee_miptables_old.keys():
158  for u in sx.ee_miptables_old[t]:
159    v1 = sx.ee_mip[u][15]
160    v2 = sx.ee_mip[u][21]
161    if v2 != '':
162      vid = v2
163    else:
164      vid = v1
165    mvlookup[t].d[vid].append( u )
166
167for u in sx.eeold.keys():
168  mvlookup2[sx.eeold[u][1]].append(  u )
169
170##for k in kfn:
171  ##for u in ee_tabs[k]:
172
173
174## ee0_xref values are values of ee_var_nv1
175for u in sx.ee0.keys():
176    var = string.strip(sx.ee0[u][1])
177    tab =  kmapmap.get(tabref1(sx.ee0[u][2]), None )
178    if ee_var_nv1.has_key(var):
179      nok += 1
180      ee_usedVars[var].append( u )
181## reference to kex in eenv
182      ee0_xref[u] += ((0,ee_var_nv1[var] ),)
183    elif ee_var_nv1.has_key(var + "**"):
184      nok += 1
185      ee_usedVars[var].append( u )
186      ee0_xref[u] += ((0,ee_var_nv1[var + "**"] ),)
187    else:
188      ok = False
189      if mvlookup.has_key(tab):
190        if mvlookup[tab].d.has_key( var ):
191          ul = mvlookup[tab].d[var]
192          if len(ul) > 1:
193            print 'ERROR.001.011: variable %s has multiple entries %s' % (var,tab)
194          ee0_xref[u] += ((1,[ul[0],]),)
195          ok = True
196        else:
197          emsg = '.001.010: variable %s not found in %s' % (var,tab)
198      else:
199          emsg = '.001.012: [%s] table not found: %s' % (var,tab)
200
201      if not ok:
202        if mvlookup2.has_key( var ):
203          if len( mvlookup2[var] ) == 1:
204             ee0_xref[u] += ((2,[mvlookup2[var][0],]),)
205             ok = True
206             print 'WARN' + emsg + ' [alternative found]'
207          else:
208            print 'ERROR' + emsg
209
210      if not ok:
211        print '-----',tab,sx.ee0[u]
212        ee0_xref[u] += ((-1,['__var_not_found_012__',]),)
213 
214        if ( len(sx.ee0[u][1]) > 0 and sx.ee0[u][1][0] == '#' ) or ( len(sx.ee0[u][0]) > 0 and sx.ee0[u][0][0] == '#' ):
215          ee0_null[u].append( '# comment' )
216        elif ( len(sx.ee0[u][0]) > 5 and sx.ee0[u][0][:4] == 'PMIP' ) and ( sx.ee0[u][1] in ['','*'] ):
217          ee0_null[u].append( 'PMIP bulk copy' )
218        elif len(sx.ee0[u][1]) == 0 and  len(sx.ee0[u][2]) == 0:
219          ee0_null[u].append( 'comment' )
220        else:
221          nn += 1
222          ee_unusedVars.append((u,var))
223   
224print nn, nok
225nok = 0
226nn = 0
227thise1 = []
228uclear = {}
229### run through CMIP5 variables which are modified, re-used etc in new CMIP6 groups.
230### 43 not found .... as above .....
231for k in kf + kfxx:
232  k2 = kmapmap[k]
233  for u in ee_tabs[k]:
234    var = string.strip(sx.ee0[u][1] )
235    if not var in sx.ee_miptables_vars_old[k2]:
236       print 'ERROR.0001.002: variables in sx.ee0 [new groups] not found: ',k,var,sx.ee0[u]
237       nn += 1
238    else:
239       ee_usedVars[var].append( u )
240
241    ok = False
242    if sx.ee_ovars_old.has_key('%s.%s' % (k2,var)):
243      uclear[u] = sx.ee_ovars_old['%s.%s' % (k2,var)]
244      ok = True
245    elif sx.ee_ovars_old.has_key('%s.%s**' % (k2,var)):
246      uclear[u] = sx.ee_ovars_old['%s.%s**' % (k2,var)]
247      ok = True
248    elif len(string.split( k, ' ')) > 1:
249      bits = string.split( k, ' ')
250      v1 = string.strip(bits[1])[1:-1]
251      if sx.ee_ovars_old.has_key('%s.%s' % (k2,v1)):
252        uclear[u] = sx.ee_ovars_old['%s.%s' % (k2,v1)]
253        ok = True
254     
255    if not ok:
256      thise1.append((u,k2,var))
257       ##ee0_xref_old[u]
258
259ee_mv0 = {}
260ee_mv1 = {}
261ee_mv2 = {}
262ee_mv3 = {}
263for k in sx.eeold.keys():
264  k1 = sx.eeold[k][7]
265  assert k1[:3] == 'mv.', 'Key not in correct syntax: %s' % k1
266  ee_mv0[k1] = k
267  k2 = sx.eeold[k][8]
268  if k2 != "":
269    if k2 in ["*omit",'null','Depricated']:
270      if k2 in ["*omit",'Depricated']:
271        ee_mv3[ k1 ] = k2
272    else:
273      starflag = False
274      if k2[0] == '*':
275        k2 = k2[1:]
276        starflag = True
277      assert k2[:3] == 'mv.', 'target key not in correct syntax: %s' % k2
278      if starflag:
279        ee_mv2[k1] = k2
280      else:
281        ee_mv1[k1] = k2
282
283for k in ee_mv1.keys():
284  assert ee_mv0.has_key(k), 'key cross-ref not found: %s' % k
285
286ll_ov = []
287for k in ee_mv0.keys():
288  if not (ee_mv3.has_key(k) or ee_mv1.has_key(k)):
289    ll_ov.append( ee_mv0[k] )
290print 'Number of old variables: %s [%s]' % (len(ll_ov), len(ee_mv0.keys()) )
291print  len(sx.eenv.keys())
292print "Number of new variables: %s" % ( len(sx.eenv.keys()) )
293##
294## extract variable name, units, standard name, long name, comment
295nt_vrecix = collections.namedtuple( 'vrecix', ['v','u','s','l','c'] )
296vrecix_new = nt_vrecix._make( (5,9,6,10,11) )
297vrecix_old = nt_vrecix._make( (1,5,3,2,4) )
298
299nnf = 0
300nnm = 0
301nno = 0
302for k in sx.ee_mip.keys():
303   t = map( lambda x: sx.ee_mip[k][x], [15,10,8,1,17] )
304   h = hashlib.md5(string.join(t) ).hexdigest()
305   if not sx.ee_xref_bck.has_key(k):
306     r1 = sx.ee_mip[k][1]
307     if r1 in ['','29'] or r1[:23] == 'Reference to literature' or r1[:15] == '(copied from 3D':
308       print 'WARN.002.0010: dud record',sx.ee_mip[k], sx.ee_mip[k][-2][:4] 
309     else:
310       print 'ERROR.002.0010: missing back reference',sx.ee_mip[k], sx.ee_mip[k][-2][:4] 
311       nnf += 1
312   elif len(sx.ee_xref_bck[k]) > 1:
313     nnm += 1
314     print 'ERROR.0001.001: #################################'
315     print sx.ee_mip[k]
316     for k2 in sx.ee_xref_bck[k]:
317       print sx.eeold[k2]
318
319print '#### Number of missing back references: %s (%s)' % (nnf,nno)
320   
321
322class dopenxx(object):
323  def __init__(self):
324    self.fn = 'xx_%s' % str( uuid.uuid1() )
325    self.oo = open('%s/%s' % (self.odir,self.fn), 'w' )
326  def write(self,x):
327    self.oo.write(x)
328  def close(self,rename=None):
329    self.oo.close()
330    if rename != None:
331      os.rename( '%s/%s' % (self.odir,self.fn), '%s/%s' % (self.odir,rename) )
332
333class dopen(object):
334  def __init__(self,odir='./'):
335    if not os.path.isdir(odir):
336      os.mkdir(odir)
337    self.odir = odir
338    self.a = collections.defaultdict( self.ClassFact() )
339  def close(self,k,rename=None):
340    if self.a.has_key(k):
341      self.a[k].close(rename=rename)
342      self.a.__delitem__(k)
343
344  def ClassFact(self):
345     class dopenyy(dopenxx):
346       """Inherits all methods from dreqItemBase"""
347
348     dopenyy.odir = self.odir
349     return dopenyy
350print 'INFO 001 ##################',nnf, nnm
351
352##sh = shelve.open( 'shelve_vars' )
353sh = shelve.open( '%s/cmipVars' % odir, 'n' )
354sh['__info__'] = { 'label':'cmipVars', 'title':'CMIP variables', 'prov':'sx.eenv and sx.eeold' }
355sh['__cols__'] = ['label','title','sn','units','description','procnote','procComment','prov']
356
357ee = {}
358for k in sx.eenv.keys():
359  this = nt_vrecix._make( map( lambda x: sx.eenv[k][x], vrecix_new ) )
360  ##sh[k] = { 'label':this.v, 'title':this.l, 'sn':this.s, 'units':this.u, 'description':this.c, 'procnote':'', 'procComment':'','prov':'CMIP6 endorsement' }
361  sh[k] = [ this.v, this.l, this.s, this.u, this.c, '', '','CMIP6 endorsement' ]
362  ee[this.u] = k
363  if this.u == 'atmos':
364     print 'ERROR: bad units',k, sx.eenv[k]
365print '################################### var units #################'
366print ee.keys()
367print '##########################################################'
368
369nk = 0
370for k in ll_ov:
371  this = nt_vrecix._make( map( lambda x: sx.eeold[k][x], vrecix_old ) )
372  ##sh[k] = { 'label':this.v, 'title':this.l, 'sn':this.s, 'units':this.u, 'description':this.c, 'procnote':'', 'procComment':'','prov':sx.eeold[k][6]}
373  sh[k] = [ this.v, this.l, this.s, this.u, this.c, '', '',sx.eeold[k][6] ]
374  nk += 1
375
376print len( sx.eenv.keys() ) + len(ll_ov), len( sh.keys() ),  len( sx.eenv.keys() )
377sh.close()
378 
379###
380###  shelve contains 1682 variables, of which 561 are new.
381###
382   
383### have lost somewhere the var/cmor var distinction. E.g. hfibthermds/hfibthermds2d  --- 2 CMOR variable names with a single output variable name.
384### But this will not be in the physical variable -- so should come in the output variable record.
385
386class c1(object):
387  def __init__(self):
388    self.d = collections.defaultdict( int )
389class c2(object):
390  def __init__(self):
391    self.d = collections.defaultdict( list )
392ee = collections.defaultdict( int )
393ff = collections.defaultdict( c1 )
394#count different shapes:
395blk = collections.defaultdict( c2 )
396for k in sx.ee0.keys():
397  ee[sx.ee0[k][5]] += 1
398  ff[sx.ee0[k][5]].d[sx.ee0[k][10]] += 1
399  blk[sx.ee0[k][5]].d[sx.ee0[k][10]].append(k)
400keys = ee.keys()
401keys.sort()
402print keys
403#######################################
404eeo = collections.defaultdict( int )
405ffo = collections.defaultdict( c1 )
406#count different shapes:
407hdims = [ 'latitude','longitude']
408vdims = [ 'alevel','alevhalf', 'olevel', 'rho', 'alt40', 'location', 'plev','alev1', 'plev3', 'plev7', 'plev8', 'plevs', 'sdepth']
409
410catdims = ['site', 'basin', 'oline', 'dbze', 'scatratio', 'sza5', 'tau', 'vegtype', 'vgidx']
411tdims = ['time','time1','time2']
412
413knowndims = hdims + vdims + catdims + tdims
414
415nsmap = {'':'MISC...', u'XYZKT':'lon.lat.ATMOS.other.time', u'XKT':'PMIP....', u'4-element vector':'..transsi.time', u'KZT':'RFMIP...', u'2D vector field':'lon.lat..sithick.time', u'XYZ':'lon.lat.olevel..time', u'XYZT':'lon.lat.ATMOS..time', u'2D':'SIMIP ... (xYT?)', u'scalar':'?...', u'XY':'FAFMIP, ISMIP6....', u'YZT':'MISC....', u'XYKT':'lon.lat..other.time', u'XYT':'lon.lat...time', u'ZST1':'..alevel.site.time', u'?':'PMIP', u'BasinYT':'.lat..basin.time'}
416## XYZ: this occurs only in FAFMIP
417## XYZT:  {'C4MIP': 80, 'PMIP': 10, 'RFMIP': 3, 'CFMIP': 19, 'LS3MIP': 8, 'GeoMIP': 1, 'HighResMIP': 82}
418##   need to follow up on what is vertical.  # of levels is captured in most cases.
419##   PMIP: email sent -- 29th June : some ocean, some atmos
420##   LS3MIP: soil or snow layers,
421## RFMIP: all levels.
422## XYZKT: CFMIP  -- K has various forms.
423## XKT: PMIP  -- salt transport -- should be lat-basin-time?
424## blank:  {'LUMIP': 40, 'PMIP': 11, 'RFMIP': 4, 'HighResMIP': 11, 'FAFMIP': 3, 'DynVar': 10}
425#-----  RFMIP: scalar .... email sent -- these ar OfflineRad varibles.
426#-----  LUMIP: XYT
427#-----  PMIP: occurs in bulk copy requests .....
428#-----  HighResMip: occurs in comment lines
429#-----  FAFMIP: occurs in comment lines
430#-----  DynVar: probably XYZT -- need to check whether on model or pressure levels.
431## YZT: 'DAMIP': 4, 'VolMIP': 2, 'HighResMIP': 10, 'SolarMIP': 4
432# ----  DAMIP: zonal mean, 17 or 23 levels (pressure) ..
433# ----  VolMIP: zonal mean, all levels
434# ----  HighResMIP: zonal mean, 36 levels
435# ----  SolarMIP: zonal mean, 17 or 23 levels.  (withdrawn and merged with DAMIP ....).
436## scalar: 'ISMIP6': 8, 'SIMIP': 6
437##  --> to KT, with K set to icesheet/hemisphere
438## ----- SIMIP: time (monthly)
439## '?': PMIP, for variables specified in C4MIP.
440##
441
442ed = collections.defaultdict( c1 )
443for k in sx.ee_mip.keys():
444  dl = sx.ee_mip[k][-1]
445  if dl == 's|c|a|l|a|r':
446     dl = 'scalar'
447  dd = string.split( dl, '|' )
448  for d in dd[:-1]:
449   
450    ed[d].d[dd.index(d)] += 1
451  ed[dd[-1]].d['f'] += 1
452  eeo[sx.ee_mip[k][-1]] += 1
453  ffo[sx.ee_mip[k][-1]].d[sx.ee_mip[k][-2]] += 1
454keys = eeo.keys()
455keys.sort()
456
457nkn = []
458for k in ed.keys():
459  if k not in knowndims:
460    nkn.append(k)
461nkn.sort()
462
463shlnks = shelve.open( '%s/requestLinks_tmp' % odir, 'r' )
464##
465## read in provisional request groups --- based on request scoping sheet
466##
467shrvg = shelve.open( '%s/requestVarGroup_tmp' % odir, 'r' )
468eervg = {}
469##
470## construct look-up by label
471##
472for k in shrvg.keys():
473  if k[0] != '_':
474    assert not eervg.has_key( shrvg[k][2] ), 'Duplicate rvg: %s' % shrvg[k][2]
475    eervg[shrvg[k][2]] = k
476
477sh = shelve.open( 'dreq_consol_tables_reviewed_b_v%s' % vdate, 'r' )
478revTabIds = Set( sh.keys()[:] )
479sh.close()
480
481## parse 1
482ee0_p1 = {}
483ee0_gp = collections.defaultdict( int )
484ee0_gp = collections.defaultdict( d1 )
485for k in sx.ee0.keys():
486  r = list(sx.ee0[k][:] )
487  if r[1] != '' and r[1][0] != '#':
488    if ee0_xref.has_key(k):
489      r1 = ee0_xref[k]
490      assert len(r1) == 1, 'FATAL:001.0001: unexpected duplicate cross ref, %s   %s %s' % (k,str(r1),str(r) )
491      assert len(r1[0][1]) == 1, 'FATAL:001.0002: unexpected duplicate cross ref, %s   %s %s' % (k,str(r1),str(r) )
492      r += [r1[0][0],r1[0][1][0]]
493    else:
494      r += [-1,'__none__']
495    ee0_p1[k] = r[:]
496    ee0_gp[r[0]][r[10]] = k
497    if r[0] == '':
498       print '################'
499       print r
500print '###################   groups referenced from new groups sheets'
501print ee0_gp.keys()
502k1 = ee0_gp.keys()
503k1.sort()
504kmapk1 = {}
505for k in k1:
506  assert len(ee0_gp[k].keys()) in  [0,1], 'Multiple references to %s' % k
507  for k2 in ee0_gp[k].keys():
508    if eervg.has_key( '%s.%s' % (k2,k) ):
509      kmapk1[k] = ('%s.%s' % (k2,k),'newGp')
510    else:
511      kmapk1[k] = ('%s.%s' % (k2,k),'unresolved')
512
513gpids = []
514for k in kmapk1.keys():
515  gpids.append(kmapk1[k][0])
516kmapk2 = {}
517
518mmmm = [('C_OceanT1', 'C_Ocean_T1'), ('C_OceanT2', 'C_Ocean_T2'), ('3hr_extreme','3hr_extr'), ('Amon_extreme','Amon_ext'), \
519        ('Amon_convection','Amon_conv'), ('L3hr','L_3hr'), ('LEday','L_day'), ('DYNVAR_day','DYVR_daily') ]
520mmmm = [('C_OceanT1', 'C_Ocean_T1'), ('C_OceanT2', 'C_Ocean_T2'), ('3hr_extreme','3hr_extr'), ('Amon_extreme','Amon_ext'), \
521        ('Amon_convection','Amon_conv'), ('L3hr','L_3hr'), ('DYNVAR_day','DYVR_daily') ]
522kmap000 = {}
523for t in mmmm:
524  kmap000[t[0]] = t[1]
525
526##
527## check links from variable output specs to group.
528## need to identify what is meant by group labels in "Request Scoping" -- now in eervg.keys()
529##
530## 29th July: loosing some links for groups of revised table items ....
531##
532## these are the reviewed cmip5 standard output tables.
533##
534shb = shelve.open( 'dreq_consol_tables_reviewed_b_v%s' % vdate, 'r' )
535revisedTabKeys = shb.keys()
536revisedTabKeys.sort()
537revisedTabKeysff = []
538revisedTabKeysNM = {}
539tabsects = collections.defaultdict( Set )
540tabsectbyvar = collections.defaultdict( dict )
541tabsectuuid = collections.defaultdict( dict )
542tabuuid = {}
543tabuuidrefs = collections.defaultdict( int )
544for r in revisedTabKeys:
545  if not tabuuid.has_key( r ):
546    tabuuid[r] = str( uuid.uuid1() )
547
548  if string.find( r, '.' ) != -1:
549    mip,tab = string.split(r, '.' )
550    assert sx.cmip5so.so.has_key(tab), 'FATAL.001.0001: revised table not found in original: %s' % tab
551    lnf = []
552    lpe = []
553    lmod = []
554    for v in shb[r].keys():
555      v1 = string.strip(v)
556      if not sx.cmip5so.so[tab].a.has_key(v1):
557        lnf.append(v)
558      else:
559        if shb[r][v][1] == sx.cmip5so.so[tab].a[v1][0]:
560          lpe.append(v)
561        else:
562          lmod.append(v)
563##
564## index sections of tables (for OMIP)
565##
566      tup = shb[r][v]
567      if tup[2] != None:
568        tabsects[mip].add( (tab,tup[2]) )
569        tabsectbyvar[mip][v] = (tup[2],tup[3])
570        if not tabsectuuid[mip].has_key( tup[2] ):
571          tabsectuuid[mip][tup[2]] = str( uuid.uuid1() )
572
573    if len(lnf) > 0:
574      print 'ERROR.008.0001: Revised variables not in original: %s %s' % (r,str(lnf) )
575    if len(lmod) == 0:
576      print 'INFO.008.0001: No modfications in %s' % r
577#### save uuid of table ... for use in requestLinks
578      revisedTabKeysNM[r] = cmip5gplk[tab]
579    else:
580      revisedTabKeysff.append( r )
581
582revGpIds = Set()
583for t in revTabIds:
584  if t[-4:] == 'Omon':
585    revGpIds.add( t + '_oth' )
586    revGpIds.add( t + '_3d' )
587  elif t[-5:] == 'cfMon':
588    revGpIds.add( t + '_3dstd' )
589    revGpIds.add( t + '_3dmod' )
590    revGpIds.add( t + '_2dmod' )
591    revGpIds.add( t + '_sim' )
592   
593shb.close()
594gpids = gpids + revisedTabKeysff
595ks = eervg.keys()
596ks.sort()
597for k0 in ks:
598  a,b = string.split(k0,'.')
599  if kmap000.has_key(b):
600    k = '%s.%s' % (a,kmap000[b])
601  else:
602    k = k0
603  ok = False
604  if b[:5] == 'CCMI1':
605    b1,b2 = string.split(b, '_' )
606    if ccmivgrdict.has_key( b2):
607      ok = True
608      kmapk2[k0] = ('CCMI',b2)
609  elif b[:5] == 'SPECS':
610    b1,b2 = string.split(b, '_' )
611    if b2 in specsvgr:
612      ok = True
613      kmapk2[k0] = ('SPECS',b2)
614    elif b2 == 'Amon':
615      kmapk2[k0] = ('SPECS','mon')
616      ok = True
617  if not ok:
618    if k in gpids:
619    ## print 'OK1: ',k
620      kmapk2[k0] = ('new',k)
621      ok = True
622    elif a in ['LUMIP','LS3MIP']:
623      tk = 'C4MIP.%s' % kmap000.get(b,b)
624      if tk in gpids:
625        kmapk2[k0] = ('new',tk)
626        ok = True
627    elif a in ['VolMIP','DAMIP']:
628      tk = 'DynVar.%s' % kmap000.get(b,b)
629      if tk in gpids:
630        kmapk2[k0] = ('new',tk)
631        ok = True
632  if not ok:
633## revTabIds has table names, revGpIds has group names
634    if k in revTabIds or k in revGpIds:
635      if k in revGpIds:
636         print 'OK2: ',k
637      kmapk2[k0] = ('CMIP5Rev',k)
638    else:
639      if b in cmip5vgr:
640        kmapk2[k0] = ('CMIP5',b)
641      else:
642        kmapk2[k0] = ('nomap',k)
643   
644print '###############################################################'
645print '###############################################################'
646##
647## following list currently contains separate entries for group references from different MIPs --- want to have a single one
648## here, and multiple references to it ...
649##
650rvgref2 = collections.defaultdict( list )
651lookup1a = collections.defaultdict( d1 )
652lookup1b = {}
653lookup1 = collections.defaultdict( d1 )
654lookup2 = collections.defaultdict( d1 )
655import sx2_extra as sx2e
656sh = shelve.open( '%s/requestVarGroup' % odir, 'n' )
657sh['__info__'] = { 'label':'requestVarGroup', 'title':'Identify variable groups' }
658sh['__cols__'] = [ 'uuid', 'mip', 'label','title','ref','refNote']
659## C4MIP-OceanT2        C4MIP: C4MIP-OceanT2    C4MIP   new     C4MIP.C_Ocean_T2
660## label title mip ref refNote
661
662####
663#### reconfigure to uuid, mip, label (no "."), title, class, refNote
664#### for "ttt==new", use sx2e.ngmap( kkk ) to give labels, keep kkk as refNote, ttt --> class
665###
666### lookup1: constructed from requestVarGroup list
667for k in shrvg.keys():
668  if k[0] != '_':
669    id0 = shrvg[k][2]
670    ttt,kkk = kmapk2[id0]
671    lookup1a[ttt].d[kkk].append(k)
672    if ttt == 'new':
673      rvgref2[kkk].append( shrvg[k][0] )
674
675for k in lookup1a.keys():
676  for k2 in lookup1a[k].d.keys():
677    id0 = lookup1a[k].d[k2][0]
678    id =  str( uuid.uuid1() )
679    lookup1[k].d[k2].append( id)
680    lookup1b[id0] = id
681 
682### shlnks carries the "request scoping rows" ###
683### somehow not getting labels for Omon_oth etc
684ndup = 0
685for k in shlnks.keys():
686  thistr = False
687  if k[0] != '_':
688    if shlnks[k][2][-4:] == '_oth':
689      thistr = True
690    k1 = '%s.%s' % (shlnks[k][1],shlnks[k][2])
691    if thistr:
692      print k1
693    assert kmapk2.has_key(k1), 'Key missing  %s, %s' % (k,k1)
694    if not kmapk2.has_key(k1):
695      pass
696      #print '###########',shlnks[k]
697    else:
698      ttt,kkk = kmapk2[k1]
699      id = lookup1[ttt].d[kkk][0]
700      if thistr:
701         print ttt,kkk,id
702    if id == k:
703      print '***DUPLICATE:',k,k1, ttt, kkk, lookup1[ttt].d[kkk]
704      ndup += 1
705
706assert ndup==0, ndup
707
708for k in lookup1.keys():
709  for k2 in lookup1[k].d.keys():
710    id = lookup1[k].d[k2][0]
711    idi = lookup1a[k].d[k2][0]
712    id0 = shrvg[idi][2]
713    mip = shrvg[idi][1]
714    ttt,kkk = kmapk2[id0]
715    cls = k
716    assert  cls == k, 'Mismatch in lookup1'
717    refNote = k2
718    ##print k2, cls
719    if cls == 'new':
720      if kkk in revisedTabKeys:
721        lab = kkk
722        cls = 'rev'
723        lab = string.replace( kkk, '.', '-' )
724      else:
725        if not sx2e.ngmap.has_key(kkk):
726          print 'ERROR.002.0001: key %s not found' % kkk
727        else:
728          lab = sx2e.ngmap[kkk]
729    elif cls == 'CMIP5':
730      lab = string.replace( k2, '_', '-' )
731    elif cls in ['CMIP5Rev','rev']:
732      lab = string.replace( k2, '.', '-' )
733    elif cls == 'nomap':
734      lab = string.replace( k2, '.', '-' )
735      lab = string.replace( lab, '_', '-' )
736    else:
737      lab = '%s-%s' % (mip,k2)
738    if sx2e.r1.match( lab ) == None:
739      print 'NON_COMPLIANT label', lab,k2, cls
740      ## print k,k2,shrvg[id]
741      ## assert False
742    sh[id] = [id,mip,lab,'%s: %s' % (mip,lab), cls, refNote]
743    print '>>>>>>>>>',sh[id]
744
745for k in ['seaiceday', 'seaicemon']:
746    id =  str( uuid.uuid1() )
747    mip = 'SIMIP'
748    lab = '%s-%s' % (mip,k)
749    title = '%s: %s' % (mip,k)
750    cls = 'newOrp'
751    refNote = '%s.%s' % (mip,k)
752    sh[id] = [id,mip,lab,title, cls, refNote]
753    lookup1[cls].d[refNote].append(id)
754     
755## add CMIP5 groups .........
756for g in cmip5tbs:
757  sh[g[0]] = g[:]
758sh.close()
759sh = shelve.open( '%s/requestVarSections' % odir, 'n' )
760sh['__info__'] = { 'label':'requestVarGroup', 'title':'Identify variable groups' }
761sh['__cols__'] = [ 'uuid', 'gpid', 'mip', 'label','title','ref','refNote']
762## add CMIP5 groups .........
763for g in cmip5gps:
764  sh[g[0]] = g[:]
765sh.close()
766
767err001 = collections.defaultdict( int )
768sh = shelve.open( '%s/groupItems' % odir, 'n' )
769sh['__info__'] =  {'label':'groupItems', 'title':'List of items in new groups', 'description':"New groups" }
770##(u'DYVR_daily', u'utendnogw', '', u'daily', '', '', '', '', '', u'DynVar', 'DynVar', '772da0b6-25b6-11e5-8cf6-ac72891c3257')
771sh['__cols__'] = ['group','var','table','freq','', 'shape', '', '', '','mip','mip?','uuid','new','gpid','vkey','vid']
772for k in ee0_p1.keys():
773    kkk = '%s.%s' % (ee0_p1[k][10],ee0_p1[k][0])
774    ##if not sx2e.ngmap.has_key(kkk):
775    if lookup1['new'].d.has_key(kkk):
776       id = lookup1['new'].d[kkk][0] 
777    elif lookup1['newOrp'].d.has_key(kkk):
778       id = lookup1['newOrp'].d[kkk][0] 
779    else:
780       id = None
781       err001[kkk] += 1
782    r = ee0_p1[k][:]
783    if id != None:
784      r[-2] = 1
785      r[-1] = id
786    else:
787      r[-2] = -1
788      r[-1] = '__none__'
789    t = ee0_xref[k][0]
790    r += [t[0],t[1][0]]
791    sh[k] = r[:]
792sh.close()
793
794sh = shelve.open( '%s/requestLinks' % odir, 'n' )
795sh['__info__'] = { 'label':'requestLinks', 'title':'Links from variable groups to a request id' }
796sh['__cols__'] = [ 'uid', 'mip', 'tab','objective','grid','gridreq','comment','opt','opar','ref','refNote','refid']
797ndup = 0
798for k in shlnks.keys():
799  if k[0] != '_':
800    k1 = '%s.%s' % (shlnks[k][1],shlnks[k][2])
801    assert kmapk2.has_key(k1), 'Key missing  %s, %s' % (k,k1)
802    if not kmapk2.has_key(k1):
803      #print '###########',shlnks[k]
804      pass
805    else:
806      ttt,kkk = kmapk2[k1]
807
808      if revisedTabKeysNM.has_key(k1):
809        print 'INFO.010.0010: Replacing link for %s' % k1
810        id = revisedTabKeysNM[k1]
811      else:
812        id = lookup1[ttt].d[kkk][0]
813
814      sh[k] = list( shlnks[k] ) + list( kmapk2[k1] ) + [id,]
815    if sh[k][0] == sh[k][-1]:
816      print 'DUPLICATE LINK:',k,sh[k]
817      ndup += 1
818print 'INFO: Number of duplicates %s (%s)' % (ndup, len(sh.keys()))
819sh.close()
820## link to group items is now via mip + group id, using stuff from kmapk2 ....
821
822dorest = True
823
824class psort(object):
825
826   def __init__(self):
827     pass
828
829   def p(self,z):
830     return tabpri.get(z,9)
831
832   def cmp(self,x,y):
833     return cmp( self.p(x), self.p(y) )
834
835if dorest:
836 tabpri = { 'SPECS':2, 'CMIP5':0, 'CORDEX':3, 'PMIP3':4 }
837
838 gg = {}
839 for k in sx.eeold.keys():
840  if sx.eeold[k][7][:6] == 'mv.005':
841    gg[sx.eeold[k][1]] = k
842###
843### BUT need to get full OMIP records in here ......
844 sh = shelve.open( '%s/refTableItems' % odir, 'n' )
845 sh['__info__'] =  {'label':'refTableItems', 'title':'List of items in reference tables', 'prov':'sx.ee_mip' }
846 sh['__cols__'] = ['uuid', 'comment', 'deflate_level', 'shuffle', 'ok_max_mean_abs', 'flag_meanings', \
847                          'type', 'ok_min_mean_abs', 'standard_name', 'deflate', 'long_name', 'valid_min',\
848                           'cell_methods', 'flag_values', 'cell_measures', 'out_name', 'modeling_realm', 'units',\
849                           '#cell_methods', 'valid_max', 'positive', 'var', 'mipTable','dimensions','vid','gpid'] 
850
851## added gpid for link to variable group .... not clear at this point how OMIP to be dealt with here.
852## for sections, perhaps need new section linking sections to groups ....
853
854 vdefex = {}
855 rwixkkk = 0
856 for k in sx.ee_mip.keys():
857  gpid = '__group_unknown__'
858  rwix = 0
859  mipt = sx.ee_mip[k][22]
860  if tabuuid.has_key( mipt ):
861    gpid = tabuuid[mipt]
862  if mipt[:6] == "CMIP5_":
863    m,t = string.split( mipt, '_' )
864    assert cmip5gplk.has_key(t), 'ERROR.009.0010: CMIP5 table link not found for %s' % mipt
865    gpid = cmip5gplk[t]
866  elif mipt[:5] == "OMIP.":
867    m,t = string.split( mipt, '.' )
868# output name
869    v0 = sx.ee_mip[k][15]
870# variable name
871    v1 = sx.ee_mip[k][21]
872    if type(v0) == type( 'y' ) and v0 not in ['', ' ']:
873      v1 = v0
874## check to see if sections are defined.
875    if tabsectbyvar.has_key(m):
876      print m, sx.ee_mip[k][15], v0, tabsectbyvar[m].has_key(v1), sx.ee_mip[k]
877      if tabsectbyvar[m].has_key(v1):
878        gpid = tabsectuuid[m][ tabsectbyvar[m][v1][0] ]
879        rwix = tabsectbyvar[m][v1][1]
880        rwixkkk += 1
881    ##    tabsects[mip].add( (tab,tup[2]) )
882        ##tabsectbyvar[mip][v] = tup[2]
883        ##if not tabsectuuid[mip].has_key( tup[2] ):
884          ##tabsectuuid[mip][tup[2]] = str( uuid.uuid1() )
885    if gpid == '__group_unknown__':
886      print 'ERROR.040.0010: OMIP group not found %s, %s, %s' % (mipt,v0,) 
887  omit = False
888  if not sx.ee_xref_bck.has_key( k ):
889    r1 = sx.ee_mip[k][1]
890    if r1 in ['','29'] or r1[:23] == 'Reference to literature' or r1[:15] == '(copied from 3D':
891       print 'WARN.002.0003: dud record',sx.ee_mip[k], sx.ee_mip[k][-2][:4] 
892       omit = True
893    elif sx.ee_mip[k][-2][:4] == 'OMIP':
894       print 'ERROR.002.0004: no back references %s' % str(sx.ee_mip[k])
895    else:
896      print 'ERROR.002.0003: no back references %s' % str(sx.ee_mip[k])
897    kl = ['__none__',]
898    vnam0 = ''
899  else:
900    kl = sx.ee_xref_bck[ k ]
901    if len(kl) != 1:
902      print 'ERROR.002.0001: multiple back references %s' % str(kl)
903      #print sx.ee_mip[k]
904    kv = kl[0]
905    r = sx.eeold[kv]
906    vnam0 = r[1]
907    kit = 0
908    itl = []
909    while r[8] not in [ '','null','Depricated'] and r[8][0] != '*':
910      itl.append(r)
911      if ee_mv0.has_key(r[8]):
912        kv = ee_mv0[ r[8] ]
913        r = sx.eeold[kv]
914      else:
915        print 'ERROR.002.0002: ambiguous back reference: %s' % str(r)
916      kit += 1
917      assert kit < 5, 'Too many iterations: %s,\n%s' % (str(r),str(itl))
918      if kit > 1:
919        print 'WARNING.002.0001: chained reference: %s' % str(r)
920    kl = [kv,]
921  if not omit:
922## count refs, for use in determining where to create group records ....
923    tabuuidrefs[gpid] += 1
924    if r[1] != vnam0:
925      print 'INFO.0001.001: name change:',r,vnam0
926    vdefex[k] = list(r) + [vnam0,] 
927    if len( sx.ee_mip[k][:] ) != 24:
928      print 'ERROR.015.0002: Bad record length %s: %s' % (k,sx.ee_mip[k])
929    sh[k] = sx.ee_mip[k][:]  + [kl[0],gpid,rwix] 
930 sh.close()
931
932 sha = shelve.open( 'dreq_consol_tables_reviewed_a_v%s' % vdate )
933 shb = shelve.open( 'dreq_consol_tables_reviewed_b_v%s' % vdate )
934 keys = shb.keys()
935 keys.sort()
936 k0 = []
937 for k in revisedTabKeysff:
938   bb = string.split(k, '.' )
939   if len(bb) == 2:
940     k0.append( tuple(bb) )
941
942 sh = shelve.open( '%s/revTabItems' % odir, 'n' )
943 sh['__info__'] =  {'label':'revTabItems', 'title':'List of items in revised tables', 'description':"uuid (col 3) references an item in 'refTableItems'", 'prov':'from dreq_consol_tables_reviewed_b_v%s, cross-referenced with sx.ee_miptables_old' % vdate }
944 sh['__cols__'] = ['var','table','mip','uuid','priority']
945####
946 dop = dopen('check3')
947 kr = 0
948 krn = 0
949
950 for m,t in k0:
951  print 'INFO.003.0001: ',m,t
952  vars = shb[ '%s.%s' % (m,t) ]
953  ee = {}
954  ff = {}
955  if m == "OMIP":
956    rk = 'OMIP.%s' % t
957  else:
958    rk = 'CMIP5_%s' % t
959  if not sx.ee_miptables_old.has_key(rk):
960     print 'ERROR.003.0001: key %s not found ' % rk
961  else:
962    for u in sx.ee_miptables_old[rk]:
963      ee[ sx.ee_mip[u][21] ] = u
964      if vdefex.has_key(u):
965        if vdefex[u][1] != sx.ee_mip[u][21]:
966          ff[vdefex[u][1]] = u
967      ##if sx.ee_xref_bck.has_key(u):
968    for v0 in vars.keys():
969      v = string.strip( v0 )
970      r = sha['records'][vars[v0][0]]
971      if not ee.has_key(v):
972        if ff.has_key(v):
973          print 'INFO ... rename found',v
974          thisu = ff[v]
975        elif v[:7] == 'include':
976          thisu = '__inc__'
977        else:
978          thisu = None
979          if sx.ee_byvar.has_key( v ):
980             tabs = map( lambda x: sx.ee_mip[x][-2], sx.ee_byvar[v] )
981             tbs = map( lambda x: string.split(x, '_' )[-1], tabs )
982             cls = map( lambda x: string.split(x, '_' )[0], tabs )
983             if t in tbs:
984               cl0 = []
985               for k in range(len(tbs)):
986                 if tbs[k] == t:
987                    cl0.append( cls[k] )
988
989               cl0.sort( psort().cmp )
990               ix = tabs.index( '%s_%s' % (cl0[0],t) )
991               print 'WARN.003.0001 var not found -- alternative table used [%s]: %s (%s, %s)' % (cl0[0],v,m,t)
992               thisu = sx.ee_byvar[v][ix]
993               
994             ##print map( lambda x: sx.ee_mip[x][-2], sx.ee_byvar[v] )
995          elif m == 'OMIP' and gg.has_key(v):
996            print 'INFO ... new OMIP var found',v
997            thisu = '__new.OMIP__'
998            krn += 1
999            id =  str( uuid.uuid1() )
1000            dop.a['omip3'].write( string.join( [id,] + map(lambda x: r[x],[4,0,5,2,7]) + ['%s_%s' % (m,t),'mv.006.%4.4i' % krn], '\t' ) + '\n' )
1001         
1002          if thisu == None:
1003            print 'ERROR.003.0001 var not found: %s (%s, %s)' % (v,m,t)
1004            thisu = "__var_not_found__"
1005          if m == 'OMIP':
1006            kr += 1
1007            sr =  map(str,r)
1008            dop.a['omip'].write( string.join( map(str,r), '\t' ) + '\n' )
1009            dop.a['omip2'].write( string.join( map(lambda x: r[x],[4,0,5,2,7]) + ['%s_%s' % (m,t),'mv.005.%4.4i' % kr], '\t' ) + '\n' )
1010         
1011      else:
1012        thisu = ee[v]
1013      kv = str( uuid.uuid1() )
1014      sh[kv] = [v,t,m,thisu,vars[v0][1]]
1015 dop.close('omip',rename='omip.csv')
1016 dop.close('omip2',rename='omip2.csv')
1017 dop.close('omip3',rename='omip3.csv')
1018 sh.close()
1019
1020 sh = shelve.open( '%s/requestVarGroup' % odir )
1021## add OMIP (+ ....?)
1022 nomip = 0
1023 for k in tabuuid.keys():
1024   if k[0] != '_':
1025  ####cmip5tbs.append( [u,"CMIP6",k,"CMIP6 CMOR Table: %s" % k, "CMIP5", "CMIP5 MIP Table: %s" % k] )
1026     if tabuuidrefs[tabuuid[k]]  > 0:
1027        mip,tab = string.split( k, '.' )
1028        u = tabuuid[k]
1029        sh[u] = [u,mip,tab,"CMOR Table variant: %s" % k, "CMIP5Rev", k ]
1030####'OMIP', u'OMIP-fx', u'OMIP: OMIP-fx', 'CMIP5Rev', u'OMIP.fx'
1031        print 'INFO: ADDING GROUP: %s' % str(sh[u])
1032        nomip += 1
1033 sh.close()
1034 print nomip
1035
Note: See TracBrowser for help on using the repository browser.