source: CMIP6dreqbuild/trunk/src/workbook/importWbRef.py @ 967

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

misc

Line 
1from utils_wb import workbook
2import collections, uuid
3import xlrd
4
5nt__varGroup = collections.namedtuple( 'varGroup', ['uid','label','title','mip','ref','refNote'] )
6
7def cellMethodCheck(cm):
8      rv = 0
9      if cm.find( '  ' ) != -1:
10        cm = cm.replace( '  ', ' ' )
11        rv = 1
12
13      if cm.find( "area: where" ) != -1:
14        cm = cm.replace( "area: where", "area: mean where" )
15        rv = 1
16
17      if cm.find( "time:mean" ) != -1:
18        cm = cm.replace( "time:mean", "time: mean" )
19        rv = 1
20      elif cm.find( "weighted b " ) != -1:
21        return  ( cm.replace( "weighted b ", "weighted by " ), 1)
22
23      if cm.find( "xxxxxtime: mean" ) == 0 and len(cm) > 10:
24        if cm[10:].strip()[0] == '(':
25          ix = cm.index(')') + 1
26        else:
27          ix = 10
28        cm0 = cm
29        cm = cm0[ix:].strip( ) + ' ' + cm0[:ix]
30        rv = 1
31
32      if cm.find( "time: point" ) == 0 and len(cm) > 11:
33        if cm[11:].strip()[0] == '(':
34          ix = cm.index(')') + 1
35        else:
36          ix = 11
37        cm0 = cm
38        cm = cm0[ix:].strip( ) + ' ' + cm0[:ix]
39        rv = 1
40      return (cm,rv)
41
42class loadCellm(object):
43  def __init__(self):
44    """Information on cell methods. cmmap [dict] defines how to map old cell methods string to new.
45            cminfo .. provides a tuple (title,label,uid) for each cell methods string"""
46
47    wb = xlrd.open_workbook( 'inputs/cm.xls' )
48
49    sht = wb.sheet_by_name( 'Sheet1' )
50    ll = []
51    for i in range( sht.nrows ):
52      ll.append( [x.value for x in sht.row(i) ] )
53
54    self.cmmap = {}
55    self.cminfo = {}
56    ee = {}
57    kk = 0
58    for r in ll:
59      v0 = r[0].strip()
60      if len(v0) == 0 or v0[0] != '#':
61        v1 = r[3].strip()
62#######
63        vv,rv = cellMethodCheck(v0)
64        vmap = None
65        if r[1] in ['redirect','change']:
66          self.cmmap[v0] = v1
67          vmap = (v0,v1)
68          if r[1] == 'redirect' and vv != v0:
69            self.cmmap[vv] = v1
70            vmap = ([vv,v0],v1)
71          v0 = v1
72          vv,rv = cellMethodCheck(v0)
73        if r[1] != 'redirect':
74          if len(r) >= 6:
75            desc = r[6]
76          else:
77            desc = None
78          t = r[5].strip()
79          l = r[4].strip()
80          if vv != v0:
81            self.cminfo[vv] = (t,l,'CellMethods::%s' % l, desc)
82            vinf = vv
83            self.cmmap[v0] = vv
84            vmap = (v0,vv)
85          else:
86            self.cminfo[v0] = (t,l,'CellMethods::%s' % l, desc)
87            vinf = v0
88        print 'INFO.cm.00880: ',r,v0,vv, vinf, vmap
89#######
90       
91        if r[1] in ['ok','ok?']:
92           v = r[0].strip()
93        elif r[1] != 'redirect':
94           v = r[3].strip()
95        else:
96           v = r[0].strip()
97        assert v not in ee, 'duplicate: %s: %s, %s' % (v,str(r),str(ee[v]))
98        ee[v] = kk
99        kk += 1
100
101class loadCmorDims(object):
102  def __init__(self):
103    wb = workbook( 'inputs/CMORdims.xls' )
104    s1 = wb.book.sheet_by_name(u'Sheet1')
105    self.ss = {}
106    for i in range(3,s1.nrows):
107      rr = [ str(x.value).strip() for x in s1.row(i)]
108      if rr[1] != '':
109        assert rr[1] not in self.ss, 'Duplicate dimension: %s' % rr[1]
110        self.ss[ rr[1] ] = rr
111
112class loadSpatial(object):
113  def __init__(self):
114    wb = workbook( 'inputs/spatialShape_ref.xls' )
115    s1 = wb.book.sheet_by_name(u'ss_ref')
116    self.ss = {}
117    self.ssu = {}
118    self.labByUid = {}
119    self.uidByLab = {}
120    uu = set()
121    for i in range(s1.nrows):
122      rr = [x.value for x in s1.row(i)]
123      if rr[0] != 'label' and rr[0][0] != '#':
124        assert rr[2] not in self.ss, 'Duplicate dimension set in spatial shape sheet: %s' % rr[2]
125        lab,ttl,dims,lf = tuple( [x.strip() for x in rr[:4] ] )
126        li = str( int( rr[4] ) )
127        u = str( rr[6] )
128        assert u not in uu, 'Duplicate uid in spatialShape_ref.xls: %s' % u
129        self.labByUid[u] = rr[0]
130        self.uidByLab[rr[0]] = u
131        self.ss[ dims ] = (lab,ttl,lf,li,u)
132        self.ssu[ u ] = (lab,ttl,dims,lf,li,u)
133
134  def addTime(self):
135    tshp = { 'time':['time-mean','Temporal mean'], 'time1':['time-point','Instantaneous value (i.e. synoptic or time-step value)'], \
136             'time2':['climatology','Climatological mean'], \
137             'time3':['diurnal-cycle','Mean Diurnal Cycle'], \
138             '':['None','No temporal dimensions ... fixed field'] }
139    tuid = ['7a96eb30-8042-11e6-97ee-ac72891c3257', '7a972f78-8042-11e6-97ee-ac72891c3257', '7a976ce0-8042-11e6-97ee-ac72891c3257', '7a97ae58-8042-11e6-97ee-ac72891c3257','cf34c974-80be-11e6-97ee-ac72891c3257']
140    self.etd = {}
141    self.tsu = {}
142    self.tByLab = {}
143
144    k = 0
145    for s in tshp:
146       label, description = tshp[s]
147       u = tuid[k]
148       self.etd[s] = (u,label,description,s)
149       self.tsu[u] = (label,description,s)
150       self.tByLab[label] = (u,description,s)
151       k+=1
152 
153class run(object):
154  def __init__(self):
155    self.ls = loadSpatial()
156    self.cm = loadCmorDims()
157    self.cellm = loadCellm()
158
159if __name__ == '__main__':
160  r = run()
Note: See TracBrowser for help on using the repository browser.