source: CMIP6dreqbuild/trunk/srcMisc/dreq_consol_dreq.py @ 508

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

corrections

Line 
1import string, uuid, shelve
2from fcc_utils2 import snlist
3import xlrd, string, shelve, os, re, sys
4import collections
5import xlutils, xlwt
6import xlutils.copy
7import xlutils.styles
8####
9import dreq_cfg
10import dreq_utils
11
12cmip5Vg = ['Omon','fx','Oyr','Oclim','Omon_3d','Omon_oth','Amon','Lmon','LImon','OImon','aero_3d','aero_oth','cfDay_2d','cfDay_3d','cfMon_3dstd','cfMon_3dmod','cfMon_2dmod','cfMon_sim','day_oth','day_ss','cfOff','cfSites','6hrLev','6hrPlev','3hr','cf3hr_grid','cf3hr_sim']
13cmip5Tabs = ['fx','Oyr','Oclim','Omon','Amon','Lmon','LImon','OImon','cfMon','aero','cfDay','day','cfOff','cfSites','6hrLev','6hrPlev','3hr','cf3hr']
14
15nt__deckrq = collections.namedtuple( 'dckrq', ['control','AMIP','abrupt4xCO2','rq_1pctCO2','historical'] )
16dd_rq = collections.defaultdict( dict )
17dd_tbl = collections.defaultdict( int )
18
19class wbcp(object):
20  def __init__( self, inbook=dreq_cfg.rqcfg.tmpl ):
21    self.book = xlrd.open_workbook(inbook,formatting_info=True)
22    self.sns = self.book.sheet_names()
23    self.wb = xlutils.copy.copy(self.book)
24    ##self.book = xlrd.open_workbook(inbook,formatting_info=True)
25    self.plain = xlwt.easyxf('')
26    self.styles = xlutils.styles.Styles(self.book)
27
28  def styleUpdate(self,other):
29    self.styles.cell_styles.update( other.styles.cell_styles )
30  def _getOutCell(self, rowIndex, colIndex,stbk=None):
31    """ HACK: Extract the internal xlwt cell representation. """
32   
33    if stbk == None:
34      this = self
35    else:
36      this = stbk
37    row = this.currentSo._Worksheet__rows.get(rowIndex)
38
39    if not row: return None
40
41    cell = row._Row__cells.get(colIndex)
42    return cell
43
44  def putValue2(self, row, col, value,sti=None,stj=None,stbk=None,style=0):
45    """ Change cell value without changing formatting. """
46    # HACK to retain cell style.
47    if sti == None:
48      sti = col
49    if stj == None:
50      stj = row
51    self.previousCell = self._getOutCell( stj,sti,stbk=stbk )
52    # END HACK, PART I
53
54    if style==0:
55      self.currentSo.write(row, col, value)
56    else:
57      self.currentSo.write(row, col, value,style=style)
58
59    # HACK, PART II
60
61    do_style = False
62    if self.previousCell and style==0 and do_style:
63        self.newCell = self._getOutCell( row, col)
64        if self.newCell:
65          if stbk == None:
66            self.newCell.xf_idx = self.previousCell.xf_idx
67          else:
68            self.newCell.xf_idx = self.previousCell.xf_idx
69            ##nn = len( self.styles.cell_styles.keys() )
70            ##print stj,sti,self.previousCell.xf_idx, nn
71            ##self.styles.cell_styles[nn] = stbk.styles.cell_styles.items()[self.previousCell.xf_idx]
72            ##self.newCell.xf_idx = nn
73    # END HACK
74
75  def focus( self, name ):
76    if name not in self.sns:
77       print '%s not in %s' % (name,str(self.sns) )
78       raise
79    self.currentIndex = self.sns.index(name)
80    if self.currentIndex == -1:
81      self.currentSi = None
82    else:
83      self.currentSi = self.book.sheet_by_name( name )
84      self.currentSo = self.wb.get_sheet( self.currentIndex )
85
86  def putValue(self,i,j,value,sti=None,stj=None):
87    ##self.currentSi.write(i,j,value,self.plain)
88    if sti == None:
89      sti = i
90    if stj == None:
91      stj = j
92    cell_style = self.styles[self.currentSi.cell(sti,stj)]
93    self.currentSo.write(i,j,value,cell_style)
94
95  def write(self,file='output.xls'):
96    self.wb.save( file )
97
98class tupsort:
99   def __init__(self,k=0):
100     self.k = k
101   def cmp(self,x,y):
102     return cmp( x[self.k], y[self.k] )
103
104def uniquify( ll ):
105  ll.sort()
106  l0 = [ll[0],]
107  for l in ll[1:]:
108    if l != l0[-1]:
109      l0.append(l)
110  return l0
111
112class workbook(object):
113  def __init__(self,file):
114    assert os.path.isfile(file), 'File %s not found' % file
115    self.book = xlrd.open_workbook( file )
116    self.sns = self.book.sheet_names()
117
118clabs = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
119def clab(n):
120  i = n/26
121  assert i < 26, 'Not ready for row number greater than 26*26'
122  if i == 0:
123    return clabs[n]
124  else:
125    return clabs[i-1] + clabs[ n - i*26]
126
127def getRow(sht):
128  ee = {}
129  for i in range(sht.nrows):
130    if sht.row(i)[0].ctype == 2 and str( sht.row(i)[0].value ) != '0.0':
131      l = map( lambda x: str( x.value ), sht.row(i) )
132      ##k = string.replace( l[5], ' ','')
133      k = l[5]
134      try:
135        ee[k] = l
136      except:
137        print l
138        raise
139  return ee
140   
141def outvSer( ov ):
142  ll = []
143  for i in ov:
144    ll.append( '%s|%s|%s' % tuple( map( str, i) ) )
145  return string.join(ll, '; ' )
146 
147class cpsh(object):
148
149  def __init__(self,wk0,mip,path,kk=3,oo=None):
150    self.oo = oo
151    self.nn = 0
152    self.kk = kk
153    wk = wbcp( path )
154    wk0.focus( u'New variables')
155    self.wk = wk
156    self.mip = mip
157    self.nvgs = []
158    for s in wk.sns:
159      if s not in ['Objectives','Experiments','Experiment Groups','Request scoping','New variables','__lists__']:
160        self.nvgs.append(s)
161    self.outv = collections.defaultdict(list)
162    for s in self.nvgs:
163      thiss = wk.book.sheet_by_name( s )
164      for k in range(4,thiss.nrows):
165        r = thiss.row(k)
166        v = r[1].value
167        t = r[2].value
168        f = r[3].value
169        s = r[5].value
170        m = r[7].value
171        if t[:3] == 'new':
172          self.outv[v].append( (f,s,m) )
173    this = wk.book.sheet_by_name(u'New variables')
174    ee = collections.defaultdict( list )
175    for i in range(3,this.nrows):
176      r = this.row(i)
177      if r[0].value == "**end**":
178        break
179      v = r[0].value
180      ee[v].append(i)
181
182    for i in range(3,this.nrows):
183      r = this.row(i)
184      if r[0].value == "**end**":
185        break
186
187      v = r[0].value
188      l = r[4].value
189      novar = v == '' and l == ''
190      omitOld = True
191      omit = False
192      if vdict.has_key(v) and omitOld:
193        omit = True
194
195      if not omit:
196        if not novar:
197          wk0.putValue2( self.kk, 0, mip )
198          s = r[1].value
199          if s in ['','?']:
200            chk = 0
201          elif esn.has_key(s):
202            chk = 1
203          elif esna.has_key(s):
204            chk = 2
205          else:
206            chk = -1
207          wk0.putValue2( self.kk, 1, chk )
208          self.nn += 1
209          htmlline = "<td>%s</td>" % mip
210        else:
211          chk = 0
212          htmlline = "<td></td>"
213     
214        j = 3
215        jo = 1
216        wk0.putValue2( self.kk, 3, outvSer( self.outv[v] ) )
217        for x in r:
218          if j == 3:
219            v = x.value
220            v0 = x.value
221            if str(v0) != "":
222              if len(ee[v0]) != 1:
223                 v += '!'
224              if vdict.has_key(v0):
225                 v += '**'
226            wk0.putValue2( self.kk, j+jo, v )
227          else:
228            wk0.putValue2( self.kk, j+jo, x.value )
229          if j in [3,7]:
230            htmlline += "<td>%s</td>\n" % x.value
231          elif j == 4:
232            if chk == -1:
233              htmlline += "<td>?%s?</td>\n" % x.value
234            else:
235              htmlline += "<td>%s</td>\n" % x.value
236          elif j == 8:
237            y = x.value
238          elif j == 9:
239            htmlline += '<td><span title="%s">%s</span></td>\n' % (x.value,y)
240          j += 1
241        self.kk += 1
242        if not novar:
243          if mip == "SIMIP":
244            print htmlline
245          htmlline = string.replace( htmlline, u'\u2013', '-' )
246          htmlline = string.replace( htmlline, u'\u2018', "'" )
247          htmlline = string.replace( htmlline, u'\u2019', "'" )
248          htmlline = string.replace( htmlline, u'\u2026', '...' )
249          htmlline = string.replace( htmlline, u'\u25e6', 'o' )
250          htmlline = string.replace( htmlline, u'\xb2', '2' )
251          htmlline = string.replace( htmlline, u'\xb3', '3' )
252          if self.oo != None:
253            self.oo.write( "<tr>%s</tr>" % str(htmlline) + '\n' )
254
255  def parseRQ(self):
256    this = self.wk.book.sheet_by_name(u'Request scoping')
257    for i in range(6,this.nrows):
258      r = this.row(i)
259      mipt = r[0].value
260      s = r[1].value
261      if mipt[:4]  in ['SPEC','CORD', 'CCMI'] and s != 'none':
262        print self.mip,mipt
263def lennbl(ll):
264  i = 0
265  ii = 0
266  for l in ll:
267    i+= 1
268    if l != '':
269      ii = i
270  return ii
271
272def  matchVals( thisv, valset ):
273  ll1 = []
274  ll2 = []
275  lk0 = []
276  kk = 0
277  for vals in valset:
278    l1 = min( [lennbl(thisv), lennbl(vals)] )
279    l2 = max( [lennbl(thisv), lennbl(vals)] )
280    ll = []
281    for i in range(l1):
282      ll.append( vals[i] == thisv[i] )
283    for i in range(l2-l1):
284      ll.append(False)
285    if all(ll):
286      return ll
287    k = 0
288    for l in ll:
289      if l:
290        k+=1
291    if ll[0]:
292      lk0.append( kk )
293     
294    ll1.append(k)
295    ll2.append(ll)
296    kk += 1
297  k0 = max( ll1 )
298  if len(lk0) > 0:
299    k0 = lk0[0]
300    return ll2[ k0 ]
301  return ll2[ ll1.index(k0) ]
302   
303kk=3
304
305base = '/home/martin/2014/wip/dreq/'
306dir0 = '/home/martin/2014/wip/dreq/input/'
307file = 'PMIP/CMIP6DataRequestCompilationTemplate_20141218_PMIP_v150228_final.xls'
308file = 'C4MIP/CMIP6DataRequestCompilationTemplate_C4MIP_06March2015_submitted.xls'
309fileTmpl = 'CMIP6DataRequestCompilationTemplate_20141218.xls'
310
311wk0 = wbcp( inbook=base+fileTmpl )
312cfg = dreq_cfg.rqcfg()
313wk0.focus( u'Experiments')
314mlist = collections.defaultdict( list )
315for i in range(2,wk0.currentSi.nrows):
316  mip = str(wk0.currentSi.row(i)[3].value)
317  vals = map( lambda x: x.value, wk0.currentSi.row(i) )
318  if mip != '':
319    mlist[mip].append( vals )
320
321keys = mlist.keys()
322keys.sort()
323print keys
324
325mipTrans ={ 'geoMIP':'GeoMIP' }
326diagMips = ['DynVar','SIMIP','CORDEX']
327k2 = cfg.ee.keys()
328k2.sort()
329nn = 0
330for k in k2:
331  k = mipTrans.get( k,k)
332  if k not in keys and k not in diagMips:
333     print '%s not found' % k
334     nn += 1
335assert nn == 0, 'MIP naming error?'
336
337
338class rqsummary(object):
339  __doc__ = """Create a request summary table, by MIP and variable table.
340Creates a list of default dictionaries, one for each table. An entry for each MIP in each dictionary.
341"""
342
343  def __init__(self,exptInfo=None):
344    self.tablist = []
345    self.tabindx = {}
346    self.mips = collections.defaultdict( int )
347    self.exptInfo = exptInfo
348    self.rowList = []
349    self.records = []
350    self.headers = {}
351
352  def add(self,mip,path):
353    return rq(mip,path,parent=self)
354
355  def addRow( self, mip, tab, obj, grid, gok, comment,opt='',opar='',uid=None, preset=-2 ):
356    if uid == None:
357      k = str( uuid.uuid1() )
358    else:
359      k = uid
360    self.rowList.append( (k,mip,tab, obj, grid, gok, comment, opt, opar, preset) )
361    return k
362
363  def addItem( self, mip, tab, nn, nexmax, nenmax, nymax, expt=None, rid=None ):
364    if not self.tabindx.has_key( tab ):
365      self.tabindx[tab] = len(self.tablist)
366      self.tablist.append( collections.defaultdict( int ) )
367    ix = self.tabindx[tab]
368    self.tablist[ix][mip] = nn
369    self.mips[mip] += 1
370    self.records.append( (mip,tab,expt, rid,nn, nexmax, nenmax, nymax) )
371
372  def show(self,oo):
373    mips = self.mips.keys()
374    mips.sort()
375    keys = self.tabindx.keys()
376    keys.sort()
377    oo.write( ',' + string.join(mips, ',') + ',\n' )
378    for k in keys:
379      r = []
380      ix = self.tabindx[k]
381      for m in mips:
382        r.append( self.tablist[ix][m] )
383      print k,r
384      if max(r) > 0:
385        rec = '%s,' % k
386        for i in r:
387          rec += '%s,' %  i
388        oo.write( rec + '\n' )
389
390
391#dd_rq = collections.defaultdict( dict )
392#dd_tbl = collections.defaultdict( int )
393class rq(object):
394
395  def __init__(self, mip,path, parent=None ):
396    self.mip = mip
397    self.wk1 = wbcp( inbook=path )
398    self.pr4 = dreq_utils.pr4()
399    if u'Request scoping' in self.wk1.sns:
400      self.wk1.focus( u'Request scoping')
401
402      self.parent = parent
403      self.ok = self.parse02()
404    else:
405      self.ok = False
406
407  def parse02(self):
408
409    r4 = map( lambda x: x.value, self.wk1.currentSi.row(3) )
410    r3 = map( lambda x: x.value, self.wk1.currentSi.row(2) )
411    self.pr4.parse( self.mip, r4 )
412    ##self.pr4.parse3( self.mip, r3 )
413    self.parent.headers[self.mip] = r4[:]
414    self.ixh = 0
415    self.ixm = 0
416    self.mipl = None
417    self.nbl = None
418    hhref = [u'control', u'AMIP', u'abrupt4xCO2', u'1pctCO2', u'CMIP6 historical']
419##
420## identify key start and end columns
421##
422## NEED to scan and check all expt. names.
423##
424    lega = False
425    if lega:
426     try:
427      self.ixh = r4.index( u'CMIP6 historical' )
428      self.ixm = r4.index( u'MIP name:' )
429      if r4[self.ixh-8] == u'control':
430        self.iccntl = self.ixh-8
431        hh = []
432        for j in range(5):
433          hh.append( r4[self.iccntl + j*2] )
434          if hh[j] != hhref[j]:
435            print 'ERROR.001.002: mismatch in heading %s' %j, r4
436      else:
437        print 'ERROR.001.001: control expt. column not found', r4
438     except:
439      if self.mip == 'DCPP':
440        self.ix0 = r4.index( u'DCPP-A' )
441        self.ixm = self.ix0+8
442        self.ixh = -1
443        self.iccntl = self.ix0
444        hh = []
445        for j in range(5):
446          hh.append( r4[self.iccntl + j*2] )
447      else:
448        print 'Failed to parse Row 4'
449        raise
450     nn = len(r4) - self.ixm
451     self.mipl = []
452     self.mipix = []
453     for v in r4[self.ixm+1:]:
454      if v not in ['',u'MIP name:']:
455        self.mipl.append( v )
456        self.mipix.append( r4.index(v) )
457
458     if self.ixh > 0:
459      i0 = self.ixh - 8
460     else:
461      i0 = self.ix0
462     if len(self.mipix) == 0:
463      i9 = self.ixm-1
464     else:
465      i9 = max( self.mipix ) + 1
466     self.nbl = []
467     self.hnbl = []
468
469     for j in range(5,self.wk1.currentSi.nrows):
470      rv = map( lambda x: x.value, self.wk1.currentSi.row(j) )
471      isblnk = all( map( lambda x: x == '', rv[i0:i9] ) )
472      if not isblnk:
473        self.nbl.append(j)
474      if self.ixh > 0:
475        ishblnk = all( map( lambda x: x == '', rv[self.ixh:self.ixh+2] ) )
476        if not isblnk:
477          self.hnbl.append(j)
478
479    ##self.opt = 'self'
480    ##self.opt = 'deck'
481    ##self.opt = 'all'
482    r4i = self.pr4.r4info
483    ##for j in self.nbl:
484    grids = set()
485    for j in range(5,self.wk1.currentSi.nrows):
486        rv = map( lambda x: x.value, self.wk1.currentSi.row(j)[:8] )
487        tab = rv[0]
488        grid = rv[3]
489        grids.add( grid )
490        gok = rv[r4i.mode-2]
491        comment = rv[r4i.mode-1]
492        obj0 = rv[r4i.mode]
493        bb = string.split(obj0, ':' )
494        if len(bb) > 1:
495          obj = bb[0]
496          preset = int( bb[1] )
497        else:
498          obj = obj0
499          preset = -1
500        opt = rv[1]
501        opar = rv[2]
502        uid = str( uuid.uuid1() )
503        nbl = False
504        if not tab in ['',u'']:
505          ##uid = self.parent.addRow( self.mip, tab, obj, grid, gok, comment, opt=opt, opar=opar )
506          if self.mip != 'DCPP':
507              for je in range(5):
508                j1 = r4i.ixcntl + je*2
509                ok = self.readDeckColPair( j, j1, 160, expt=string.strip(r4[j1]), rid=uid )
510                if ok:
511                  nbl = True
512          for je in r4i.ownix:
513                ok = self.readDeckColPair( j, je, 100, expt=string.strip(r4[je]), rid=uid )
514                if ok:
515                  nbl = True
516          for je in r4i.othix:
517                ok = self.readDeckColPair( j, je, 100, expt=string.strip(r4[je+1]), rid=uid,mode=3 )
518                if ok:
519                  nbl = True
520### add row if non-blank element found
521        if nbl:
522          uid = self.parent.addRow( self.mip, tab, obj, grid, gok, comment, opt=opt, opar=opar, uid=uid, preset=preset )
523    print 'INFO.100.00001: grids for MIP %s: %s' % (self.mip, str(grids) )
524    return True
525
526  def readDeckColPair( self,j, ix, nydef, expt=None, rid=None, mode=2 ):
527      assert mode in [2,3], 'Only modes 2,3 supported, not mode=%s' % mode
528      this = map( lambda x: x.value, self.wk1.currentSi.row(j)[ix:ix+mode] )
529##  if this element is empty, return .. nothing to do.
530      if all( [x in {u'','',0,0.0} for x in this] ):
531        return False
532
533      if mode == 2:
534        snens, sny = this
535        cmt = '2:%s:%s:' % (snens,sny)
536      else:
537        snex, snens, sny = this
538        cmt = '3:%s:%s:%s:' % (snex,snens,sny)
539
540      nex = 0
541      nexmax = -999
542      if mode == 3:
543        print '######### MODE = 3: %s' % str(this)
544        if type( snex ) in  {type(u' '),type(' ')}:
545          if snex[:3] in {u'all',u'ALL'}:
546            nex = 5
547            nexmax = -1
548          elif snex[:3] in {u'tbd',u'TBD','tbd','TBD'}:
549            print 'WARN:005.0001: tbd encountered in experiment number'
550            nex = 5
551            cmt += '*'
552          else:
553            print 'ERROR.001.0010: string in experiment number: %s' % snex
554            nex = 0
555            cmt += '*'
556        else:
557          print 'WARN:005.0002: experiment number .... need to check consistency etc: %s' % self.mip
558          nex = int(snex)
559          nexmax = nex
560        if type(nex) not in {type(1.), type(1)}:
561          print 'ERROR.099.0100: non integer nex: %s:: %s:: %s' % (str(this),snex, type(snex))
562          raise
563
564      try:
565        if snens == u'all':
566          nens = 1
567          nenmax = -1
568        elif snens == '':
569          nens = 0
570          nenmax = -999
571        else:
572          nens = int( snens )
573          nenmax = nens
574
575        if sny == u'all':
576          ny = nydef
577          ony = 'all'
578          nymax = -1
579        elif sny == '':
580          ny = 0
581          ony = 0
582          nymax = -999
583        elif type(sny) in [type('x'),type(u'x')]:
584            s = sny
585            if string.find( s, '\n' ) != -1:
586              bits = string.split( s, '\n' )
587              ny = int( bits[0] )
588              nymax = ny
589              cmt += '*'
590              print 'WARN.001.0001: [%s] truncating time period option: %s' % (self.mip, str(s) )
591            else:
592              x = string.split( s )[0]
593              if string.find( x, '-' ) != -1:
594                bb = string.split(x, '-' )
595                ny = int(bb[1])-int(bb[0])
596                print 'WARN.001.0002: [%s] truncating time period option: %s' % (self.mip, str(s) )
597                nymax = ny
598              elif string.find( x, '/' ) != -1:
599                bb = string.split(x, '/' )
600                ny = int(bb[0])
601                print 'WARN.001.0003: [%s] truncating time period option: %s' % (self.mip, str(s) )
602                nymax = ny
603              else:
604                print 'WARN.001.0004: [%s] time period option read as string: %s' % (self.mip, str(s) )
605                ny = int( x )
606                nymax = ny
607        else:
608          ny = sny
609          nymax = ny
610
611        if type( ny ) in [type( 'x' ),type( u'x' )]:
612          bits = string.split(ny) 
613          if bits[1] == u'period':
614            bb = string.split( bits[0], '-' )
615            ny = int(bb[1]) - int(bb[0])
616            raise
617
618        tab = self.wk1.currentSi.row(j)[0].value
619        try:
620          if mode == 2:
621            ntot = nens*ny
622          else:
623            ntot = nex*nens*ny
624          if type(ntot) not in {type(1.), type(1)}:
625            print 'ERROR.099.0101: non integer ntot: %s:: %s' % (str([mode,nex,nens,ny]),str(this))
626            raise
627        except:
628          print self.mip, tab, nens, ny
629          raise
630        if tab in self.wk1.sns:
631          tab = '%s:%s' % (self.mip,tab)
632        elif tab not in cmip5Vg:
633          if not ( tab[:5] == 'SPECS' or tab[:4] == 'CCMI' ):
634            tab = '%s!!%s' % (self.mip,tab)
635
636        self.parent.addItem( self.mip, tab, ntot, nexmax, nenmax, nymax, expt=expt, rid=rid )
637        return True
638      except:
639        print 'ERROR.002.0001: Failed trying to scan deck column pair.'
640        print self.mip,expt
641        raise
642
643#https://secure.simplistix.co.uk/svn/xlwt/tags/0.7.2/xlwt/Style.py
644## following style used for a changed cell.
645style_string = "border: top thick, right thick, bottom thick, left thick; pattern: pattern fine_dots, fore_color white, back_color yellow;"
646deltaStyle = xlwt.easyxf(style_string)
647## following style is used in the 1st column if there is a change somewhere in the row and not in 1st column
648style_string = "border: top thick, right thick, bottom thick, left thick; pattern: pattern fine_dots, fore_color white, back_color orange;"
649delta0Style = xlwt.easyxf(style_string)
650style_string = "border: top thin, right thin, bottom thin, left thin; pattern: pattern fine_dots, fore_color white, back_color pale_blue;"
651toggleStyle = xlwt.easyxf(style_string)
652mipPrev=None
653ktog = 0
654jj = 2
655
656##wke = wbcp( 'CMIP6_consolidatedExptList_20150408.xls' )
657wke = wbcp( 'CMIP6DataRequest_ConsolidatedExperiments_20150618.xls' )
658wke.focus( 'Experiments' )
659expgs = collections.defaultdict( int )
660expgsEns = collections.defaultdict( int )
661expgsYpe = collections.defaultdict( int )
662tier0 = 1
663pre = dreq_utils.prcexr()
664elist = []
665for k in range(2,wke.currentSi.nrows):
666  vals = map( lambda x: x.value, wke.currentSi.row(k) )
667  pre.parse( vals )
668  elist.append( pre.row )
669  g = string.strip( vals[1] )
670  tier = vals[5]
671  if g[:5] == 'DAMIP':
672    print '######',g,vals[12],vals[13],tier
673  if tier0 >= tier:
674    expgs[g] += vals[13]
675    expgsEns[g] = vals[12]
676for k in expgs.keys():
677  if expgsEns[k] == 0:
678    expgsYpe[k] = 0
679  else:
680    try:
681      expgsYpe[k] = expgs[k]/expgsEns[k]
682    except:
683      print k, expgs[k], expgsEns[k]
684      raise
685
686rqs= rqsummary(exptInfo=(expgs,expgsEns,expgsYpe))
687
688##for k in keys:
689for k in k2:
690  ktog = 1 - ktog
691  if k in k2:
692    path = '%s%s/%s' % (dir0,k,cfg.ee[k])
693    print path
694    thisrq = rqs.add( k, path )
695    if thisrq.ok:
696      print thisrq.ok, k, thisrq.ixh, thisrq.ixm, thisrq.mipl
697    else:
698      print thisrq.ok, k
699
700oo = open( 'request.csv', 'w' )
701rqs.show( oo )
702oo.close()
703
704##sh = shelve.open( 'dreq_consol_tables_reviewed_b_v20150827', 'r' )
705sh = shelve.open( 'dreq_consol_tables_reviewed_b_v20150907', 'r' )
706revTabIds = sh.keys()[:]
707sh.close()
708odir = 'sh20150708'
709odir = 'sh20150827'
710### need to split this, so that a collection of variables can be used in more than one request row.
711## check for duplicates
712## look to see if a reference to, e.g. Omon is CMIP5 or a revised list ....
713### requestVarGroup = mip, label, title, uuid
714### requestLinks = vgid, objective, grid, gridreq, comment, uuid -- inherits label and title
715sh = shelve.open( '%s/requestVarGroup_tmp' % odir, 'n' )
716sh['__info__'] = { 'label':'requestVarGroup_tmp', 'title':'Identify variable groups' }
717sh['__cols__'] = [ 'uuid', 'mip', 'label','title']
718rvgps = collections.defaultdict( list )
719### need to give temporary labels/titles here and consolidate after all variables have been collated in
720### sx2.
721## rows from "request scoping"
722for i in rqs.rowList:
723  kk ='%s.%s' % (i[1],i[2])
724  rvgps[kk].append(i) 
725
726for k in rvgps.keys():
727  if len(rvgps[k]) > 1:
728    print 'WARN.010.0005: ',k,'############# MULTIPLE ENTRIES'
729    for i in rvgps[k]:
730      print i
731  for i in rvgps[k]:
732    print 'requestVarGroup: %s' % str(i)
733    sh[i[0]] = (i[0],i[1],k,k)
734sh.close()
735
736s1 = set()
737sh = shelve.open( '%s/requestLinks_tmp' % odir, 'n' )
738sh['__info__'] = { 'label':'requestLinks', 'title':'Links from variable groups to a request id' }
739sh['__cols__'] = [ 'uid', 'mip', 'tab','objective','grid','gridreq','comment','opt','opar', 'preset']
740for i in rqs.rowList:
741  sh[i[0]] = i[:]
742  if i[3] in {'',u''}:
743    print 'ERROR.099.0060: Blank objective: %s' % str(i)
744  s1.add( i[0] )
745sh.close()
746sh = shelve.open( '%s/requestItems' % odir, 'n' )
747sh['__info__'] = { 'label':'requestItems', 'title':'Specification for a single experiment' , \
748     'comment':'Currently only has number of years -- need to include more details' }
749sh['__cols__'] = [ 'mip', 'tab', 'expt','rlid','ny', 'nexmax', 'nenmax', 'nymax']
750##('AerChemMIP', u'Omon_3d', u'CMIP6 historical', 'ad74be9a-26ef-11e5-8d9b-ac72891c3257', 0.0)
751for i in rqs.records:
752  k = str( uuid.uuid1() )
753  if type(i[4]) not in  (type( 0 ),type(1.)):
754    print 'ERROR.099.0001: non-integer ny: %s' % str(i)
755  if i[3] not in s1:
756    print 'SEVERE.005.00009: bad link ',i
757  sh[k] = i[:]
758sh.close()
Note: See TracBrowser for help on using the repository browser.