source: CMIP6dreq/trunk/makeTables.py @ 570

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreq/trunk/makeTables.py@570
Revision 570, 16.2 KB checked in by mjuckes, 4 years ago (diff)

candidate

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', skipped=set()):
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            if (t,v.label) not in skipped:
166              print 'makeTables: skipping %s %s' % (t,v.label)
167              skipped.add( (t,v.label) )
168          else:
169            dims = []
170            dims += string.split( sshp.dimensions, '|' )
171            dims += string.split( tshp.dimensions, '|' )
172            dims += string.split( strc.odims, '|' )
173            dims += string.split( strc.coords, '|' )
174            dims = string.join( dims )
175            if mode == 'c':
176              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)]
177            else:
178              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)]
179            if addMips:
180              thismips = c.chkCmv( v.uid )
181              thismips2 = c.chkCmv( v.uid, byExpt=True )
182              orec.append( string.join( sorted( list( thismips) ),',') )
183              orec.append( string.join( sorted( list( thismips2) ),',') )
184
185            oo.write( string.join(orec, '\t' ) + '\n' )
186            j+=1
187            for i in range(len(orec)):
188              sht.write( j,i, orec[i], cell_format )
189      oo.close()
190    wb.close()
191
192hdr = """
193var getData  = {
194cols: function() {
195  var columns = [ {id:0, name:'Variable', field:0, width: 100},
196              {id:1, name:'Standard name', field:1, width: 210 },
197              {id:2, name:'Long name', field:2, width: 180},
198              {id:3, name:'Units', field:3, width: 180},
199              {id:4, name:'uid', field:4, width: 180}];
200 return columns;
201},
202data: function() {
203var data = [];
204"""
205ftr = """return data;
206}
207};
208"""
209rtmpl = 'data[%(n)s] = { "id":%(n)s, 0:"%(var)s",  1:"%(sn)s", 2:"%(ln)s", 3:"%(u)s", 4:"%(uid)s" };'
210
211class htmlTrees(object):
212  def __init__(self,dq,odir='html/t/'):
213    self.dq = dq
214    self.odir = odir
215    self.c = vrev.checkVar( dq )
216    self.anno = {}
217    for v in dq.coll['var'].items:
218      self.makeTree( v )
219   
220  def makeTree( self, v ):
221    ee = self.c.chk2( v.label )
222    if len(ee.keys()) > 0:
223      title = 'Usage tree for %s' % v.label
224      bdy = ['<h1>%s</h1>' % title, ]
225      bdy.append( '<html><head></head><body>\n' )
226      bdy.append( '<ul>\n' )
227      for k in sorted( ee.keys() ):
228        l1, xx = ee[k]
229        lx = list( xx )
230        if len( lx ) == 0:
231          bdy.append( '<li>%s: Empty</li>\n' % l1 )
232        else:
233          bdy.append( '<li>%s:\n<ul>' % l1 )
234          for x in lx:
235            bdy.append( '<li>%s</li>\n' % x )
236          bdy.append( '</ul></li>\n' )
237      bdy.append( '</ul></body></html>\n' )
238      oo = open( '%s/%s.html' % (self.odir,v.label), 'w' )
239      oo.write( dq.pageTmpl % ( title, '', '../', '../index.html', string.join( bdy, '\n' ) ) )
240      oo.close()
241      self.anno[v.label] = '<a href="../t/%s.html">Usage</a>' % v.label
242    else:
243      self.anno[v.label] = 'Unused'
244       
245
246class makeJs(object):
247  def __init__(self,dq):
248    n = 0
249    rl = []
250    for v in dq.coll['var'].items:
251      var = '%s %s' % (v.label,v.uid)
252      sn = v.sn
253      ln = v.title
254      u = v.units
255      uid = v.uid
256      rr = rtmpl % locals()
257      rl.append( rr )
258      n += 1
259    oo = open( 'data2.js', 'w' )
260    oo.write( hdr )
261    for r in rl:
262      oo.write( r + '\n' )
263    oo.write( ftr )
264    oo.close()
265   
266
267
268class styles(object):
269  def __init__(self):
270    pass
271
272  def rqvLink01(self,targ,frm='',ann=''):
273    if targ._h.label == 'remarks':
274      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to request variable broken"  )
275    elif frm != "CMORvar":
276      cmv = targ._inx.uid[ targ.vid ]
277      if targ._h.label == 'remarks':
278        return '<li>%s [%s]: %s</li>' % ( cmv.label, targ.__href__(odir='../u/',label=targ.priority) , 'Variable not defined or not found'  )
279      else:
280        return '<li>%s [%s]: %s</li>' % ( cmv.label, targ.__href__(odir='../u/',label=targ.priority) , cmv.__href__(odir='../u/',label=cmv.title)  )
281    else:
282      rg = targ._inx.uid[ targ.vgid ]
283      if targ._h.label == 'remarks':
284        return '<li>%s [%s]: %s</li>' % ( targ.label, targ.__href__(label=targ.priority) , 'Link not defined or not found'  )
285      elif rg._h.label == 'remarks':
286        return '<li>%s [%s]: %s</li>' % ( rg.label, targ.__href__(label=targ.priority) , 'Group not defined or not found'  )
287      else:
288        return '<li>%s [%s]: %s</li>' % ( rg.label, targ.__href__(label=targ.priority) , rg.__href__(label=rg.mip)  )
289
290  def snLink01(self,a,targ,frm='',ann=''):
291    if targ._h.label == 'remarks':
292      return '<li>%s: Standard name under review [%s]</li>' % ( a, targ.__href__() )
293    else:
294      return '<li>%s [%s]: %s</li>' % ( targ._h.title, a, targ.__href__(label=targ.label)  )
295
296  def rqlLink02(self,targ,frm='',ann=''):
297    t2 = targ._inx.uid[targ.refid]
298    if t2._h.label == 'remarks':
299      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to variable group broken"  )
300    elif frm == "requestVarGroup":
301      return '<li>%s: %s [%s]</li>' % ( targ.__href__(odir='../u/', label=targ.mip), targ.title, targ.objective  )
302    else:
303      gpsz = len(t2._inx.iref_by_sect[t2.uid].a['requestVar'])
304      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  )
305
306  def snLink(self,targ,frm='',ann=''):
307    return '<li>%s [%s]: %s</li>' % ( targ.title, targ.units, targ.__href__(odir='../u/') )
308
309  def varLink(self,targ,frm='',ann=''):
310    return '<li>%s: %s [%s]%s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title, targ.units, ann )
311
312  def mipLink(self,targ,frm='',ann=''):
313    if targ.url != '':
314      return '<li>%s: %s <a href="%s">[project site]</a></li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title, targ.url )
315    else:
316      return '<li>%s: %s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title )
317
318  def cmvLink(self,targ,frm='',ann=''):
319    return '<li>%s {%s}: %s [%s]</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.mipTable, targ.title, targ.frequency )
320
321  def objLink(self,targ,frm='',ann=''):
322    return '<li>%s: %s</li>' % (  targ.label, targ.__href__(odir='../u/', label=targ.title,title=targ.description) )
323
324  def strLink(self,targ,frm='',ann=''):
325    return '<li>%s: %s</li>' % (  targ.label, targ.__href__(odir='../u/', label=targ.title) )
326
327  def objLnkLink(self,targ,frm='',ann=''):
328    if frm == 'objective':
329      t2 = targ._inx.uid[targ.rid]
330      t3 = targ._inx.uid[t2.refid]
331      thislab = '%s (%s)' % (t2.mip,t3.label)
332      return '<li>%s: %s</li>' % (  t2.title, t2.__href__(odir='../u/',label=thislab) )
333    else:
334      t2 = targ._inx.uid[targ.oid]
335      return '<li>%s: %s</li>' % (  t2.label, t2.__href__(odir='../u/',label=t2.title) )
336
337  def labTtl(self,targ,frm='',ann=''):
338    return '<li>%s: %s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title )
339
340  def vgrpLink(self,targ,frm='',ann=''):
341    gpsz = len(targ._inx.iref_by_sect[targ.uid].a['requestVar'])
342    nlnk = len(targ._inx.iref_by_sect[targ.uid].a['requestLink'])
343    return '<li>%s {%s}: %s variables, %s request links</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.mip, gpsz, nlnk )
344
345styls = styles()
346
347assert 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'
348assert 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'
349assert 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'
350assert os.path.isdir( 'tables' ), 'Before running this script you need to create a "tables" sub-directory, or edit the makeTab class'
351
352htmlStyle = {}
353htmlStyle['CMORvar'] = {'getIrefs':['requestVar']}
354htmlStyle['requestVarGroup'] = {'getIrefs':['requestVar','requestLink']}
355htmlStyle['var'] = {'getIrefs':['CMORvar']}
356htmlStyle['objective'] = {'getIrefs':['objectiveLink']}
357htmlStyle['requestLink'] = {'getIrefs':['objectiveLink','requestItem']}
358htmlStyle['exptgroup'] = {'getIrefs':['__all__']}
359htmlStyle['requestItem'] = {'getIrefs':['__all__']}
360htmlStyle['experiment'] = {'getIrefs':['__all__']}
361htmlStyle['mip'] = {'getIrefs':['__all__']}
362htmlStyle['remarks'] = {'getIrefs':['__all__']}
363htmlStyle['varChoice'] = {'getIrefs':['__all__']}
364htmlStyle['spatialShape'] = {'getIrefs':['__all__']}
365htmlStyle['temporalShape'] = {'getIrefs':['__all__']}
366htmlStyle['structure'] = {'getIrefs':['__all__']}
367htmlStyle['standardname'] = {'getIrefs':['__all__']}
368dq = dreq.loadDreq( htmlStyles=htmlStyle)
369##
370## add special styles to dq object "itemStyle" dictionary.
371##
372
373dq.itemStyles['standardname'] = styls.snLink
374dq.itemStyles['var'] = styls.varLink
375dq.itemStyles['mip'] = styls.mipLink
376dq.itemStyles['CMORvar'] = styls.cmvLink
377dq.itemStyles['objective'] = styls.objLink
378dq.itemStyles['structure'] = styls.strLink
379dq.itemStyles['objectiveLink'] = styls.objLnkLink
380dq.itemStyles['requestVarGroup'] = styls.vgrpLink
381dq.itemStyles['requestLink'] = styls.rqlLink02
382dq.itemStyles['spatialShape'] = styls.labTtl
383dq.coll['var'].items[0].__class__._linkAttrStyle['sn'] = styls.snLink01
384##dq.coll['requestVarGroup'].items[0].__class__._linkAttrStyle['requestVar'] = styls.rqvLink01
385dq.itemStyles['requestVar'] = styls.rqvLink01
386
387if __name__ == "__main__":
388  ht = htmlTrees(dq)
389  dq.makeHtml( annotations={'var':ht.anno} )
390  try:
391    import xlsxwriter
392    mt = makeTab()
393  except:
394    print ('Could not make tables ...')
395    raise
396  mp = makePurl()
397  mj = makeJs( dq )
Note: See TracBrowser for help on using the repository browser.