source: CMIP6dreqbuild/trunk/srcMisc/dreq_consol_dreq2.py @ 323

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

dreq misc

Line 
1import string
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
10from utils_wb import wbcp
11from dreq_cfg import diagMips
12
13nt__deckrq = collections.namedtuple( 'dckrq', ['control','AMIP','abrupt4xCO2','rq_1pctCO2','historical'] )
14dd_rq = collections.defaultdict( dict )
15dd_tbl = collections.defaultdict( int )
16
17class tupsort:
18   def __init__(self,k=0):
19     self.k = k
20   def cmp(self,x,y):
21     return cmp( x[self.k], y[self.k] )
22
23def uniquify( ll ):
24  ll.sort()
25  l0 = [ll[0],]
26  for l in ll[1:]:
27    if l != l0[-1]:
28      l0.append(l)
29  return l0
30
31class workbook(object):
32  def __init__(self,file):
33    assert os.path.isfile(file), 'File %s not found' % file
34    self.book = xlrd.open_workbook( file )
35    self.sns = self.book.sheet_names()
36
37clabs = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
38def clab(n):
39  i = n/26
40  assert i < 26, 'Not ready for row number greater than 26*26'
41  if i == 0:
42    return clabs[n]
43  else:
44    return clabs[i-1] + clabs[ n - i*26]
45
46def getRow(sht):
47  ee = {}
48  for i in range(sht.nrows):
49    if sht.row(i)[0].ctype == 2 and str( sht.row(i)[0].value ) != '0.0':
50      l = map( lambda x: str( x.value ), sht.row(i) )
51      ##k = string.replace( l[5], ' ','')
52      k = l[5]
53      try:
54        ee[k] = l
55      except:
56        print l
57        raise
58  return ee
59   
60def outvSer( ov ):
61  ll = []
62  for i in ov:
63    ll.append( '%s|%s|%s' % tuple( map( str, i) ) )
64  return string.join(ll, '; ' )
65 
66
67class cpsh(object):
68
69  def __init__(self,wk0,mip,path,kk=3,oo=None):
70    self.oo = oo
71    self.nn = 0
72    self.kk = kk
73    wk = wbcp( path )
74    wk0.focus( u'New variables')
75    self.wk = wk
76    self.mip = mip
77    self.nvgs = []
78    for s in wk.sns:
79      if s not in ['Objectives','Experiments','Experiment Groups','Request scoping','New variables','__lists__']:
80        self.nvgs.append(s)
81    self.outv = collections.defaultdict(list)
82    for s in self.nvgs:
83      thiss = wk.book.sheet_by_name( s )
84      for k in range(4,thiss.nrows):
85        r = thiss.row(k)
86        v = r[1].value
87        t = r[2].value
88        f = r[3].value
89        s = r[5].value
90        m = r[7].value
91        if t[:3] == 'new':
92          self.outv[v].append( (f,s,m) )
93    this = wk.book.sheet_by_name(u'New variables')
94    ee = collections.defaultdict( list )
95    for i in range(3,this.nrows):
96      r = this.row(i)
97      if r[0].value == "**end**":
98        break
99      v = r[0].value
100      ee[v].append(i)
101
102    for i in range(3,this.nrows):
103      r = this.row(i)
104      if r[0].value == "**end**":
105        break
106
107      v = r[0].value
108      l = r[4].value
109      novar = v == '' and l == ''
110      omitOld = True
111      omit = False
112      if vdict.has_key(v) and omitOld:
113        omit = True
114
115      if not omit:
116        if not novar:
117          wk0.putValue2( self.kk, 0, mip )
118          s = r[1].value
119          if s in ['','?']:
120            chk = 0
121          elif esn.has_key(s):
122            chk = 1
123          elif esna.has_key(s):
124            chk = 2
125          else:
126            chk = -1
127          wk0.putValue2( self.kk, 1, chk )
128          self.nn += 1
129          htmlline = "<td>%s</td>" % mip
130        else:
131          chk = 0
132          htmlline = "<td></td>"
133     
134        j = 3
135        jo = 1
136        wk0.putValue2( self.kk, 3, outvSer( self.outv[v] ) )
137        for x in r:
138          if j == 3:
139            v = x.value
140            v0 = x.value
141            if str(v0) != "":
142              if len(ee[v0]) != 1:
143                 v += '!'
144              if vdict.has_key(v0):
145                 v += '**'
146            wk0.putValue2( self.kk, j+jo, v )
147          else:
148            wk0.putValue2( self.kk, j+jo, x.value )
149          if j in [3,7]:
150            htmlline += "<td>%s</td>\n" % x.value
151          elif j == 4:
152            if chk == -1:
153              htmlline += "<td>?%s?</td>\n" % x.value
154            else:
155              htmlline += "<td>%s</td>\n" % x.value
156          elif j == 8:
157            y = x.value
158          elif j == 9:
159            htmlline += '<td><span title="%s">%s</span></td>\n' % (x.value,y)
160          j += 1
161        self.kk += 1
162        if not novar:
163          if mip == "SIMIP":
164            print htmlline
165          htmlline = string.replace( htmlline, u'\u2013', '-' )
166          htmlline = string.replace( htmlline, u'\u2018', "'" )
167          htmlline = string.replace( htmlline, u'\u2019', "'" )
168          htmlline = string.replace( htmlline, u'\u2026', '...' )
169          htmlline = string.replace( htmlline, u'\u25e6', 'o' )
170          htmlline = string.replace( htmlline, u'\xb2', '2' )
171          htmlline = string.replace( htmlline, u'\xb3', '3' )
172          if self.oo != None:
173            self.oo.write( "<tr>%s</tr>" % str(htmlline) + '\n' )
174
175  def parseRQ(self):
176    this = self.wk.book.sheet_by_name(u'Request scoping')
177    for i in range(6,this.nrows):
178      r = this.row(i)
179      mipt = r[0].value
180      s = r[1].value
181      if mipt[:4]  in ['SPEC','CORD', 'CCMI'] and s != 'none':
182        print self.mip,mipt
183def lennbl(ll):
184  i = 0
185  ii = 0
186  for l in ll:
187    i+= 1
188    if l != '':
189      ii = i
190  return ii
191
192def  matchVals( thisv, valset ):
193  ll1 = []
194  ll2 = []
195  lk0 = []
196  kk = 0
197  for vals in valset:
198    l1 = min( [lennbl(thisv), lennbl(vals)] )
199    l2 = max( [lennbl(thisv), lennbl(vals)] )
200    ll = []
201    for i in range(l1):
202      ll.append( vals[i] == thisv[i] )
203    for i in range(l2-l1):
204      ll.append(False)
205    if all(ll):
206      return ll
207    k = 0
208    for l in ll:
209      if l:
210        k+=1
211    if ll[0]:
212      lk0.append( kk )
213     
214    ll1.append(k)
215    ll2.append(ll)
216    kk += 1
217  k0 = max( ll1 )
218  if len(lk0) > 0:
219    k0 = lk0[0]
220    return ll2[ k0 ]
221  return ll2[ ll1.index(k0) ]
222   
223kk=3
224
225base = '/home/martin/2014/wip/dreq/'
226dir0 = '/home/martin/2014/wip/dreq/input/'
227file = 'PMIP/CMIP6DataRequestCompilationTemplate_20141218_PMIP_v150228_final.xls'
228file = 'C4MIP/CMIP6DataRequestCompilationTemplate_C4MIP_06March2015_submitted.xls'
229fileTmpl = 'CMIP6DataRequestCompilationTemplate_20141218.xls'
230
231wk0 = wbcp( inbook=base+fileTmpl )
232cfg = dreq_cfg.rqcfg()
233wk0.focus( u'Experiments')
234mlist = collections.defaultdict( list )
235for i in range(2,wk0.currentSi.nrows):
236  mip = str(wk0.currentSi.row(i)[3].value)
237  vals = map( lambda x: x.value, wk0.currentSi.row(i) )
238  if mip != '':
239    mlist[mip].append( vals )
240
241keys = mlist.keys()
242keys.sort()
243print keys
244
245mipTrans ={ 'geoMIP':'GeoMIP' }
246k2 = cfg.ee.keys()
247k2.sort()
248nn = 0
249for k in k2:
250  k = mipTrans.get( k,k)
251  if k not in keys and k not in diagMips:
252     print '%s not found' % k
253     nn += 1
254assert nn == 0, 'MIP naming error?'
255
256
257class rqsummary(object):
258  __doc__ = """Create a request summary table, by MIP and variable table.
259Creates a list of default dictionaries, one for each table. An entry for each MIP in each dictionary.
260"""
261
262  def __init__(self,exptInfo=None):
263    self.tablist = []
264    self.tabindx = {}
265    self.mips = collections.defaultdict( int )
266    self.exptInfo = exptInfo
267
268
269  def add(self,mip,path):
270    return rq(mip,path,parent=self)
271
272  def addItem( self, mip, tab, nn ):
273    if not self.tabindx.has_key( tab ):
274      self.tabindx[tab] = len(self.tablist)
275      self.tablist.append( collections.defaultdict( int ) )
276    ix = self.tabindx[tab]
277    self.tablist[ix][mip] = nn
278    self.mips[mip] += 1
279
280  def show(self,oo):
281    mips = self.mips.keys()
282    mips.sort()
283    keys = self.tabindx.keys()
284    keys.sort()
285    oo.write( ',' + string.join(mips, ',') + ',\n' )
286    for k in keys:
287      r = []
288      ix = self.tabindx[k]
289      for m in mips:
290        r.append( self.tablist[ix][m] )
291      print k,r
292      if max(r) > 0:
293        rec = '%s,' % k
294        for i in r:
295          rec += '%s,' %  i
296        oo.write( rec + '\n' )
297
298
299#dd_rq = collections.defaultdict( dict )
300#dd_tbl = collections.defaultdict( int )
301class rq(object):
302
303  def __init__(self, mip,path, parent=None ):
304    self.mip = mip
305    self.wk1 = wbcp( inbook=path )
306    if u'Request scoping' in  self.wk1.sns:
307      self.wk1.focus( u'Request scoping')
308      self.parent = parent
309      self.ok = self.parse01()
310    else:
311      self.ok = False
312
313  def parse01(self):
314
315    r4 = map( lambda x: x.value, self.wk1.currentSi.row(3) )
316    self.ixh = 0
317    self.ixm = 0
318    try:
319      self.ixh = r4.index( u'CMIP6 historical' )
320      self.ixm = r4.index( u'MIP name:' )
321    except:
322      if self.mip == 'DCPP':
323        self.ix0 = r4.index( u'DCPP-A' )
324        self.ixm = self.ix0+8
325        self.ixh = -1
326      else:
327        print 'Failed to parse Row 4'
328        return False
329    nn = len(r4) - self.ixm
330    self.mipl = []
331    self.mipix = []
332    for v in r4[self.ixm+1:]:
333      if v not in ['',u'MIP name:']:
334        self.mipl.append( v )
335        self.mipix.append( r4.index(v) )
336
337    if self.ixh > 0:
338      i0 = self.ixh - 8
339    else:
340      i0 = self.ix0
341    if len(self.mipix) == 0:
342      i9 = self.ixm-1
343    else:
344      i9 = max( self.mipix ) + 1
345    self.nbl = []
346    self.hnbl = []
347##    if self.mip == 'DAMIP':
348      ##print self.ixh, self.mipix, self.wk1.currentSi.nrows
349
350    for j in range(5,self.wk1.currentSi.nrows):
351      rv = map( lambda x: x.value, self.wk1.currentSi.row(j) )
352      isblnk = all( map( lambda x: x == '', rv[i0:i9] ) )
353      if not isblnk:
354        self.nbl.append(j)
355      if self.ixh > 0:
356        ishblnk = all( map( lambda x: x == '', rv[self.ixh:self.ixh+2] ) )
357        if not isblnk:
358          self.hnbl.append(j)
359
360    self.opt = 'self'
361    self.opt = 'hist'
362    if self.opt == 'hist':
363      for j in self.hnbl:
364        rv = map( lambda x: x.value, self.wk1.currentSi.row(j)[self.ixh:self.ixh+2] )
365        if rv[0] == u'all':
366          nens = 1
367        elif rv[0] == '':
368          nens = 0
369        else:
370          nens = rv[0]
371        if rv[1] == u'all':
372          ny = 160
373        elif rv[1] == '':
374          ny = 0
375        elif type(rv[1]) in [type('x'),type(u'x')]:
376            s = rv[1]
377            print 'WARNING: %s' % s
378            if string.find( s, '\n' ) != -1:
379              bits = string.split( s, '\n' )
380              ny = int( bits[0] )
381            else:
382              x = string.split( s )[0]
383              if string.find( x, '-' ) != -1:
384                bb = string.split(x, '-' )
385                ny = int(bb[1])-int(bb[0])
386              else:
387                ny = int( x )
388        else:
389          ny = rv[1]
390
391        if type( ny ) in [type( 'x' ),type( u'x' )]:
392          bits = string.split(ny) 
393          if bits[1] == u'period':
394            bb = string.split( bits[0], '-' )
395            ny = int(bb[1]) - int(bb[0])
396
397        try:
398          ntot = nens*ny
399        except:
400          print self.mip, tab, nens, ny
401          raise
402        tab = self.wk1.currentSi.row(j)[0].value
403        self.parent.addItem( self.mip, tab, ntot )
404    else:
405      if self.ixh > 0:
406        i0 = self.ixh + 2
407      else:
408        i0 = self.ix0
409      hv = map( lambda x: x.value, self.wk1.currentSi.row(3)[i0:self.ixm] )
410      hfnd = []
411      for k in range(len(hv)/2):
412        h = hv[2*k]
413        if string.find( h, 'PMIP3' ) != -1:
414          h = string.replace(h,'PMIP3','PMIP')
415        ok = self.parent.exptInfo[0].has_key(h)
416        if not ok:
417          if string.find( h, '\n' ) != -1:
418            bits = string.split( h, '\n' )
419          else:
420            bits = string.split( h, ' ' )
421          if self.parent.exptInfo[0].has_key(bits[0]):
422            hv[2*k] = bits[0]
423            ok = True
424        hfnd.append( ok )
425        if not hfnd[-1]:
426             print self.mip, h, 'NOT FOUND'
427      for j in self.nbl:
428        rv = map( lambda x: x.value, self.wk1.currentSi.row(j)[i0:self.ixm] )
429        ntot = 0
430        tab = self.wk1.currentSi.row(j)[0].value
431        for k in range(len(rv)/2):
432          h = hv[2*k]
433          if self.parent.exptInfo != None:
434            if h == 'VolShortIni':
435                nensDef = 10
436                nyDef = 10
437            elif h == 'VolShort':
438                nensDef = 100
439                nyDef = 3
440            elif self.parent.exptInfo[0].has_key(h):
441              nensDef = self.parent.exptInfo[1][h]
442              nyDef = self.parent.exptInfo[2][h]
443            else:
444              nensDef = 1
445              nyDef = 100
446          if rv[2*k+0] == u'all':
447            nens = nensDef
448          elif rv[2*k+0] == '':
449            nens = 0
450          else:
451            nens = rv[2*k+0]
452          if rv[2*k+1] == u'all':
453            ny = nyDef
454          elif rv[2*k+1] == '':
455            ny = 0
456          elif type(rv[2*k+1]) in [type('x'),type(u'x')]:
457            s = rv[2*k+1]
458            print 'WARNING: %s' % s
459            if string.find( s, '\n' ) != -1:
460              bits = string.split( s, '\n' )
461              ny = int( bits[0] )
462            else:
463              ny = int( string.split( rv[2*k+1] )[0] )
464          else:
465            ny = rv[2*k+1]
466          try:
467            ntot += ny*nens
468          except:
469            print 'FAILED: ',ny,nens
470          if tab == 'day_oth' and self.mip == 'DAMIP':
471            print ny, nens, ntot
472
473
474        if self.mip == 'DAMIP':
475          print self.mip,tab,ntot
476        self.parent.addItem( self.mip, tab, ntot )
477
478    return True
479
480#https://secure.simplistix.co.uk/svn/xlwt/tags/0.7.2/xlwt/Style.py
481## following style used for a changed cell.
482style_string = "border: top thick, right thick, bottom thick, left thick; pattern: pattern fine_dots, fore_color white, back_color yellow;"
483deltaStyle = xlwt.easyxf(style_string)
484## following style is used in the 1st column if there is a change somewhere in the row and not in 1st column
485style_string = "border: top thick, right thick, bottom thick, left thick; pattern: pattern fine_dots, fore_color white, back_color orange;"
486delta0Style = xlwt.easyxf(style_string)
487style_string = "border: top thin, right thin, bottom thin, left thin; pattern: pattern fine_dots, fore_color white, back_color pale_blue;"
488toggleStyle = xlwt.easyxf(style_string)
489mipPrev=None
490ktog = 0
491jj = 2
492
493wke = wbcp( 'output.xls' )
494wke.focus( 'Experiments' )
495expgs = collections.defaultdict( int )
496expgsEns = collections.defaultdict( int )
497expgsYpe = collections.defaultdict( int )
498for k in range(2,wke.currentSi.nrows):
499  vals = map( lambda x: x.value, wke.currentSi.row(k) )
500  g = string.strip( vals[1] )
501  if g[:5] == 'DAMIP':
502    print '######',g,vals[12],vals[13]
503  expgs[g] += vals[13]
504  expgsEns[g] = vals[12]
505for k in expgs.keys():
506  if expgsEns[k] == 0:
507    expgsYpe[k] = 0
508  else:
509    try:
510      expgsYpe[k] = expgs[k]/expgsEns[k]
511    except:
512      print k, expgs[k], expgsEns[k]
513      raise
514
515rqs= rqsummary(exptInfo=(expgs,expgsEns,expgsYpe))
516
517for k in keys:
518  ktog = 1 - ktog
519  if k in k2:
520    path = '%s%s/%s' % (dir0,k,cfg.ee[k])
521    print path
522    thisrq = rqs.add( k, path )
523    if thisrq.ok:
524      print thisrq.ok, k, thisrq.ixh, thisrq.ixm, thisrq.mipl, [len(thisrq.nbl),len(thisrq.hnbl)]
525    else:
526      print thisrq.ok, k
527
528oo = open( 'request2.csv', 'w' )
529rqs.show( oo )
530oo.close()
Note: See TracBrowser for help on using the repository browser.