source: CMIP6dreqbuild/trunk/srcMisc/dreq_consol_tables.py @ 770

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/srcMisc/dreq_consol_tables.py@1157
Revision 770, 30.1 KB checked in by mjuckes, 4 years ago (diff)

Extended overview tables, corrected content

Line 
1"""Parsing adjusted CMIP5 tables.
2"""
3import string, shelve, uuid
4import dreq_utils
5from fcc_utils2 import snlist
6import xlrd, string, shelve, os, re, sys, stat
7import collections, hashlib
8import xlutils, xlwt
9import xlutils.copy
10####
11####
12#### new variables taken from CMIP6DataRequest_ConsolidatedNewVariables.xls .. but this is not kept up to date
13####
14import dreq_cfg
15from utils_wb import wbcp, workbook, uniCleanFunc
16
17class maps(object):
18  ttranstem  = {'icesheetmon':'LImon','icesheetyear':'LIyr','icesheetfx':'LIfx'}
19
20vdate = '20160309'
21
22nt__grphd = collections.namedtuple( 'grphd', ['withPriority','thisl', 'iv', 'it','ll'] )
23nt__deckrq = collections.namedtuple( 'dckrq', ['control','AMIP','abrupt4xCO2','rq_1pctCO2','historical'] )
24nt__grptbl = collections.namedtuple( 'grptbl', ['grp','var','srcTable','freq','description','shape','levels','timeProc','mask','priority','mip','id'] )
25nt__newtbl = collections.namedtuple( 'newtbl', ['var','sn','stat','grid','units','long_name','description','priority','obs','mip','id'] )
26dd_rq = collections.defaultdict( dict )
27dd_tbl = collections.defaultdict( int )
28
29def md5sum(filename, blocksize=65536):
30    hash = hashlib.md5()
31    with open(filename, "r+b") as f:
32        for block in iter(lambda: f.read(blocksize), ""):
33            hash.update(block)
34    return hash.hexdigest()
35
36#### shelve to record file access times and checksums
37shr1 = shelve.open( 'shref01/shr1_md5' )
38
39class tupsort:
40   def __init__(self,k=0):
41     self.k = k
42   def cmp(self,x,y):
43     return cmp( x[self.k], y[self.k] )
44
45def uniquify( ll ):
46  ll.sort()
47  l0 = [ll[0],]
48  for l in ll[1:]:
49    if l != l0[-1]:
50      l0.append(l)
51  return l0
52
53def getRowValues( ll, minLen=0, maxLen=0):
54  oo = []
55  for i in ll:
56    oo.append( i.value )
57  if len(oo) >= minLen:
58    return oo[:minLen]
59  for i in range(minLen+1):
60    if len(oo) == minLen:
61      return oo
62    oo.append( '' )
63  if maxLen > 0:
64    return oo[:maxLen]
65  return oo
66
67clabs = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
68def clab(n):
69  i = n/26
70  assert i < 26, 'Not ready for row number greater than 26*26'
71  if i == 0:
72    return clabs[n]
73  else:
74    return clabs[i-1] + clabs[ n - i*26]
75
76def getRow(sht):
77  ee = {}
78  for i in range(sht.nrows):
79    if sht.row(i)[0].ctype == 2 and str( sht.row(i)[0].value ) != '0.0':
80      l = map( lambda x: str( x.value ), sht.row(i) )
81      k = l[5]
82      try:
83        ee[k] = l
84      except:
85        print l
86        raise
87  return ee
88   
89def outvSer( ov ):
90  ll = []
91  for i in ov:
92    ll.append( '%s|%s|%s' % tuple( map( str, i) ) )
93  return string.join(ll, '; ' )
94def joinRec( rl, tab='\t', omit=[],lmax=None ):
95    l1 = len(rl)
96    if lmax != None and l1 > lmax:
97      l1 = lmax
98    rl0 = []
99    for i in range(l1):
100      if i not in omit:
101        rl0.append(string.strip(str(rl[i])))
102    return string.join( map( str, rl0), tab )
103 
104
105def lennbl(ll):
106  i = 0
107  ii = 0
108  for l in ll:
109    i+= 1
110    if l != '':
111      ii = i
112  return ii
113
114def  matchVals( thisv, valset ):
115  ll1 = []
116  ll2 = []
117  lk0 = []
118  kk = 0
119  for vals in valset:
120    l1 = min( [lennbl(thisv), lennbl(vals)] )
121    l2 = max( [lennbl(thisv), lennbl(vals)] )
122    ll = []
123    for i in range(l1):
124      ll.append( vals[i] == thisv[i] )
125    for i in range(l2-l1):
126      ll.append(False)
127    if all(ll):
128      return ll
129    k = 0
130    for l in ll:
131      if l:
132        k+=1
133    if ll[0]:
134      lk0.append( kk )
135     
136    ll1.append(k)
137    ll2.append(ll)
138    kk += 1
139  k0 = max( ll1 )
140  if len(lk0) > 0:
141    k0 = lk0[0]
142    return ll2[ k0 ]
143  return ll2[ ll1.index(k0) ]
144   
145class mipTable(object):
146
147  def __init__(self,id,section):
148     self.vars = collections.defaultdict( list )
149     self.id = id
150     self.section = section
151
152class s0(object):
153  def __init__(self):
154    self.a = collections.defaultdict( list )
155class s1(object):
156  def __init__(self):
157    self.a = collections.defaultdict( s0 )
158
159class rqsummary(object):
160  __doc__ = """Create a request summary table, by MIP and variable table.
161Creates a list of default dictionaries, one for each table. An entry for each MIP in each dictionary.
162"""
163
164  def __init__(self,exptInfo=None):
165    self.tablist = []
166    self.tabindx = {}
167    self.mips = collections.defaultdict( int )
168    self.vars = collections.defaultdict( list )
169    self.t = {}
170    self.records = []
171    self.recordProv = {}
172    self.exptInfo = exptInfo
173    self.ref1 = collections.defaultdict( s1 )
174    for k in shr1.keys():
175      r = shr1[k]
176## index on mip/file name/md5
177      self.ref1[r[-1]].a[r[0]].a[k] = r
178    for k in self.ref1.keys():
179      for k1 in self.ref1[k].a.keys():
180        if len( self.ref1[k].a[k1].a.keys() ) > 1:
181          ll = {}
182          for k2 in self.ref1[k].a[k1].a.keys():
183            ll[  self.ref1[k].a[k1].a[k2][2] ] = k2
184          ks = ll.keys()
185          ks.sort()
186          thisk = ll[ks[-1]]
187          assert thisk in self.ref1[k].a[k1].a, 'ERROR referencing ref1.a.a ... with %s' % thisk
188          self.ref1[k].a[k1].latest = self.ref1[k].a[k1].a[ thisk ]
189        else:
190          assert self.ref1[k].a[k1].a.keys()[0] in self.ref1[k].a[k1].a, 'ERROR referencing ref1.a.a ... with %s' % (self.ref1[k].a[k1].a.keys()[0] )
191          self.ref1[k].a[k1].latest  =  self.ref1[k].a[k1].a[ self.ref1[k].a[k1].a.keys()[0] ]
192
193  def addTab(self,tab,section):
194    self.t[tab] = mipTable( tab,section)
195
196  def add(self,mip,path,tab,tabmode='uid', extra=None):
197    self.tab = tab
198## rq will add a reference to parent
199    ##print '######',mip, path, tab
200    return rq(mip,path,parent=self,tab=tab,tabmode=tabmode,section=extra)
201
202  def addItem( self, mip, tab, nn ):
203    if not self.tabindx.has_key( tab ):
204      self.tabindx[tab] = len(self.tablist)
205      self.tablist.append( collections.defaultdict( int ) )
206    ix = self.tabindx[tab]
207    self.tablist[ix][mip] = nn
208    self.mips[mip] += 1
209
210  def checkVars(self):
211    keys = self.vars.keys()
212    keys.sort()
213    for k in keys:
214      if len( self.vars[k] ) == 1:
215        print 'INFO.00010.0001: ',k, 'singleton'
216      else:
217        li = self.vars[k]
218## getting a bit intricate here -- 3rd element is index of record row
219        ll = [self.records[li[0][2]], ]
220        aa = collections.defaultdict( list )
221        aa[0].append[0]
222       
223  def prep(self,mode='vars',tab=None):
224    if tab != None:
225      self.tab = tab
226    kk = 0
227    mips = self.mips.keys()
228    mips.sort()
229    keys = self.tabindx.keys()
230    keys.sort()
231    self.oorecs = []
232    if mode == 'vars':
233      keys = self.t[self.tab].vars.keys()
234      keys.sort()
235      for k in keys:
236        rec = [k,]
237        ee1 = collections.defaultdict( list )
238        ee2 = {}
239        for t in self.t[self.tab].vars[k]:
240          k0 = joinRec( self.records[t[2]], tab=',', omit=[7,16,23] )
241          ee1[k0].append( t )
242###
243### differences in records found as multiple entries in collection here ...
244###
245        if len(ee1.keys()) <= 1:
246          pass
247          ##print 'INFO.003: NO CHANGE AT %s (%s)' % (k,len(self.t[self.tab].vars[k]) )
248        else:
249          print 'INFO.003: DUPLICATES AT %s (%s)' % (k,len(ee1.keys()) )
250          for k1 in ee1.keys():
251              for t in ee1[k1]:
252                ee2[t[0]] = k1
253          k1 = ee1.keys()
254          ee3 = collections.defaultdict( list )
255          for t in self.t[self.tab].vars[k]:
256            ee3[k1.index( ee2[t[0]] ) ].append( '%s[%s]' % (t[0],t[1]) )
257            rec.append( '%s[%s]{%s}' % (t[0],t[1],k1.index( ee2[t[0]]) ) )
258          ##self.oorecs.append(rec)
259          for kkk in k1:
260            ix = ee1[kkk][0][2]
261            ik = k1.index(kkk)
262            rec = [k, string.join(ee3[ik],';'),]   + list(self.records[ix])
263            self.oorecs.append(rec)
264         
265  def showXls(self,wb,r0=3,offset=0):
266    r = r0
267    thisStj = 2
268    for rec in self.oorecs:
269      i = offset
270      for item in rec:
271        wb.putValue2( r,i, item )
272        i+= 1
273      thisStj = 5 - thisStj
274      r+= 1
275   
276  def show(self,oo,mode='vars',tab=None):
277    if tab != None:
278      self.tab = tab
279    kk = 0
280    mips = self.mips.keys()
281    mips.sort()
282    keys = self.tabindx.keys()
283    keys.sort()
284    if mode == 'vars':
285      for rec in self.oorecs:
286            srec = joinRec( rec) + '\t' 
287            oo.write( srec + '\n' )
288
289    elif mode == 'oldvars':
290      keys = self.t[self.tab].vars.keys()
291      keys.sort()
292      for k in keys:
293        rec = '%s\t' % k
294        ee1 = collections.defaultdict( list )
295        ee2 = {}
296        for t in self.t[self.tab].vars[k]:
297          k0 = joinRec( self.records[t[2]], tab=',', omit=[7,16,23] )
298          ee1[k0].append( t )
299        if len(ee1.keys()) > 1:
300          for k1 in ee1.keys():
301              for t in ee1[k1]:
302                ee2[t[0]] = k1
303          k1 = ee1.keys()
304          for t in self.t[self.tab].vars[k]:
305            rec += '%s[%s]{%s}\t' % (t[0],t[1],k1.index( ee2[t[0]]) )
306          oo.write( rec + '\n' )
307          for kkk in k1:
308            ix = ee1[kkk][0][2]
309            rec = '--%s--\t' % k1.index(kkk) + joinRec( self.records[ix] ) + '\t' 
310            oo.write( rec + '\n' )
311    else:
312     oo.write( ',' + string.join(mips, ',') + ',\n' )
313     for k in keys:
314      r = []
315      ix = self.tabindx[k]
316      for m in mips:
317        r.append( self.tablist[ix][m] )
318      if max(r) > 0:
319        rec = '%s,' % k
320        for i in r:
321          rec += '%s,' %  i
322        oo.write( rec + '\n' )
323
324#dd_rq = collections.defaultdict( dict )
325#dd_tbl = collections.defaultdict( int )
326class rq(object):
327  """Class rq
328--------
329This class will parse a modified CMIP5 standard output sheet.
330"""
331
332  def __init__(self, mip,path, parent=None,tab=u'Omon',tabmode='uid',section=None ):
333
334    self.mip = mip
335    self.section = section
336    self.parent = parent
337    self.nn = 0
338    self.fn = string.split( path, '/' )[-1]
339    stt = os.stat( path )
340    self.ctime = stt[stat.ST_CTIME]
341    self.fsize = stt[stat.ST_SIZE]
342    print 'INFO.001.00020: >>>> %s: %s' % (self.fn,self.ctime)
343    if self.parent.ref1[mip].a.has_key(self.fn):
344       if self.fn not in self.parent.ref1[mip].a:
345           md5 = md5sum( path )
346           shr1[md5] = (self.fn,path,self.ctime, self.fsize, md5,mip )
347       else:
348         tt = self.parent.ref1[mip].a[self.fn].latest
349         if len( tt ) > 3:
350           if self.ctime == tt[2] and self.fsize == tt[3]:
351             print 'INFO.001.00030: %s unchanged' % self.fn
352             md5 = tt[4]
353           else:
354             md5 = md5sum( path )
355             if md5 == tt[4]:
356               print 'INFO.001.00040: md5 unchanged: %s' % self.fn
357             else:
358               shr1[md5] = (self.fn,path,self.ctime, self.fsize, md5,mip )
359         else:
360           print 'ERROR.888.0001: Unexpected ref1 record (input status): %s' % str(tt)
361           md5 = md5sum( path )
362    else:
363       md5 = md5sum( path )
364       print 'INFO.888.0001: setting md5 for %s' % path
365       shr1[md5] = (self.fn,path,self.ctime, self.fsize, md5,mip )
366    self.md5 = md5
367    self.wk1 = wbcp( inbook=path )
368    if tab in  self.wk1.sns:
369      self.tab = tab
370      if tabmode == 'tab' or mip == 'CMIP5':
371            self.tabid = tab
372      else:
373            self.tabid = '%s.%s' %  (mip,tab)
374      self.wk1.focus( tab)
375      if not self.parent.t.has_key(self.tabid):
376        self.parent.addTab(self.tabid,self.section)
377      self.ok = self.parse01()
378      if not self.ok:
379        self.reason = 'Parse01 failed'
380    else:
381      self.reason = 'Table not present'
382      self.ok = False
383
384  def parse01(self):
385    """Parsing revised CMIP5 standard output"""
386
387    ee1 = collections.defaultdict( list )
388    for j in range(3,self.wk1.currentSi.nrows):
389      if self.wk1.currentSi.row(j)[0].ctype == 2:
390        v = string.strip( str( self.wk1.currentSi.row(j)[5].value ) )
391        t2 = self.wk1.currentSi.row(j)[17].ctype
392        ee1[v].append((j,t2))
393    for j in range(3,self.wk1.currentSi.nrows):
394      rv = map( lambda x: x.value, self.wk1.currentSi.row(j) )
395      lr0 = len(rv)
396      for i in range(10):
397        if len(rv) < 26:
398           rv.append('')
399      if self.wk1.currentSi.row(j)[0].ctype == 2:
400        v = string.strip( str( self.wk1.currentSi.row(j)[5].value ) )
401        if self.wk1.currentSi.row(j)[17].ctype == 1:
402          v2 = string.strip( str( self.wk1.currentSi.row(j)[17].value ) )
403        else:
404          v2 = None
405        if v not in ['0.0','']:
406          if len(ee1[v]) > 1:
407             ##v += '__%s' % ['a','b'][ee1[v].index(j)]
408             assert not all( map( lambda x: x[1] != 1, ee1[v] ) ), 'duplicate variable name and no cmor name ... %s %s' % (v,self.mip)
409             if v2 != None:
410               v = v2
411          if v == 'clic':
412            print 'INFO.clic.00004: ',rv
413          ixr = len(self.parent.records )
414## add record
415          self.parent.records.append( tuple(rv[1:]) )
416          kr = len( self.parent.records )
417          self.parent.recordProv[kr] = self.md5
418          p = int( rv[0] + 0.001 )
419          if lr0 > 24:
420            if self.wk1.currentSi.row(j)[24].ctype == 2:
421              yv = int( rv[24] + 0.001 )
422              assert yv in [0,1,2], 'Invalid value in column Y, j=%s,v=%s' % (j,v)
423              if yv == 0:
424                p = None
425              elif yv == 2:
426                p = 1
427            elif rv[24] != '':
428              print 'WARN.001.02001: [1]:', self.mip, v, p, rv[24]
429         
430          if p != None:
431            self.parent.t[self.tabid].vars[v].append( (self.mip,p,ixr,self.section,j) ) 
432            self.nn += 1
433
434    return True
435
436class main(object):
437  def __init__(self):
438    kk=3
439    self.idx = 0
440    self.vl3 = None
441    self.ctf = 'dreq_consol_tables_shelve_v%s' % vdate
442    self.vark = dreq_utils.varKeys( file=self.ctf)
443    self.sh = shelve.open( 'dreq_consol_tables_shelve_v%s' % vdate, 'n' )
444    self.shnv = shelve.open( 'dreq_consol_tables_nv_shelve_v%s' % vdate, 'n' )
445    self.shnvo = shelve.open( 'dreq_consol_tables_nvom_shelve_v%s' % vdate, 'n' )
446    self.shold = shelve.open( 'DEPRECIATED_dreq_consol_tables_old_shelve_v%s' % vdate, 'n' )
447    self.oonvo = open('DepricatedNewVars.txt', 'w' )
448
449    base = '/home/martin/2014/wip/dreq/'
450    self.dir0 = '/home/martin/2014/wip/dreq/input/'
451    file = 'PMIP/CMIP6DataRequestCompilationTemplate_20141218_PMIP_v150228_final.xls'
452    file = 'C4MIP/CMIP6DataRequestCompilationTemplate_C4MIP_06March2015_submitted.xls'
453    fileTmpl = 'CMIP6DataRequestCompilationTemplate_20141218.xls'
454    self.newVars = 'CMIP6DataRequest_ConsolidatedNewVariables_v20150907.xls'
455    self.newVars = 'CMIP6DataRequest_ConsolidatedNewVariables.xls'
456    self.nvd = {}
457
458    wk0 = wbcp( inbook=base+fileTmpl )
459    self.cfg = dreq_cfg.rqcfg()
460    wk0.focus( u'Experiments')
461    mlist = collections.defaultdict( list )
462    for i in range(2,wk0.currentSi.nrows):
463      mip = str(wk0.currentSi.row(i)[3].value)
464      vals = map( lambda x: x.value, wk0.currentSi.row(i) )
465      if mip != '':
466        mlist[mip].append( vals )
467   
468    self.mips = mlist.keys()
469    self.mips.sort()
470   
471    mipTrans ={ 'geoMIP':'GeoMIP' }
472    diagMips = ['DynVar','SIMIP']
473    k2 = self.cfg.ff.keys()
474    k2.sort()
475    nn = 0
476    for k in k2:
477      k = mipTrans.get( k,k)
478      if k not in self.mips and k not in diagMips:
479         print 'ERROR.001.09001: %s not found' % k
480         nn += 1
481    assert nn == 0, 'MIP naming error?'
482
483    exptList = '/home/martin/Documents/CMIP6_ExpermentList_draft01April2015.xls'
484    wke = wbcp( exptList )
485    wke.focus( 'Experiments' )
486    expgs = collections.defaultdict( int )
487    expgsEns = collections.defaultdict( int )
488    expgsYpe = collections.defaultdict( int )
489    for k in range(2,wke.currentSi.nrows):
490      vals = map( lambda x: x.value, wke.currentSi.row(k) )
491      g = string.strip( vals[1] )
492      if g[:5] == 'DAMIP':
493        print 'INFO.001.00060: ',g,vals[12],vals[13]
494      expgs[g] += vals[13]
495      expgsEns[g] = vals[12]
496
497    for k in expgs.keys():
498      if expgsEns[k] == 0:
499        expgsYpe[k] = 0
500      else:
501        try:
502          expgsYpe[k] = expgs[k]/expgsEns[k]
503        except:
504          print 'INFO.001.00070: ',k, expgs[k], expgsEns[k]
505          raise
506   
507    self.rqs= rqsummary(exptInfo=(expgs,expgsEns,expgsYpe))
508    self.exptInfo=(expgs,expgsEns,expgsYpe)
509
510  def loadNewVars(self):
511    assert os.path.isfile( self.newVars ), '%s not found' % self.newVars
512    wb = workbook(self.newVars)
513    sh = wb.book.sheet_by_name( 'New variables' )
514    oo = open( '/tmp/newvars.txt', 'w' )
515    for i in range(3,sh.nrows):
516      r = map( lambda x: x.value, sh.row(i) )
517      try:
518        oo.write( string.join(map(str,r) ) + '\n' )
519      except:
520        oo.write( r[0] + '  --- rest missing --- \n' )
521      if r[0] != '' and r[4] != '' and r[0][0] != '#':
522        v = string.strip( str( r[4] ) )
523        if v[0] != '#':
524          bits = string.split(v,' ')
525          if len(bits) == 1:
526            m = str( r[0] )
527            p = 0
528            try:
529              if m == 'LUMIP':
530                r = r[:5] + r[6:]
531              p = int( r[11] )
532            except:
533              print 'INFO.001.00070: Failed to read priority: ',v,m
534            if v[-2:] == '**':
535               v = v[:-2]
536            elif v[-1] == '!':
537               v = v[:-1]
538            if self.nvd.has_key(v):
539              print 'INFO.001.00070: ',v,self.nvd[v],m,p
540            self.nvd[v] = [p,] + r
541
542    for v in self.nvd.keys():
543        if v in self.vl3:
544          print 'WARN.090.08000: "new" variable in old list: %s: %s ' % (v,str(self.vl3[v]) )
545          self.shnvo[v] = ( self.nvd[v][:], self.vl3[v] )
546          self.oonvo.write( '-- %s --\n' % v )
547          self.oonvo.write( str( self.nvd[v][:]) + '\n' )
548          self.oonvo.write( str( self.vl3[v][:] ) + '\n' )
549        else:
550          k = str( uuid.uuid1() )
551          self.shnv[k] = self.nvd[v][:] + [k,]
552    oo.close()
553
554  def parseGrpHead(self,sh,path,k,s):
555    rh1 = ['Short name', 'Standard Name', 'Table', 'Frequency', 'Description extension (optional)', 'Shape', 'Levels', 'Time mean, point or climatology', 'Mask (optional)']
556    rh2 = ['Short name of group', 'Variable short name', 'Table', 'Frequency', 'Description extension (optional)', 'Shape', 'Levels', 'Time mean, point or climatology', 'Mask (optional)']
557           
558##
559## initial loop over rows in variable group sheet
560##
561    ll = []
562    for i in range(sh.nrows):
563             thisr = sh.row(i)
564             tv = thisr[0].value
565             if tv[:10] == 'Short name':
566               ll.append(i)
567
568    assert len(ll) in [1,2], 'Could not parse sheet  %s, %s, %s: %s' % (path,k,s,len(ll))
569    withPriority = False
570    hr = sh.row( ll[-1] )
571    if len(ll) == 1:
572## nt__grptbl = collections.namedtuple( 'grptbl', ['grp','var','srcTable','freq','description','shape','levels','timeProc','mask'] )
573             iv = 1
574             it = 0
575             ok = len( hr ) >= 9 and all( map( lambda x: string.strip(hr[x].value) == rh2[x], range(9) ) )
576             assert ok, '001: Sheet heading not recognised: %s' % str(hr)
577             if len(hr) > 9 and hr[9].value == u'Priority':
578               withPriority = True
579               thisl = 10
580             else:
581               thisl = 9
582    else:
583             ok = len( hr ) >= 9 and all( map( lambda x: string.strip(hr[x].value) == rh1[x], range(9) ) )
584             assert ok, '002: Sheet heading not recognised: %s' % str(hr)
585             iv = 0
586             it = -1
587             tv = sh.row(2)[1].value
588             thisl = 9
589    return (nt__grphd( withPriority, thisl, iv, it, ll ), tv)
590
591  def groups(self):
592    '''Parse new variable groups'''
593    vl3 = self.vl3
594##    rh1 = ['Short name', 'Standard Name', 'Table', 'Frequency', 'Description extension (optional)', 'Shape', 'Levels', 'Time mean, point or climatology', 'Mask (optional)']
595##    rh2 = ['Short name of group', 'Variable short name', 'Table', 'Frequency', 'Description extension (optional)', 'Shape', 'Levels', 'Time mean, point or climatology', 'Mask (optional)']
596    rh3 = ['Short name of group', 'Variable short name', 'Table', 'Frequency', 'Description extension (optional)', 'Shape', 'Levels', 'Time mean, point or climatology', 'Mask (optional)', 'Priority']
597
598    print 'INFO.002.0001: cfg.ee.keys: ',self.cfg.ee.keys()
599    omit = ['ALL VARIABLES', 'Objectives','Experiments','Experiment Groups','Request scoping','New variables','__lists__']
600    keys = self.cfg.ee.keys()
601    keys.sort()
602    ee = {}
603##
604## array for information and debugging
605##
606    self.glist = []
607    for k in keys:
608        fn = self.cfg.ee[k]
609        path = '%s%s/%s' % (self.dir0,k,fn)
610        wb = workbook( path )
611        ss = []
612        for s in wb.sns:
613          if s not in omit:
614            ss.append(s)
615        for s in ss:
616          e1 = collections.defaultdict( int )
617          if s[:5] != 'CMIP5':
618           sh = wb.book.sheet_by_name( s ) 
619##
620## parse headers of sheet into named tuple "gh"
621##
622           gh, tv = self.parseGrpHead(sh,path,k,s)
623##
624## main loop over rows in variable group sheet
625##
626           irsh = 5
627           for i in range(gh.ll[-1]+1,sh.nrows):
628            rowIndex = i
629            thisr = sh.row(i)
630            v0 = str( thisr[0].value ) + '__' 
631            if v0[0] != '#':
632             if gh.iv == 1:
633                lll = getRowValues( thisr, minLen=gh.thisl, maxLen=gh.thisl )
634             else:
635                lll = getRowValues( thisr, minLen=gh.thisl, maxLen=gh.thisl )
636                lll[1] = lll[0]
637                lll[0] = tv
638             if gh.thisl == 9:
639               lll.append( 105 )
640
641             assert len(lll) == 10,'bad record length ....'
642###
643### add mip name and space ...
644###
645             lll += [k,'']
646             if gh.it >= 0:
647               tv = thisr[gh.it].value
648             v = thisr[gh.iv].value
649             bits = string.split(v, ' ')
650             if len(bits) > 1:
651               v = bits[0]
652             if v == 'ta':
653               print 'INFO.045.0001: reading ta: thisl=%s, lll=%s' % (gh.thisl,lll)
654             t = thisr[2].value
655             if t[:6] == "CMIP5_":
656               t = t[6:]
657             if len(string.split(t, ' ')) > 1:
658               t2 = string.split(t, ' ')[1]
659               t = string.split(t, ' ')[0]
660             else: 
661               t2 = None
662             if t in ['OImon','day','Omon'] and t2 != None:
663               v2 = string.strip(t2)[1:-1]
664             else:
665               v2 = None
666
667             pmsg = ''
668             p0 = None
669             if v == '*':
670               if t in self.cmip5sns:
671                 print 'INFO[1a]: bulk copy of external sheet %s' % t
672               elif t in ss:
673                 print 'INFO[1b]: bulk copy of internal sheet %s' % t
674
675             elif len(v) == 0 or v[0] == '#':
676               pass
677             else:
678
679               if vl3 != None:
680                 if vl3.has_key(v):
681                   id = vl3[v][7]
682                 elif v2 != None and vl3.has_key(v2):
683                   id = vl3[v2][7]
684                 else:
685                   id = None
686
687               if t in self.cmip5sns:
688                 p = 1
689                 if self.rqs.t.has_key(t):
690                   if self.rqs.t[t].vars.has_key(v):
691                     p = self.rqs.t[t].vars[v][0][1]
692                     pmsg = 'a: %s: %s' % (v,str( self.rqs.t[t].vars[v][0] ) )
693                   elif v in self.nvd:
694                     p = self.nvd[v][0]
695                     print 'INFO.priority.00002: ',v,p
696                   elif v2 != None and self.rqs.t[t].vars.has_key(v2):
697                     p = self.rqs.t[t].vars[v2][0][1]
698                     ##print '%s old name for %s' % (v2,v)
699                     pmsg = 'b: %s: %s' % (v2,str( self.rqs.t[t].vars[v2][0] ) )
700                   else:
701                     if v in self.nvd:
702                       print 'ERROR.priority.0001: wrongly assigned table',v,lll,self.nvd[v]
703                     else:
704                       print 'ERROR.priority.0002: variable not found', v,lll
705                     p0 = None
706                 
707               else:
708                 if string.lower(t)[:3] == 'new' or t == '':
709                   p = self.nvd.get( v, [0,7] )[0]
710                   if v == 'sisnconc':
711                     print 'INFO.sisnconc.00002: ', p, v in self.nvd
712                   pmsg = 'c: %s: %s' % (v,str(self.nvd.get( v, [0,7] )) )
713                   if p == 7:
714                     p = self.nvd.get( v + '!', [0,7] )[0]
715                     pmsg = 'd: %s: %s' % (v + '!',str(self.nvd.get( v + '!', [0,7] )) )
716                   if p != 7:
717                     self.idx += 1
718                     id = 'mv.010.%4.4i' % self.idx
719               if id == None and p < 7:
720                  print 'WARNING[1]: no id for %s' % v
721               elif id == None:
722                  print 'WARNING[2]: no id, no variable defn for %s' % v
723               elif p > 6:
724                  print 'WARNING[3.%s]: no variable defn for %s ' % (p,v)
725               ts = string.strip(thisr[irsh].value)
726               if string.strip(tv) != '':
727                 e1['%s:%s' % (ts,p)] += 1
728
729### complete ntr and save to shelf.
730             if type(p) != type(0):
731               print 'ERROR.020.0002: attempt to set non integer priority: %s [%s] ... %s' % (p,str(lll),pmsg)
732               p = 106
733             if (not gh.withPriority) or string.strip( str( lll[9]) ) == '':
734               lll[9] = p
735             if p0 != None and lll[9] != p0:
736               print 'INFO.088.00001: overriding p: ',lll,p0
737             if v == 'ta':
738               print 'INFO.045.0002: reading ta: thisl=%s, lll=%s' % (gh.thisl,lll)
739             if v == 'clisccp':
740               print 'INFO.clisccp.00001', lll, t, t in  self.cmip5sns, gh.withPriority
741             self.ntr = nt__grptbl._make( lll )
742##
743##
744##
745             if lll[0] in ['icesheetmon','icesheetyear','icesheetfx']:
746               otab = lll[0]
747               oshp = lll[5]
748##
749##  reduce doubly specified variables to single
750##
751               if lll[4] == 'Greenland':
752                 break
753               if lll[4] == 'Antarctica':
754                 lll[4] = ''
755##
756##  create two copies of all variables
757##
758               for targ in ['ant','gre']:
759                 lll[0] = maps.ttranstem[otab] + targ
760                 ku = self.vark.lookuprec( lll )
761                 lll[11] = ku
762                 lll[5] = oshp + targ
763                 self.sh[ku] = tuple( lll + [rowIndex,])
764                 print 'INFO.icesheet.00001: ',self.sh[ku]
765             else:
766               ku = self.vark.lookuprec( lll )
767               lll[11] = ku
768               self.sh[ku] = tuple( lll + [rowIndex,])
769###   MIP, group, size, dictionary -- # items in each shape.
770           self.glist.append( (k, s, gh.ll, e1) )
771
772  def run1(self,nmip=0,kmip=0,clear=False,tabmode='uid'):
773    if clear:
774      self.rqs.t = {}
775    self.cfg.ff['CMIP5'] = ['/data/work/documents/CMIP5_standard_output.xls']
776    wb = workbook( self.cfg.ff['CMIP5'][0] )
777    wb.sns.sort()
778    omit1 = [u'dims', u'general', u'other output',u'CFMIP output']
779    sns = []
780    for s in wb.sns:
781      if s not in omit1:
782        sns.append(s)
783
784    self.cmip5sns = sns[:]
785    k2 = self.cfg.ff.keys()
786    k2.sort()
787    k2.append( 'CMIP5' )
788
789    amips = ['CMIP5'] + self.mips
790    if nmip > 0:
791       amips = amips[kmip:kmip+nmip]
792    for s in sns:
793     for k in amips:
794      if k in k2:
795        for fn in self.cfg.ff[k]:
796          if k == 'CMIP5':
797            path = fn
798          else:
799            path = '%s%s/%s' % (self.dir0,k,fn)
800          extra = self.cfg.fff.get( fn, None )
801##
802## deal with modified CMIP5 tables
803##
804          thisrq = self.rqs.add( k, path,s,tabmode=tabmode, extra=extra )
805          if thisrq.ok:
806            print 'INFO.002:',k,path,s,thisrq.ok, thisrq.nn
807          else:
808            if thisrq.reason != 'Table not present':
809              print 'WARN.002:',k,path,s,thisrq.ok, thisrq.reason
810
811  def run2(self):
812    init=False
813    if init:
814      wbx = wbcp( '/home/martin/Documents/MIPTableSheetTemplate.xls' )
815    else:
816      wbx = wbcp( 'CMIP6_DataRequest_CMIP5changes_blank.xls' )
817
818    print 'INFO.002.00002: rqs.t.keys: ',self.rqs.t.keys()
819    for s in wbx.sns:
820     if s != u'Template':
821      keys = self.rqs.t[s].vars.keys()
822      keys.sort()
823      ##for k in keys:
824         ##print k, self.rqs.t[s].vars[k]
825      self.rqs.prep( tab=s )
826      print 'INFO.001:', s, len(self.rqs.oorecs)
827      if len(self.rqs.oorecs) > 0:
828         if init:
829           wbx.copy_sheet( 0, s )
830           wbx.focus( s, old='Template' )
831         else:
832           wbx.focus( s )
833           self.rqs.showXls(wbx,r0=2,offset=0)
834   
835         for i in range( min( 5, len( self.rqs.oorecs) ) ):
836           print 'INFO.002: oorecs: ',self.rqs.oorecs[i]
837   
838         oo = open( 'dreq2/request2_%s.csv' % s, 'w' )
839         self.rqs.show( oo, tab=s )
840         oo.close()
841
842    wbx.write( 'CMIP6_DataRequest_CMIP5changes.xls' )
843
844##wb3 = workbook( 'vlsc5b_v20150714.xls' )
845wb3 = workbook( 'vlsc5b_v20160309.xls' )
846sh = wb3.book.sheet_by_name( 'Sheet1' )
847m = main()
848
849opt = 1
850if opt == 1:
851  m.vl3 = {}
852  for i in range(sh.nrows):
853    r = map( lambda x: string.strip(str(uniCleanFunc(x.value))), sh.row(i) )
854    if len(r) < 9 or r[8] == '':
855      m.vl3[r[1]] = tuple( r[:8] )
856    m.shold[r[0]] = r
857
858  m.run1(nmip=1)
859  m.loadNewVars()
860  m.groups( )
861  k = m.sh.keys()[4]
862  print '##############################################'
863  print 'INFO.003.0001',k,m.sh[k]
864  sss = set()
865  for k in m.sh.keys():
866    if k[0] != '_':
867      sss.add( m.sh[k][0] )
868  print 'INFO.003.0002: test .... ','cfMon_3dstd_new' in sss
869
870  m.sh.close()
871  m.shnv.close()
872  m.shnvo.close()
873  m.oonvo.close()
874  m.shold.close()
875 
876  m.run1( clear=True)
877  keys = sorted( m.rqs.t )
878
879##
880## these two shelves used in sx2.py, to generate revTabItems
881##
882  sh = shelve.open( 'dreq_consol_tables_reviewed_a_v%s' % vdate, 'n' )
883  sh['records'] = m.rqs.records[:] 
884  sh['recordProv'] = m.rqs.recordProv.copy()
885  sh.close()
886  sh = shelve.open( 'dreq_consol_tables_reviewed_b_v%s' % vdate, 'n' )
887  sh['__keys__'] = map( str, keys[:] )
888  for k in keys:
889    vs = sorted( m.rqs.t[k].vars)
890    ee = {}
891    m.rqs.vn = {}
892    for v in vs:
893      for mip,p,ix,sect,rowix in m.rqs.t[k].vars[v]:
894        if v == 'clic':
895          print 'INFO.clic.00003: ',k,v,mip,p,ix,sect,rowix
896        this = m.rqs.records[ix]
897        if v == 'prhmax':
898          print 'xxxxx: ',v,mip,p,ix,sect,rowix, m.rqs.records[ix]
899        if this[16] in ['','0.0',0.0]:
900          vn = this[4]
901        else:
902          vn = this[16]
903        if ee.has_key(vn):
904          print 'ERROR.030.0010: DUPLICATE %s' % vn
905          print m.rqs.t[k].vars[v]
906          print m.rqs.records[ee[vn][0]]
907          print m.rqs.records[ix]
908        ee[vn] = (ix,p,sect,rowix)
909     
910    print 'INFO.009.00101:', k,len(vs),'#################'
911    k2 = str(k)
912    m.rqs.vn[k2] = ee
913    sh[k2] = ee.copy()
914  sh.close()
915  shr1.close()
916   
917elif opt == 2:
918  m.run1(tabmode='tab')
919  m.run2()
920  shr1.close()
Note: See TracBrowser for help on using the repository browser.