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

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

adding importWbRef

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( "time: 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 and v0[0] != '#':
61        v1 = r[3].strip()
62        vv,rv = cellMethodCheck(v0)
63        if r[1] in ['redirect','change']:
64          self.cmmap[v0] = v1
65          if r[1] == 'redirect' and vv != v0:
66            self.cmmap[vv] = v1
67          v0 = v1
68          vv,rv = cellMethodCheck(v0)
69        if r[1] != 'redirect':
70          t = r[5].strip()
71          l = r[4].strip()
72          if vv != v0:
73            self.cminfo[vv] = (t,l,'CellMethods::%s' % l)
74            self.cmmap[v0] = vv
75          else:
76            self.cminfo[v0] = (t,l,'CellMethods::%s' % l)
77       
78        if r[1] in ['ok','ok?']:
79           v = r[0].strip()
80        elif r[1] != 'redirect':
81           v = r[3].strip()
82        else:
83           v = r[0].strip()
84        assert v not in ee, 'duplicate: %s: %s' % (v,str(r))
85        ee[v] = kk
86        kk += 1
87
88class loadCmorDims(object):
89  def __init__(self):
90    wb = workbook( 'inputs/CMORdims.xls' )
91    s1 = wb.book.sheet_by_name(u'Sheet1')
92    self.ss = {}
93    for i in range(3,s1.nrows):
94      rr = [ str(x.value).strip() for x in s1.row(i)]
95      if rr[1] != '':
96        assert rr[1] not in self.ss, 'Duplicate dimension: %s' % rr[1]
97        self.ss[ rr[1] ] = rr
98
99class loadSpatial(object):
100  def __init__(self):
101    wb = workbook( 'inputs/spatialShape_ref.xls' )
102    s1 = wb.book.sheet_by_name(u'ss_ref')
103    self.ss = {}
104    self.ssu = {}
105    self.labByUid = {}
106    self.uidByLab = {}
107    uu = set()
108    for i in range(s1.nrows):
109      rr = [x.value for x in s1.row(i)]
110      if rr[0] != 'label' and rr[0][0] != '#':
111        assert rr[2] not in self.ss, 'Duplicate dimension set in spatial shape sheet: %s' % rr[2]
112        lab,ttl,dims,lf = tuple( [x.strip() for x in rr[:4] ] )
113        li = str( int( rr[4] ) )
114        u = str( rr[6] )
115        assert u not in uu, 'Duplicate uid in spatialShape_ref.xls: %s' % u
116        self.labByUid[u] = rr[0]
117        self.uidByLab[rr[0]] = u
118        self.ss[ dims ] = (lab,ttl,lf,li,u)
119        self.ssu[ u ] = (lab,ttl,dims,lf,li,u)
120
121  def addTime(self):
122    tshp = { 'time':['time-mean','Temporal mean'], 'time1':['time-point','Instantaneous value (i.e. synoptic or time-step value)'], \
123             'time2':['climatoglogy','Climatological mean'], \
124             'time3':['diurnal-cycle','Mean Diurnal Cycle'], \
125             '':['None','No temporal dimensions ... fixed field'] }
126    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']
127    self.etd = {}
128    self.tsu = {}
129    self.tByLab = {}
130
131    k = 0
132    for s in tshp:
133       label, description = tshp[s]
134       u = tuid[k]
135       self.etd[s] = (u,label,description,s)
136       self.tsu[u] = (label,description,s)
137       self.tByLab[label] = (u,description,s)
138       k+=1
139 
140class run(object):
141  def __init__(self):
142    self.ls = loadSpatial()
143    self.cm = loadCmorDims()
144    self.cellm = loadCellm()
145
146if __name__ == '__main__':
147  r = run()
Note: See TracBrowser for help on using the repository browser.