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

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

Extended overview tables, corrected content

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