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

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/srcMisc/dreq_consol_expt.py@376
Revision 323, 10.8 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
10
11class wbcp(object):
12  def __init__( self, inbook=dreq_cfg.rqcfg.tmpl ):
13    self.book = xlrd.open_workbook(inbook,formatting_info=True)
14    self.sns = self.book.sheet_names()
15    self.wb = xlutils.copy.copy(self.book)
16    ##self.book = xlrd.open_workbook(inbook,formatting_info=True)
17    self.plain = xlwt.easyxf('')
18    self.styles = xlutils.styles.Styles(self.book)
19
20
21  def styleUpdate(self,other):
22    self.styles.cell_styles.update( other.styles.cell_styles )
23  def _getOutCell(self, rowIndex, colIndex,stbk=None):
24    """ HACK: Extract the internal xlwt cell representation. """
25   
26    if stbk == None:
27      this = self
28    else:
29      this = stbk
30    row = this.currentSo._Worksheet__rows.get(rowIndex)
31
32    if not row: return None
33
34    cell = row._Row__cells.get(colIndex)
35    return cell
36
37  def putValue2(self, row, col, value,sti=None,stj=None,stbk=None,style=0):
38    """ Change cell value without changing formatting. """
39    # HACK to retain cell style.
40    if sti == None:
41      sti = col
42    if stj == None:
43      stj = row
44    self.previousCell = self._getOutCell( stj,sti,stbk=stbk )
45    # END HACK, PART I
46
47    if style==0:
48      self.currentSo.write(row, col, value)
49    else:
50      self.currentSo.write(row, col, value,style=style)
51
52    # HACK, PART II
53
54    do_style = False
55    if self.previousCell and style==0 and do_style:
56        self.newCell = self._getOutCell( row, col)
57        if self.newCell:
58          if stbk == None:
59            self.newCell.xf_idx = self.previousCell.xf_idx
60          else:
61            self.newCell.xf_idx = self.previousCell.xf_idx
62            ##nn = len( self.styles.cell_styles.keys() )
63            ##print stj,sti,self.previousCell.xf_idx, nn
64            ##self.styles.cell_styles[nn] = stbk.styles.cell_styles.items()[self.previousCell.xf_idx]
65            ##self.newCell.xf_idx = nn
66    # END HACK
67
68  def focus( self, name ):
69    if name not in self.sns:
70       print '%s not in %s' % (name,str(self.sns) )
71       raise
72    self.currentIndex = self.sns.index(name)
73    if self.currentIndex == -1:
74      self.currentSi = None
75    else:
76      self.currentSi = self.book.sheet_by_name( name )
77      self.currentSo = self.wb.get_sheet( self.currentIndex )
78
79  def putValue(self,i,j,value,sti=None,stj=None):
80    ##self.currentSi.write(i,j,value,self.plain)
81    if sti == None:
82      sti = i
83    if stj == None:
84      stj = j
85    cell_style = self.styles[self.currentSi.cell(sti,stj)]
86    self.currentSo.write(i,j,value,cell_style)
87
88  def write(self,file='output.xls'):
89    self.wb.save( file )
90
91class tupsort:
92   def __init__(self,k=0):
93     self.k = k
94   def cmp(self,x,y):
95     return cmp( x[self.k], y[self.k] )
96
97def uniquify( ll ):
98  ll.sort()
99  l0 = [ll[0],]
100  for l in ll[1:]:
101    if l != l0[-1]:
102      l0.append(l)
103  return l0
104
105class workbook(object):
106  def __init__(self,file):
107    assert os.path.isfile(file), 'File %s not found' % file
108    self.book = xlrd.open_workbook( file )
109    self.sns = self.book.sheet_names()
110
111clabs = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
112def clab(n):
113  i = n/26
114  assert i < 26, 'Not ready for row number greater than 26*26'
115  if i == 0:
116    return clabs[n]
117  else:
118    return clabs[i-1] + clabs[ n - i*26]
119
120def getRow(sht):
121  ee = {}
122  for i in range(sht.nrows):
123    if sht.row(i)[0].ctype == 2 and str( sht.row(i)[0].value ) != '0.0':
124      l = map( lambda x: str( x.value ), sht.row(i) )
125      ##k = string.replace( l[5], ' ','')
126      k = l[5]
127      try:
128        ee[k] = l
129      except:
130        print l
131        raise
132  return ee
133   
134def outvSer( ov ):
135  ll = []
136  for i in ov:
137    ll.append( '%s|%s|%s' % tuple( map( str, i) ) )
138  return string.join(ll, '; ' )
139 
140
141class cpsh(object):
142
143  def __init__(self,wk0,mip,path,kk=3,oo=None):
144    self.oo = oo
145    self.nn = 0
146    self.kk = kk
147    wk = wbcp( path )
148    wk0.focus( u'New variables')
149    self.wk = wk
150    self.mip = mip
151    self.nvgs = []
152    for s in wk.sns:
153      if s not in ['Objectives','Experiments','Experiment Groups','Request scoping','New variables','__lists__']:
154        self.nvgs.append(s)
155    self.outv = collections.defaultdict(list)
156    for s in self.nvgs:
157      thiss = wk.book.sheet_by_name( s )
158      for k in range(4,thiss.nrows):
159        r = thiss.row(k)
160        v = r[1].value
161        t = r[2].value
162        f = r[3].value
163        s = r[5].value
164        m = r[7].value
165        if t[:3] == 'new':
166          self.outv[v].append( (f,s,m) )
167    this = wk.book.sheet_by_name(u'New variables')
168    ee = collections.defaultdict( list )
169    for i in range(3,this.nrows):
170      r = this.row(i)
171      if r[0].value == "**end**":
172        break
173      v = r[0].value
174      ee[v].append(i)
175
176    for i in range(3,this.nrows):
177      r = this.row(i)
178      if r[0].value == "**end**":
179        break
180
181      v = r[0].value
182      l = r[4].value
183      novar = v == '' and l == ''
184      omitOld = True
185      omit = False
186      if vdict.has_key(v) and omitOld:
187        omit = True
188
189      if not omit:
190        if not novar:
191          wk0.putValue2( self.kk, 0, mip )
192          s = r[1].value
193          if s in ['','?']:
194            chk = 0
195          elif esn.has_key(s):
196            chk = 1
197          elif esna.has_key(s):
198            chk = 2
199          else:
200            chk = -1
201          wk0.putValue2( self.kk, 1, chk )
202          self.nn += 1
203          htmlline = "<td>%s</td>" % mip
204        else:
205          chk = 0
206          htmlline = "<td></td>"
207     
208        j = 3
209        jo = 1
210        wk0.putValue2( self.kk, 3, outvSer( self.outv[v] ) )
211        for x in r:
212          if j == 3:
213            v = x.value
214            v0 = x.value
215            if str(v0) != "":
216              if len(ee[v0]) != 1:
217                 v += '!'
218              if vdict.has_key(v0):
219                 v += '**'
220            wk0.putValue2( self.kk, j+jo, v )
221          else:
222            wk0.putValue2( self.kk, j+jo, x.value )
223          if j in [3,7]:
224            htmlline += "<td>%s</td>\n" % x.value
225          elif j == 4:
226            if chk == -1:
227              htmlline += "<td>?%s?</td>\n" % x.value
228            else:
229              htmlline += "<td>%s</td>\n" % x.value
230          elif j == 8:
231            y = x.value
232          elif j == 9:
233            htmlline += '<td><span title="%s">%s</span></td>\n' % (x.value,y)
234          j += 1
235        self.kk += 1
236        if not novar:
237          if mip == "SIMIP":
238            print htmlline
239          htmlline = string.replace( htmlline, u'\u2013', '-' )
240          htmlline = string.replace( htmlline, u'\u2018', "'" )
241          htmlline = string.replace( htmlline, u'\u2019', "'" )
242          htmlline = string.replace( htmlline, u'\u2026', '...' )
243          htmlline = string.replace( htmlline, u'\u25e6', 'o' )
244          htmlline = string.replace( htmlline, u'\xb2', '2' )
245          htmlline = string.replace( htmlline, u'\xb3', '3' )
246          if self.oo != None:
247            self.oo.write( "<tr>%s</tr>" % str(htmlline) + '\n' )
248
249  def parseRQ(self):
250    this = self.wk.book.sheet_by_name(u'Request scoping')
251    for i in range(6,this.nrows):
252      r = this.row(i)
253      mipt = r[0].value
254      s = r[1].value
255      if mipt[:4]  in ['SPEC','CORD', 'CCMI'] and s != 'none':
256        print self.mip,mipt
257def lennbl(ll):
258  i = 0
259  ii = 0
260  for l in ll:
261    i+= 1
262    if l != '':
263      ii = i
264  return ii
265
266def  matchVals( thisv, valset ):
267  ll1 = []
268  ll2 = []
269  lk0 = []
270  kk = 0
271  for vals in valset:
272    l1 = min( [lennbl(thisv), lennbl(vals)] )
273    l2 = max( [lennbl(thisv), lennbl(vals)] )
274    ll = []
275    for i in range(l1):
276      ll.append( vals[i] == thisv[i] )
277    for i in range(l2-l1):
278      ll.append(False)
279    if all(ll):
280      return ll
281    k = 0
282    for l in ll:
283      if l:
284        k+=1
285    if ll[0]:
286      lk0.append( kk )
287     
288    ll1.append(k)
289    ll2.append(ll)
290    kk += 1
291  k0 = max( ll1 )
292  if len(lk0) > 0:
293    k0 = lk0[0]
294    return ll2[ k0 ]
295  return ll2[ ll1.index(k0) ]
296   
297kk=3
298
299base = '/home/martin/2014/wip/dreq/'
300dir0 = '/home/martin/2014/wip/dreq/input/'
301file = 'PMIP/CMIP6DataRequestCompilationTemplate_20141218_PMIP_v150228_final.xls'
302file = 'C4MIP/CMIP6DataRequestCompilationTemplate_C4MIP_06March2015_submitted.xls'
303fileTmpl = 'CMIP6DataRequestCompilationTemplate_20141218.xls'
304
305wk0 = wbcp( inbook=base+fileTmpl )
306cfg = dreq_cfg.rqcfg()
307wk0.focus( u'Experiments')
308mlist = collections.defaultdict( list )
309for i in range(2,wk0.currentSi.nrows):
310  mip = str(wk0.currentSi.row(i)[3].value)
311  vals = map( lambda x: x.value, wk0.currentSi.row(i) )
312  if mip != '':
313    mlist[mip].append( vals )
314
315keys = mlist.keys()
316keys.sort()
317print keys
318
319mipTrans ={  }
320diagMips = ['DynVar','SIMIP','CORDEX','AgMIP']
321k2 = cfg.ee.keys()
322k2.sort()
323nn = 0
324for k in k2:
325  k = mipTrans.get( k,k)
326  if k not in keys and k not in diagMips:
327     print '%s not found' % k
328     nn += 1
329
330assert nn == 0, 'MIP naming error?'
331
332#https://secure.simplistix.co.uk/svn/xlwt/tags/0.7.2/xlwt/Style.py
333## following style used for a changed cell.
334style_string = "border: top thick, right thick, bottom thick, left thick; pattern: pattern fine_dots, fore_color white, back_color yellow;"
335deltaStyle = xlwt.easyxf(style_string)
336## following style is used in the 1st column if there is a change somewhere in the row and not in 1st column
337style_string = "border: top thick, right thick, bottom thick, left thick; pattern: pattern fine_dots, fore_color white, back_color orange;"
338delta0Style = xlwt.easyxf(style_string)
339style_string = "border: top thin, right thin, bottom thin, left thin; pattern: pattern fine_dots, fore_color white, back_color pale_blue;"
340toggleStyle = xlwt.easyxf(style_string)
341mipPrev=None
342ktog = 0
343jj = 2
344for k in keys:
345  if k not in ['OCMIP6','ENSOMIP']:
346    ktog = 1 - ktog
347    if k in k2:
348      path = '%s%s/%s' % (dir0,k,cfg.ee[k])
349      print path
350      wk1 = wbcp( inbook=path )
351      wk1.focus( u'Experiments')
352      thiswk = wk1
353      stbk = thiswk
354      ##wk0.styleUpdate( wk1 )
355    else:
356      print '##########',k,' USING OLD VERSION #################'
357      thiswk = wk0
358      stbk = None
359    style=0
360    for j  in range(2,thiswk.currentSi.nrows):
361       mip = str(thiswk.currentSi.row(j)[3].value) 
362       e = str(thiswk.currentSi.row(j)[0].value) 
363       thisv = map( lambda x: x.value, thiswk.currentSi.row(j) )
364       if thisv[0] != 'Totals':
365         if mip == k:
366           mcs = matchVals( thisv, mlist[mip] )
367           i = 0
368           for v in thiswk.currentSi.row(j):
369             if i >= len(mcs):
370               style = 0
371             elif not mcs[i]:
372               style = deltaStyle
373             elif i == 0 and not(all(mcs)):
374               style = delta0Style
375             elif ktog == 1:
376               style = toggleStyle
377             else:
378               style = 0
379             wk0.putValue2( jj,i,thiswk.currentSi.row(j)[i].value,sti=i,stj=j,stbk=stbk,style=style )
380             i+=1
381           jj += 1
382         
383wk0.write()
Note: See TracBrowser for help on using the repository browser.