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

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

fixed expts

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