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

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

partial updates for AerChemMIP, SIMIP

Line 
1from utils_wb import workbook
2import string, collections, uuid
3
4class loadMipMaps(object):
5  def __init__(self,mip):
6    nt__mapr = collections.namedtuple( 'mapr', ['vid1','sn','lab1','vid2','lab2','group','mip','k','kk','table','freq'] )
7    knownMips = {'SIMIP':'simipMap2.csv'}
8    assert mip in knownMips, 'mip %s not recognised' % mip
9    ##['CFMIP-OImon', '64c8d0c2-9671-11e5-b0d6-ac72891c3257', 'sea_ice_thickness', 'sit', 0, 1, 'f081b01e-960a-11e5-a98a-ac72891c3257', 'sithick']
10    ii = open('inputs/%s' % knownMips[mip] )
11    self.records = []
12    for l in ii.readlines():
13      rr = [string.strip(x) for x in string.split( l, '\t') ]
14      rr[7] = int(rr[7])
15      rr[8] = int(rr[8])
16      self.records.append( nt__mapr._make(  rr ) )
17    self.ss = collections.defaultdict( list )
18    self.ee = {}
19    for r in self.records:
20      self.ss[r.vid1].append( r )
21      self.ee[r.lab1] = r.lab2
22
23class loadVars(object):
24  def __init__(self,opt=1,map01=None):
25    self.loadRevisedSn()
26    if opt == 0:
27      wb = workbook( 'inputs/var.xls' )
28    else:
29      wb = workbook( 'inputs/vars_20151201.xls' )
30    #x = ['label', 'title', 'description', 'procComment', 'procnote', 'prov', 'provmip', 'sn', 'units', 'uid','defaultp','replaced_by']
31    #nt_var = collections.namedtuple( 'var', x )
32
33    self.mapx1 = {}
34    ii = open( 'inputs/simip_rename.csv', 'r' )
35    for l in ii.readlines():
36      bits = string.split( string.strip( l ), '\t' )
37      if bits[1] != '*':
38        print 'ERROR: unexpected line in inputs/simip_rename.csv: ',l
39      else:
40        self.mapx1[bits[4]]  = bits[2]
41    ii.close()
42
43    self.d1 = {}
44    self.c1 = collections.defaultdict(list)
45    d2 = {}
46    s1 = wb.book.sheet_by_name(u'var')
47    ssn = set()
48    for i in range(1,s1.nrows):
49      try:
50        rr = [x.value for x in s1.row(i)]
51        uid = rr[9]
52        assert uid not in self.d1, 'Duplicate uid in var.xls: %s, %s' % (uid,str(rr) )
53        rr[10] = int( rr[10] )
54        var = string.replace( rr[0], '_', '' )
55        if rr[0] in self.snbyvar or var in self.snbyvar:
56          ##print 'Revised standard name found for : %s' % var
57          if rr[0] in self.snbyvar:
58            kk = rr[0]
59          else:
60            kk = var
61          ssn.add( var )
62          ix = self.snbyvar[kk]
63          print '%s:: %s, %s: %s' % (var, rr[7], self.snrecs[ix][7], self.snrecs[ix][9])
64          rr[7] = self.snrecs[ix][9]
65         
66        if var != rr[0]:
67          rr[0] = var
68        self.d1[uid] = [str(x) for x in rr]
69        self.c1[rr[0]].append( uid )
70        if string.strip( rr[11] ) != '':
71          d2[uid] = (string.strip(rr[11]),rr[0] )
72      except:
73        print rr
74        raise
75
76    snf = set( self.snbyvar.keys() ).difference( ssn )
77    assert len( list(snf) ) == 0, 'Difference in var lists %s' % str(snf)
78
79    mm = []
80    mmm = []
81
82    self.vmap= {}
83    for k in d2:
84      if d2[k][0] not in self.c1:
85        mm.append( (d2[k],k) )
86      elif len( self.c1[ d2[k][0] ] ) > 1:
87        mmm.append( (k,  self.c1[ d2[k][0] ] ) )
88      else:
89        self.vmap[k] = self.c1[ d2[k][0] ][0]
90
91
92    if map01 != None:
93      for k in map01:
94    ##for k in self.mapx1:
95        u1 = None
96        u2 = None
97        if len( self.c1[k] ) == 1:
98          u1  =  self.c1[k][0]
99        else:
100          print 'ERROR: ambigous variable label: %s' % k
101        k2 = map01[k]
102        if len( self.c1[k2] ) == 1:
103          u2  =  self.c1[k2][0]
104        else:
105          print 'ERROR: ambigous variable label: %s' % k2
106        if None not in [u1,u2]:
107           self.vmap[u1] = u2
108           rr = self.d1[u1]
109           if rr[4] == '':
110             rr[4] = 'OBSOLETE'
111           else:
112             rr[4] += ' OBSOLETE'
113           self.d1[u1] = rr
114    assert len( mm ) == 0, 'Mappings not all valid: %s' % str(mm)
115    assert len( mmm ) == 0, 'Mappings not all unambiguous: %s' % str(mmm)
116
117  def loadRevisedSn(self):
118    wb = workbook( 'inputs/reviewedSN.xls' )
119
120    sht = wb.book.sheet_by_name( 'Sheet1' )
121    self.snrecs = []
122    self.snbyvar = {}
123    self.snix = collections.defaultdict( list )
124    self.snix0 = collections.defaultdict( dict )
125    ix = -1
126    for i in range( sht.nrows ):
127      rr = [str(x.value) for x in sht.row(i)]
128      var = rr[6]
129      vn = string.replace( var, '_', '-' )
130      sn0 = rr[7]
131      sn1 = rr[9]
132      flg = rr[10]
133      if flg[:2] == 'ex' and var[-1:] != '*':
134        self.snrecs.append(rr)
135        ix += 1
136        assert vn not in self.snbyvar, 'Duplicate variable name %s' % vn
137        self.snbyvar[vn] = ix
138        self.snix0[sn0][vn] = ix
139        self.snix[sn1].append( vn )
140   
141class loadFixes(object):
142  def __init__(self):
143    wb = workbook( 'CMIP6_issues_and_fixes.xls' )
144
145    self.d1 = {}
146    self.fixcmv = {}
147    self.fixcmvextra = collections.defaultdict( dict )
148    self.d3 = {}
149    self.fixcmvinfo = ['label','uid','table','mode','uid2']
150    s1 = wb.book.sheet_by_name(u'var')
151    for i in range(1,s1.nrows):
152      rr = [x.value for x in s1.row(i)]
153      if string.find( rr[0], '::' ) != -1:
154        a,b = string.split( rr[0], '::' )
155        assert str(a ) not in self.d1, 'Duplicate variable name in var sheet: %s' % rr[0]
156        rr[0] = b
157        self.d1[a] = rr
158      else:
159        assert str(rr[0] ) not in self.d1, 'Duplicate variable name in var sheet: %s' % rr[0]
160        self.d1[  str(rr[0]) ] = rr
161 
162    s2 = wb.book.sheet_by_name(u'CMORvar')
163    for i in range(1,s2.nrows):
164      rr = [x.value for x in s2.row(i)]
165      assert str(rr[1] ) not in self.fixcmv, 'Duplicate identifier in CMORvar sheet: %s' % rr[1]
166      self.fixcmv[  str(rr[1]) ] = rr
167
168    self.relations = []
169    self.relationlinks = []
170    self.relationinfo = ['label','title','description','uid','relation']
171    self.relationlinkinfo = ['label','title','uid','rlid','rid']
172    for fn in ['cmvDup_01.xls','cmvDup_02.xls','cmvDup_03.xls','cmvDup_04.xls']:
173      self.loadCmvDup(fn=fn)
174
175  def loadCmvDup( self, fn='cmvDup_01.xls' ):
176    ##self.fixcmvinfo = ['label','uid','table','mode','uid2']
177    wb = workbook( 'inputs/' + fn )
178    items = []
179    sht = wb.book.sheet_by_name( 'Sheet1' )
180    item = {}
181    for i in range( sht.nrows ):
182      r = sht.row(i)
183      if r[0].value == '####':
184        items.append( item )
185        item = {}
186      elif r[0].value == '@VAR:':
187        item['__var__'] = r
188      else:
189        id = str( r[2].value )
190        if id == '':
191          print 'WARN .. multiple variables encountered and not dealt with ....'
192        else:
193          item[id] = r
194          for x in r[:2]:
195            if str( x.value ) != '':
196              item['__flag__'] = True
197
198    knownrelations = {'tm':('masking','Different Masking'), 'tv':('vertical','Different Vertical Structure'), \
199                      'txy':('spatial','Different spatial structure'), \
200                      'ttm':('time-mean','Different temporal processing')}
201    for i in items:
202       if i.get('__flag__',False):
203         cc = collections.defaultdict( list )
204         for k in i:
205           if k[0] != '_':
206             r = [ str( x.value ) for x in i[k] ]
207             u2 = r[1]
208             opt = r[0]
209           
210             if u2 != '':
211               assert u2 in i, 'Attempt to replace with unrecognised uid: %s ... \n %s' % (u2, str(i) )
212               rr = [r[3],k,r[7], 'replace', u2]
213               self.fixcmv[k] = rr
214               self.fixcmvextra['cmvDup'][k] = r
215
216             if opt != '' and opt != 'xxx':
217               if string.find(opt,' ') != -1:
218                 for o in string.split( opt ):
219                   cc[o].append(k)
220               else:
221                 cc[opt].append(k)
222
223         for o in cc:
224           assert len( cc[o] ) > 1, 'Attempt to encode singleton relationship: %s .. %s' % (o,str(i))
225           assert o in knownrelations, 'Key not recognised %s .... %s' % (o,str(i) )
226    ##self.relationinfo = ['label','title','description','uid','relation']
227    ##self.relationlinkinfo = ['label','title','uid','rlid','rid']
228           rlid = str( uuid.uuid1() )
229           s = list( { str( i[k][3].value ) for k in cc[o] } )
230           assert len( s ) == 1, 'Multiple labels'
231           lab = string.replace(s[0], '-', '' )
232           reln = knownrelations[o]
233           self.relations.append( ['%s__%s' % (o,lab), '%s [%s]' % (lab,reln[0]), reln[1], rlid, reln[0] ] )
234           kkk = 0
235           for k in cc[o]:
236             r = i[ k ]
237             kkk+=1
238             t,v,p = tuple( [str( r[j].value ) for j in [7,3,9] ] )
239             ##if string.find( p, ' ((isd' ) != -1:
240               ##ip = string.find( p, ' ((isd' )
241               ##p = p[:ip]
242             tvp = (t,v,p)
243             self.relationlinks.append( (['%s__%s_%s' % (o,lab,kkk), '%s [%s] {%s}' % (lab,reln[0],kkk),str( uuid.uuid1() ), rlid, k], tvp) )
244           
245class loadCmorDims(object):
246  def __init__(self):
247    wb = workbook( 'inputs/CMORdims.xls' )
248    s1 = wb.book.sheet_by_name(u'Sheet1')
249    self.ss = {}
250    for i in range(3,s1.nrows):
251      rr = [string.strip( str(x.value) ) for x in s1.row(i)]
252      assert rr[1] not in self.ss, 'Duplicate dimension: %s' % rr[1]
253      self.ss[ rr[1] ] = rr
254
255class loadSpatial(object):
256  def __init__(self):
257    wb = workbook( 'inputs/spatialShape_ref.xls' )
258    s1 = wb.book.sheet_by_name(u'ss_ref')
259    self.ss = {}
260    for i in range(s1.nrows):
261      rr = [x.value for x in s1.row(i)]
262      if rr[0] != 'label':
263        assert rr[2] not in self.ss, 'Duplicate dimension set in spatial shape sheet: %s' % rr[2]
264        a,b,k,lf = tuple( [string.strip(x) for x in rr[:4] ] )
265        li = str( int( rr[4] ) )
266        self.ss[ k ] = (a,b,lf,li)
267 
268class run(object):
269  def __init__(self):
270    self.fix = loadFixes()
271    self.ls = loadSpatial()
272    self.cm = loadCmorDims()
273    self.mmsi = loadMipMaps( 'SIMIP' )
274    self.vars = loadVars(map01=self.mmsi.ee)
Note: See TracBrowser for help on using the repository browser.