source: CMIP6dreqbuild/trunk/src/framework/makeTables.py @ 511

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/makeTables.py@511
Revision 511, 14.7 KB checked in by mjuckes, 6 years ago (diff)

misc

Line 
1
2from dreqPy import dreq
3import collections, string, os
4import vrev
5
6class xlsx(object):
7  def __init__(self,fn):
8    self.wb = xlsxwriter.Workbook(fn)
9
10  def newSheet(self,name):
11    self.worksheet = self.wb.add_worksheet(name=name)
12    return self.worksheet
13
14  def close(self):
15    self.wb.close()
16
17#priority       long name       units   comment         questions & notes       output variable name    standard name   unconfirmed or proposed standard name   unformatted units       cell_methods    valid min       valid max       mean absolute min       mean absolute max       positive        type    CMOR dimensions CMOR variable name      realm   frequency       cell_measures   flag_values     flag_meanings
18
19strkeys = [u'procNote', u'uid', u'odims', u'flag_meanings', u'prov', u'title', u'tmid', u'label', u'cell_methods', u'coords', u'cell_measures', u'spid', u'flag_values', u'description']
20
21ntstr = collections.namedtuple( 'ntstr', strkeys )
22
23class cmpd(object):
24  def __init__(self,k):
25    self.k = k
26  def cmp(self,x,y):
27    return cmp( x.__dict__[self.k], y.__dict__[self.k] )
28
29class cmpd2(object):
30  def __init__(self,k1,k2):
31    self.k1 = k1
32    self.k2 = k2
33  def cmp(self,x,y):
34    if x.__dict__[self.k1] == y.__dict__[self.k1]:
35      return cmp( x.__dict__[self.k2], y.__dict__[self.k2] )
36    else:
37      return cmp( x.__dict__[self.k1], y.__dict__[self.k1] )
38
39class cmpdn(object):
40  def __init__(self,kl):
41    self.kl = kl
42  def cmp(self,x,y):
43    for k in self.kl:
44      if x.__dict__[k] != y.__dict__[k]:
45        return cmp( x.__dict__[k], y.__dict__[k] )
46   
47    return cmp( 0,0 )
48
49def cmpAnnex( x, y ):
50  ax = len(x) > 2 and x[:2] == 'em'
51  ay = len(y) > 2 and y[:2] == 'em'
52  bx = len(x) > 5 and x[:5] in ['CMIP5','CORDE','SPECS']
53  by = len(y) > 5 and y[:5] in ['CMIP5','CORDE','SPECS']
54  if ax  == ay and bx == by:
55    return cmp(x,y)
56  elif ax:
57    if by:
58      return cmp(0,1)
59    else:
60      return cmp(1,0)
61  elif ay:
62    if bx:
63      return cmp(1,0)
64    else:
65      return cmp(0,1)
66  elif bx:
67      return cmp(1,0)
68  else:
69    return cmp(0,1)
70
71import re
72
73
74class makePurl(object):
75  def __init__(self):
76    c1 = re.compile( '^[a-zA-Z][a-zA-Z0-9]*$' )
77    mv = dq.coll['var'].items
78    oo = open( 'htmlRewrite.txt', 'w' )
79    for v in mv:
80      if c1.match( v.label ):
81         oo.write( 'RewriteRule ^%s$ http://clipc-services.ceda.ac.uk/dreq/u/%s.html\n' % (v.label,v.uid) )
82      else:
83         print 'Match failed: ', v.label
84    oo.close()
85     
86class makeTab(object):
87  def __init__(self):
88    cmv = dq.coll['CMORvar'].items
89    tables = sorted( list( set( [i.mipTable for i in cmv] ) ), cmp=cmpAnnex )
90
91    addMips = True
92    if addMips:
93      c = vrev.checkVar(dq)
94
95    wb = xlsx( 'tables/test.xlsx' )
96
97
98    hdr_cell_format = wb.wb.add_format({'text_wrap': True, 'font_size': 14, 'font_color':'#0000ff', 'bold':1, 'fg_color':'#aaaacc'})
99    hdr_cell_format.set_text_wrap()
100    cell_format = wb.wb.add_format({'text_wrap': True, 'font_size': 11})
101    cell_format.set_text_wrap()
102
103    mode = 'c'
104    sht = wb.newSheet( 'Notes' )
105    tableNotes = [('MIPs (...)','The last two columns in each row list MIPs associated with each variable. The first column in this pair lists the MIPs which are requesting the variable in one or more experiments. The second column lists the MIPs proposing experiments in which this variable is requested. E.g. If a variable is requested in a DECK experiment by HighResMIP, then HighResMIP appears in the forst column and DECK in the second')]
106    sht.set_row(0,40)
107    sht.write( 0,1, 'Notes on tables', hdr_cell_format )
108    ri = 0
109    sht.set_column(0,0,40)
110    sht.set_column(0,1,200)
111    for t in tableNotes:
112      ri += 1
113      for i in range(2):
114          sht.write( ri,i, t[i], cell_format )
115
116    ncga = 'NetCDF Global Attribute'
117    for t in tables:
118      oo = open( 'tables/test_%s.csv' % t, 'w' )
119      sht = wb.newSheet( t )
120      j = 0
121      if mode == 'c':
122        hrec = ['Priority','Long name', 'units', 'description', 'comment', 'Variable Name', 'CF Standard Name', 'cell_methods', 'positive', 'type', 'dimensions', 'CMOR Name', 'modeling_realm', 'frequency', 'cell_measures', 'prov', 'provNote','rowIndex']
123        hcmt = ['Default priority (generally overridden by settings in "requestVar" record)',ncga,'','','Name of variable in file','','','CMOR directive','','','CMOR name, unique within table','','','','','','','','','']
124        sht.set_column(1,1,40)
125        sht.set_column(1,3,50)
126        sht.set_column(1,4,30)
127        sht.set_column(1,5,50)
128        sht.set_column(1,6,30)
129        sht.set_column(1,9,40)
130        sht.set_column(1,18,40)
131        sht.set_column(1,19,40)
132      else:
133        hrec = ['','Long name', 'units', 'description', '', 'Variable Name', 'CF Standard Name', '','', 'cell_methods', 'valid_min', 'valid_max', 'ok_min_mean_abs', 'ok_max_mean_abs', 'positive', 'type', 'dimensions', 'CMOR name', 'modeling_realm', 'frequency', 'cell_measures', 'flag_values', 'flag_meanings', 'prov', 'provNote','rowIndex']
134      if addMips:
135        hrec.append( 'MIPs (requesting)' )
136        hrec.append( 'MIPs (by experiment)' )
137
138      sht.set_row(0,40)
139      for i in range(len(hrec)):
140          sht.write( j,i, hrec[i], hdr_cell_format )
141          if hcmt[i] != '':
142            sht.write_comment( j,i,hcmt[i])
143      thiscmv =  sorted( [v for v in cmv if v.mipTable == t], cmp=cmpdn(['prov','rowIndex','label']).cmp )
144     
145      for v in thiscmv:
146          cv = dq.inx.uid[ v.vid ]
147          strc = dq.inx.uid[ v.stid ]
148          sshp = dq.inx.uid[ strc.spid ]
149          tshp = dq.inx.uid[ strc.tmid ]
150          ok = all( [i._h.label != 'remarks' for i in [cv,strc,sshp,tshp]] )
151          #[u'shuffle', u'ok_max_mean_abs', u'vid', '_contentInitialised', u'valid_min', u'frequency', u'uid', u'title', u'rowIndex', u'positive', u'stid', u'mipTable', u'label', u'type', u'description', u'deflate_level', u'deflate', u'provNote', u'ok_min_mean_abs', u'modeling_realm', u'prov', u'valid_max']
152
153          if not ok:
154            print 'skipping %s %s' % (t,v.label)
155          else:
156            dims = []
157            dims += string.split( sshp.dimensions, '|' )
158            dims += string.split( tshp.dimensions, '|' )
159            dims += string.split( strc.odims, '|' )
160            dims += string.split( strc.coords, '|' )
161            dims = string.join( dims )
162            if mode == 'c':
163              orec = [str(v.defaultPriority),cv.title, cv.units, cv.description, v.description, cv.label, cv.sn, strc.cell_methods, v.positive, v.type, dims, v.label, v.modeling_realm, v.frequency, strc.cell_measures, v.prov,v.provNote,str(v.rowIndex)]
164            else:
165              orec = ['',cv.title, cv.units, v.description, '', cv.label, cv.sn, '','', strc.cell_methods, v.valid_min, v.valid_max, v.ok_min_mean_abs, v.ok_max_mean_abs, v.positive, v.type, dims, v.label, v.modeling_realm, v.frequency, strc.cell_measures, strc.flag_values, strc.flag_meanings,v.prov,v.provNote,str(v.rowIndex)]
166            if addMips:
167              thismips = c.chkCmv( v.uid )
168              thismips2 = c.chkCmv( v.uid, byExpt=True )
169              orec.append( string.join( sorted( list( thismips) ),',') )
170              orec.append( string.join( sorted( list( thismips2) ),',') )
171
172            oo.write( string.join(orec, '\t' ) + '\n' )
173            j+=1
174            for i in range(len(orec)):
175              sht.write( j,i, orec[i], cell_format )
176      oo.close()
177    wb.close()
178
179hdr = """
180var getData  = {
181cols: function() {
182  var columns = [ {id:0, name:'Variable', field:0, width: 100},
183              {id:1, name:'Standard name', field:1, width: 210 },
184              {id:2, name:'Long name', field:2, width: 180},
185              {id:3, name:'Units', field:3, width: 180},
186              {id:4, name:'uid', field:4, width: 180}];
187 return columns;
188},
189data: function() {
190var data = [];
191"""
192ftr = """return data;
193}
194};
195"""
196rtmpl = 'data[%(n)s] = { "id":%(n)s, 0:"%(var)s",  1:"%(sn)s", 2:"%(ln)s", 3:"%(u)s", 4:"%(uid)s" };'
197
198class htmlTrees(object):
199  def __init__(self,dq,odir='html/t/'):
200    self.dq = dq
201    self.odir = odir
202    self.c = vrev.checkVar( dq )
203    self.anno = {}
204    for v in dq.coll['var'].items:
205      self.makeTree( v )
206   
207  def makeTree( self, v ):
208    ee = self.c.chk2( v.label )
209    if len(ee.keys()) > 0:
210      title = 'Usage tree for %s' % v.label
211      bdy = ['<h1>%s</h1>' % title, ]
212      bdy.append( '<html><head></head><body>\n' )
213      bdy.append( '<ul>\n' )
214      for k in sorted( ee.keys() ):
215        l1, xx = ee[k]
216        lx = list( xx )
217        if len( lx ) == 0:
218          bdy.append( '<li>%s: Empty</li>\n' % l1 )
219        else:
220          bdy.append( '<li>%s:\n<ul>' % l1 )
221          for x in lx:
222            bdy.append( '<li>%s</li>\n' % x )
223          bdy.append( '</ul></li>\n' )
224      bdy.append( '</ul></body></html>\n' )
225      oo = open( '%s/%s.html' % (self.odir,v.label), 'w' )
226      oo.write( dq.pageTmpl % ( title, '', '../', string.join( bdy, '\n' ) ) )
227      oo.close()
228      self.anno[v.label] = '<a href="../t/%s.html">Usage</a>' % v.label
229    else:
230      self.anno[v.label] = 'Unused'
231       
232
233class makeJs(object):
234  def __init__(self,dq):
235    n = 0
236    rl = []
237    for v in dq.coll['var'].items:
238      var = '%s %s' % (v.label,v.uid)
239      sn = v.sn
240      ln = v.title
241      u = v.units
242      uid = v.uid
243      rr = rtmpl % locals()
244      rl.append( rr )
245      n += 1
246    oo = open( 'data2.js', 'w' )
247    oo.write( hdr )
248    for r in rl:
249      oo.write( r + '\n' )
250    oo.write( ftr )
251    oo.close()
252   
253
254
255class styles(object):
256  def __init__(self):
257    pass
258
259  def rqvLink01(self,targ,frm='',ann=''):
260    if targ._h.label == 'remarks':
261      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to request variable broken"  )
262    elif frm != "CMORvar":
263      cmv = targ._inx.uid[ targ.vid ]
264      if targ._h.label == 'remarks':
265        return '<li>%s [%s]: %s</li>' % ( cmv.label, targ.__href__(odir='../u/',label=targ.priority) , 'Variable not defined or not found'  )
266      else:
267        return '<li>%s [%s]: %s</li>' % ( cmv.label, targ.__href__(odir='../u/',label=targ.priority) , cmv.__href__(odir='../u/',label=cmv.title)  )
268    else:
269      rg = targ._inx.uid[ targ.vgid ]
270      if targ._h.label == 'remarks':
271        return '<li>%s [%s]: %s</li>' % ( targ.label, targ.__href__(label=targ.priority) , 'Link not defined or not found'  )
272      elif rg._h.label == 'remarks':
273        return '<li>%s [%s]: %s</li>' % ( rg.label, targ.__href__(label=targ.priority) , 'Group not defined or not found'  )
274      else:
275        return '<li>%s [%s]: %s</li>' % ( rg.label, targ.__href__(label=targ.priority) , rg.__href__(label=rg.mip)  )
276
277  def snLink01(self,a,targ,frm='',ann=''):
278    if targ._h.label == 'remarks':
279      return '<li>%s: Standard name under review [%s]</li>' % ( a, targ.__href__() )
280    else:
281      return '<li>%s [%s]: %s</li>' % ( targ._h.title, a, targ.__href__(label=targ.label)  )
282
283  def rqlLink02(self,targ,frm='',ann=''):
284    t2 = targ._inx.uid[targ.refid]
285    if t2._h.label == 'remarks':
286      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to variable group broken"  )
287    elif frm == "requestVarGroup":
288      return '<li>%s: %s [%s]</li>' % ( targ.__href__(odir='../u/', label=targ.mip), targ.title, targ.objective  )
289    else:
290      gpsz = len(t2._inx.iref_by_sect[t2.uid].a['requestVar'])
291      return '<li>%s: Link to group: %s [%s]</li>' % ( targ.__href__(odir='../u/', label='%s:%s' % (targ.mip,targ.title)), t2.__href__(odir='../u/', label=t2.title), gpsz  )
292
293  def snLink(self,targ,frm='',ann=''):
294    return '<li>%s [%s]: %s</li>' % ( targ.title, targ.units, targ.__href__(odir='../u/') )
295
296  def varLink(self,targ,frm='',ann=''):
297    return '<li>%s: %s [%s]%s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title, targ.units, ann )
298
299  def mipLink(self,targ,frm='',ann=''):
300    if targ.url != '':
301      return '<li>%s: %s <a href="%s">[project site]</a></li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title, targ.url )
302    else:
303      return '<li>%s: %s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title )
304
305  def cmvLink(self,targ,frm='',ann=''):
306    return '<li>%s {%s}: %s [%s]</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.mipTable, targ.title, targ.frequency )
307
308  def labTtl(self,targ,frm='',ann=''):
309    return '<li>%s: %s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title )
310
311  def vgrpLink(self,targ,frm='',ann=''):
312    gpsz = len(targ._inx.iref_by_sect[targ.uid].a['requestVar'])
313    nlnk = len(targ._inx.iref_by_sect[targ.uid].a['requestLink'])
314    return '<li>%s {%s}: %s variables, %s request links</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.mip, gpsz, nlnk )
315
316styls = styles()
317
318assert os.path.isdir( 'html' ), 'Before running this script you need to create "html", "html/index" and "html/u" sub-directories, or edit the call to dq.makeHtml'
319assert os.path.isdir( 'html/u' ), 'Before running this script you need to create "html", "html/index" and "html/u" sub-directories, or edit the call to dq.makeHtml, and refernces to "u" in style lines below'
320assert os.path.isdir( 'html/index' ), 'Before running this script you need to create "html", "html/index" and "html/u" sub-directories, or edit the call to dq.makeHtml, and refernces to "u" in style lines below'
321assert os.path.isdir( 'tables' ), 'Before running this script you need to create a "tables" sub-directory, or edit the makeTab class'
322
323htmlStyle = {}
324htmlStyle['CMORvar'] = {'getIrefs':['requestVar']}
325htmlStyle['requestVarGroup'] = {'getIrefs':['requestVar','requestLink']}
326htmlStyle['var'] = {'getIrefs':['CMORvar']}
327htmlStyle['objective'] = {'getIrefs':['objectiveLink']}
328htmlStyle['requestLink'] = {'getIrefs':['objectiveLink','requestItem']}
329htmlStyle['exptgroup'] = {'getIrefs':['__all__']}
330htmlStyle['requestItem'] = {'getIrefs':['__all__']}
331htmlStyle['experiment'] = {'getIrefs':['__all__']}
332htmlStyle['mip'] = {'getIrefs':['__all__']}
333htmlStyle['remarks'] = {'getIrefs':['__all__']}
334htmlStyle['varChoice'] = {'getIrefs':['__all__']}
335htmlStyle['spatialShape'] = {'getIrefs':['__all__']}
336htmlStyle['structure'] = {'getIrefs':['__all__']}
337htmlStyle['standardname'] = {'getIrefs':['__all__']}
338dq = dreq.loadDreq( htmlStyles=htmlStyle)
339##
340## add special styles to dq object "itemStyle" dictionary.
341##
342
343dq.itemStyles['standardname'] = styls.snLink
344dq.itemStyles['var'] = styls.varLink
345dq.itemStyles['mip'] = styls.mipLink
346dq.itemStyles['CMORvar'] = styls.cmvLink
347dq.itemStyles['requestVarGroup'] = styls.vgrpLink
348dq.itemStyles['requestLink'] = styls.rqlLink02
349dq.itemStyles['spatialShape'] = styls.labTtl
350dq.coll['var'].items[0].__class__._linkAttrStyle['sn'] = styls.snLink01
351##dq.coll['requestVarGroup'].items[0].__class__._linkAttrStyle['requestVar'] = styls.rqvLink01
352dq.itemStyles['requestVar'] = styls.rqvLink01
353
354ht = htmlTrees(dq)
355dq.makeHtml( annotations={'var':ht.anno} )
356try:
357  import xlsxwriter
358  mt = makeTab()
359except:
360  print ('Could not make tables ...')
361mp = makePurl()
362mj = makeJs( dq )
Note: See TracBrowser for help on using the repository browser.