source: CMIP6dreqbuild/trunk/srcMisc/dreq_consol.py @ 382

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

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  def _getOutCell(self, rowIndex, colIndex):
21    """ HACK: Extract the internal xlwt cell representation. """
22    row = self.currentSo._Worksheet__rows.get(rowIndex)
23    if not row: return None
24
25    cell = row._Row__cells.get(colIndex)
26    return cell
27
28  def putValue2(self, row, col, value):
29    """ Change cell value without changing formatting. """
30    # HACK to retain cell style.
31    previousCell = self._getOutCell( row, col)
32    # END HACK, PART I
33
34    self.currentSo.write(row, col, value)
35
36    # HACK, PART II
37    if previousCell:
38        newCell = self._getOutCell( row, col)
39        if newCell:
40            newCell.xf_idx = previousCell.xf_idx
41    # END HACK
42
43  def focus( self, name ):
44    self.currentIndex = self.sns.index(name)
45    if self.currentIndex == -1:
46      self.currentSi = None
47    else:
48      self.currentSi = self.book.sheet_by_name( name )
49      self.currentSo = self.wb.get_sheet( self.currentIndex )
50
51  def putValue(self,i,j,value):
52    ##self.currentSi.write(i,j,value,self.plain)
53    cell_style = self.styles[self.currentSi.cell(i,j)]
54    self.currentSo.write(i,j,value,cell_style)
55
56  def write(self,file='CMIP6DataRequest_ConsolidatedNewVariables.xls'):
57    self.wb.save( file )
58
59class tupsort:
60   def __init__(self,k=0):
61     self.k = k
62   def cmp(self,x,y):
63     return cmp( x[self.k], y[self.k] )
64
65def uniquify( ll ):
66  ll.sort()
67  l0 = [ll[0],]
68  for l in ll[1:]:
69    if l != l0[-1]:
70      l0.append(l)
71  return l0
72
73class workbook(object):
74  def __init__(self,file):
75    assert os.path.isfile(file), 'File %s not found' % file
76    self.book = xlrd.open_workbook( file )
77    self.sns = self.book.sheet_names()
78
79clabs = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
80def clab(n):
81  i = n/26
82  assert i < 26, 'Not ready for row number greater than 26*26'
83  if i == 0:
84    return clabs[n]
85  else:
86    return clabs[i-1] + clabs[ n - i*26]
87
88def getRow(sht,varix=5):
89  ee = {}
90  for i in range(sht.nrows):
91    if sht.row(i)[0].ctype == 2 and str( sht.row(i)[0].value ) != '0.0':
92      l = map( lambda x: str( x.value ), sht.row(i) )
93      ##k = string.replace( l[5], ' ','')
94      k = l[varix]
95      try:
96        ee[k] = l
97      except:
98        print l
99        raise
100  return ee
101   
102snli = snlist( dir='./config/cf/' )
103sn,sna = snli.gen_sn_list()
104esn = {}
105esna = {}
106for s in sn:
107  esn[s] = s
108for s in sna:
109  esna[s] = s
110
111useVdict = False
112if useVdict:
113  vdict = collections.defaultdict( list )
114  for l in open( '../inputsOther/vlsc3.csv' ):
115    v,l,s,c,m = string.split(string.strip(l),'\t')[:5]
116    vdict[v].append(( l,s,c,m))
117
118dir0 = '/home/martin/2014/wip/dreq/input/'
119file = 'PMIP/CMIP6DataRequestCompilationTemplate_20141218_PMIP_v150228_final.xls'
120file = 'C4MIP/CMIP6DataRequestCompilationTemplate_C4MIP_06March2015_submitted.xls'
121
122wk0 = wbcp( )
123cfg = dreq_cfg.rqcfg()
124wk0.focus( u'New variables')
125
126keys = cfg.ee.keys()
127keys.sort()
128
129def outvSer( ov ):
130  ll = []
131  for i in ov:
132    ll.append( '%s|%s|%s' % tuple( map( str, i) ) )
133  return string.join(ll, '; ' )
134 
135
136class cpsh(object):
137  ccmiTabs = { 'Annu':'yr', 'Mont':'mon', 'Dail':'day', 'Time':'fx', 'Hour':'hr' }
138
139  def __init__(self,wk0,mip,path,kk=3,oo=None,mode="cmip6"):
140    self.oo = oo
141    self.nn = 0
142    self.kk = kk
143    self.nnew = 0
144    wk = wbcp( path )
145    wk0.focus( u'New variables')
146    self.wk = wk
147    self.mip = mip
148    self.nvgs = []
149    for s in wk.sns:
150      if (s not in ['ALL VARIABLES', 'Objectives','Experiments','Experiment Groups','Request scoping','New variables','__lists__','notes','Coordinates']) and \
151         (s[:5] != 'CMIP5'):
152        self.nvgs.append(s)
153    self.outv = collections.defaultdict(list)
154## variable name, table, frequency, standard name, time mean/point
155    ixv, ixt, ixf, ixs, ixm = (1,2,3,5,7)
156    if mode == "ccmi":
157      ixv, ixt, ixf, ixs, ixm = (2,0,0,0,0)
158      f = self.ccmiTabs[s[:4]]
159      t = s
160      m = 'mean'
161    for s in self.nvgs:
162      thiss = wk.book.sheet_by_name( s )
163      for k in range(4,thiss.nrows):
164        r = thiss.row(k)
165        v = r[ixv].value
166        s = r[ixs].value
167        if mode != "ccmi":
168          t = r[ixt].value
169          f = r[ixf].value
170          m = r[ixm].value
171        noFilt = False
172        if t[:3] == 'new' or noFilt:
173          self.outv[v].append( (f,s,m) )
174    if u'New variables' not in wk.sns:
175       print '############### no new variables, %s' % self.mip
176       return
177    this = wk.book.sheet_by_name(u'New variables')
178    ee = collections.defaultdict( list )
179    for i in range(3,this.nrows):
180      r = this.row(i)
181      if r[0].value == "**end**":
182        break
183      v = r[0].value
184      ee[v].append(i)
185      self.nnew += 1
186
187    for i in range(3,this.nrows):
188      r = this.row(i)
189      if r[0].value == "**end**":
190        break
191
192      v = r[0].value
193      l = r[4].value
194      novar = v == '' and l == ''
195      omitOld = True
196      omitOld = False
197      omit = False
198      if useVdict:
199        if vdict.has_key(v) and omitOld:
200          omit = True
201      s = r[1].value
202      if s in ['','?']:
203            chk = 0
204      elif esn.has_key(s):
205           chk = 1
206      elif esna.has_key(s):
207            chk = 2
208      else:
209            chk = -1
210      omitWithSn = False
211      if chk in [1,2] and omitWithSn:
212        omit = True
213      if novar:
214        omit = True
215      if v[0:17] == 'Insert additional':
216        print 'Omitting comment line'
217        omit = True
218
219      if not omit:
220        if not novar:
221          wk0.putValue2( self.kk, 0, mip )
222          wk0.putValue2( self.kk, 1, chk )
223          self.nn += 1
224          htmlline = "<td>%s</td>" % mip
225        else:
226          chk = 0
227          htmlline = "<td></td>"
228     
229        j = 3
230        jo = 1
231        wk0.putValue2( self.kk, 3, outvSer( self.outv[v] ) )
232        for x in r:
233          if j == 3:
234            v = x.value
235            v0 = x.value
236            if str(v0) != "":
237              if len(ee[v0]) != 1:
238                 v += '!'
239              if useVdict:
240                if vdict.has_key(v0):
241                   v += '**'
242            wk0.putValue2( self.kk, j+jo, v )
243          else:
244            wk0.putValue2( self.kk, j+jo, x.value )
245          if j in [3,7]:
246            htmlline += "<td>%s</td>\n" % x.value
247          elif j == 4:
248            if chk == -1:
249              htmlline += "<td>?%s?</td>\n" % x.value
250            else:
251              htmlline += "<td>%s</td>\n" % x.value
252          elif j == 8:
253            y = x.value
254          elif j == 9:
255            htmlline += '<td><span title="%s">%s</span></td>\n' % (x.value,y)
256          j += 1
257        self.kk += 1
258        if not novar:
259          htmlline = string.replace( htmlline, u'\u2013', '-' )
260          htmlline = string.replace( htmlline, u'\u2018', "'" )
261          htmlline = string.replace( htmlline, u'\u2019', "'" )
262          htmlline = string.replace( htmlline, u'\u2026', '...' )
263          htmlline = string.replace( htmlline, u'\u25e6', 'o' )
264          htmlline = string.replace( htmlline, u'\xb2', '2' )
265          htmlline = string.replace( htmlline, u'\xb3', '3' )
266          self.oo.write( "<tr>%s</tr>" % str(htmlline) + '\n' )
267
268  def parseRQ(self):
269    if u'Request scoping' not in self.wk.sns:
270       return
271    this = self.wk.book.sheet_by_name(u'Request scoping')
272    for i in range(6,this.nrows):
273      r = this.row(i)
274      mipt = r[0].value
275      s = r[1].value
276      if mipt[:4]  in ['SPEC','CORD', 'CCMI'] and s != 'none':
277        print self.mip,mipt
278
279kk=3
280c1 = """<th>%s</th>
281<th>%s</th>
282<th>%s</th>
283<th>%s</th>
284<th>%s</th>
285<th>%s</th>
286<th>%s</th>
287<th>%s</th>""" % ("MIP","Variable","Standard name","SN status","grid","units","Long name","comments")
288c1 = """<th>%s</th>
289<th>%s</th>
290<th>%s</th>
291<th>%s</th>
292<th>%s</th>""" % ("MIP","Variable","Standard name","units","Long name")
293oo = open( 'table.htmllet', 'w' )
294oo.write( """<table id="example"  class="display" cellspacing="0" width="100%%">
295<thead>
296<tr>
297%s
298</tr>
299</thead>
300<tfoot>
301<tr>
302%s
303</tr>
304</tfoot>
305<tbody>
306""" % (c1,c1)  )
307
308oo1 = open( 'newVarCount.txt', 'w' )
309for k in keys:
310  print k,cfg.ee[k]
311  path = '%s%s/%s' % (dir0,k,cfg.ee[k])
312  if k!= 'AerChemMIP':
313    md = {'AerChemMIP':'ccmi'}.get( k, 'cmip5' )
314    c = cpsh(wk0,k,path,kk=kk,oo=oo,mode=md)
315    print c.nn
316    oo1.write( '%s %s %s\n' % (k,c.nnew,c.nn) )
317    c.parseRQ()
318    kk=c.kk
319oo1.close()
320oo.write( "</tbody>\n</table>\n" )
321oo.close()
322
323wk0.write()
Note: See TracBrowser for help on using the repository browser.