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

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

update inputs

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
10import dreq_utils
11import utils_wb
12from sets import Set
13odir = 'sh20150827'
14
15vdate = '20150907'
16if not os.path.isdir( odir ):
17  os.mkdir( odir )
18
19class uid1(object):
20  def __init__(self, uid=None):
21    if uid == None:
22      self.uid = str( uuid.uuid1() )
23    else:
24      self.uid = uid
25
26uidgen = collections.defaultdict( uid1 )
27
28def labcoerce(s):
29  s = string.replace(s, '.', '' )
30  s = string.replace(s, '+', '' )
31  s = string.replace(s, '/', ' ' )
32  s = string.replace(s, '--', '-' )
33  if string.find(s, '-' ) != -1:
34    s = string.replace(s, '-', ' ' )
35  if string.find(s, ' ' ) != -1:
36    s = string.replace( string.capwords( s ), ' ', '' )
37  return s
38
39sh1 = shelve.open( '%s/cmip5Groups' % odir, 'n' )
40##
41## list of CMIP5 tables which have groups
42##
43cmip5GroupsIx = set()
44##
45## dictionary, specifying group for each variable in table
46##
47cmip5GroupsIVAR = collections.defaultdict( dict )
48for k in sx.cmip5so.sop.keys():
49  sh1[k] = sx.cmip5so.sop[k][:]
50  cmip5GroupsIx.add( string.split( k, '_' )[0] )
51  for v in sx.cmip5so.sop[k]:
52    cmip5GroupsIVAR[ string.split( k, '_' )[0] ][v] = k
53  if sx.cmip5so.omipInsert and k in sx.cmip5so.sxp:
54    for v in sx.cmip5so.sxp[k]:
55      cmip5GroupsIVAR[ string.split( k, '_' )[0] ][v] = k
56sh1.close()
57#### 'uuid', 'mip', 'label','title','ref','refNote'
58####  i, "CMIP6",  key, ...., "CMIP5", ''
59cmip5tbs = []
60cmip5tbs0 = set()
61cmip5gps = []
62cmip5gplk = {}
63for k in sx.cmip5so.so.keys():
64  u = str( uuid.uuid1() )
65  cmip5gplk[k] = u
66  cmip5tbs0.add( k )
67  cmip5tbs.append( [u,"CMIP6",k,"CMIP6 CMOR Table: %s" % k, "CMIP5", "CMIP5 MIP Table: %s" % k] )
68
69for k in sx.cmip5so.sop.keys():
70  u = str( uuid.uuid1() )
71  cmip5gplk[k] = u
72  t,s = string.split( k, '_' )
73  assert sx.cmip5so.so.has_key(t), 'Table for group %s not found' % k
74  u2 = cmip5gplk[t]
75  cmip5gps.append( [u,u2,"CMIP6",k,"CMIP6 Variable Group: %s" % k, "CMIP5", "CMIP5 MIP Table section: %s" % k] )
76  u3 = str( uuid.uuid1() )
77### section link .... variables in sections are linked to a section which carries a link to the group.
78### request links can refer to a section or a group .....
79
80cmip5vgr = ['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']
81ccmivgrdict = {'fixed':'fx','annual':'yr','monthly':'mon','daily':'day','hourly':'hr'}
82specsvgr =  ['fx','mon','day','6hr']
83
84ee_nv1 = collections.defaultdict( list )
85ee_var_nv1 = collections.defaultdict( list )
86ee_tabs = collections.defaultdict( list )
87ee_grps = collections.defaultdict( list )
88ee_usedVars = collections.defaultdict( list )
89
90kmap = { 'cfday':'cfDay', 'Limon':'LImon', 'CMIP5_Llmon':'CMIP5_LImon', 'CMIP5 day':'CMIP5_day', 'NEW':'new', 'New':'new', \
91         'CCMI monthly mean 3d':'CCMI1_monthly', \
92         'CCMI Daily zonal mean 2d':'CCMI1_daily', \
93         'CCMI monthly mean zonal mean 2d':'CCMI1_monthly', \
94         'PMIP-LImon':'PMIP_LImon', 'CMIP5 Amon':'CMIP5_Amon', 'CCMI monthly':'CCMI1_monthly', 'PMIP-OImon':'PMIP_OImon'}
95
96for k in sx.eenv.keys():
97  mip = string.strip(sx.eenv[k][1])
98  var = string.strip(sx.eenv[k][5])
99  uid = sx.eenv[k][-1]
100  ee_nv1[uid].append( k )
101  ee_var_nv1[var].append( k )
102  assert uid == k, 'mismatch in uid in record %s' % k
103
104def tabref1( ti ):
105  if ti == 'new BUT':
106    return 'CMIP5_Lmon'
107  elif ti == 'new':
108    return 'new'
109  else:
110    return ti
111
112for k in sx.ee0.keys():
113  r = sx.ee0[k]
114  mip = r[10]
115  assert mip == r[-3],'Double check failed'
116  tab = r[2]
117  grp = r[0]
118  thistab = tabref1(tab)
119  ##ee_tabs[tab].append(k)
120  ee_tabs[thistab].append(k)
121  ee_grps[grp].append(k)
122
123
124import sys
125
126kf = []
127kfn = []
128kfxx = []
129kfgp = []
130knf = []
131kmapmap = {}
132for k in ee_tabs.keys():
133  k1 = kmap.get( k,k)
134  if string.find( k1, ' ' ) != -1:
135    k2 = string.split(k1)[0]
136  else:
137    k2 = k
138
139  k2 = kmap.get( k2,k2)
140
141  if k2 in ['new','']:
142     kfn.append(k)
143     kmapmap[k] = 'new'
144  elif sx.ee_miptables_old.has_key(k2):
145     kf.append(k)
146     kmapmap[k] = k2
147  elif ee_grps.has_key(k2):
148     kfgp.append(k)
149     kmapmap[k] = k2
150  else:
151    if sx.ee_miptables_old.has_key('CMIP5_%s' % k2 ):
152      kfxx.append(k)
153      kmapmap[k] = 'CMIP5_%s' % k2
154    else:
155      knf.append(k)
156
157thisd = {}
158print 'Missing groups'
159for k in knf:
160  thise = collections.defaultdict( int )
161  for k2 in ee_tabs[k]:
162    thise[sx.ee0[k2][12-2]] += 1
163  keys = thise.keys()
164  keys.sort()
165  thisd[k] = keys[:]
166  print 'ERROR.020.0001: Missing Group: %s :: %s' % (k, keys)
167   
168### look for new variables in variable groups.
169class d1(object):
170  def __init__(self):
171    self.d = collections.defaultdict( list )
172    self.onItemNotFound = 'error'
173
174  def keys(self):
175    return self.d.keys()
176
177  def __setitem__(self,k,v):
178    self.d[k].append(v)
179
180  def __itemNotFound__(self,k):
181    if self.onItemNotFound == 'error':
182      raise  KeyError( 'Key %s not found in dictionary keys' % k)
183   
184  def __getitem__(self,k):
185    if self.d.has_key(k):
186      return self.d[k]
187    else:
188      return self.__itemNotFound__(k)
189
190## look up table, giving uuid from old mip tables for each mip, var combination.
191mvlookup = collections.defaultdict( d1 )
192mvlookup2 = collections.defaultdict( list )
193
194ee_unusedVars = []
195nok = 0
196nn = 0
197ee0_null = collections.defaultdict( list )
198ee0_xref = collections.defaultdict( list )
199ee0_xref_old = collections.defaultdict( list )
200for t in sx.ee_miptables_old.keys():
201  for u in sx.ee_miptables_old[t]:
202    v1 = sx.ee_mip[u][15]
203    v2 = sx.ee_mip[u][21]
204    if v2 != '':
205      vid = v2
206    else:
207      vid = v1
208    mvlookup[t].d[vid].append( u )
209
210for u in sx.eeold.keys():
211  mvlookup2[sx.eeold[u][1]].append(  u )
212
213##for k in kfn:
214  ##for u in ee_tabs[k]:
215
216
217## ee0_xref values are values of ee_var_nv1
218for u in sx.ee0.keys():
219    var = string.strip(sx.ee0[u][1])
220    tab =  kmapmap.get(tabref1(sx.ee0[u][2]), None )
221    if ee_var_nv1.has_key(var):
222      nok += 1
223      ee_usedVars[var].append( u )
224## reference to kex in eenv
225      ee0_xref[u] += ((0,ee_var_nv1[var] ),)
226    elif ee_var_nv1.has_key(var + "**"):
227      nok += 1
228      ee_usedVars[var].append( u )
229      ee0_xref[u] += ((0,ee_var_nv1[var + "**"] ),)
230    else:
231      ok = False
232      if mvlookup.has_key(tab):
233        if mvlookup[tab].d.has_key( var ):
234          ul = mvlookup[tab].d[var]
235          if len(ul) > 1:
236            print 'ERROR.001.011: variable %s has multiple entries %s' % (var,tab)
237          ee0_xref[u] += ((1,[ul[0],]),)
238          ok = True
239        else:
240          emsg = '.001.010: variable %s not found in %s' % (var,tab)
241      else:
242          emsg = '.001.012: [%s] table not found: %s' % (var,tab)
243
244      if not ok:
245        if mvlookup2.has_key( var ):
246          if len( mvlookup2[var] ) == 1:
247             ee0_xref[u] += ((2,[mvlookup2[var][0],]),)
248             ok = True
249             print 'WARN' + emsg + ' [alternative found]'
250          else:
251            print 'ERROR' + emsg
252
253      if not ok:
254        print 'ERROR.090.077000:',tab,sx.ee0[u]
255        ee0_xref[u] += ((-1,['__var_not_found_012__',]),)
256 
257        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] == '#' ):
258          ee0_null[u].append( '# comment' )
259        elif ( len(sx.ee0[u][0]) > 5 and sx.ee0[u][0][:4] == 'PMIP' ) and ( sx.ee0[u][1] in ['','*'] ):
260          ee0_null[u].append( 'PMIP bulk copy' )
261        elif len(sx.ee0[u][1]) == 0 and  len(sx.ee0[u][2]) == 0:
262          ee0_null[u].append( 'comment' )
263        else:
264          nn += 1
265          ee_unusedVars.append((u,var))
266   
267print nn, nok
268nok = 0
269nn = 0
270thise1 = []
271uclear = {}
272### run through CMIP5 variables which are modified, re-used etc in new CMIP6 groups.
273### 43 not found .... as above .....
274for k in kf + kfxx:
275  k2 = kmapmap[k]
276  for u in ee_tabs[k]:
277    var = string.strip(sx.ee0[u][1] )
278    if not var in sx.ee_miptables_vars_old[k2]:
279       print 'ERROR.0001.002: variables in sx.ee0 [new groups] not found: ',k,var,sx.ee0[u]
280       nn += 1
281    else:
282       ee_usedVars[var].append( u )
283
284    ok = False
285    if sx.ee_ovars_old.has_key('%s.%s' % (k2,var)):
286      uclear[u] = sx.ee_ovars_old['%s.%s' % (k2,var)]
287      ok = True
288    elif sx.ee_ovars_old.has_key('%s.%s**' % (k2,var)):
289      uclear[u] = sx.ee_ovars_old['%s.%s**' % (k2,var)]
290      ok = True
291    elif len(string.split( k, ' ')) > 1:
292      bits = string.split( k, ' ')
293      v1 = string.strip(bits[1])[1:-1]
294      if sx.ee_ovars_old.has_key('%s.%s' % (k2,v1)):
295        uclear[u] = sx.ee_ovars_old['%s.%s' % (k2,v1)]
296        ok = True
297     
298    if not ok:
299      thise1.append((u,k2,var))
300       ##ee0_xref_old[u]
301
302ee_mv0 = {}
303ee_mv1 = {}
304ee_mv2 = {}
305ee_mv3 = {}
306for k in sx.eeold.keys():
307  k1 = sx.eeold[k][7]
308  assert k1[:3] == 'mv.', 'Key not in correct syntax: %s' % k1
309  ee_mv0[k1] = k
310  k2 = sx.eeold[k][8]
311  if k2 != "":
312    if k2 in ["*omit",'null','Depricated']:
313      if k2 in ["*omit",'Depricated']:
314        ee_mv3[ k1 ] = k2
315    else:
316      starflag = False
317      if k2[0] == '*':
318        k2 = k2[1:]
319        starflag = True
320      assert k2[:3] == 'mv.', 'target key not in correct syntax: %s' % k2
321      if starflag:
322        ee_mv2[k1] = k2
323      else:
324        ee_mv1[k1] = k2
325
326for k in ee_mv1.keys():
327  assert ee_mv0.has_key(k), 'key cross-ref not found: %s' % k
328
329ll_ov = []
330for k in ee_mv0.keys():
331  if not (ee_mv3.has_key(k) or ee_mv1.has_key(k)):
332    ll_ov.append( ee_mv0[k] )
333print 'Number of old variables: %s [%s]' % (len(ll_ov), len(ee_mv0.keys()) )
334print len(sx.eenv.keys())
335print "Number of new variables: %s" % ( len(sx.eenv.keys()) )
336##
337## extract variable name, units, standard name, long name, comment
338nt_vrecix = collections.namedtuple( 'vrecix', ['v','u','s','l','c'] )
339vrecix_new = nt_vrecix._make( (5,9,6,10,11) )
340vrecix_old = nt_vrecix._make( (1,5,3,2,4) )
341
342nnf = 0
343nnm = 0
344nno = 0
345for k in sx.ee_mip.keys():
346   t = map( lambda x: sx.ee_mip[k][x], [15,10,8,1,17] )
347   h = hashlib.md5(string.join(t) ).hexdigest()
348   if not sx.ee_xref_bck.has_key(k):
349     r1 = sx.ee_mip[k][1]
350     if r1 in ['','29'] or r1[:23] == 'Reference to literature' or r1[:15] == '(copied from 3D':
351       print 'WARN.002.0010: dud record',sx.ee_mip[k], sx.ee_mip[k][-2][:4] 
352     else:
353       print 'ERROR.002.0010: missing back reference',sx.ee_mip[k], sx.ee_mip[k][-2][:4] 
354       nnf += 1
355   elif len(sx.ee_xref_bck[k]) > 1:
356     nnm += 1
357     print 'ERROR.0001.001: #######', sx.ee_mip[k]
358     for k2 in sx.ee_xref_bck[k]:
359       print sx.eeold[k2]
360
361print '#### Number of missing back references: %s (%s)' % (nnf,nno)
362   
363
364class dopenxx(object):
365  def __init__(self):
366    self.fn = 'xx_%s' % str( uuid.uuid1() )
367    self.oo = open('%s/%s' % (self.odir,self.fn), 'w' )
368  def write(self,x):
369    self.oo.write(x)
370  def close(self,rename=None):
371    self.oo.close()
372    if rename != None:
373      os.rename( '%s/%s' % (self.odir,self.fn), '%s/%s' % (self.odir,rename) )
374
375class dopen(object):
376  def __init__(self,odir='./'):
377    if not os.path.isdir(odir):
378      os.mkdir(odir)
379    self.odir = odir
380    self.a = collections.defaultdict( self.ClassFact() )
381  def close(self,k,rename=None):
382    if self.a.has_key(k):
383      self.a[k].close(rename=rename)
384      self.a.__delitem__(k)
385
386  def ClassFact(self):
387     class dopenyy(dopenxx):
388       """Inherits all methods from dreqItemBase"""
389
390     dopenyy.odir = self.odir
391     return dopenyy
392print 'INFO 001 ##################',nnf, nnm
393
394##sh = shelve.open( 'shelve_vars' )
395sh = shelve.open( '%s/cmipVars' % odir, 'n' )
396sh['__info__'] = { 'label':'cmipVars', 'title':'CMIP variables', 'prov':'sx.eenv and sx.eeold' }
397sh['__cols__'] = ['label','title','sn','units','description','procnote','procComment','prov','priority0','realm0']
398
399ee = {}
400for k in sx.eenv.keys():
401  this = nt_vrecix._make( map( lambda x: sx.eenv[k][x], vrecix_new ) )
402  ##sh[k] = { 'label':this.v, 'title':this.l, 'sn':this.s, 'units':this.u, 'description':this.c, 'procnote':'', 'procComment':'','prov':'CMIP6 endorsement' }
403  prov = 'CMIP6 endorsement [%s]' % sx.eenv[k][1]
404  sh[k] = [ this.v, this.l, this.s, this.u, this.c, '', '',prov, sx.eenv[k][0], sx.eenv[k][8] ]
405  ee[this.u] = k
406  if this.u == 'atmos':
407     print 'ERROR: bad units',k, sx.eenv[k]
408print '################################### var units #################'
409print ee.keys()
410print '##########################################################'
411
412nk = 0
413for k in ll_ov:
414  this = nt_vrecix._make( map( lambda x: sx.eeold[k][x], vrecix_old ) )
415  ##sh[k] = { 'label':this.v, 'title':this.l, 'sn':this.s, 'units':this.u, 'description':this.c, 'procnote':'', 'procComment':'','prov':sx.eeold[k][6]}
416  if this.v in sx.cmip5ByVar.keys():
417    s = set()
418    for t in sx.cmip5ByVar[this.v]:
419      s.add( sx.cmip5so.so[t].a[this.v][18] )
420
421    s = list(s)
422    rlm0 = string.join( s )
423  elif this.v in sx.eenvo:
424    rlm0 = sx.eenvo[this.v][0][8]
425    print 'INFO.llll: using eenvo .....',this.v
426  else:
427    rlm0 = '__na__'
428     
429  sh[k] = [ this.v, this.l, this.s, this.u, this.c, '', '',sx.eeold[k][6], 101, rlm0 ]
430  nk += 1
431
432print len( sx.eenv.keys() ) + len(ll_ov), len( sh.keys() ),  len( sx.eenv.keys() )
433sh.close()
434 
435###
436###  shelve contains 1682 variables, of which 561 are new.
437###
438   
439### have lost somewhere the var/cmor var distinction. E.g. hfibthermds/hfibthermds2d  --- 2 CMOR variable names with a single output variable name.
440### But this will not be in the physical variable -- so should come in the output variable record.
441
442class c1(object):
443  def __init__(self):
444    self.d = collections.defaultdict( int )
445class c2(object):
446  def __init__(self):
447    self.d = collections.defaultdict( list )
448ee = collections.defaultdict( int )
449ff = collections.defaultdict( c1 )
450#count different shapes:
451blk = collections.defaultdict( c2 )
452for k in sx.ee0.keys():
453  ee[sx.ee0[k][5]] += 1
454  ff[sx.ee0[k][5]].d[sx.ee0[k][10]] += 1
455  blk[sx.ee0[k][5]].d[sx.ee0[k][10]].append(k)
456keys = ee.keys()
457keys.sort()
458print keys
459#######################################
460eeo = collections.defaultdict( int )
461ffo = collections.defaultdict( c1 )
462#count different shapes:
463hdims = [ 'latitude','longitude']
464vdims = [ 'alevel','alevhalf', 'olevel', 'rho', 'alt40', 'location', 'plev','alev1', 'plev3', 'plev7', 'plev8', 'plevs', 'sdepth']
465
466catdims = ['site', 'basin', 'oline', 'dbze', 'scatratio', 'sza5', 'tau', 'vegtype', 'vgidx']
467tdims = ['time','time1','time2']
468
469knowndims = hdims + vdims + catdims + tdims
470
471nsmap = {'':'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'}
472## XYZ: this occurs only in FAFMIP
473## XYZT:  {'C4MIP': 80, 'PMIP': 10, 'RFMIP': 3, 'CFMIP': 19, 'LS3MIP': 8, 'GeoMIP': 1, 'HighResMIP': 82}
474##   need to follow up on what is vertical.  # of levels is captured in most cases.
475##   PMIP: email sent -- 29th June : some ocean, some atmos
476##   LS3MIP: soil or snow layers,
477## RFMIP: all levels.
478## XYZKT: CFMIP  -- K has various forms.
479## XKT: PMIP  -- salt transport -- should be lat-basin-time?
480## blank:  {'LUMIP': 40, 'PMIP': 11, 'RFMIP': 4, 'HighResMIP': 11, 'FAFMIP': 3, 'DynVar': 10}
481#-----  RFMIP: scalar .... email sent -- these ar OfflineRad varibles.
482#-----  LUMIP: XYT
483#-----  PMIP: occurs in bulk copy requests .....
484#-----  HighResMip: occurs in comment lines
485#-----  FAFMIP: occurs in comment lines
486#-----  DynVar: probably XYZT -- need to check whether on model or pressure levels.
487## YZT: 'DAMIP': 4, 'VolMIP': 2, 'HighResMIP': 10, 'SolarMIP': 4
488# ----  DAMIP: zonal mean, 17 or 23 levels (pressure) ..
489# ----  VolMIP: zonal mean, all levels
490# ----  HighResMIP: zonal mean, 36 levels
491# ----  SolarMIP: zonal mean, 17 or 23 levels.  (withdrawn and merged with DAMIP ....).
492## scalar: 'ISMIP6': 8, 'SIMIP': 6
493##  --> to KT, with K set to icesheet/hemisphere
494## ----- SIMIP: time (monthly)
495## '?': PMIP, for variables specified in C4MIP.
496##
497
498ed = collections.defaultdict( c1 )
499for k in sx.ee_mip.keys():
500  dl = sx.ee_mip[k][-1]
501  if dl == 's|c|a|l|a|r':
502     dl = 'scalar'
503  dd = string.split( dl, '|' )
504  for d in dd[:-1]:
505   
506    ed[d].d[dd.index(d)] += 1
507  ed[dd[-1]].d['f'] += 1
508  eeo[sx.ee_mip[k][-1]] += 1
509  ffo[sx.ee_mip[k][-1]].d[sx.ee_mip[k][-2]] += 1
510keys = eeo.keys()
511keys.sort()
512
513nkn = []
514for k in ed.keys():
515  if k not in knowndims:
516    nkn.append(k)
517nkn.sort()
518
519presetlinks = {}
520shlnks = shelve.open( '%s/requestLinks_tmp' % odir, 'r' )
521for k in shlnks.keys():
522  if k[0] != '_':
523    if shlnks[k][9] > -1:
524      print 'INFO.aaa.00001: Priority reset ',shlnks[k]
525      presetlinks[ '%s.%s' % (shlnks[k][1],shlnks[k][2]) ] = shlnks[k][9]
526##
527## read in provisional request groups --- based on request scoping sheet
528##
529shrvg = shelve.open( '%s/requestVarGroup_tmp' % odir, 'r' )
530eervg = collections.defaultdict( list )
531##
532## construct look-up by label
533##
534for k in shrvg.keys():
535  if k[0] != '_':
536    ##assert not eervg.has_key( shrvg[k][2] ), 'Duplicate rvg: %s' % shrvg[k][2]
537    eervg[shrvg[k][2]].append( k )
538     
539
540sh = shelve.open( 'dreq_consol_tables_reviewed_b_v%s' % vdate, 'r' )
541revTabIds = Set( sh.keys()[:] )
542sh.close()
543
544## parse 1
545ee0_p1 = {}
546ee0_gp = collections.defaultdict( d1 )
547st1 = set()
548for k in sx.ee0.keys():
549  r = list(sx.ee0[k][:] )
550  if r[1] != '' and r[1][0] != '#':
551    if ee0_xref.has_key(k):
552      r1 = ee0_xref[k]
553      assert len(r1) == 1, 'FATAL:001.0001: unexpected duplicate cross ref, %s   %s %s' % (k,str(r1),str(r) )
554      assert len(r1[0][1]) == 1, 'FATAL:001.0002: unexpected duplicate cross ref, %s   %s %s' % (k,str(r1),str(r) )
555      r += [r1[0][0],r1[0][1][0]]
556    else:
557      r += [-1,'__none__']
558    ee0_p1[k] = r[:]
559    ee0_gp[r[0]][r[10]] = k
560    st1.add( r[10] )
561    if r[0] == '':
562       print '################'
563       print r
564
565##assert 'CFMIP' in st1, 'FAILED sanity check 1 ... CFMIP not in st1 %s' % str(st1)
566assert len( list(st1) ) < 40, 'FAILED sanity check 2 ... too many items in st1 [should be list of MIPs] %s' % len(list(st1))
567print '###################   groups referenced from new groups sheets'
568print ee0_gp.keys()
569k1 = ee0_gp.keys()
570k1.sort()
571kmapk1 = {}
572for k in k1:
573  assert len(ee0_gp[k].keys()) in  [0,1], 'Multiple references to %s' % k
574  for k2 in ee0_gp[k].keys():
575    if eervg.has_key( '%s.%s' % (k2,k) ):
576      kmapk1[k] = ('%s.%s' % (k2,k),'newGp')
577    else:
578      kmapk1[k] = ('%s.%s' % (k2,k),'unresolved')
579
580gpids = []
581for k in kmapk1.keys():
582  gpids.append(kmapk1[k][0])
583kmapk2 = {}
584
585mmmm = [('C_OceanT1', 'C_Ocean_T1'), ('C_OceanT2', 'C_Ocean_T2'), ('3hr_extreme','3hr_extr'), ('Amon_extreme','Amon_ext'), \
586        ('Amon_convection','Amon_conv'), ('L3hr','L_3hr'), ('LEday','L_day'), ('DYNVAR_day','DYVR_daily') ]
587mmmm = [('C_OceanT1', 'C_Ocean_T1'), ('C_OceanT2', 'C_Ocean_T2'), ('3hr_extreme','3hr_extr'), ('Amon_extreme','Amon_ext'), \
588        ('Amon_convection','Amon_conv'), ('L3hr','L_3hr'), ('DYNVAR_day','DYVR_daily') ]
589kmap000 = {}
590for t in mmmm:
591  kmap000[t[0]] = t[1]
592
593##
594## check links from variable output specs to group.
595## need to identify what is meant by group labels in "Request Scoping" -- now in eervg.keys()
596##
597## 29th July: loosing some links for groups of revised table items ....
598##
599## these are the reviewed cmip5 standard output tables.
600##
601tabuuidrefs = collections.defaultdict( int )
602
603###
604### get some tables for looking up links from shelve
605###
606shbx = dreq_utils.parseShb(vdate,sx,cmip5gplk)
607
608gpids = gpids + shbx.revisedTabKeysff
609ks = eervg.keys()
610ks.sort()
611for k0 in ks:
612  a,b = string.split(k0,'.')
613  print 'k0:: ',a,b
614  if kmap000.has_key(b):
615    k = '%s.%s' % (a,kmap000[b])
616  else:
617    k = k0
618  ok = False
619  if b[:5] == 'CCMI1':
620    b1,b2 = string.split(b, '_' )
621    if ccmivgrdict.has_key( b2):
622      ok = True
623      kmapk2[k0] = ('CCMI',b2)
624  elif b[:5] == 'SPECS':
625    b1,b2 = string.split(b, '_' )
626    if b2 in specsvgr:
627      ok = True
628      kmapk2[k0] = ('SPECS',b2)
629    elif b2 == 'Amon':
630      kmapk2[k0] = ('SPECS','mon')
631      ok = True
632  if not ok:
633    if k in gpids:
634    ## print 'OK1: ',k
635      kmapk2[k0] = ('new',k)
636      ok = True
637    elif a in ['LUMIP','LS3MIP']:
638      tk = 'C4MIP.%s' % kmap000.get(b,b)
639      if tk in gpids:
640        kmapk2[k0] = ('new',tk)
641        ok = True
642    elif a in ['VolMIP','DAMIP']:
643      tk = 'DynVar.%s' % kmap000.get(b,b)
644      if tk in gpids:
645        kmapk2[k0] = ('new',tk)
646        ok = True
647    ##elif a in ['HighResMIP'] and b in subgroups:
648        ##kmapk2[k0] = ('CMIP5',tk)
649        ##ok = True
650  if not ok:
651## revTabIds has table names, revGpIds has group names
652    if k in revTabIds or k in shbx.revGpIds:
653      if k in shbx.revGpIds:
654         print 'OK2: ',k
655      kmapk2[k0] = ('CMIP5Rev',k)
656    else:
657      if b in cmip5vgr:
658        kmapk2[k0] = ('CMIP5',b)
659      elif b in cmip5tbs0:
660        kmapk2[k0] = ('CMIP5',b)
661      else:
662        print 'WARN.080.09001: nomap for ',b,k
663        kmapk2[k0] = ('nomap',k)
664   
665print '###############################################################'
666print '###############################################################'
667##
668## following list currently contains separate entries for group references from different MIPs --- want to have a single one
669## here, and multiple references to it ...
670##
671rvgref2 = collections.defaultdict( list )
672lookup1a = collections.defaultdict( d1 )
673lookup1b = {}
674lookup1 = collections.defaultdict( d1 )
675lookup2 = collections.defaultdict( d1 )
676import sx2_extra as sx2e
677rvguids = set()
678#### prepare for requestVarGroup ###########
679## C4MIP-OceanT2        C4MIP: C4MIP-OceanT2    C4MIP   new     C4MIP.C_Ocean_T2
680## label title mip ref refNote
681
682####
683#### reconfigure to uuid, mip, label (no "."), title, class, refNote
684#### for "ttt==new", use sx2e.ngmap( kkk ) to give labels, keep kkk as refNote, ttt --> class
685###
686### lookup1: constructed from requestVarGroup list
687for k in shrvg.keys():
688  if k[0] != '_':
689    id0 = shrvg[k][2]
690    ttt,kkk = kmapk2[id0]
691    lookup1a[ttt].d[kkk].append(k)
692    if ttt == 'new':
693      rvgref2[kkk].append( shrvg[k][0] )
694
695for k in lookup1a.keys():
696  for k2 in lookup1a[k].d.keys():
697    id0 = lookup1a[k].d[k2][0]
698    id =  str( uuid.uuid1() )
699    lookup1[k].d[k2].append( id)
700    lookup1b[id0] = id
701
702###
703## add cmip5tbs to lookup, so that these will be picked up in links from "rqeuestLinks"
704for g in cmip5tbs:
705  ####cmip5tbs.append( [u,"CMIP6",k,"CMIP6 CMOR Table: %s" % k, "CMIP5", "CMIP5 MIP Table: %s" % k] )
706  k = g[2]
707  u = g[0]
708  lookup1['CMIP5'].d[k] = [u,]
709 
710### shlnks carries the "request scoping rows" ###
711ndup = 0
712for k in shlnks.keys():
713  thistr = False
714  if k[0] != '_':
715    if shlnks[k][9] > -1:
716      print 'INFO.aaa.00001: Priority reset ',shlnks[k]
717    if shlnks[k][2][-4:] == '_oth':
718      thistr = True
719    k1 = '%s.%s' % (shlnks[k][1],shlnks[k][2])
720    if thistr:
721      print k1
722    assert kmapk2.has_key(k1), 'Key missing  %s, %s' % (k,k1)
723     
724    ttt,kkk = kmapk2[k1]
725    id = lookup1[ttt].d[kkk][0]
726    if thistr:
727         print 'INFO.aaa.00002: ', ttt,kkk,id
728    if id == k:
729      print '***DUPLICATE:',k,k1, ttt, kkk, lookup1[ttt].d[kkk]
730      ndup += 1
731
732assert ndup==0, ndup
733
734tmp = collections.defaultdict( list )
735for k in lookup1.keys():
736  for k2 in lookup1[k].d.keys():
737    if k2 in presetlinks:
738      print 'INFO.aaa.00200: preset refound,', k2
739    for idi in lookup1a[k].d[k2]:
740      print 'INFO.bbb.0001: ',k,shrvg[idi]
741      id = lookup1[k].d[k2][0]
742    ####idi = lookup1a[k].d[k2][0]
743      id0 = shrvg[idi][2]
744      mip = shrvg[idi][1]
745      ttt,kkk = kmapk2[id0]
746      cls = k
747      assert  cls == k, 'Mismatch in lookup1'
748      refNote = k2
749      kl = 0
750      lab = '__unset__'
751    ##print k2, cls
752      if cls == 'new':
753        if kkk in shbx.revisedTabKeys:
754          lab = kkk
755          cls = 'rev'
756          lab = string.replace( kkk, '.', '-' )
757          kl = 1
758        else:
759          if not sx2e.ngmap.has_key(kkk):
760            print 'ERROR.002.0001: key %s not found' % kkk
761          else:
762            lab = sx2e.ngmap[kkk]
763            kl = 2
764      elif cls == 'CMIP5':
765        lab = string.replace( k2, '_', '-' )
766        kl = 3
767      elif cls in ['CMIP5Rev','rev']:
768        lab = string.replace( k2, '.', '-' )
769        kl = 4
770      elif cls == 'nomap':
771        lab = string.replace( k2, '.', '-' )
772        kl = 5
773        lab = string.replace( lab, '_', '-' )
774      else:
775        lab = '%s-%s' % (mip,k2)
776        kl = 6
777      if sx2e.r1.match( lab ) == None:
778        print 'NON_COMPLIANT label', lab,k2, cls
779      rec, sup = ([id,mip,lab,'%s: %s' % (mip,lab), cls, refNote],[ttt,kkk])
780      if string.find( string.join( rec ), '__unset__' ) != -1:
781         print 'INFO.ppp.00003: ',rec, sup, lab,k2, cls, kl
782      if refNote == 'C4MIP.Lmon':
783        print 'WARN.051.00001: ',rec,sup, lab,k2, cls, kl
784##['6a7ed72e-98d7-11e5-9c3a-ac72891c3257', 'LUMIP', u'C4MIP-Lmon', u'LUMIP: C4MIP-Lmon', 'rev', u'C4MIP.Lmon'] ['new', u'C4MIP.Lmon'] C4MIP-Lmon C4MIP.Lmon rev 1
785      print 'INFO.bbb.0002: ',id,rec,sup
786      tmp[id].append(  (rec, sup) )
787
788sh = shelve.open( '%s/requestVarGroup' % odir, 'n' )
789sh['__info__'] = { 'label':'requestVarGroup', 'title':'Identify variable groups' }
790sh['__cols__'] = [ 'uuid', 'mip', 'label','title','ref','refNote']
791sss = collections.defaultdict( list )
792for id in tmp.keys():
793  dosh = False
794  trc = '>'
795  if len(tmp[id]) == 1:
796    rec,sup = tmp[id][0]
797    dosh = True
798    tr = 1
799  else:
800    s = {tuple(sup) for rec,sup in tmp[id]}
801    if len(s) == 1:
802      rec,sup = tmp[id][0]
803      dosh = True
804      tr=2
805    else:
806      tr=3
807      print 'ERROR.070.0020: ambiguous variable groups '
808      for l in tmp[id]: 
809        print l
810
811  if sup[0] not in ['new','CMIP5Rev']:
812      ttt, kkk = sup
813      lab = '%s-%s' % (ttt,kkk)
814      cls, refNote = rec[-2:]
815      rec = [id,ttt,lab,'%s: %s' % (ttt,kkk), cls, refNote]
816      print 'INFO:070.0001: modifying record: %s  --> %s' % (mip,ttt)
817      tr += 0.5
818      trc += 'mod:'
819
820  kc = '%s.%s' % (rec[-2],rec[-1])
821  if rec[-2] == 'CCMI':
822    kc = '%s1.%s' % (rec[-2],rec[-1])
823    print 'WARN.080.08100: adjusting CCMI  to CCMI1: ',rec
824  if kc == 'SPECS.6hr':
825     print kc, rec, tr
826  if kc[:4] == 'CCMI':
827     print 'INFO.cccc: ',rec
828  sss[kc].append( id )
829  rvguids.add( rec[0] )
830  uidgen[ kc ] = uid1(uid=rec[0])
831
832  print 'rvg:: ',rec
833  if rec[3] in ['CMIP6 CMOR Table: Oyr',]:
834     print 'INFO.ppp.00001: omitting ',rec
835  else:
836    sh[rec[0]] = rec
837
838a = {k for k in sss.keys() if len(sss[k]) > 1}
839if len(a) > 0:
840  for k in a:
841    print 'SEVERE.090.0001: ',k,sss[k]
842
843##
844## appears to have become redundant
845##
846dosi = False
847if dosi:
848  for k in ['seaiceday', 'seaicemon']:
849    id =  str( uuid.uuid1() )
850    mip = 'SIMIP'
851    lab = '%s-%s' % (mip,k)
852    title = '%s: %s' % (mip,k)
853    cls = 'newOrp'
854    refNote = '%s.%s' % (mip,k)
855    rvguids.add( id )
856    sh[id] = [id,mip,lab,title, cls, refNote]
857    lookup1[cls].d[refNote].append(id)
858     
859## add CMIP5 groups .........
860for g in cmip5tbs:
861  kc = '%s.%s' % (g[-2],g[-1])
862  sss[kc].append( g[0] )
863  rvguids.add( g[0] )
864  if g[3] in ['CMIP6 CMOR Table: Oyr',]:
865     print 'INFO.ppp.00002: omitting ',g
866  else:
867    sh[g[0]] = g[:]
868sh.close()
869
870##############################################
871a = {k for k in sss.keys() if len(sss[k]) > 1}
872if len(a) > 0:
873  for k in a:
874    print 'SEVERE.090.0002: ',k,sss[k]
875##############################################
876
877sh = shelve.open( '%s/requestVarSections' % odir, 'n' )
878sh['__info__'] = { 'label':'requestVarGroup', 'title':'Identify variable groups' }
879sh['__cols__'] = [ 'uuid', 'gpid', 'mip', 'label','title','ref','refNote']
880## add CMIP5 groups .........
881for g in cmip5gps:
882  sh[g[0]] = g[:]
883sh.close()
884########
885######## this does not work .... the variables need to be added to "revTabItems",
886######## with link to variable group associated with the CMIP5 group.
887######## latter should be available through "CMIP5-Omon_3d" etc....:
888
889##
890
891err001 = collections.defaultdict( int )
892sh = shelve.open( '%s/groupItems' % odir, 'n' )
893sh['__info__'] =  {'label':'groupItems', 'title':'List of items in new groups', 'description':"New groups" }
894##(u'DYVR_daily', u'utendnogw', '', u'daily', '', '', '', '', '', u'DynVar', 'DynVar', '772da0b6-25b6-11e5-8cf6-ac72891c3257')
895sh['__cols__'] = ['group','var','table','freq','', 'shape', '', '', '','mip','mip?','uuid','rowIndex','new','gpid','vkey','vid']
896for k in ee0_p1.keys():
897    kkk = '%s.%s' % (ee0_p1[k][10],ee0_p1[k][0])
898    ##if not sx2e.ngmap.has_key(kkk):
899    if lookup1['new'].d.has_key(kkk):
900       id = lookup1['new'].d[kkk][0] 
901    elif lookup1['newOrp'].d.has_key(kkk):
902       id = lookup1['newOrp'].d[kkk][0] 
903    else:
904       id = None
905       err001[kkk] += 1
906    r = ee0_p1[k][:]
907    if id != None:
908      r[-2] = 1
909      r[-1] = id
910    else:
911      r[-2] = -1
912      r[-1] = '__none__'
913    t = ee0_xref[k][0]
914    r += [t[0],t[1][0]]
915    if r[1] == 'sisnconc':
916      print 'INFO.sisnconc.0001:', r
917    sh[k] = r[:]
918sh.close()
919
920sh = shelve.open( '%s/requestLinks' % odir, 'n' )
921sh['__info__'] = { 'label':'requestLinks', 'title':'Links from variable groups to a request id' }
922sh['__cols__'] = [ 'uid', 'mip', 'tab','objective','grid','gridreq','comment','opt','opar','preset','ref','refNote','refid']
923ndup = 0
924for k in shlnks.keys():
925  if k[0] != '_':
926    k1 = '%s.%s' % (shlnks[k][1],shlnks[k][2])
927    preset = shlnks[k][9]
928    assert kmapk2.has_key(k1), 'Key missing  %s, %s' % (k,k1)
929    if not kmapk2.has_key(k1):
930      #print '###########',shlnks[k]
931      pass
932    else:
933      ttt,kkk = kmapk2[k1]
934
935      if shbx.revisedTabKeysNM.has_key(k1):
936        print 'INFO.010.0010: Replacing link for %s' % k1
937        id = shbx.revisedTabKeysNM[k1]
938      else:
939        id = lookup1[ttt].d[kkk][0]
940
941      if preset > -1:
942        print 'INFO.aaa.00100: ', shlnks[k], kmapk2[k1], id
943      sh[k] = list( shlnks[k] ) + list( kmapk2[k1] ) + [id,]
944      if id not in rvguids:
945        print 'ERROR.080.06005: Request variable group link broken:', sh[k]
946    if sh[k][0] == sh[k][-1]:
947      print 'DUPLICATE LINK:',k,sh[k]
948      ndup += 1
949print 'INFO: Number of duplicates %s (%s)' % (ndup, len(sh.keys()))
950sh.close()
951## link to group items is now via mip + group id, using stuff from kmapk2 ....
952
953dorest = True
954
955class psort(object):
956
957   def __init__(self):
958     pass
959
960   def p(self,z):
961     return tabpri.get(z,9)
962
963   def cmp(self,x,y):
964     return cmp( self.p(x), self.p(y) )
965
966if dorest:
967 tabpri = { 'SPECS':2, 'CMIP5':0, 'CORDEX':3, 'PMIP3':4 }
968
969 gg = {}
970 for k in sx.eeold.keys():
971  if sx.eeold[k][7][:6] == 'mv.005':
972    gg[sx.eeold[k][1]] = k
973###
974### BUT need to get full OMIP records in here ......
975 cmip5GroupCol = collections.defaultdict( list )
976 sh = shelve.open( '%s/refTableItems' % odir, 'n' )
977 sh['__info__'] =  {'label':'refTableItems', 'title':'List of items in reference tables', 'prov':'sx.ee_mip' }
978 sh['__cols__'] = ['uuid', 'comment', 'deflate_level', 'shuffle', 'ok_max_mean_abs', 'flag_meanings', \
979                          'type', 'ok_min_mean_abs', 'standard_name', 'deflate', 'long_name', 'valid_min',\
980                           'cell_methods', 'flag_values', 'cell_measures', 'out_name', 'modeling_realm', 'units',\
981                           '#cell_methods', 'valid_max', 'positive', 'var', 'mipTable','dimensions','vid','gpid','ssect','priority'] 
982
983## added gpid for link to variable group .... not clear at this point how OMIP to be dealt with here.
984## for sections, perhaps need new section linking sections to groups ....
985
986 vdefex = {}
987 rwixkkk = 0
988 for k in sx.ee_mip.keys():
989  gpid = '__group_unknown__'
990  rwix = 0
991  mipt = sx.ee_mip[k][22]
992  if shbx.tabuuid.has_key( mipt ):
993    gpid = shbx.tabuuid[mipt]
994  p = 0
995  ssect = ''
996  if mipt[:4] in { "CMIP", "CCMI", "SPEC", "CORD"}:
997    m,t = string.split( mipt, '_' )
998# output name
999    v0 = sx.ee_mip[k][15]
1000# variable name
1001    v1 = sx.ee_mip[k][21]
1002    if type(v0) == type( 'y' ) and v0 not in ['', ' ']:
1003      v1 = v0
1004
1005    if v1 == 'rtmt':
1006      print 'xxyyyy',v1,sx.ee_mip[k]
1007
1008    trc = []
1009    if m == "CMIP5":
1010      assert cmip5gplk.has_key(t), 'ERROR.009.0010: CMIP5 table link not found for %s' % mipt
1011      gpid = cmip5gplk[t]
1012      assert sx.cmip5so.so.has_key(t), 'Key %s not found in cmip5.so keys' % t
1013      if not sx.cmip5so.so[t].a.has_key(v1):
1014        if t in sx.cmip5so.sx and v1 in sx.cmip5so.sx[t].a:
1015          print 'ERROR.030.0001xx: Variable %s not found in cmip5so %s' % (v1,t)
1016        else:
1017          print 'ERROR.030.0001: Variable %s not found in cmip5so %s' % (v1,t)
1018        p = 0
1019        trc.append( 'p0' )
1020      else:
1021        p = sx.cmip5so.so[t].a[v1][0]
1022        trc.append( 'pp' )
1023        rwix = sx.cmip5so.so[t].a[v1][23]
1024        si = sx.cmip5so.so[t].a[v1][24]
1025        try:
1026          rwix = rwix + 200*si
1027        except:
1028          print sx.cmip5so.so[t].a[v1], len(sx.cmip5so.so[t].a[v1])
1029          raise
1030
1031## the "Oyr" group is for import, not needed in request
1032      if t in cmip5GroupsIx and t not in ['Oyr','Amon']:
1033        trc.append( 'ix' )
1034      ##assert cmip5GroupsIVAR[t].has_key(v1) or cmip5GroupsIVAR[t].has_key(v0), '%s not found in table %s' % (v1,t)
1035        if not (cmip5GroupsIVAR[t].has_key(v1) or cmip5GroupsIVAR[t].has_key(v0) ):
1036           print 'ERROR.080.0020: %s not found in table %s' % (v1,t)
1037        else:
1038          if cmip5GroupsIVAR[t].has_key(v1):
1039            trc.append( '1' )
1040            gp = cmip5GroupsIVAR[t][v1]
1041          else:
1042            gp = cmip5GroupsIVAR[t][v0]
1043            trc.append( '0' )
1044##
1045## collect variables in each group, along with key and priority, to create "revTabItems"
1046##
1047          cmip5GroupCol[ gp ].append( (v1,k,p) )
1048    else:
1049       thisk = '%s.%s' % (m,t)
1050       if thisk in shbx.tabuuid:
1051         gpid = shbx.tabuuid[thisk]
1052       else:
1053         gpid = uidgen[thisk].uid
1054       
1055  elif mipt[:5] == "OMIP.":
1056####
1057#### this would be the place to create "OMIP.Omon_3d" and "OMIP.Omon_oth"
1058####
1059#### also need to generate "OMIP.Oyr_3dtr" ....
1060####
1061#### some information added to tabsectbyvar in dreq_utils
1062####
1063#### might be cleaner in framework/scanDreq ...
1064####
1065####
1066    m,t = string.split( mipt, '.' )
1067# output name
1068    v0 = sx.ee_mip[k][15]
1069# variable name
1070    v1 = sx.ee_mip[k][21]
1071    if type(v0) == type( 'y' ) and v0 not in ['', ' ']:
1072      v1 = v0
1073## check to see if sections are defined.
1074    if shbx.tabsectbyvar.has_key(m):
1075      tv = '%s.%s' % (t,v1)
1076      if shbx.tabsectbyvar[m].has_key(tv):
1077        gpid = shbx.tabsectuuid[m][ '%s.%s' % (t,shbx.tabsectbyvar[m][tv][2]) ]
1078        rwix = shbx.tabsectbyvar[m][tv][3]
1079        ssect = shbx.tabsectbyvar[m][tv][2]
1080        p = shbx.tabsectbyvar[m][tv][1]
1081        rwixkkk += 1
1082
1083    if gpid == '__group_unknown__':
1084      print 'ERROR.040.0010: OMIP group not found %s, %s, %s' % (mipt,v0,) 
1085  elif gpid == '__group_unknown__':
1086    print 'ERROR:040.0011: failed to set gpid: ',sx.ee_mip[k]
1087  omit = False
1088  if not sx.ee_xref_bck.has_key( k ):
1089    r1 = sx.ee_mip[k][1]
1090    if r1 in ['','29'] or r1[:23] == 'Reference to literature' or r1[:15] == '(copied from 3D':
1091       print 'WARN.002.0003: dud record',sx.ee_mip[k], sx.ee_mip[k][-2][:4] 
1092       omit = True
1093    elif sx.ee_mip[k][-2][:4] == 'OMIP':
1094       print 'ERROR.002.0004: no back references %s' % str(sx.ee_mip[k])
1095    else:
1096      print 'ERROR.002.0003: no back references %s' % str(sx.ee_mip[k])
1097    kl = ['__none__',]
1098    vnam0 = ''
1099  else:
1100    kl = sx.ee_xref_bck[ k ]
1101    if len(kl) != 1:
1102      print 'ERROR.002.0001: multiple back references %s' % str(kl)
1103      #print sx.ee_mip[k]
1104    kv = kl[0]
1105    r = sx.eeold[kv]
1106    vnam0 = r[1]
1107    kit = 0
1108    itl = []
1109    while r[8] not in [ '','null','Depricated'] and r[8][0] != '*':
1110      itl.append(r)
1111      if ee_mv0.has_key(r[8]):
1112        kv = ee_mv0[ r[8] ]
1113        r = sx.eeold[kv]
1114      else:
1115        print 'ERROR.002.0002: ambiguous back reference: %s' % str(r)
1116      kit += 1
1117      assert kit < 5, 'Too many iterations: %s,\n%s' % (str(r),str(itl))
1118      if kit > 1:
1119        print 'WARNING.002.0001: chained reference: %s' % str(r)
1120    kl = [kv,]
1121  print 'INFO.999.00005: ',omit, rec
1122  if not omit:
1123## count refs, for use in determining where to create group records ....
1124    tabuuidrefs[gpid] += 1
1125    if r[1] != vnam0:
1126      print 'INFO.0001.001: name change:',r,vnam0
1127    vdefex[k] = list(r) + [vnam0,] 
1128    if len( sx.ee_mip[k][:] ) != 24:
1129      print 'ERROR.015.0002: Bad record length %s: %s' % (k,sx.ee_mip[k])
1130    rec = sx.ee_mip[k][:]  + [kl[0],gpid,rwix,p]
1131    if rec[21] == u'bsi' or rec[15] == u'bsi':
1132      print 'INFO.999.00001: ',[rec[i] for i in [15,21,22,25]]
1133    sh[k] = sx.ee_mip[k][:]  + [kl[0],gpid,rwix,ssect,p] 
1134    if gpid not in rvguids:
1135        print 'ERROR.080.06006: Request variable group link broken:', sh[k]
1136 sh.close()
1137
1138 sha = shelve.open( 'dreq_consol_tables_reviewed_a_v%s' % vdate )
1139 shb = shelve.open( 'dreq_consol_tables_reviewed_b_v%s' % vdate )
1140 keys = shb.keys()
1141 keys.sort()
1142 k0 = []
1143 for k in shbx.revisedTabKeysff:
1144   bb = string.split(k, '.' )
1145   if len(bb) == 2:
1146     k0.append( tuple(bb) )
1147
1148 sh = shelve.open( '%s/revTabItems' % odir, 'n' )
1149 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 }
1150 sh['__cols__'] = ['var','table','mip','uuid','priority']
1151####
1152 dop = dopen('check3')
1153 kr = 0
1154 krn = 0
1155
1156 for m,t in k0:
1157  vars = shb[ '%s.%s' % (m,t) ]
1158  print 'INFO.003.0001: ',m,t, sorted( vars.keys() )[:3]
1159  ee = {}
1160  ff = {}
1161##
1162## inclusion of CFMIP here was an error ....
1163  if m in ["OMIP",'CFMIPx']:
1164    rk = '%s.%s' % (m,t)
1165  else:
1166    rk = 'CMIP5_%s' % t
1167
1168  if not sx.ee_miptables_old.has_key(rk):
1169     print 'ERROR.003.0002: key %s not found ' % rk
1170  else:
1171    for u in sx.ee_miptables_old[rk]:
1172      ee[ sx.ee_mip[u][21] ] = u
1173      if vdefex.has_key(u):
1174        if vdefex[u][1] != sx.ee_mip[u][21]:
1175          ff[vdefex[u][1]] = u
1176      ##if sx.ee_xref_bck.has_key(u):
1177
1178    for v0 in vars.keys():
1179      v = string.strip( v0 )
1180      r = sha['records'][vars[v0][0]]
1181      if not ee.has_key(v):
1182        if ff.has_key(v):
1183          print 'INFO ... rename found',v
1184          thisu = ff[v]
1185        elif v[:7] == 'include':
1186          thisu = '__inc__'
1187        else:
1188          thisu = None
1189          if sx.ee_byvar.has_key( v ):
1190             tabs = map( lambda x: sx.ee_mip[x][-2], sx.ee_byvar[v] )
1191             tbs = map( lambda x: string.split(x, '_' )[-1], tabs )
1192             cls = map( lambda x: string.split(x, '_' )[0], tabs )
1193             if t in tbs:
1194               cl0 = []
1195               for k in range(len(tbs)):
1196                 if tbs[k] == t:
1197                    cl0.append( cls[k] )
1198
1199               cl0.sort( psort().cmp )
1200               ix = tabs.index( '%s_%s' % (cl0[0],t) )
1201               print 'WARN.003.0001 var not found -- alternative table used [%s]: %s (%s, %s)' % (cl0[0],v,m,t)
1202               thisu = sx.ee_byvar[v][ix]
1203               
1204             ##print map( lambda x: sx.ee_mip[x][-2], sx.ee_byvar[v] )
1205          elif m in ['OMIP','CFMIP'] and gg.has_key(v):
1206            print 'INFO.003.00010: new %s var found: %s' % (m,v)
1207            thisu = '__new.%s__' % m
1208            krn += 1
1209            id =  str( uuid.uuid1() )
1210            dop.a[ '%s3' % string.lower( m ) ].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' )
1211         
1212          if thisu == None:
1213            print 'ERROR.003.0001 var not found: %s (%s, %s)' % (v,m,t)
1214            thisu = "__var_not_found__"
1215
1216          if m == 'OMIP':
1217            kr += 1
1218            sr =  map(str,r)
1219            dop.a['omip'].write( string.join( map(str,r), '\t' ) + '\n' )
1220            dop.a['omip2'].write( string.join( map(lambda x: str(r[x]),[4,0,5,2,7]) + ['%s_%s' % (m,t),'mv.005.%4.4i' % kr], '\t' ) + '\n' )
1221         
1222      else:
1223        thisu = ee[v]
1224      kv = str( uuid.uuid1() )
1225      if t == 'day_oth':
1226        print 'xxxxxx', v,t,m,r
1227      if v == 'clic':
1228        print 'INFO.clic.00002: ',v,t,m,thisu,v0,vars[v0]
1229      sh[kv] = [v,t,m,thisu,vars[v0][1]]
1230
1231        ### cmip5GroupCol[ gp ].append( (v1,k,p) )
1232 gpextra = []
1233 for gp in cmip5GroupCol.keys():
1234   for v,k,p in cmip5GroupCol[gp]:
1235     kv = str( uuid.uuid1() )
1236     rec = [v,gp,'CMIP5',k,int(p)]
1237     if gp == 'day_oth':
1238        print 'xxxxyy', rec, gp
1239     gpextra.append(rec)
1240     sh[kv] = rec[:]
1241 dop.close('omip',rename='omip.csv')
1242 dop.close('omip2',rename='omip2.csv')
1243 dop.close('omip3',rename='omip3.csv')
1244 sh.close()
1245
1246 sh = shelve.open( '%s/requestVarGroup' % odir )
1247## add OMIP (+ ....?)
1248 nomip = 0
1249 for k in shbx.tabuuid.keys():
1250   if k[0] != '_':
1251  ####cmip5tbs.append( [u,"CMIP6",k,"CMIP6 CMOR Table: %s" % k, "CMIP5", "CMIP5 MIP Table: %s" % k] )
1252     if tabuuidrefs[shbx.tabuuid[k]]  > 0:
1253        mip,tab = string.split( k, '.' )
1254        u = shbx.tabuuid[k]
1255        if mip in {u'OMIP', 'OMIP'}:
1256          lab = '%s-%s' % (mip,tab)
1257        else:
1258          lab = tab
1259        sh[u] = [u,mip,lab,"CMOR Table variant: %s" % k, "CMIP5Rev", k ]
1260####'OMIP', u'OMIP-fx', u'OMIP: OMIP-fx', 'CMIP5Rev', u'OMIP.fx'
1261        print 'INFO: ADDING GROUP: %s' % str(sh[u])
1262        nomip += 1
1263 sh.close()
1264 print nomip
1265
1266
1267 ##wb = utils_wb.workbook( 'CMIP6DataRequest_ConsolidatedExperiments_20151028.xls' )
1268 wb = utils_wb.workbook( 'CMIP6DataRequest_ConsolidatedExperiments_20160110.xls' )
1269 sht = wb.book.sheet_by_name( 'Experiments' )
1270 p = dreq_utils.prconsolexpt()
1271 p.parse(sht)
1272
1273## info about the deck to fill in.
1274 wb2 = utils_wb.workbook( 'CMIP6DataRequest_deckInfo.xls' )
1275 sht2 = wb2.book.sheet_by_name( 'Experiments' )
1276
1277## appends records to "p.records"
1278 p.parse(sht2)
1279
1280 sh = shelve.open( '%s/experiments' % odir, 'n' )
1281 sh['__info__'] = { 'label':'experiments', 'title':'Experiments', 'prov':'ConsolidatedExperiments' }
1282 sh['__cols__'] = ['uuid','egid','label','description','mip','mcfg','tier','nstart','starty','endy','yps','ensz','ntot','comment']
1283 ##['label','group','mip','description','modelClass','tier','nstart','starty','endy','yps','ensz','ntot','comment']
1284 eegg = {}
1285 eetm = collections.defaultdict( set )
1286 eent = collections.defaultdict( int )
1287 for r in p.records:
1288   u = str( uuid.uuid1() )
1289   gp = r[1]
1290   if not eegg.has_key(gp):
1291     eegg[gp] = str( uuid.uuid1() )
1292 
1293   if type( r[5] ) == type( 1 ):
1294     eetm[gp].add( r[5] )
1295   else:
1296     eetm[gp].add( r[5][-1] )
1297   eent[gp] += r[11]
1298   label = labcoerce( r[0] )
1299   oo = [u,eegg[gp],label]
1300   for j in [3,2,4,5,6,7,8,9,10,11,12]:
1301     oo.append( r[j] )
1302   sh[u] = oo[:]
1303 sh.close()
1304
1305 sh = shelve.open( '%s/exptGroups' % odir, 'n' )
1306 sh['__info__'] = { 'label':'exptGroups', 'title':'Experiment groups', 'prov':'ConsolidatedExperiments' }
1307 sh['__cols__'] = ['uuid','label','tiermin','ntot']
1308 for k in eegg.keys():
1309   if not eegg.has_key(gp):
1310     eegg[gp] = str( uuid.uuid1() )
1311 
1312   lab = labcoerce(k)
1313   oo = [eegg[k],lab,min(eetm[k]),eent[k]]
1314   sh[oo[0]] = oo[:]
1315 sh.close()
1316
1317print uidgen.keys()
Note: See TracBrowser for help on using the repository browser.