source: CMIP6dreqbuild/trunk/src/framework/ing02/loadvar.py @ 1017

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/ing02/loadvar.py@1206
Revision 1017, 5.1 KB checked in by mjuckes, 2 years ago (diff)

add loadvar

Line 
1from utils_wb import workbook
2import collections, shelve
3import loadcf
4
5class loadVars(object):
6  def __init__(self,opt=1,map01=None):
7    cf = loadcf.cf()
8    self.loadRevisedSn()
9    if opt == 0:
10      wb = workbook( 'inputs/var.xls' )
11    else:
12      wb = workbook( 'inputs/vars_20170326.xls' )
13
14    self.mapx1 = {}
15    ii = open( 'inputs/simip_rename.csv', 'r' )
16    for l in ii.readlines():
17      bits = l.strip().split( '\t' )
18      if bits[1] != '*':
19        print 'ERROR: unexpected line in inputs/simip_rename.csv: ',l
20      else:
21        self.mapx1[bits[4]]  = bits[2]
22    ii.close()
23
24    self.d1 = collections.OrderedDict()
25    self.c1 = collections.defaultdict(list)
26    d2 = {}
27    s1 = wb.book.sheet_by_name(u'var')
28    ssn = set()
29    for i in range(s1.nrows):
30      try:
31        rr = [x.value for x in s1.row(i)]
32        if rr[0][0] != '#':
33          uid = rr[9]
34          assert uid not in self.d1, 'Duplicate uid in var.xls: %s, %s' % (uid,str(rr) )
35          try:
36            rr[10] = int( rr[10] )
37          except:
38            print 'FATAL.type: ',rr
39            raise
40
41          assert rr[0].find('_') == -1, 'FATAL ERROR: underscore in variable name : %s' % str(rr)
42
43          var = rr[0]
44          if var in self.snbyvar:
45            kk = var
46            ssn.add( var )
47            ix = self.snbyvar[kk]
48            ##print '%s:: %s, %s: %s' % (var, rr[7], self.snrecs[ix][7], self.snrecs[ix][9])
49            snx = self.snrecs[ix][9]
50            if snx[-1] == '?':
51              snx = snx[:-1]
52            cfok = rr[7]  in cf.names or rr[7] in cf.alias
53            if snx not in cf.names and snx not in cf.alias:
54               if cfok:
55                 print 'ERROR.sn.02008: Attempt replace valid standard name: %s: %s' % (var,snx)
56               else:
57                 print 'WARN.sn.02005: Inserting invalid standard name: %s: %s [replace: %s]' % (var,snx,rr[7])
58                 rr[7] = snx
59            else:
60              rr[7] = snx
61          elif var in self.snbyvar2:
62
63            snx = self.snbyvar2[var][4]
64            if snx[-1] == '?':
65              snx = snx[:-1]
66            if snx not in cf.names and snx not in cf.alias:
67               print 'ERROR.sn.02009: Attempt to impose invalid standard name: %s: %s' % (var,self.snbyvar2[var])
68            else:
69              if snx not in cf.names:
70                 print 'WARN.sn.02009: Imposing standard name alias: %s: %s [%s]' % (var,self.snbyvar2[var],cf.alias[snx])
71              rr[7] = snx
72              print 'INFO.sn.02002: updating standard name: %s [%s]' % (rr[7],var)
73         
74          self.d1[uid] = [str(x) for x in rr]
75          self.c1[rr[0]].append( uid )
76          if rr[11].strip( ) != '':
77            d2[uid] = (rr[11].strip(),rr[0] )
78      except:
79        print rr
80        raise
81
82    snf = set( self.snbyvar.keys() ).difference( ssn )
83    assert len( list(snf) ) == 0, 'Difference in var lists %s: check inputs/reviewedSN.xls' % str(snf)
84
85    mm = []
86    mmm = []
87
88    self.vmap= {}
89    for k in d2:
90      if d2[k][0] not in self.c1:
91        mm.append( (d2[k],k) )
92      elif len( self.c1[ d2[k][0] ] ) > 1:
93        mmm.append( (k,   d2[k][0], self.c1[ d2[k][0] ] ) )
94      else:
95        self.vmap[k] = self.c1[ d2[k][0] ][0]
96
97    if map01 != None:
98      for k in map01:
99    ##for k in self.mapx1:
100        u1 = None
101        u2 = None
102        if len( self.c1[k] ) == 1:
103          u1  =  self.c1[k][0]
104        else:
105          print 'ERROR: ambigous variable label: %s' % k
106        k2 = map01[k]
107        if len( self.c1[k2] ) == 1:
108          u2  =  self.c1[k2][0]
109        else:
110          print 'ERROR: ambigous variable label: %s' % k2
111        if None not in [u1,u2]:
112           self.vmap[u1] = u2
113           rr = self.d1[u1]
114           print 'WARN.obsolete.001: ambigous variable label: %s, %s, %s' % (k2,u1,u2)
115           self.d1[u1] = rr
116    assert len( mm ) == 0, 'Mappings not all valid: %s' % str(mm)
117    assert len( mmm ) == 0, 'Mappings not all unambiguous: %s' % str(mmm)
118
119  def loadRevisedSn(self):
120    wb = workbook( 'inputs/reviewedSN.xls' )
121
122    sht = wb.book.sheet_by_name( 'Sheet1' )
123    self.snrecs = []
124    self.snbyvar = {}
125    self.snbyvar2 = {}
126    self.snix = collections.defaultdict( list )
127    self.snix0 = collections.defaultdict( dict )
128    ix = -1
129    for i in range( sht.nrows ):
130      rr = [str(x.value) for x in sht.row(i)]
131      var = rr[6]
132      vn = var.replace( '_', '-' )
133      sn0 = rr[7]
134      sn1 = rr[9]
135      flg = rr[10]
136      if flg[:2] == 'ex' and var[-1:] != '*':
137        self.snrecs.append(rr)
138        ix += 1
139        assert vn not in self.snbyvar, 'Duplicate variable name %s' % vn
140        self.snbyvar[vn] = ix
141        self.snix0[sn0][vn] = ix
142        self.snix[sn1].append( vn )
143    ii = open( 'inputs/varStandardNameUpdates.csv', 'r' )
144    for l in ii.readlines():
145      rr = l.strip().split( '\t' )
146      if rr[0][0] != '#' and rr[2] in ['2','6']:
147        if rr[1] in self.snbyvar2:
148          assert rr[3:] == self.snbyvar2[rr[1]][3:], 'Duplication of variable names in varStandardNameUpdates.csv: %s' % (str(rr),str(self.snbyvar2[rr[1]]) )
149        else:
150          self.snbyvar2[rr[1]] = rr
151    ii.close()
152   
153
154if __name__ == "__main__":
155  l = loadVars()
Note: See TracBrowser for help on using the repository browser.