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

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

01.00.17

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