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

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

more updates

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='../inputsOther/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
111vdict = collections.defaultdict( list )
112for l in open( '../inputsOther/vlsc3.csv' ):
113  v,l,s,c,m = string.split(string.strip(l),'\t')[:5]
114  vdict[v].append(( l,s,c,m))
115
116dir0 = '/home/martin/2014/wip/dreq/input/'
117file = 'PMIP/CMIP6DataRequestCompilationTemplate_20141218_PMIP_v150228_final.xls'
118file = 'C4MIP/CMIP6DataRequestCompilationTemplate_C4MIP_06March2015_submitted.xls'
119
120wk0 = wbcp( )
121cfg = dreq_cfg.rqcfg()
122wk0.focus( u'New variables')
123
124keys = cfg.ee.keys()
125keys.sort()
126
127def outvSer( ov ):
128  ll = []
129  for i in ov:
130    ll.append( '%s|%s|%s' % tuple( map( str, i) ) )
131  return string.join(ll, '; ' )
132 
133
134class cpsh(object):
135  ccmiTabs = { 'Annu':'yr', 'Mont':'mon', 'Dail':'day', 'Time':'fx', 'Hour':'hr' }
136
137  def __init__(self,wk0,mip,path,kk=3,oo=None,mode="cmip6"):
138    self.oo = oo
139    self.nn = 0
140    self.kk = kk
141    self.nnew = 0
142    wk = wbcp( path )
143    wk0.focus( u'New variables')
144    self.wk = wk
145    self.mip = mip
146    self.nvgs = []
147    for s in wk.sns:
148      if (s not in ['ALL VARIABLES', 'Objectives','Experiments','Experiment Groups','Request scoping','New variables','__lists__','notes','Coordinates']) and \
149         (s[:5] != 'CMIP5'):
150        self.nvgs.append(s)
151    self.outv = collections.defaultdict(list)
152## variable name, table, frequency, standard name, time mean/point
153    ixv, ixt, ixf, ixs, ixm = (1,2,3,5,7)
154    if mode == "ccmi":
155      ixv, ixt, ixf, ixs, ixm = (2,0,0,0,0)
156      f = self.ccmiTabs[s[:4]]
157      t = s
158      m = 'mean'
159    for s in self.nvgs:
160      thiss = wk.book.sheet_by_name( s )
161      for k in range(4,thiss.nrows):
162        r = thiss.row(k)
163        v = r[ixv].value
164        s = r[ixs].value
165        if mode != "ccmi":
166          t = r[ixt].value
167          f = r[ixf].value
168          m = r[ixm].value
169        noFilt = False
170        if t[:3] == 'new' or noFilt:
171          self.outv[v].append( (f,s,m) )
172    if u'New variables' not in wk.sns:
173       print '############### no new variables, %s' % self.mip
174       return
175    this = wk.book.sheet_by_name(u'New variables')
176    ee = collections.defaultdict( list )
177    for i in range(3,this.nrows):
178      r = this.row(i)
179      if r[0].value == "**end**":
180        break
181      v = r[0].value
182      ee[v].append(i)
183      self.nnew += 1
184
185    for i in range(3,this.nrows):
186      r = this.row(i)
187      if r[0].value == "**end**":
188        break
189
190      v = r[0].value
191      l = r[4].value
192      novar = v == '' and l == ''
193      omitOld = True
194      omitOld = False
195      omit = False
196      if vdict.has_key(v) and omitOld:
197        omit = True
198      s = r[1].value
199      if s in ['','?']:
200            chk = 0
201      elif esn.has_key(s):
202           chk = 1
203      elif esna.has_key(s):
204            chk = 2
205      else:
206            chk = -1
207      omitWithSn = False
208      if chk in [1,2] and omitWithSn:
209        omit = True
210      if novar:
211        omit = True
212      if v[0:17] == 'Insert additional':
213        print 'Omitting comment line'
214        omit = True
215
216      if not omit:
217        if not novar:
218          wk0.putValue2( self.kk, 0, mip )
219          wk0.putValue2( self.kk, 1, chk )
220          self.nn += 1
221          htmlline = "<td>%s</td>" % mip
222        else:
223          chk = 0
224          htmlline = "<td></td>"
225     
226        j = 3
227        jo = 1
228        wk0.putValue2( self.kk, 3, outvSer( self.outv[v] ) )
229        for x in r:
230          if j == 3:
231            v = x.value
232            v0 = x.value
233            if str(v0) != "":
234              if len(ee[v0]) != 1:
235                 v += '!'
236              if vdict.has_key(v0):
237                 v += '**'
238            wk0.putValue2( self.kk, j+jo, v )
239          else:
240            wk0.putValue2( self.kk, j+jo, x.value )
241          if j in [3,7]:
242            htmlline += "<td>%s</td>\n" % x.value
243          elif j == 4:
244            if chk == -1:
245              htmlline += "<td>?%s?</td>\n" % x.value
246            else:
247              htmlline += "<td>%s</td>\n" % x.value
248          elif j == 8:
249            y = x.value
250          elif j == 9:
251            htmlline += '<td><span title="%s">%s</span></td>\n' % (x.value,y)
252          j += 1
253        self.kk += 1
254        if not novar:
255          htmlline = string.replace( htmlline, u'\u2013', '-' )
256          htmlline = string.replace( htmlline, u'\u2018', "'" )
257          htmlline = string.replace( htmlline, u'\u2019', "'" )
258          htmlline = string.replace( htmlline, u'\u2026', '...' )
259          htmlline = string.replace( htmlline, u'\u25e6', 'o' )
260          htmlline = string.replace( htmlline, u'\xb2', '2' )
261          htmlline = string.replace( htmlline, u'\xb3', '3' )
262          self.oo.write( "<tr>%s</tr>" % str(htmlline) + '\n' )
263
264  def parseRQ(self):
265    if u'Request scoping' not in self.wk.sns:
266       return
267    this = self.wk.book.sheet_by_name(u'Request scoping')
268    for i in range(6,this.nrows):
269      r = this.row(i)
270      mipt = r[0].value
271      s = r[1].value
272      if mipt[:4]  in ['SPEC','CORD', 'CCMI'] and s != 'none':
273        print self.mip,mipt
274
275kk=3
276c1 = """<th>%s</th>
277<th>%s</th>
278<th>%s</th>
279<th>%s</th>
280<th>%s</th>
281<th>%s</th>
282<th>%s</th>
283<th>%s</th>""" % ("MIP","Variable","Standard name","SN status","grid","units","Long name","comments")
284c1 = """<th>%s</th>
285<th>%s</th>
286<th>%s</th>
287<th>%s</th>
288<th>%s</th>""" % ("MIP","Variable","Standard name","units","Long name")
289oo = open( 'table.htmllet', 'w' )
290oo.write( """<table id="example"  class="display" cellspacing="0" width="100%%">
291<thead>
292<tr>
293%s
294</tr>
295</thead>
296<tfoot>
297<tr>
298%s
299</tr>
300</tfoot>
301<tbody>
302""" % (c1,c1)  )
303
304oo1 = open( 'newVarCount.txt', 'w' )
305for k in keys:
306  print k,cfg.ee[k]
307  path = '%s%s/%s' % (dir0,k,cfg.ee[k])
308  if k!= 'AerChemMIP':
309    md = {'AerChemMIP':'ccmi'}.get( k, 'cmip5' )
310    c = cpsh(wk0,k,path,kk=kk,oo=oo,mode=md)
311    print c.nn
312    oo1.write( '%s %s %s\n' % (k,c.nnew,c.nn) )
313    c.parseRQ()
314    kk=c.kk
315oo1.close()
316oo.write( "</tbody>\n</table>\n" )
317oo.close()
318
319wk0.write()
Note: See TracBrowser for help on using the repository browser.