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

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/ing02/importSect.py@1206
Revision 1173, 14.3 KB checked in by mjuckes, 21 months ago (diff)

check

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( ['tomint','albsrfc','ua200','ua850','va200','va850', 'pdi', 'dpocdtcalc', 'dpocdtpico', 'dpocdtdiaz'] )
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      ity= tags.index( 'type' )
159      imt= tags.index( 'mipTable' )
160      ifr= tags.index( 'frequency' )
161    elif self.section in ['requestVar']:
162      iv = tags.index( 'vid' )
163      ivg = tags.index( 'vgid' )
164      imp = tags.index( 'mip' )
165    elif self.section == 'remarks':
166      iv = tags.index( 'tid' )
167    elif self.section == 'experiment':
168      ig = tags.index( 'egid' )
169    elif self.section == 'requestItem':
170      ie = tags.index( 'esid' )
171      iec = tags.index( 'esidComment' )
172    elif self.section == 'tableSection':
173      ig = tags.index( 'gpid' )
174    if section in ['var','grids']:
175      iun = tags.index( 'units' )
176
177    lm = 0
178    for k in range(tagrow+1,sht.nrows):
179     vals = [x.value for x in sht.row(k)]
180     try:
181      d = vals[0]
182      skip = False
183      if d != '':
184        if d[:3] in ['REM','DEL','MOV']:
185          skip = True
186        elif d[0] == '*' and d[-1] == ':':
187          targ = d[1:-1]
188          skip = 'after_remap'
189        else:
190          print 'ERROR.appendSect: directive in %s: %s' % ('xx',str(vals))
191
192      u = str(vals[iu])
193      l = str(vals[il])
194      if skip == 'after_remap':
195        skip = True
196        self.directiveMaps[section][(u,l)] = targ
197
198      if section in ['var','CMORvar'] and l in self.purgeVlab:
199        skip = True
200        self.purged.add( u )
201      elif section == 'CMORvar' and (l,str(vals[imt])) in self.purgeCmv:
202        skip = True
203        self.purged.add( u )
204
205      if section  in ['requestVar','remarks'] and str( vals[iv] ) in self.purged:
206         skip = True
207         print 'Purged request var: ', vals
208      elif section == 'requestVar':
209        t = tuple( [ str( vals[x] ) for x in [il,iv,ivg,imp] ] )
210        if t in self.rqvp.ss:
211          skip = True
212          print 'PURGED request var: ', t
213       
214      if not skip:
215        if self.labMap:
216          if section == 'CMORvar':
217            self.mapl2u[section][(str(vals[imt]),l)] = u
218          else:
219            self.mapl2u[section][l] = u
220          if section == 'cellMethods':
221            self.mapu2l[section][u] = (l,str(vals[icm]))
222          else:
223            self.mapu2l[section][u] = l
224
225        assert u not in sh.keys(), 'Bad uid: %s [%s]' % (u,self.section)
226        if deflt == None:
227          oo = vals[1:]
228        else:
229          oo = deflt[1][:]
230          for i in range(len(ix)):
231            oo[ ix[i] ] = vals[i+1]
232        if section in ['CMORvar','tableSection','requestVar']:
233          if section == 'CMORvar':
234              targ = 'structure'
235              iz = sti-1
236          elif section == 'tableSection':
237              targ = 'miptable'
238              iz = ig-1
239          elif section == 'requestVar':
240              targ = 'CMORvar'
241              iz = iv-1
242          if oo[iz][0] == '$':
243            if section == 'requestVar':
244              slab = tuple( oo[iz][1:].split('.') )
245            else:
246              slab = oo[iz][1:]
247            assert slab in self.mapl2u[targ], '%s ref not found: %s' % (targ,oo[iz])
248            oo[iz] = self.mapl2u[targ][slab]
249
250        if section in ['var','grids']:
251          if str(vals[iun]) == '1.0':
252            oo[iun-1] = '1'
253
254        if section in ['CMORvar']:
255          if str(vals[ity]) in [ '','float']:
256            oo[ity-1] = 'real'
257
258         
259        if section in ['requestVar'] and (vals[ivg],str( vals[iv] )) in self.rqvm:
260            oo[iv-1] = self.rqvm[ (vals[ivg],str( vals[iv] )) ]
261
262        if section == 'CMORvar':
263          if oo[ifr-1] == 'hr':
264            oo[ifr-1] = '1hr'
265            print 'Changing frequency --> 1hr',oo
266
267        if section == 'experiment':
268          if oo[ig-1][0] == '$':
269            glab = oo[ig-1][1:]
270            oo[ig-1] = self.mapl2u['exptgroup'][glab]
271            print 'Changing egid :',oo
272        if section == 'requestItem':
273          if oo[iec-1][:28] == 'ERROR: Experiment Aerchemmip':
274            glab = oo[iec-1].split()[2]
275            u = self.mapl2u['exptgroup'][glab]
276            oo[ie-1] = u
277            oo[iec-1] = 'AerChemMIP group %s' % glab
278            print 'Changing esid :',oo
279
280
281        if section == 'structure':
282          assert l not in lset, 'Label reused ....%s: %s' % (vals[ipn],l)
283          lset.add(l)
284          if 'spid' in remap:
285            lab = oo[remap['spid']]
286            oo[remap['spid']] = self.mapl2u['spatialShape'][lab]
287          if 'tmid' in remap:
288            lab = oo[remap['tmid']]
289            oo[remap['tmid']] = self.mapl2u['temporalShape'][lab]
290          if 'cmid' in remap:
291            lab = oo[remap['cmid']]
292            uu = self.mapl2u['cellMethods'][lab]
293            cm = self.mapu2l['cellMethods'][uu][1]
294            oo[remap['cmid']] = self.mapl2u['cellMethods'][lab]
295            oo[icm2] = cm
296          if 'cids' in remap:
297            uu = oo[remap['cids']]
298            if uu == '':
299              oo[icoo] = ''
300            else:
301              cl = []
302              for u1 in uu.split( ' ' ):
303                cl.append( self.mapu2l['grids'][u1] )
304              oo[icoo] = ' '.join( cl )
305          if 'dids' in remap:
306            uu = oo[remap['dids']]
307            if uu == '':
308              oo[icdi] = ''
309            else:
310              cl = []
311              for u1 in uu.split( ' ' ):
312                cl.append( self.mapu2l['grids'][u1] )
313              oo[icdi] = ' '.join( cl )
314
315        if ltd != None:
316          if u not in ltd:
317            print 'INFO.ltd.00001: %s not found: %s' % (u,str(oo))
318          else:
319            l,t=ltd[u]
320            if l != oo[il-1]:
321              print 'INFO.ltd.00002: new label: %s --> %s' % (oo[il-1],l)
322            else:
323              lm += 1
324            if t != oo[ittl-1]:
325              print 'INFO.ltd.00003: new title: %s --> %s' % (oo[ittl-1],t)
326            if l == 'rsutcsaf':
327              print 'rsutcsaf found',oo,l,t
328          d = oo[ides-1]
329          if d == 'as specified by C4MIP' and False:
330            l = str( oo[il-1] )
331            if l in self.c4mip:
332               d2 = self.c4mip[l][6]
333               print 'C4MIP: [%s] %s --> %s' % (l,d,d2)
334               oo[ides-1] = d2
335            else:
336               print 'ERROR.c4mip.001: no description found for %s' % l
337
338        if oo[il-1] == '__unset__':
339          oo[il-1] = 'unset'
340        sh[u] = oo
341     except:
342      print 'FATAL ERROR'
343      print k,vals
344      raise
345
346    if self.section == 'requestVar':
347      self.rqvExtra(sh,tags)
348
349    if ltd != None:
350        print lm
351
352  def rqvExtra(self,sh,tags):
353    wb = utils_wb.workbook( 'requestvars.xls' )
354    print 'rqvExtra:: ',wb.sns, tags
355    sht = wb.book.sheet_by_name( 'extra' )
356##u'label', u'mip', u'priority', u'title', u'uid', u'vgid', u'vid'
357    for i in range(1,sht.nrows):
358      gp, var, tab, mip, title, p = (str(x.value) for x in sht.row(i)[:6] )
359      if gp != '' and gp[0] != '#':
360        ee = {}
361        print 'rqvExtra: ',gp, var, tab, gp in self.mapl2u['requestVarGroup'], (tab,var) in self.mapl2u['CMORvar']
362        ee['vid'] = self.mapl2u['CMORvar'][(tab,var)]
363        ee['vgid'] = self.mapl2u['requestVarGroup'][gp]
364        ee['title'] = title
365        ee['priority'] = str( int( float( p ) )  )
366        ee['mip'] = mip
367        ee['label'] = '%s-%s' % (tab,var)
368        u = hashlib.new( 'sha1', '%s %s' % (ee['vgid'],ee['vid']) ).hexdigest()
369        ee['uid'] = u
370        assert u not in sh.keys(), 'Duplicate key'
371        sh[u] = [ee[k] for k in tags[1:]]
372        print u,sh[u]
373           
374
375class l1checks(object):
376  def __init__(self,l0dir='exports/l0sh', l1dir='exports/l0sh'):
377    self.l0 = l0sh( idir=l0dir )
378    self.l1 = l0sh( idir=l1dir )
379
380    self.check_var()
381
382  def check_var(self):
383    data = self.l1.sections['var']['data']
384    cols = self.l1.sections['var']['cols']
385
386 
387    ##for k,r in data.items():
388
389class l0sh(object):
390  def __init__(self,idir='exports/l0sh'):
391    self.sections = {}
392    fl = glob.glob( '%s/*' % idir )
393
394    for f in fl:
395      self.addSection( f )
396
397###
398### need to do something with units redirect ###
399###  may be easier to do global change in vars.
400###################################################
401  def addSection(self,f):
402    sh = shelve.open(f, 'r' )
403    section = sh['__info__']['label']
404    title = sh['__info__']['title']
405    ee = {}
406    cols = sh['__cols__'][:]
407    il = cols.index( 'label' )
408    cc = collections.defaultdict( set )
409    for k in sh.keys():
410      if k[0] != '_':
411        vals = sh[k][:]
412        cc[vals[il]].add( k )
413        ee[k] = vals
414    ii = [k for k in cc if len(cc[k]) > 1]
415    sd = {'title':title, 'cols':cols, 'data':ee}
416    if len(ii) > 0:
417      print 'Section %s:  number of non-unique labels=%s' % (section,len(ii))
418    else:
419      inx = {}
420      for k in cc:
421        inx[k] = cc[k].pop()
422      sd['byLab'] = inx
423    self.sections[section] = sd
424
425if __name__ == "__main__":
426  l02sh(idir='exports/l1',odir='exports/l1sh')
Note: See TracBrowser for help on using the repository browser.