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

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

cleaned

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