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

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

fixing SIMIP issues ...

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