source: CMIP6dreqbuild/trunk/src/workbook/importWbMods.py @ 876

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/workbook/importWbMods.py@876
Revision 876, 15.1 KB checked in by mjuckes, 4 years ago (diff)

release candidate

Line 
1from utils_wb import workbook
2import string, collections, uuid
3import xlrd
4import importWbRef
5##import ivg
6
7nt__varGroup = collections.namedtuple( 'varGroup', ['uid','label','title','mip','ref','refNote'] )
8
9
10class loadVarGroupInfo20(object):
11  def __init__(self):
12    sh = shelve.open( '../framework/inSh/sh__requestScoping', 'r' )
13    ks = [k for k in sh.keys() if k[0] != '_']
14    self.link2uid = {}
15    self.vglab2uid = {}
16    for k in ks:
17      assert k[-3:] in ['__1','__0'], 'Unexpected key in sh__requestScoping: %s' % k
18      if k[-3:] == '__0':
19        self.vgid2linklab[k[:3]] = sh[k]
20      else:
21        self.vglab2uid[k[:3]] = sh[k]
22
23class loadGroups(object):
24  def __init__(self):
25    wb = workbook( '../framework/ingest/sortedVarGroups.xls' )
26    sh = wb.book.sheet_by_name( 'Sheet1' )
27    self.vg = {}
28    self.uidByLabel = {}
29   
30    for i in range( sh.nrows ):
31      rr = [x.value for x in sh.row(i)]
32      if len(rr[0]) > 0 and rr[0][0] != '#':
33        uid, label, title, mip, ref, refNote = [rr[x] for x in [7,0,5,1,8,6] ]
34        assert uid not in self.vg, 'DUPLICATE variable group id: %s\n%s\n%s\n' % (uid,str(self.vg[uid]),str([uid, label, title, mip, ref, refNote]) )
35        self.vg[uid] = nt__varGroup._make( [uid, label, title, mip, ref, refNote] )
36        assert label not in self.uidByLabel, 'DUPLICATE variable group label: %s' % label
37        self.uidByLabel[label] = uid
38     
39
40class loadMipMaps(object):
41  def __init__(self,mip):
42    nt__mapr = collections.namedtuple( 'mapr', ['vid1','sn','lab1','vid2','lab2','group','mip','k','kk','table','freq'] )
43    knownMips = {'SIMIP':'simipMap2.csv'}
44    assert mip in knownMips, 'mip %s not recognised' % mip
45    ##['CFMIP-OImon', '64c8d0c2-9671-11e5-b0d6-ac72891c3257', 'sea_ice_thickness', 'sit', 0, 1, 'f081b01e-960a-11e5-a98a-ac72891c3257', 'sithick']
46    ii = open('inputs/%s' % knownMips[mip] )
47    self.records = []
48    for l in ii.readlines():
49      rr = [string.strip(x) for x in string.split( l, '\t') ]
50      rr[7] = int(rr[7])
51      rr[8] = int(rr[8])
52      self.records.append( nt__mapr._make(  rr ) )
53    self.ss = collections.defaultdict( list )
54    self.ee = {}
55    for r in self.records:
56      self.ss[r.vid1].append( r )
57      self.ee[r.lab1] = r.lab2
58
59class loadStr(object):
60  def __init__(self):
61    """Information on structure records. cmmap [dict] defines how to map old cell methods string to new.
62            cminfo .. provides a tuple (title,label,uid) for each cell methods string"""
63
64    wb = xlrd.open_workbook( 'inputs/structRef.xls' )
65    ii = open( 'inputs/strUidMap.txt' )
66    self.uidByLab = {}
67    for l in ii.readlines():
68      k,v = l.strip().split()
69      self.uidByLab[k] = v
70
71    self.lookupinfo = {'cols':['temp. shape','spat. shape','odims','coords','cmeth','cmea','flags']}
72    self.lookup = {}
73    self.labMap = {}
74    self.uidMap = {}
75    self.mods = collections.defaultdict(dict)
76
77
78    for s in wb.sheet_names():
79      sht = wb.sheet_by_name( s )
80      for i in range(1,sht.nrows):
81        r = [x.value for x in sht.row(i)]
82        xx = r[0]
83        if s != '__mods__':
84          if len(xx) > 8 and xx[0] == '*' and (xx[8] == ':' or xx[9] == ':'):
85            ixc = xx.index( ':' )
86            self.labMap[r[1]] = xx[1:ixc]
87            self.uidMap[self.uidByLab[r[1]]] = self.uidByLab[xx[1:ixc]]
88            print 'INFO.str.00010: ',s,r[1],xx[1:ixc],self.uidByLab[r[1]],self.uidByLab[xx[1:ixc]]
89
90        ### tlab, splab, odims, coords, cell_met, cell_mea, flag mean
91          t = (s,r[3],r[4],r[5],r[6],r[7],r[8])
92          if t in self.lookup:
93            if self.lookup[t] == r[1]:
94              print 'INFO:loadstr.00015: skipping preset lookup: %s' % r[1]
95            elif r[1] in self.labMap and self.lookup[t] in self.labMap and self.labMap[r[1]] == self.labMap[self.lookup[t] ]:
96              print 'INFO:loadstr.00010: duplicate lookup tuple, automating redirect [a]: ',t
97              self.lookup[t] = self.labMap[r[1]]
98            elif r[1] in self.labMap and self.labMap[r[1]] == self.lookup[t]:
99              print 'INFO:loadstr.00011: duplicate lookup tuple, automating redirect [b]: ',t
100            elif self.lookup[t] in self.labMap and self.labMap[self.lookup[t] ] == r[1]:
101              print 'INFO:loadstr.00012: duplicate lookup tuple, automating redirect [c]: ',t
102              self.lookup[t] = r[1]
103            else:
104              print 'SEVERE:loadstr.0001: duplicate lookup tuple: ',t
105              print r[1], self.lookup[t]
106          print 'INFO.loadstr.00022: ',r[1],t
107          self.lookup[t] = r[1]
108## Label        Title   Spatial shape   Other dims      coords  cell methods    cell measures   flag meanings   flag values     Spatial shape (title)   Spatial dimensions
109        if len(xx) > 8 and xx[0] == '@':
110          a,b = xx[1:].split( '=' )
111          if a in [ 'cell_measures','cell_methods']:
112            self.mods[r[1]][a] = b
113          else:
114            print 'SEVERE.loadstr.0002: unrecognised directive [%s]: %s' % (r[1],a)
115
116class loadVars(object):
117  def __init__(self,opt=1,map01=None):
118    self.loadRevisedSn()
119    if opt == 0:
120      wb = workbook( 'inputs/var.xls' )
121    else:
122      wb = workbook( 'inputs/vars_20160721.xls' )
123    #x = ['label', 'title', 'description', 'procComment', 'procnote', 'prov', 'provmip', 'sn', 'units', 'uid','defaultp','replaced_by']
124    #nt_var = collections.namedtuple( 'var', x )
125
126    self.mapx1 = {}
127    ii = open( 'inputs/simip_rename.csv', 'r' )
128    for l in ii.readlines():
129      bits = string.split( string.strip( l ), '\t' )
130      if bits[1] != '*':
131        print 'ERROR: unexpected line in inputs/simip_rename.csv: ',l
132      else:
133        self.mapx1[bits[4]]  = bits[2]
134    ii.close()
135
136    self.d1 = collections.OrderedDict()
137    self.c1 = collections.defaultdict(list)
138    d2 = {}
139    s1 = wb.book.sheet_by_name(u'var')
140    ssn = set()
141    for i in range(s1.nrows):
142      try:
143        rr = [x.value for x in s1.row(i)]
144        if rr[0][0] != '#':
145          uid = rr[9]
146          assert uid not in self.d1, 'Duplicate uid in var.xls: %s, %s' % (uid,str(rr) )
147          rr[10] = int( rr[10] )
148
149          assert rr[0].find('_') == -1, 'FATAL ERROR: underscore in variable name : %s' % str(rr)
150
151          var = rr[0]
152          if var in self.snbyvar:
153            kk = var
154            ssn.add( var )
155            ix = self.snbyvar[kk]
156            ##print '%s:: %s, %s: %s' % (var, rr[7], self.snrecs[ix][7], self.snrecs[ix][9])
157            rr[7] = self.snrecs[ix][9]
158          elif var in self.snbyvar2:
159            rr[7] = self.snbyvar2[var][4]
160            print 'INFO.sn.02002: updating standard name: %s [%s]' % (rr[7],var)
161         
162          self.d1[uid] = [str(x) for x in rr]
163          self.c1[rr[0]].append( uid )
164          if string.strip( rr[11] ) != '':
165            d2[uid] = (string.strip(rr[11]),rr[0] )
166      except:
167        print rr
168        raise
169
170    snf = set( self.snbyvar.keys() ).difference( ssn )
171    assert len( list(snf) ) == 0, 'Difference in var lists %s: check inputs/reviewedSN.xls' % str(snf)
172
173    mm = []
174    mmm = []
175
176    self.vmap= {}
177    for k in d2:
178      if d2[k][0] not in self.c1:
179        mm.append( (d2[k],k) )
180      elif len( self.c1[ d2[k][0] ] ) > 1:
181        mmm.append( (k,   d2[k][0], self.c1[ d2[k][0] ] ) )
182      else:
183        self.vmap[k] = self.c1[ d2[k][0] ][0]
184
185
186    if map01 != None:
187      for k in map01:
188    ##for k in self.mapx1:
189        u1 = None
190        u2 = None
191        if len( self.c1[k] ) == 1:
192          u1  =  self.c1[k][0]
193        else:
194          print 'ERROR: ambigous variable label: %s' % k
195        k2 = map01[k]
196        if len( self.c1[k2] ) == 1:
197          u2  =  self.c1[k2][0]
198        else:
199          print 'ERROR: ambigous variable label: %s' % k2
200        if None not in [u1,u2]:
201           self.vmap[u1] = u2
202           rr = self.d1[u1]
203           if rr[4] == '':
204             rr[4] = 'OBSOLETE'
205           else:
206             rr[4] += ' OBSOLETE'
207           self.d1[u1] = rr
208    assert len( mm ) == 0, 'Mappings not all valid: %s' % str(mm)
209    assert len( mmm ) == 0, 'Mappings not all unambiguous: %s' % str(mmm)
210
211  def loadRevisedSn(self):
212    wb = workbook( 'inputs/reviewedSN.xls' )
213
214    sht = wb.book.sheet_by_name( 'Sheet1' )
215    self.snrecs = []
216    self.snbyvar = {}
217    self.snbyvar2 = {}
218    self.snix = collections.defaultdict( list )
219    self.snix0 = collections.defaultdict( dict )
220    ix = -1
221    for i in range( sht.nrows ):
222      rr = [str(x.value) for x in sht.row(i)]
223      var = rr[6]
224      vn = string.replace( var, '_', '-' )
225      sn0 = rr[7]
226      sn1 = rr[9]
227      flg = rr[10]
228      if flg[:2] == 'ex' and var[-1:] != '*':
229        self.snrecs.append(rr)
230        ix += 1
231        assert vn not in self.snbyvar, 'Duplicate variable name %s' % vn
232        self.snbyvar[vn] = ix
233        self.snix0[sn0][vn] = ix
234        self.snix[sn1].append( vn )
235    ii = open( 'inputs/varStandardNameUpdates.csv', 'r' )
236    for l in ii.readlines():
237      rr = l.strip().split( '\t' )
238      if rr[2] in ['2','6']:
239        if rr[1] in self.snbyvar2:
240          assert rr[3:] == self.snbyvar2[rr[1]][3:], 'Duplication of variable names in varStandardNameUpdates.csv: %s' % (str(rr),str(self.snbyvar2[rr[1]]) )
241        else:
242          self.snbyvar2[rr[1]] = rr
243    ii.close()
244   
245class loadFixes(object):
246  def __init__(self):
247    wb = workbook( 'CMIP6_issues_and_fixes.xls' )
248
249    self.d1 = {}
250    self.fixcmv = {}
251    self.fixcmvx = collections.defaultdict( list )
252    self.fixcmvextra = collections.defaultdict( dict )
253    self.d3 = {}
254    self.fixcmvinfo = ['label','uid','table','mode','uid2','prov']
255    s1 = wb.book.sheet_by_name(u'var')
256    for i in range(1,s1.nrows):
257      rr = [x.value for x in s1.row(i)]
258      if string.find( rr[0], '::' ) != -1:
259        a,b = string.split( rr[0], '::' )
260        assert str(a ) not in self.d1, 'Duplicate variable name in var sheet: %s' % rr[0]
261        rr[0] = b
262        self.d1[a] = rr
263      else:
264        assert str(rr[0] ) not in self.d1, 'Duplicate variable name in var sheet: %s' % rr[0]
265        self.d1[  str(rr[0]) ] = rr
266 
267    self.relations = []
268    self.relationlinks = []
269    self.relationinfo = ['label','title','description','uid','relation']
270    self.relationlinkinfo = ['label','title','uid','rlid','rid']
271    for fn in ['cmvDup_04.xls', 'cmvDup_06.xls', 'cmvDup_08.xls']:
272      self.loadCmvDup(fn=fn)
273    self.loadCmvDup002()
274    self.checkFix()
275
276    for i in sorted( self.fixcmvx.keys() ):
277      if len( self.fixcmvx[i] ) > 1:
278         print 'duplicated entries:',i
279         for k in self.fixcmvx[i]:
280           if k in self.fixcmv:
281              print '---------------',k,self.fixcmv[k]
282           else:
283              print '---------------',k
284
285  def checkFix(self):
286    cc = collections.defaultdict( int )
287    kk = 0
288    targs = dict()
289    rms = set()
290    for u,r in self.fixcmv.items():
291      assert u == r[1], 'Bad record: %s -- %s' % (u,str(r))
292      cc[r[3]] += 1
293      kk += 1
294      if r[3] == 'replace':
295         targs[ r[4] ] = u
296      if r[3] in ['replace','delete']:
297         rms.add( u )
298
299    for k in sorted( cc.keys() ):
300      print 'INFO.cmvfix.01001: action %s: %s (%s)' % (k,cc[k],kk)
301
302    se1 = {u for u in rms if u in targs}
303    if len(se1) > 0:
304      print 'SEVERE.cmvfix.09001: %s target variables deleted' % len(se1)
305      for u in se1:
306        uu = targs[u]
307        print 'SEVERE.cmvfix.09002: %s -- %s \n %s ----- %s' % (u,str( self.fixcmv[u] ), uu, str( self.fixcmv[uu] ) )
308      assert False, 'Errors fatal'
309
310  def loadCmvDup002( self, fn='cmv_duplication.csv' ):
311    ii = open( 'inputs/' + fn, 'r' )
312    for l in ii.readlines():
313      bits = l.strip().split('\t')
314      if bits[0] == 'NEXT':
315        var = bits[4]
316      elif bits[0] == '+':
317        if bits[1] != '':
318          uid = bits[2]
319          toid = bits[1]
320          tab = bits[3]
321          prov = bits[6]
322          self.fixcmv[uid] = (var,uid,tab,'replace',toid,prov,fn)
323         
324  def loadCmvDup( self, fn='cmvDup_01.xls' ):
325    ##self.fixcmvinfo = ['label','uid','table','mode','uid2','prov']
326    wb = workbook( 'inputs/' + fn )
327    items = []
328    sht = wb.book.sheet_by_name( 'Sheet1' )
329    item = {'__file__':fn }
330    for i in range( sht.nrows ):
331      r = sht.row(i)
332      if r[0].value == '####':
333        items.append( item )
334        item = {'__file__':fn }
335      elif r[0].value == '@VAR:':
336        item['__var__'] = r
337      else:
338        id = str( r[2].value )
339        if id == '':
340          print 'WARN .. multiple variables encountered and not dealt with ....'
341        else:
342          item[id] = r
343          for x in r[:2]:
344            if str( x.value ) != '':
345              item['__flag__'] = True
346
347    knownrelations = {'tm':('masking','Different Masking'), 'tv':('vertical','Different Vertical Structure'), \
348                      'txy':('spatial','Different spatial structure'), \
349                      'ttm':('time-mean','Different temporal processing')}
350    for i in items:
351       if i.get('__flag__',False):
352         cc = collections.defaultdict( list )
353         for k in i:
354           if k[0] != '_':
355             r = [ str( x.value ) for x in i[k] ]  + [i['__file__'],]
356             u2 = r[1]
357             opt = r[0]
358             if r[3] == 'prsn':
359                  print 'INFO.prsn.0001: ',r
360           
361             self.fixcmvx[  '%s.%s.%s' % (r[3],r[7],r[9]) ].append( k )
362             if u2 != '':
363               assert u2 in i, 'Attempt to replace with unrecognised uid: %s ... \n %s' % (u2, str(i) )
364               rr = [r[3],k,r[7], 'replace', u2,r[9],i['__file__']] 
365
366               if k in self.fixcmv:
367                  print 'ERROR.cmv.0001: duplicate record: ',self.fixcmv[k],rr
368
369               self.fixcmv[k] = rr
370               self.fixcmvextra['cmvDup'][k] = r
371
372             if opt != '' and opt != 'xxx':
373               if string.find(opt,' ') != -1:
374                 for o in string.split( opt ):
375                   cc[o].append(k)
376               else:
377                 cc[opt].append(k)
378
379         for o in cc:
380           assert len( cc[o] ) > 1, 'Attempt to encode singleton relationship: %s .. %s' % (o,str(i))
381           assert o in knownrelations, 'Key not recognised %s .... %s' % (o,str(i) )
382    ##self.relationinfo = ['label','title','description','uid','relation']
383    ##self.relationlinkinfo = ['label','title','uid','rlid','rid']
384           rlid = str( uuid.uuid1() )
385           s = list( { str( i[k][3].value ) for k in cc[o] } )
386           assert len( s ) == 1, 'Multiple labels'
387           lab = string.replace(s[0], '-', '' )
388           reln = knownrelations[o]
389           self.relations.append( ['%s__%s' % (o,lab), '%s [%s]' % (lab,reln[0]), reln[1], rlid, reln[0] ] )
390           kkk = 0
391           for k in cc[o]:
392             r = i[ k ]
393             kkk+=1
394             t,v,p = tuple( [str( r[j].value ) for j in [7,3,9] ] )
395             ##if string.find( p, ' ((isd' ) != -1:
396               ##ip = string.find( p, ' ((isd' )
397               ##p = p[:ip]
398             tvp = (t,v,p)
399             self.relationlinks.append( (['%s__%s_%s' % (o,lab,kkk), '%s [%s] {%s}' % (lab,reln[0],kkk),str( uuid.uuid1() ), rlid, k], tvp) )
400           
401 
402class run(object):
403  def __init__(self):
404    self.fix = loadFixes()
405    self.ls = importWbRef.loadSpatial()
406    self.cm = importWbRef.loadCmorDims()
407    self.cellm = importWbRef.loadCellm()
408    self.mmsi = loadMipMaps( 'SIMIP' )
409    self.vars = loadVars(map01=self.mmsi.ee)
410    self.str = loadStr()
411    self.vg = loadGroups()
412
413if __name__ == '__main__':
414  r = run()
Note: See TracBrowser for help on using the repository browser.