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

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

clearing old aerchemmip code

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 len(xx) > 8 and xx[0] == '*' and (xx[8] == ':' or xx[9] == ':'):
84            ixc = xx.index( ':' )
85            self.labMap[r[1]] = xx[1:ixc]
86            self.uidMap[self.uidByLab[r[1]]] = self.uidByLab[xx[1:ixc]]
87            print 'INFO.str.00010: ',s,r[1],xx[1:ixc],self.uidByLab[r[1]],self.uidByLab[xx[1:ixc]]
88
89        if s != '__mods__':
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           print 'WARN.obsolete.001: ambigous variable label: %s, %s, %s' % (k2,u1,u2)
204           self.d1[u1] = rr
205    assert len( mm ) == 0, 'Mappings not all valid: %s' % str(mm)
206    assert len( mmm ) == 0, 'Mappings not all unambiguous: %s' % str(mmm)
207
208  def loadRevisedSn(self):
209    wb = workbook( 'inputs/reviewedSN.xls' )
210
211    sht = wb.book.sheet_by_name( 'Sheet1' )
212    self.snrecs = []
213    self.snbyvar = {}
214    self.snbyvar2 = {}
215    self.snix = collections.defaultdict( list )
216    self.snix0 = collections.defaultdict( dict )
217    ix = -1
218    for i in range( sht.nrows ):
219      rr = [str(x.value) for x in sht.row(i)]
220      var = rr[6]
221      vn = string.replace( var, '_', '-' )
222      sn0 = rr[7]
223      sn1 = rr[9]
224      flg = rr[10]
225      if flg[:2] == 'ex' and var[-1:] != '*':
226        self.snrecs.append(rr)
227        ix += 1
228        assert vn not in self.snbyvar, 'Duplicate variable name %s' % vn
229        self.snbyvar[vn] = ix
230        self.snix0[sn0][vn] = ix
231        self.snix[sn1].append( vn )
232    ii = open( 'inputs/varStandardNameUpdates.csv', 'r' )
233    for l in ii.readlines():
234      rr = l.strip().split( '\t' )
235      if rr[2] in ['2','6']:
236        if rr[1] in self.snbyvar2:
237          assert rr[3:] == self.snbyvar2[rr[1]][3:], 'Duplication of variable names in varStandardNameUpdates.csv: %s' % (str(rr),str(self.snbyvar2[rr[1]]) )
238        else:
239          self.snbyvar2[rr[1]] = rr
240    ii.close()
241   
242class loadFixes(object):
243  def __init__(self):
244    wb = workbook( 'CMIP6_issues_and_fixes.xls' )
245
246    self.d1 = {}
247    self.fixcmv = {}
248    self.fixcmvx = collections.defaultdict( list )
249    self.fixcmvextra = collections.defaultdict( dict )
250    self.d3 = {}
251    self.fixcmvinfo = ['label','uid','table','mode','uid2','prov']
252    s1 = wb.book.sheet_by_name(u'var')
253    for i in range(1,s1.nrows):
254      rr = [x.value for x in s1.row(i)]
255      if string.find( rr[0], '::' ) != -1:
256        a,b = string.split( rr[0], '::' )
257        assert str(a ) not in self.d1, 'Duplicate variable name in var sheet: %s' % rr[0]
258        rr[0] = b
259        self.d1[a] = rr
260      else:
261        assert str(rr[0] ) not in self.d1, 'Duplicate variable name in var sheet: %s' % rr[0]
262        self.d1[  str(rr[0]) ] = rr
263 
264    self.relations = []
265    self.relationlinks = []
266    self.relationinfo = ['label','title','description','uid','relation']
267    self.relationlinkinfo = ['label','title','uid','rlid','rid']
268    for fn in ['cmvDup_04.xls', 'cmvDup_06.xls', 'cmvDup_08.xls']:
269      self.loadCmvDup(fn=fn)
270    self.loadCmvDup002()
271    self.checkFix()
272
273    for i in sorted( self.fixcmvx.keys() ):
274      if len( self.fixcmvx[i] ) > 1:
275         print 'duplicated entries:',i
276         for k in self.fixcmvx[i]:
277           if k in self.fixcmv:
278              print '---------------',k,self.fixcmv[k]
279           else:
280              print '---------------',k
281
282  def checkFix(self):
283    cc = collections.defaultdict( int )
284    kk = 0
285    targs = dict()
286    rms = set()
287    for u,r in self.fixcmv.items():
288      assert u == r[1], 'Bad record: %s -- %s' % (u,str(r))
289      cc[r[3]] += 1
290      kk += 1
291      if r[3] == 'replace':
292         targs[ r[4] ] = u
293      if r[3] in ['replace','delete']:
294         rms.add( u )
295
296    for k in sorted( cc.keys() ):
297      print 'INFO.cmvfix.01001: action %s: %s (%s)' % (k,cc[k],kk)
298
299    se1 = {u for u in rms if u in targs}
300    if len(se1) > 0:
301      print 'SEVERE.cmvfix.09001: %s target variables deleted' % len(se1)
302      for u in se1:
303        uu = targs[u]
304        print 'SEVERE.cmvfix.09002: %s -- %s \n %s ----- %s' % (u,str( self.fixcmv[u] ), uu, str( self.fixcmv[uu] ) )
305      assert False, 'Errors fatal'
306
307  def loadCmvDup002( self, fn='cmv_duplication.csv' ):
308    ii = open( 'inputs/' + fn, 'r' )
309    for l in ii.readlines():
310      bits = l.strip().split('\t')
311      if bits[0] == 'NEXT':
312        var = bits[4]
313      elif bits[0] == '+':
314        if bits[1] != '':
315          uid = bits[2]
316          toid = bits[1]
317          tab = bits[3]
318          prov = bits[6]
319          self.fixcmv[uid] = (var,uid,tab,'replace',toid,prov,fn)
320         
321  def loadCmvDup( self, fn='cmvDup_01.xls' ):
322    ##self.fixcmvinfo = ['label','uid','table','mode','uid2','prov']
323    wb = workbook( 'inputs/' + fn )
324    items = []
325    sht = wb.book.sheet_by_name( 'Sheet1' )
326    item = {'__file__':fn }
327    for i in range( sht.nrows ):
328      r = sht.row(i)
329      if r[0].value == '####':
330        items.append( item )
331        item = {'__file__':fn }
332      elif r[0].value == '@VAR:':
333        item['__var__'] = r
334      else:
335        id = str( r[2].value )
336        if id == '':
337          print 'WARN .. multiple variables encountered and not dealt with ....'
338        else:
339          item[id] = r
340          for x in r[:2]:
341            if str( x.value ) != '':
342              item['__flag__'] = True
343
344    knownrelations = {'tm':('masking','Different Masking'), 'tv':('vertical','Different Vertical Structure'), \
345                      'txy':('spatial','Different spatial structure'), \
346                      'ttm':('time-mean','Different temporal processing')}
347    for i in items:
348       if i.get('__flag__',False):
349         cc = collections.defaultdict( list )
350         for k in i:
351           if k[0] != '_':
352             r = [ str( x.value ) for x in i[k] ]  + [i['__file__'],]
353             u2 = r[1]
354             opt = r[0]
355             if r[3] in [ 'prsn','prlq','pr']:
356                  print 'INFO.prxx.0001: ',r
357           
358             self.fixcmvx[  '%s.%s.%s' % (r[3],r[7],r[9]) ].append( k )
359             if u2 != '':
360               assert u2 in i, 'Attempt to replace with unrecognised uid: %s ... \n %s' % (u2, str(i) )
361               rr = [r[3],k,r[7], 'replace', u2,r[9],i['__file__']] 
362
363               if k in self.fixcmv:
364                  print 'ERROR.cmv.0001: duplicate record: ',self.fixcmv[k],rr
365
366               self.fixcmv[k] = rr
367               self.fixcmvextra['cmvDup'][k] = r
368
369             if opt != '' and opt != 'xxx':
370               if string.find(opt,' ') != -1:
371                 for o in string.split( opt ):
372                   cc[o].append(k)
373               else:
374                 cc[opt].append(k)
375
376         for o in cc:
377           assert len( cc[o] ) > 1, 'Attempt to encode singleton relationship: %s .. %s' % (o,str(i))
378           assert o in knownrelations, 'Key not recognised %s .... %s' % (o,str(i) )
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             tvp = (t,v,p)
391             self.relationlinks.append( (['%s__%s_%s' % (o,lab,kkk), '%s [%s] {%s}' % (lab,reln[0],kkk),str( uuid.uuid1() ), rlid, k], tvp) )
392           
393 
394class run(object):
395  def __init__(self):
396    self.fix = loadFixes()
397    self.ls = importWbRef.loadSpatial()
398    self.cm = importWbRef.loadCmorDims()
399    self.cellm = importWbRef.loadCellm()
400    self.mmsi = loadMipMaps( 'SIMIP' )
401    self.vars = loadVars(map01=self.mmsi.ee)
402    self.str = loadStr()
403    self.vg = loadGroups()
404
405if __name__ == '__main__':
406  r = run()
Note: See TracBrowser for help on using the repository browser.