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

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

debugging and code cleaning of overview tables

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