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

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

cleaning

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