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

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

fix on cmv duplication bug

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/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      uid, label, title, mip, ref, refNote = [rr[x] for x in [7,0,5,1,8,6] ]
33      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]) )
34      self.vg[uid] = nt__varGroup._make( [uid, label, title, mip, ref, refNote] )
35      assert label not in self.uidByLabel, 'DUPLICATE variable group label: %s' % label
36      self.uidByLabel[label] = uid
37     
38
39class loadMipMaps(object):
40  def __init__(self,mip):
41    nt__mapr = collections.namedtuple( 'mapr', ['vid1','sn','lab1','vid2','lab2','group','mip','k','kk','table','freq'] )
42    knownMips = {'SIMIP':'simipMap2.csv'}
43    assert mip in knownMips, 'mip %s not recognised' % mip
44    ##['CFMIP-OImon', '64c8d0c2-9671-11e5-b0d6-ac72891c3257', 'sea_ice_thickness', 'sit', 0, 1, 'f081b01e-960a-11e5-a98a-ac72891c3257', 'sithick']
45    ii = open('inputs/%s' % knownMips[mip] )
46    self.records = []
47    for l in ii.readlines():
48      rr = [string.strip(x) for x in string.split( l, '\t') ]
49      rr[7] = int(rr[7])
50      rr[8] = int(rr[8])
51      self.records.append( nt__mapr._make(  rr ) )
52    self.ss = collections.defaultdict( list )
53    self.ee = {}
54    for r in self.records:
55      self.ss[r.vid1].append( r )
56      self.ee[r.lab1] = r.lab2
57
58class loadStr(object):
59  def __init__(self):
60    """Information on structure records. cmmap [dict] defines how to map old cell methods string to new.
61            cminfo .. provides a tuple (title,label,uid) for each cell methods string"""
62
63    wb = xlrd.open_workbook( 'inputs/structRef.xls' )
64    ii = open( 'inputs/strUidMap.txt' )
65    self.uidByLab = {}
66    for l in ii.readlines():
67      k,v = l.strip().split()
68      self.uidByLab[k] = v
69
70    self.lookupinfo = {'cols':['temp. shape','spat. shape','odims','coords','cmeth','cmea','flags']}
71    self.lookup = {}
72    self.labMap = {}
73    self.uidMap = {}
74    self.mods = collections.defaultdict(dict)
75    ##ls0 = ivg.structureList()
76    ##ls0.importExRef()
77
78##
79## 1st replaced by second
80##
81    ##omaps = [ ('str-a020','str-a027')]
82    ##for a,b in omaps:
83      ##self.uidMap[ls0.xRecByLab[a]] = ls0.xRecByLab[b]
84
85###  cant locate source of str-a027 ....
86
87    for s in wb.sheet_names():
88      sht = wb.sheet_by_name( s )
89      for i in range(1,sht.nrows):
90        r = [x.value for x in sht.row(i)]
91        xx = r[0]
92        if len(xx) > 8 and xx[0] == '*' and (xx[8] == ':' or xx[9] == ':'):
93          ixc = xx.index( ':' )
94          self.labMap[r[1]] = xx[1:ixc]
95          self.uidMap[self.uidByLab[r[1]]] = self.uidByLab[xx[1:ixc]]
96          print 'INFO.str.00010: ',s,r[1],xx[1:ixc],self.uidByLab[r[1]],self.uidByLab[xx[1:ixc]]
97
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 == 'cell_measures':
120            self.mods[r[1]][a] = b
121          else:
122            print 'ERROR.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         
167          self.d1[uid] = [str(x) for x in rr]
168          self.c1[rr[0]].append( uid )
169          if string.strip( rr[11] ) != '':
170            d2[uid] = (string.strip(rr[11]),rr[0] )
171      except:
172        print rr
173        raise
174
175    snf = set( self.snbyvar.keys() ).difference( ssn )
176    assert len( list(snf) ) == 0, 'Difference in var lists %s' % str(snf)
177
178    mm = []
179    mmm = []
180
181    self.vmap= {}
182    for k in d2:
183      if d2[k][0] not in self.c1:
184        mm.append( (d2[k],k) )
185      elif len( self.c1[ d2[k][0] ] ) > 1:
186        mmm.append( (k,   d2[k][0], self.c1[ d2[k][0] ] ) )
187      else:
188        self.vmap[k] = self.c1[ d2[k][0] ][0]
189
190
191    if map01 != None:
192      for k in map01:
193    ##for k in self.mapx1:
194        u1 = None
195        u2 = None
196        if len( self.c1[k] ) == 1:
197          u1  =  self.c1[k][0]
198        else:
199          print 'ERROR: ambigous variable label: %s' % k
200        k2 = map01[k]
201        if len( self.c1[k2] ) == 1:
202          u2  =  self.c1[k2][0]
203        else:
204          print 'ERROR: ambigous variable label: %s' % k2
205        if None not in [u1,u2]:
206           self.vmap[u1] = u2
207           rr = self.d1[u1]
208           if rr[4] == '':
209             rr[4] = 'OBSOLETE'
210           else:
211             rr[4] += ' OBSOLETE'
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.snix = collections.defaultdict( list )
223    self.snix0 = collections.defaultdict( dict )
224    ix = -1
225    for i in range( sht.nrows ):
226      rr = [str(x.value) for x in sht.row(i)]
227      var = rr[6]
228      vn = string.replace( var, '_', '-' )
229      sn0 = rr[7]
230      sn1 = rr[9]
231      flg = rr[10]
232      if flg[:2] == 'ex' and var[-1:] != '*':
233        self.snrecs.append(rr)
234        ix += 1
235        assert vn not in self.snbyvar, 'Duplicate variable name %s' % vn
236        self.snbyvar[vn] = ix
237        self.snix0[sn0][vn] = ix
238        self.snix[sn1].append( vn )
239   
240class loadFixes(object):
241  def __init__(self):
242    wb = workbook( 'CMIP6_issues_and_fixes.xls' )
243
244    self.d1 = {}
245    self.fixcmv = {}
246    self.fixcmvx = collections.defaultdict( list )
247    self.fixcmvextra = collections.defaultdict( dict )
248    self.d3 = {}
249    self.fixcmvinfo = ['label','uid','table','mode','uid2','prov']
250    s1 = wb.book.sheet_by_name(u'var')
251    for i in range(1,s1.nrows):
252      rr = [x.value for x in s1.row(i)]
253      if string.find( rr[0], '::' ) != -1:
254        a,b = string.split( rr[0], '::' )
255        assert str(a ) not in self.d1, 'Duplicate variable name in var sheet: %s' % rr[0]
256        rr[0] = b
257        self.d1[a] = rr
258      else:
259        assert str(rr[0] ) not in self.d1, 'Duplicate variable name in var sheet: %s' % rr[0]
260        self.d1[  str(rr[0]) ] = rr
261 
262    self.relations = []
263    self.relationlinks = []
264    self.relationinfo = ['label','title','description','uid','relation']
265    self.relationlinkinfo = ['label','title','uid','rlid','rid']
266    for fn in ['cmvDup_04.xls', 'cmvDup_06.xls', 'cmvDup_08.xls']:
267      self.loadCmvDup(fn=fn)
268    self.loadCmvDup002()
269    self.checkFix()
270
271    for i in sorted( self.fixcmvx.keys() ):
272      if len( self.fixcmvx[i] ) > 1:
273         print 'duplicated entries:',i
274         for k in self.fixcmvx[i]:
275           if k in self.fixcmv:
276              print '---------------',k,self.fixcmv[k]
277           else:
278              print '---------------',k
279
280  def checkFix(self):
281    cc = collections.defaultdict( int )
282    kk = 0
283    targs = dict()
284    rms = set()
285    for u,r in self.fixcmv.items():
286      assert u == r[1], 'Bad record: %s -- %s' % (u,str(r))
287      cc[r[3]] += 1
288      kk += 1
289      if r[3] == 'replace':
290         targs[ r[4] ] = u
291      if r[3] in ['replace','delete']:
292         rms.add( u )
293
294    for k in sorted( cc.keys() ):
295      print 'INFO.cmvfix.01001: action %s: %s (%s)' % (k,cc[k],kk)
296
297    se1 = {u for u in rms if u in targs}
298    if len(se1) > 0:
299      print 'SEVERE.cmvfix.09001: %s target variables deleted' % len(se1)
300      for u in se1:
301        uu = targs[u]
302        print 'SEVERE.cmvfix.09002: %s -- %s \n %s ----- %s' % (u,str( self.fixcmv[u] ), uu, str( self.fixcmv[uu] ) )
303      assert False, 'Errors fatal'
304
305  def loadCmvDup002( self, fn='cmv_duplication.csv' ):
306    ii = open( 'inputs/' + fn, 'r' )
307    for l in ii.readlines():
308      bits = l.strip().split('\t')
309      if bits[0] == 'NEXT':
310        var = bits[4]
311      elif bits[0] == '+':
312        if bits[1] != '':
313          uid = bits[2]
314          toid = bits[1]
315          tab = bits[3]
316          prov = bits[6]
317          self.fixcmv[uid] = (var,uid,tab,'replace',toid,prov,fn)
318         
319  def loadCmvDup( self, fn='cmvDup_01.xls' ):
320    ##self.fixcmvinfo = ['label','uid','table','mode','uid2','prov']
321    wb = workbook( 'inputs/' + fn )
322    items = []
323    sht = wb.book.sheet_by_name( 'Sheet1' )
324    item = {'__file__':fn }
325    for i in range( sht.nrows ):
326      r = sht.row(i)
327      if r[0].value == '####':
328        items.append( item )
329        item = {'__file__':fn }
330      elif r[0].value == '@VAR:':
331        item['__var__'] = r
332      else:
333        id = str( r[2].value )
334        if id == '':
335          print 'WARN .. multiple variables encountered and not dealt with ....'
336        else:
337          item[id] = r
338          for x in r[:2]:
339            if str( x.value ) != '':
340              item['__flag__'] = True
341
342    knownrelations = {'tm':('masking','Different Masking'), 'tv':('vertical','Different Vertical Structure'), \
343                      'txy':('spatial','Different spatial structure'), \
344                      'ttm':('time-mean','Different temporal processing')}
345    for i in items:
346       if i.get('__flag__',False):
347         cc = collections.defaultdict( list )
348         for k in i:
349           if k[0] != '_':
350             r = [ str( x.value ) for x in i[k] ]  + [i['__file__'],]
351             u2 = r[1]
352             opt = r[0]
353             if r[3] == 'prsn':
354                  print 'INFO.prsn.0001: ',r
355           
356             self.fixcmvx[  '%s.%s.%s' % (r[3],r[7],r[9]) ].append( k )
357             if u2 != '':
358               assert u2 in i, 'Attempt to replace with unrecognised uid: %s ... \n %s' % (u2, str(i) )
359               rr = [r[3],k,r[7], 'replace', u2,r[9],i['__file__']] 
360
361               if k in self.fixcmv:
362                  print 'ERROR.cmv.0001: duplicate record: ',self.fixcmv[k],rr
363
364               self.fixcmv[k] = rr
365               self.fixcmvextra['cmvDup'][k] = r
366
367             if opt != '' and opt != 'xxx':
368               if string.find(opt,' ') != -1:
369                 for o in string.split( opt ):
370                   cc[o].append(k)
371               else:
372                 cc[opt].append(k)
373
374         for o in cc:
375           assert len( cc[o] ) > 1, 'Attempt to encode singleton relationship: %s .. %s' % (o,str(i))
376           assert o in knownrelations, 'Key not recognised %s .... %s' % (o,str(i) )
377    ##self.relationinfo = ['label','title','description','uid','relation']
378    ##self.relationlinkinfo = ['label','title','uid','rlid','rid']
379           rlid = str( uuid.uuid1() )
380           s = list( { str( i[k][3].value ) for k in cc[o] } )
381           assert len( s ) == 1, 'Multiple labels'
382           lab = string.replace(s[0], '-', '' )
383           reln = knownrelations[o]
384           self.relations.append( ['%s__%s' % (o,lab), '%s [%s]' % (lab,reln[0]), reln[1], rlid, reln[0] ] )
385           kkk = 0
386           for k in cc[o]:
387             r = i[ k ]
388             kkk+=1
389             t,v,p = tuple( [str( r[j].value ) for j in [7,3,9] ] )
390             ##if string.find( p, ' ((isd' ) != -1:
391               ##ip = string.find( p, ' ((isd' )
392               ##p = p[:ip]
393             tvp = (t,v,p)
394             self.relationlinks.append( (['%s__%s_%s' % (o,lab,kkk), '%s [%s] {%s}' % (lab,reln[0],kkk),str( uuid.uuid1() ), rlid, k], tvp) )
395           
396 
397class run(object):
398  def __init__(self):
399    self.fix = loadFixes()
400    self.ls = importWbRef.loadSpatial()
401    self.cm = importWbRef.loadCmorDims()
402    self.cellm = importWbRef.loadCellm()
403    self.mmsi = loadMipMaps( 'SIMIP' )
404    self.vars = loadVars(map01=self.mmsi.ee)
405    self.str = loadStr()
406    self.vg = loadGroups()
407
408if __name__ == '__main__':
409  r = run()
Note: See TracBrowser for help on using the repository browser.