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

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

release cand

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