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

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

updates

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