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

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

import of cmip5 standard output for priorities

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