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

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

misc

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          self.ref1[k].a[k1].latest = self.ref1[k].a[k1].a[ ks[-1] ]
179        else:
180          self.ref1[k].a[k1].latest  =  self.ref1[k].a[k1].a[ self.ref1[k].a[k1].a.keys()[0] ]
181
182  def addTab(self,tab,section):
183    self.t[tab] = mipTable( tab,section)
184
185  def add(self,mip,path,tab,tabmode='uid', extra=None):
186    self.tab = tab
187## rq will add a reference to parent
188    ##print '######',mip, path, tab
189    return rq(mip,path,parent=self,tab=tab,tabmode=tabmode,section=extra)
190
191  def addItem( self, mip, tab, nn ):
192    if not self.tabindx.has_key( tab ):
193      self.tabindx[tab] = len(self.tablist)
194      self.tablist.append( collections.defaultdict( int ) )
195    ix = self.tabindx[tab]
196    self.tablist[ix][mip] = nn
197    self.mips[mip] += 1
198
199  def checkVars(self):
200    keys = self.vars.keys()
201    keys.sort()
202    for k in keys:
203      if len( self.vars[k] ) == 1:
204        print k, 'singleton'
205      else:
206        li = self.vars[k]
207## getting a bit intricate here -- 3rd element is index of record row
208        ll = [self.records[li[0][2]], ]
209        aa = collections.defaultdict( list )
210        aa[0].append[0]
211       
212  def prep(self,mode='vars',tab=None):
213    if tab != None:
214      self.tab = tab
215    kk = 0
216    mips = self.mips.keys()
217    mips.sort()
218    keys = self.tabindx.keys()
219    keys.sort()
220    self.oorecs = []
221    if mode == 'vars':
222      keys = self.t[self.tab].vars.keys()
223      keys.sort()
224      for k in keys:
225        rec = [k,]
226        ee1 = collections.defaultdict( list )
227        ee2 = {}
228        for t in self.t[self.tab].vars[k]:
229          k0 = joinRec( self.records[t[2]], tab=',', omit=[7,16,23] )
230          ee1[k0].append( t )
231###
232### differences in records found as multiple entries in collection here ...
233###
234        if len(ee1.keys()) <= 1:
235          pass
236          ##print 'INFO.003: NO CHANGE AT %s (%s)' % (k,len(self.t[self.tab].vars[k]) )
237        else:
238          print 'INFO.003: DUPLICATES AT %s (%s)' % (k,len(ee1.keys()) )
239          for k1 in ee1.keys():
240              for t in ee1[k1]:
241                ee2[t[0]] = k1
242          k1 = ee1.keys()
243          ee3 = collections.defaultdict( list )
244          for t in self.t[self.tab].vars[k]:
245            ee3[k1.index( ee2[t[0]] ) ].append( '%s[%s]' % (t[0],t[1]) )
246            rec.append( '%s[%s]{%s}' % (t[0],t[1],k1.index( ee2[t[0]]) ) )
247          ##self.oorecs.append(rec)
248          for kkk in k1:
249            ix = ee1[kkk][0][2]
250            ik = k1.index(kkk)
251            rec = [k, string.join(ee3[ik],';'),]   + list(self.records[ix])
252            self.oorecs.append(rec)
253         
254  def showXls(self,wb,r0=3,offset=0):
255    r = r0
256    thisStj = 2
257    for rec in self.oorecs:
258      i = offset
259      for item in rec:
260        wb.putValue2( r,i, item )
261        i+= 1
262      thisStj = 5 - thisStj
263      r+= 1
264   
265  def show(self,oo,mode='vars',tab=None):
266    if tab != None:
267      self.tab = tab
268    kk = 0
269    mips = self.mips.keys()
270    mips.sort()
271    keys = self.tabindx.keys()
272    keys.sort()
273    if mode == 'vars':
274      for rec in self.oorecs:
275            srec = joinRec( rec) + '\t' 
276            oo.write( srec + '\n' )
277
278    elif mode == 'oldvars':
279      keys = self.t[self.tab].vars.keys()
280      keys.sort()
281      for k in keys:
282        rec = '%s\t' % k
283        ee1 = collections.defaultdict( list )
284        ee2 = {}
285        for t in self.t[self.tab].vars[k]:
286          k0 = joinRec( self.records[t[2]], tab=',', omit=[7,16,23] )
287          ee1[k0].append( t )
288        if len(ee1.keys()) > 1:
289          for k1 in ee1.keys():
290              for t in ee1[k1]:
291                ee2[t[0]] = k1
292          k1 = ee1.keys()
293          for t in self.t[self.tab].vars[k]:
294            rec += '%s[%s]{%s}\t' % (t[0],t[1],k1.index( ee2[t[0]]) )
295          oo.write( rec + '\n' )
296          for kkk in k1:
297            ix = ee1[kkk][0][2]
298            rec = '--%s--\t' % k1.index(kkk) + joinRec( self.records[ix] ) + '\t' 
299            oo.write( rec + '\n' )
300    else:
301     oo.write( ',' + string.join(mips, ',') + ',\n' )
302     for k in keys:
303      r = []
304      ix = self.tabindx[k]
305      for m in mips:
306        r.append( self.tablist[ix][m] )
307      if max(r) > 0:
308        rec = '%s,' % k
309        for i in r:
310          rec += '%s,' %  i
311        oo.write( rec + '\n' )
312
313#dd_rq = collections.defaultdict( dict )
314#dd_tbl = collections.defaultdict( int )
315class rq(object):
316
317  def __init__(self, mip,path, parent=None,tab=u'Omon',tabmode='uid',section=None ):
318
319    self.mip = mip
320    self.section = section
321    self.parent = parent
322    self.nn = 0
323    self.fn = string.split( path, '/' )[-1]
324    stt = os.stat( path )
325    self.ctime = stt[stat.ST_CTIME]
326    self.fsize = stt[stat.ST_SIZE]
327    print '>>>> %s: %s' % (self.fn,self.ctime)
328    if self.parent.ref1[mip].a.has_key(self.fn):
329       tt = self.parent.ref1[mip].a[self.fn].latest
330       if len( tt ) > 3:
331         if self.ctime == tt[2] and self.fsize == tt[3]:
332           print '%s unchanged' % self.fn
333           md5 = tt[4]
334         else:
335           md5 = md5sum( path )
336           if md5 == tt[4]:
337             print 'md5 unchanged: %s' % self.fn
338           else:
339             shr1[md5] = (self.fn,path,self.ctime, self.fsize, md5,mip )
340       else:
341         print 'ERROR.888.0001: Unexpected ref1 record (input status): %s' % str(tt)
342         md5 = md5sum( path )
343    else:
344       md5 = md5sum( path )
345       shr1[md5] = (self.fn,path,self.ctime, self.fsize, md5,mip )
346    self.md5 = md5
347    self.wk1 = wbcp( inbook=path )
348    if tab in  self.wk1.sns:
349      self.tab = tab
350      if tabmode == 'tab' or mip == 'CMIP5':
351            self.tabid = tab
352      else:
353            self.tabid = '%s.%s' %  (mip,tab)
354      self.wk1.focus( tab)
355      if not self.parent.t.has_key(self.tabid):
356        self.parent.addTab(self.tabid,self.section)
357      self.ok = self.parse01()
358    else:
359      self.ok = False
360
361  def parse01(self):
362
363    ee1 = collections.defaultdict( list )
364    for j in range(3,self.wk1.currentSi.nrows):
365      if self.wk1.currentSi.row(j)[0].ctype == 2:
366        v = string.strip( str( self.wk1.currentSi.row(j)[5].value ) )
367        t2 = self.wk1.currentSi.row(j)[17].ctype
368        ee1[v].append((j,t2))
369    for j in range(3,self.wk1.currentSi.nrows):
370      rv = map( lambda x: x.value, self.wk1.currentSi.row(j) )
371      lr0 = len(rv)
372      for i in range(10):
373        if len(rv) < 26:
374           rv.append('')
375      if self.wk1.currentSi.row(j)[0].ctype == 2:
376        v = string.strip( str( self.wk1.currentSi.row(j)[5].value ) )
377        if self.wk1.currentSi.row(j)[17].ctype == 1:
378          v2 = string.strip( str( self.wk1.currentSi.row(j)[17].value ) )
379        else:
380          v2 = None
381        if v not in ['0.0','']:
382          if len(ee1[v]) > 1:
383             ##v += '__%s' % ['a','b'][ee1[v].index(j)]
384             assert not all( map( lambda x: x[1] != 1, ee1[v] ) ), 'duplicate variable name and no cmor name ... %s %s' % (v,self.mip)
385             if v2 != None:
386               v = v2
387          ixr = len(self.parent.records )
388## add record
389          self.parent.records.append( tuple(rv[1:]) )
390          kr = len( self.parent.records )
391          self.parent.recordProv[kr] = self.md5
392          p = int( rv[0] + 0.001 )
393          if lr0 > 24:
394            if self.wk1.currentSi.row(j)[24].ctype == 2:
395              yv = int( rv[24] + 0.001 )
396              assert yv in [0,1,2], 'Invalid value in column Y, j=%s,v=%s' % (j,v)
397              if yv == 0:
398                p = None
399              elif yv == 2:
400                p = 1
401            elif rv[24] != '':
402              print 'WARNING[1]:', self.mip, v, p, rv[24]
403         
404          if p != None:
405            self.parent.t[self.tabid].vars[v].append( (self.mip,p,ixr,self.section,j) ) 
406            self.nn += 1
407
408    return True
409
410class main(object):
411  def __init__(self):
412    kk=3
413    self.idx = 0
414    self.sh = shelve.open( 'dreq_consol_tables_shelve_v%s' % vdate, 'n' )
415    self.shnv = shelve.open( 'dreq_consol_tables_nv_shelve_v%s' % vdate, 'n' )
416    self.shold = shelve.open( 'dreq_consol_tables_old_shelve_v%s' % vdate, 'n' )
417
418    base = '/home/martin/2014/wip/dreq/'
419    self.dir0 = '/home/martin/2014/wip/dreq/input/'
420    file = 'PMIP/CMIP6DataRequestCompilationTemplate_20141218_PMIP_v150228_final.xls'
421    file = 'C4MIP/CMIP6DataRequestCompilationTemplate_C4MIP_06March2015_submitted.xls'
422    fileTmpl = 'CMIP6DataRequestCompilationTemplate_20141218.xls'
423    self.newVars = 'CMIP6DataRequest_ConsolidatedNewVariables_v20150907.xls'
424    self.nvd = {}
425
426    wk0 = wbcp( inbook=base+fileTmpl )
427    self.cfg = dreq_cfg.rqcfg()
428    wk0.focus( u'Experiments')
429    mlist = collections.defaultdict( list )
430    for i in range(2,wk0.currentSi.nrows):
431      mip = str(wk0.currentSi.row(i)[3].value)
432      vals = map( lambda x: x.value, wk0.currentSi.row(i) )
433      if mip != '':
434        mlist[mip].append( vals )
435   
436    self.mips = mlist.keys()
437    self.mips.sort()
438   
439    mipTrans ={ 'geoMIP':'GeoMIP' }
440    diagMips = ['DynVar','SIMIP']
441    k2 = self.cfg.ff.keys()
442    k2.sort()
443    nn = 0
444    for k in k2:
445      k = mipTrans.get( k,k)
446      if k not in self.mips and k not in diagMips:
447         print '%s not found' % k
448         nn += 1
449    assert nn == 0, 'MIP naming error?'
450
451    exptList = '/home/martin/Documents/CMIP6_ExpermentList_draft01April2015.xls'
452    wke = wbcp( exptList )
453    wke.focus( 'Experiments' )
454    expgs = collections.defaultdict( int )
455    expgsEns = collections.defaultdict( int )
456    expgsYpe = collections.defaultdict( int )
457    for k in range(2,wke.currentSi.nrows):
458      vals = map( lambda x: x.value, wke.currentSi.row(k) )
459      g = string.strip( vals[1] )
460      if g[:5] == 'DAMIP':
461        print '######',g,vals[12],vals[13]
462      expgs[g] += vals[13]
463      expgsEns[g] = vals[12]
464
465    for k in expgs.keys():
466      if expgsEns[k] == 0:
467        expgsYpe[k] = 0
468      else:
469        try:
470          expgsYpe[k] = expgs[k]/expgsEns[k]
471        except:
472          print k, expgs[k], expgsEns[k]
473          raise
474   
475    self.rqs= rqsummary(exptInfo=(expgs,expgsEns,expgsYpe))
476    self.exptInfo=(expgs,expgsEns,expgsYpe)
477
478  def loadNewVars(self):
479    assert os.path.isfile( self.newVars ), '%s not found' % self.newVars
480    wb = workbook(self.newVars)
481    sh = wb.book.sheet_by_name( 'New variables' )
482    oo = open( '/tmp/newvars.txt', 'w' )
483    for i in range(3,sh.nrows):
484      r = map( lambda x: x.value, sh.row(i) )
485      try:
486        oo.write( string.join(map(str,r) ) + '\n' )
487      except:
488        oo.write( r[0] + '  --- rest missing --- \n' )
489      if r[0] != '' and r[4] != '':
490        v = string.strip( str( r[4] ) )
491        if v[0] != '#':
492          bits = string.split(v,' ')
493          if len(bits) == 1:
494            m = str( r[0] )
495            p = 0
496            try:
497              if m == 'LUMIP':
498                p = int( r[12] )
499              else:
500                p = int( r[11] )
501            except:
502              print '!!!!!! Failed to read priority: ',v,m
503            if v[-2:] == '**':
504               v = v[:-2]
505            elif v[-1] == '!':
506               v = v[:-1]
507            if self.nvd.has_key(v):
508              print '#########',v,self.nvd[v],m,p
509            self.nvd[v] = [p,] + r
510    for v in self.nvd.keys():
511        k = str( uuid.uuid1() )
512        self.shnv[k] = self.nvd[v][:] + [k,]
513    oo.close()
514
515  def groups(self, vl3=None):
516    rh1 = ['Short name', 'Standard Name', 'Table', 'Frequency', 'Description extension (optional)', 'Shape', 'Levels', 'Time mean, point or climatology', 'Mask (optional)']
517    rh2 = ['Short name of group', 'Variable short name', 'Table', 'Frequency', 'Description extension (optional)', 'Shape', 'Levels', 'Time mean, point or climatology', 'Mask (optional)']
518    rh3 = ['Short name of group', 'Variable short name', 'Table', 'Frequency', 'Description extension (optional)', 'Shape', 'Levels', 'Time mean, point or climatology', 'Mask (optional)', 'Priority']
519
520    print self.cfg.ee.keys()
521    omit = ['ALL VARIABLES', 'Objectives','Experiments','Experiment Groups','Request scoping','New variables','__lists__']
522    keys = self.cfg.ee.keys()
523    keys.sort()
524    ee = {}
525    self.glist = []
526    for k in keys:
527        fn = self.cfg.ee[k]
528        path = '%s%s/%s' % (self.dir0,k,fn)
529        wb = workbook( path )
530        ss = []
531        for s in wb.sns:
532          if s not in omit:
533            ss.append(s)
534        for s in ss:
535          e1 = collections.defaultdict( int )
536          if s[:5] != 'CMIP5':
537           sh = wb.book.sheet_by_name( s ) 
538           ll = []
539           for i in range(sh.nrows):
540             thisr = sh.row(i)
541             tv = thisr[0].value
542             if tv[:10] == 'Short name':
543               ll.append(i)
544           assert len(ll) in [1,2], 'Could not parse sheet  %s, %s, %s' % (path,k,s)
545           withPriority = False
546           hr = sh.row( ll[-1] )
547           if len(ll) == 1:
548## nt__grptbl = collections.namedtuple( 'grptbl', ['grp','var','srcTable','freq','description','shape','levels','timeProc','mask'] )
549             iv = 1
550             it = 0
551             ok = len( hr ) >= 9 and all( map( lambda x: string.strip(hr[x].value) == rh2[x], range(9) ) )
552             assert ok, '001: Sheet heading not recognised: %s' % str(hr)
553             if len(hr) > 9 and hr[9] == 'Priority':
554               withPriority = True
555               thisl = 10
556             else:
557               thisl = 9
558           else:
559             print '*************',k,s
560             ok = len( hr ) >= 9 and all( map( lambda x: string.strip(hr[x].value) == rh1[x], range(9) ) )
561             assert ok, '002: Sheet heading not recognised: %s' % str(hr)
562             iv = 0
563             it = -1
564             tv = sh.row(2)[1].value
565             thisl = 9
566
567           irsh = 5
568           for i in range(ll[-1]+1,sh.nrows):
569             thisr = sh.row(i)
570             if iv == 1:
571                 ##self.ntr = nt__grptbl._make( getRowValues( thisr, minLen=9 ) + [105,k,''] )
572                lll = getRowValues( thisr, minLen=thisl, maxLen=thisl )
573             else:
574                lll = getRowValues( thisr, minLen=thisl, maxLen=thisl )
575                lll[1] = lll[0]
576                lll[0] = tv
577             if thisl == 9:
578               lll.append( 105 )
579             lll += [k,'']
580             if it >= 0:
581               tv = thisr[it].value
582             v = thisr[iv].value
583             bits = string.split(v, ' ')
584             if len(bits) > 1:
585               v = bits[0]
586             t = thisr[2].value
587             if t[:6] == "CMIP5_":
588               t = t[6:]
589             if len(string.split(t, ' ')) > 1:
590               t2 = string.split(t, ' ')[1]
591               t = string.split(t, ' ')[0]
592             else: 
593               t2 = None
594             if t in ['OImon','day','Omon'] and t2 != None:
595               v2 = string.strip(t2)[1:-1]
596             else:
597               v2 = None
598
599             pmsg = ''
600             if v == '*':
601               if t in self.cmip5sns:
602                 print 'INFO[1a]: bulk copy of external sheet %s' % t
603               elif t in ss:
604                 print 'INFO[1b]: bulk copy of internal sheet %s' % t
605
606             elif len(v) == 0 or v[0] == '#':
607               pass
608             else:
609
610               if vl3 != None:
611                 if vl3.has_key(v):
612                   id = vl3[v][7]
613                 elif v2 != None and vl3.has_key(v2):
614                   id = vl3[v2][7]
615                 else:
616                   id = None
617
618               if t in self.cmip5sns:
619                 p = 9
620                 if self.rqs.t.has_key(t):
621                   if self.rqs.t[t].vars.has_key(v):
622                     p = self.rqs.t[t].vars[v][0][1]
623                     pmsg = 'a: %s: %s' % (v,str( self.rqs.t[t].vars[v][0] ) )
624                   elif v2 != None and self.rqs.t[t].vars.has_key(v2):
625                     p = self.rqs.t[t].vars[v2][0][1]
626                     ##print '%s old name for %s' % (v2,v)
627                     pmsg = 'b: %s: %s' % (v2,str( self.rqs.t[t].vars[v2][0] ) )
628                   else:
629                     p = 8
630                 
631               else:
632                 if string.lower(t)[:3] == 'new' or t == '':
633                   p = self.nvd.get( v, [0,7] )[0]
634                   pmsg = 'c: %s: %s' % (v,str(self.nvd.get( v, [0,7] )) )
635                   if p == 7:
636                     p = self.nvd.get( v + '!', [0,7] )[0]
637                     pmsg = 'd: %s: %s' % (v + '!',str(self.nvd.get( v + '!', [0,7] )) )
638                   if p != 7:
639                     self.idx += 1
640                     id = 'mv.010.%4.4i' % self.idx
641               if id == None and p < 7:
642                  print 'WARNING[1]: no id for %s' % v
643               elif id == None:
644                  print 'WARNING[2]: no id, no variable defn for %s' % v
645               elif p > 6:
646                  print 'WARNING[3.%s]: no variable defn for %s ' % (p,v)
647               ts = string.strip(thisr[irsh].value)
648               if string.strip(tv) != '':
649                 e1['%s:%s' % (ts,p)] += 1
650
651### complete ntr and save to shelf.
652             if type(p) != type(0):
653               print 'ERROR.020.0002: attempt to set non integer priority: %s [%s] ... %s' % (p,str(lll),pmsg)
654               p = 106
655             lll[9] = p
656             self.ntr = nt__grptbl._make( lll )
657             ku = str( uuid.uuid1() )
658             lll[11] = ku
659             self.sh[ku] = tuple( lll )
660###   MIP, group, size, dictionary -- # items in each shape.
661           self.glist.append( (k, s, ll, e1) )
662
663  def run1(self,nmip=0,kmip=0,clear=False,tabmode='uid'):
664    if clear:
665      self.rqs.t = {}
666    self.cfg.ff['CMIP5'] = ['/data/work/documents/CMIP5_standard_output.xls']
667    wb = workbook( self.cfg.ff['CMIP5'][0] )
668    wb.sns.sort()
669    omit1 = [u'dims', u'general', u'other output',u'CFMIP output']
670    sns = []
671    for s in wb.sns:
672      if s not in omit1:
673        sns.append(s)
674
675    self.cmip5sns = sns[:]
676    k2 = self.cfg.ff.keys()
677    k2.sort()
678    k2.append( 'CMIP5' )
679
680    amips = ['CMIP5'] + self.mips
681    if nmip > 0:
682       amips = amips[kmip:kmip+nmip]
683    for s in sns:
684     for k in amips:
685      if k in k2:
686        for fn in self.cfg.ff[k]:
687          if k == 'CMIP5':
688            path = fn
689          else:
690            path = '%s%s/%s' % (self.dir0,k,fn)
691          extra = self.cfg.fff.get( fn, None )
692          thisrq = self.rqs.add( k, path,s,tabmode=tabmode, extra=extra )
693          if thisrq.ok:
694            print 'INFO.002:',k,path,s,thisrq.ok, thisrq.nn
695          else:
696            print 'WARN.002:',k,path,s,thisrq.ok
697
698  def run2(self):
699    init=False
700    if init:
701      wbx = wbcp( '/home/martin/Documents/MIPTableSheetTemplate.xls' )
702    else:
703      wbx = wbcp( 'CMIP6_DataRequest_CMIP5changes_blank.xls' )
704
705    print self.rqs.t.keys()
706    for s in wbx.sns:
707     if s != u'Template':
708      keys = self.rqs.t[s].vars.keys()
709      keys.sort()
710      ##for k in keys:
711         ##print k, self.rqs.t[s].vars[k]
712      self.rqs.prep( tab=s )
713      print 'INFO.001:', s, len(self.rqs.oorecs)
714      if len(self.rqs.oorecs) > 0:
715         if init:
716           wbx.copy_sheet( 0, s )
717           wbx.focus( s, old='Template' )
718         else:
719           wbx.focus( s )
720           self.rqs.showXls(wbx,r0=2,offset=0)
721   
722         for i in range( min( 5, len( self.rqs.oorecs) ) ):
723           print self.rqs.oorecs[i]
724   
725         oo = open( 'dreq2/request2_%s.csv' % s, 'w' )
726         self.rqs.show( oo, tab=s )
727         oo.close()
728
729    wbx.write( 'CMIP6_DataRequest_CMIP5changes.xls' )
730
731vl3 = {}
732##wb3 = workbook( 'vlsc5b_v20150714.xls' )
733wb3 = workbook( 'vlsc5b_v20150907.xls' )
734sh = wb3.book.sheet_by_name( 'Sheet1' )
735m = main()
736
737opt = 1
738if opt == 1:
739  for i in range(sh.nrows):
740    r = map( lambda x: string.strip(str(uniCleanFunc(x.value))), sh.row(i) )
741    if len(r) < 9 or r[8] == '':
742      vl3[r[1]] = tuple( r[:8] )
743    m.shold[r[0]] = r
744
745
746  m.run1(nmip=1)
747  m.loadNewVars()
748  m.groups( vl3=vl3)
749  k = m.sh.keys()[4]
750  print '##############################################'
751  print k
752  print m.sh[k]
753  m.sh.close()
754  m.shnv.close()
755  m.shold.close()
756 
757  m.run1( clear=True)
758  keys = sorted( m.rqs.t )
759  sh = shelve.open( 'dreq_consol_tables_reviewed_a_v%s' % vdate, 'n' )
760  sh['records'] = m.rqs.records[:] 
761  sh['recordProv'] = m.rqs.recordProv.copy()
762  sh.close()
763  sh = shelve.open( 'dreq_consol_tables_reviewed_b_v%s' % vdate, 'n' )
764  sh['__keys__'] = map( str, keys[:] )
765  for k in keys:
766    vs = sorted( m.rqs.t[k].vars)
767    ee = {}
768    print '#############',k,len(vs),'#################'
769    m.rqs.vn = {}
770    for v in vs:
771      for mip,p,ix,sect,rowix in m.rqs.t[k].vars[v]:
772        this = m.rqs.records[ix]
773        if this[16] in ['','0.0',0.0]:
774          vn = this[4]
775        else:
776          vn = this[16]
777        if ee.has_key(vn):
778          print 'ERROR.030.0010: DUPLICATE %s' % vn
779          print m.rqs.t[k].vars[v]
780          print m.rqs.records[ee[vn][0]]
781          print m.rqs.records[ix]
782        ee[vn] = (ix,p,sect,rowix)
783    k2 = str(k)
784    m.rqs.vn[k2] = ee
785    sh[k2] = ee.copy()
786  sh.close()
787  shr1.close()
788   
789elif opt == 2:
790  m.run1(tabmode='tab')
791  m.run2()
792  shr1.close()
Note: See TracBrowser for help on using the repository browser.