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

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

final adjustments

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