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

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

updates

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