source: CMIP6dreqbuild/trunk/src/framework/ing02/importSect.py @ 997

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/ing02/importSect.py@997
Revision 997, 11.1 KB checked in by mjuckes, 3 years ago (diff)

01.00.09

Line 
1import shelve, glob, collections, hashlib
2import utils_wb
3import loadvar
4
5structMaps = {'str-h050':'str-a081'}
6
7class l02sh(object):
8  def __init__(self,idir='exports/l0',odir='exports/l0sh'):
9    fl = glob.glob( '%s/*.xlsx' % idir )
10    self.odir = odir
11    self.ulook = collections.defaultdict( dict )
12
13    ee = {}
14    for f in fl:
15      sect = f.split('/')[-1][:-5]
16      ee[sect] = f
17
18    rqvmapf = 'rvg_remap_002.csv'
19    self.rqvm = {}
20    ii = open( rqvmapf, 'r' )
21    for l in ii.readlines():
22      u1, vf, vt = l.strip().split( '\t' )
23      self.rqvm[(u1,vf)] = str( vt )
24
25    self.purged = set()
26    self.purgeVlab = set( ['lts', 'pcp', 'fDeforest', 'lateralCtransfer', 'fNdepox', 'fNdepred', 'fBNFsymb', 'fBNFasymb'] )
27    keys = sorted( ee.keys() )
28    k0 = ['grids','spatialShape','temporalShape','cellMethods','var','structure','CMORvar','requestVarGroup','miptable']
29    self.mapu2l = collections.defaultdict( dict )
30    self.mapl2u = collections.defaultdict( dict )
31    self.directiveMaps = collections.defaultdict( dict )
32    k00 = k0[:]
33    for k in keys:
34      if k not in k0:
35        k0.append(k)
36    ##k0 = ['grids','spatialShape','temporalShape','cellMethods','structure','var','CMORvar','requestVarGroup']
37    ##k0 = ['var','CMORvar','requestVar']
38
39    for k in k0:
40      f = ee[k]
41      sect = k
42      print 'Starting %s' % sect
43      if sect == 'structure':
44        self.scanToSh( f, tagrow=4, opt='all', section=sect, labMap=True )
45      elif sect == 'var':
46        lv = loadvar.loadVars()
47        self.c4mip = shelve.open( '../inSh/sh__newVar_C4MIP', 'r' )
48        ltd = {}
49        for u in lv.d1:
50          ltd[u] = (lv.d1[u][0],lv.d1[u][1])
51        self.scanToSh( f, labMap=k in k00, ltd=ltd )
52      else:
53        self.scanToSh( f, labMap=k in k00 )
54    self.saveMaps()
55
56  def saveMaps(self):
57      sh = shelve.open( '%s_maps/%s' % (self.odir,'importMaps'), 'n' )
58      for s in ['structure']:
59        for u,l in self.directiveMaps[s]:
60          targ = self.directiveMaps[s][(u,l)]
61          if targ not in self.mapl2u[s]:
62             print 'SEVERE: targ not found: %s, %s ---> %s' % (u,l,targ)
63          else:
64             sh[' '.join([s,u,l])] = self.mapl2u[s][targ]
65      sh.close()
66
67  def scanToSh( self, f, tagrow=3, opt='data', section=None, labMap = False, ltd=None ):
68    wb = utils_wb.workbook( f )
69    self.labMap = labMap
70    if opt == 'data':
71      sht = wb.book.sheet_by_name( 'data' )
72      section = sht.row(0)[0].value
73      self.section = section
74      sh = shelve.open( '%s/%s' % (self.odir,section), 'n' )
75      sh['__info__'] = {'label':section, 'title':'Data Request Section, imported from spreadsheet'}
76      self.appendSect( sht, tagrow, sh, ltd=ltd )
77      sh.close()
78    else:
79      shts = wb.sns
80      assert section != None
81      self.section = section
82      sh = shelve.open( '%s/%s' % (self.odir,section), 'n' )
83      sh['__info__'] = {'label':section, 'title':'Data Request Section, imported from spreadsheet'}
84      for s in shts:
85        if s[0] != '_':
86          sht = wb.book.sheet_by_name( s )
87          tags = [x.value for x in sht.row(1)]
88          vals = [x.value for x in sht.row(2)]
89          sh['__cols__'] = tags[1:]
90          ip = tags.index( 'procNote' )
91          vals[ip] = s
92          deflt = (tags[1:],vals[1:])
93           
94          print 'start %s (%s)' % (section,s)
95          self.appendSect( sht, tagrow, sh,deflt=deflt )
96      sh.close()
97     
98
99  def appendSect(self, sht, tagrow, sh, deflt=None, ltd=None ):
100    tags = [x.value for x in sht.row(tagrow)]
101    if deflt == None:
102      sh['__cols__'] = tags[1:]
103    else:
104      ix = []
105      for t in tags[1:]:
106        if t != '':
107          ix.append( deflt[0].index(t) )
108
109    iu = tags.index( 'uid' )
110    il = tags.index( 'label' )
111    ittl = tags.index( 'title' )
112    if 'description' in tags:
113      ides = tags.index( 'description' )
114    else:
115      ides = None
116    section = self.section
117    if section == 'cellMethods':
118      icm = tags.index( 'cell_methods' )
119   
120    remap = {}
121    if self.section == 'structure':
122      lset = set()
123      icm2 = deflt[0].index( 'cell_methods' )
124      icoo = deflt[0].index( 'coords' )
125      icdi = deflt[0].index( 'odims' )
126      ##for idtag,targs,ltag in [('spid','spatialShape',None),('cmid','cellMethods','cell_methods'),('tmid','temporalShape',None)]:
127      for idtag in ['spid','cmid','tmid','cids','dids']:
128        if idtag in tags:
129          remap[idtag] = deflt[0].index(idtag)
130      print remap
131    if self.section == 'CMORvar':
132      sti= tags.index( 'stid' )
133      imt= tags.index( 'mipTable' )
134    elif self.section in ['requestVar']:
135      iv = tags.index( 'vid' )
136      ivg = tags.index( 'vgid' )
137    elif self.section == 'remarks':
138      iv = tags.index( 'tid' )
139    elif self.section == 'tableSection':
140      ig = tags.index( 'gpid' )
141    lm = 0
142    for k in range(tagrow+1,sht.nrows):
143     vals = [x.value for x in sht.row(k)]
144     try:
145      d = vals[0]
146      skip = False
147      if d != '':
148        if d[:3] in ['REM','MOV']:
149          skip = True
150        elif d[0] == '*' and d[-1] == ':':
151          targ = d[1:-1]
152          skip = 'after_remap'
153        else:
154          print 'WARN: directive in %s: %s' % ('xx',str(vals))
155      u = str(vals[iu])
156      l = str(vals[il])
157      if skip == 'after_remap':
158        skip = True
159        self.directiveMaps[section][(u,l)] = targ
160      if section in ['var','CMORvar'] and l in self.purgeVlab:
161        skip = True
162        self.purged.add( u )
163      if section  in ['requestVar','remarks'] and str( vals[iv] ) in self.purged:
164         skip = True
165         print 'Purged request var: ', vals
166       
167      if not skip:
168        if self.labMap:
169          if section == 'CMORvar':
170            self.mapl2u[section][(str(vals[imt]),l)] = u
171          else:
172            self.mapl2u[section][l] = u
173          if section == 'cellMethods':
174            self.mapu2l[section][u] = (l,str(vals[icm]))
175          else:
176            self.mapu2l[section][u] = l
177
178        assert u not in sh.keys(), 'Bad uid: %s' % u
179        if deflt == None:
180          oo = vals[1:]
181        else:
182          oo = deflt[1][:]
183          for i in range(len(ix)):
184            oo[ ix[i] ] = vals[i+1]
185        if section in ['CMORvar','tableSection']:
186          if section == 'CMORvar':
187              targ = 'structure'
188              iz = sti-1
189          elif section == 'tableSection':
190              targ = 'miptable'
191              iz = ig-1
192          if oo[iz][0] == '$':
193            slab = oo[iz][1:]
194            assert slab in self.mapl2u[targ], '%s ref not found: %s' % (targ,oo[iz])
195            oo[iz] = self.mapl2u[targ][slab]
196         
197        if section in ['requestVar'] and (vals[ivg],str( vals[iv] )) in self.rqvm:
198            oo[iv-1] = self.rqvm[ (vals[ivg],str( vals[iv] )) ]
199        if section == 'structure':
200          assert l not in lset, 'Label reused .....'
201          lset.add(l)
202          if 'spid' in remap:
203            lab = oo[remap['spid']]
204            oo[remap['spid']] = self.mapl2u['spatialShape'][lab]
205          if 'tmid' in remap:
206            lab = oo[remap['tmid']]
207            oo[remap['tmid']] = self.mapl2u['temporalShape'][lab]
208          if 'cmid' in remap:
209            lab = oo[remap['cmid']]
210            uu = self.mapl2u['cellMethods'][lab]
211            cm = self.mapu2l['cellMethods'][uu][1]
212            oo[remap['cmid']] = self.mapl2u['cellMethods'][lab]
213            oo[icm2] = cm
214          if 'cids' in remap:
215            uu = oo[remap['cids']]
216            if uu == '':
217              oo[icoo] = ''
218            else:
219              cl = []
220              for u1 in uu.split( ' ' ):
221                cl.append( self.mapu2l['grids'][u1] )
222              oo[icoo] = ' '.join( cl )
223          if 'dids' in remap:
224            uu = oo[remap['dids']]
225            if uu == '':
226              oo[icdi] = ''
227            else:
228              cl = []
229              for u1 in uu.split( ' ' ):
230                cl.append( self.mapu2l['grids'][u1] )
231              oo[icdi] = ' '.join( cl )
232
233        if ltd != None:
234          if u not in ltd:
235            print 'WARN.ltd.00001: %s not found: %s' % (u,str(oo))
236          else:
237            l,t=ltd[u]
238            if l != oo[il-1]:
239              print 'INFO.ltd.00002: new label: %s --> %s' % (oo[il-1],l)
240            else:
241              lm += 1
242            if t != oo[ittl-1]:
243              print 'INFO.ltd.00003: new title: %s --> %s' % (oo[ittl-1],t)
244            if l == 'rsutcsaf':
245              print 'rsutcsaf found',oo,l,t
246          d = oo[ides-1]
247          if d == 'as specified by C4MIP':
248            l = str( oo[il-1] )
249            if l in self.c4mip:
250               d2 = self.c4mip[l][6]
251               print 'C4MIP: [%s] %s --> %s' % (l,d,d2)
252               oo[ides-1] = d2
253            else:
254               print 'ERROR.c4mip.001: no description found for %s' % l
255        if oo[il-1] == '__unset__':
256          oo[il-1] = 'unset'
257        sh[u] = oo
258     except:
259      print 'FATAL ERROR'
260      print vals
261      raise
262
263    if self.section == 'requestVar':
264      self.rqvExtra(sh,tags)
265
266    if ltd != None:
267        print lm
268
269  def rqvExtra(self,sh,tags):
270    wb = utils_wb.workbook( 'requestvars.xls' )
271    print 'rqvExtra:: ',wb.sns, tags
272    sht = wb.book.sheet_by_name( 'extra' )
273##u'label', u'mip', u'priority', u'title', u'uid', u'vgid', u'vid'
274    for i in range(1,sht.nrows):
275      gp, var, tab, mip, title, p = (str(x.value) for x in sht.row(i)[:6] )
276      ee = {}
277      print 'rqvExtra: ',gp, var, tab, gp in self.mapl2u['requestVarGroup'], (tab,var) in self.mapl2u['CMORvar']
278      ee['vid'] = self.mapl2u['CMORvar'][(tab,var)]
279      ee['vgid'] = self.mapl2u['requestVarGroup'][gp]
280      ee['title'] = title
281      ee['priority'] = str( int( float( p ) )  )
282      ee['mip'] = mip
283      ee['label'] = '%s-%s' % (tab,var)
284      u = hashlib.new( 'sha1', '%s %s' % (ee['vgid'],ee['vid']) ).hexdigest()
285      ee['uid'] = u
286      assert u not in sh.keys(), 'Duplicate key'
287      sh[u] = [ee[k] for k in tags[1:]]
288      print u,sh[u]
289           
290
291class l1checks(object):
292  def __init__(self,l0dir='exports/l0sh', l1dir='exports/l0sh'):
293    self.l0 = l0sh( idir=l0dir )
294    self.l1 = l0sh( idir=l1dir )
295
296    self.check_var()
297
298  def check_var(self):
299    data = self.l1.sections['var']['data']
300    cols = self.l1.sections['var']['cols']
301
302 
303    ##for k,r in data.items():
304
305class l0sh(object):
306  def __init__(self,idir='exports/l0sh'):
307    self.sections = {}
308    fl = glob.glob( '%s/*' % idir )
309
310    for f in fl:
311      self.addSection( f )
312
313###
314### need to do something with units redirect ###
315###  may be easier to do global change in vars.
316###################################################
317  def addSection(self,f):
318    sh = shelve.open(f, 'r' )
319    section = sh['__info__']['label']
320    title = sh['__info__']['title']
321    ee = {}
322    cols = sh['__cols__'][:]
323    il = cols.index( 'label' )
324    cc = collections.defaultdict( set )
325    for k in sh.keys():
326      if k[0] != '_':
327        vals = sh[k][:]
328        cc[vals[il]].add( k )
329        ee[k] = vals
330    ii = [k for k in cc if len(cc[k]) > 1]
331    sd = {'title':title, 'cols':cols, 'data':ee}
332    if len(ii) > 0:
333      print 'Section %s:  number of non-unique labels=%s' % (section,len(ii))
334    else:
335      inx = {}
336      for k in cc:
337        inx[k] = cc[k].pop()
338      sd['byLab'] = inx
339    self.sections[section] = sd
340
341if __name__ == "__main__":
342  l02sh()
Note: See TracBrowser for help on using the repository browser.