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

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

misc to do with CF tables

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