source: CMIP6dreqbuild/trunk/src/framework/dreqPy/makeTables.py @ 770

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

Extended overview tables, corrected content

Line 
1
2import collections, string, os, sys
3import volsum
4
5nt__charmeEnable = collections.namedtuple( 'charme', ['id','site'] )
6
7try:
8  import dreq
9  import vrev
10  import misc_utils
11  import rvgExtraTable
12except:
13  import dreqPy.dreq as dreq
14  import dreqPy.vrev as vrev
15  import dreqPy.misc_utils as misc_utils
16  import dreqPy.rvgExtraTable as rvgExtraTable
17
18python2 = True
19if sys.version_info[0] == 3:
20  python2 = False
21  def cmp(x,y):
22    if x == y:
23      return 0
24    elif x > y:
25      return 1
26    else:
27      return -1
28
29if sys.version_info >= (2,7):
30  from functools import cmp_to_key
31  oldpython = False
32else:
33  oldpython = True
34
35try:
36    import xlsxwriter
37except:
38    print ('No xlsxwrite: will not make tables ...')
39
40##NT_txtopts = collections.namedtuple( 'txtopts', ['mode'] )
41
42def setMlab( m ):
43      if type(m) == type(''):
44        if m == '_all_':
45          mlab = 'TOTAL'
46        else:
47          mlab = m
48      else:
49        ll = sorted( list(m) )
50        if len(ll) == 1:
51          mlab = list(m)[0]
52        else:
53          mlab=string.join( [ x[:2].lower() for x in m ], '.' )
54      return mlab
55
56class xlsx(object):
57  def __init__(self,fn,xls=True,txt=False,txtOpts=None):
58    self.xls=xls
59    self.txt=txt
60    self.txtOpts = txtOpts
61    self.mcfgNote = 'Reference Volume (1 deg. atmosphere, 0.5 deg. ocean)'
62    if xls:
63      self.wb = xlsxwriter.Workbook('%s.xlsx' % fn)
64      self.hdr_cell_format = self.wb.add_format({'text_wrap': True, 'font_size': 14, 'font_color':'#0000ff', 'bold':1, 'fg_color':'#aaaacc'})
65      self.hdr_cell_format.set_text_wrap()
66      self.sect_cell_format = self.wb.add_format({'text_wrap': True, 'font_size': 14, 'font_color':'#0000ff', 'bold':1, 'fg_color':'#ccccbb'})
67      self.sect_cell_format.set_text_wrap()
68      self.cell_format = self.wb.add_format({'text_wrap': True, 'font_size': 11})
69      self.cell_format.set_text_wrap()
70
71    if txt:
72      self.oo = open( '%s.csv' % fn, 'w' )
73
74  def header(self,tableNotes,collected):
75    if self.xls:
76      sht = self.newSheet( 'Notes' )
77      sht.write( 0,0, '', self.hdr_cell_format )
78      sht.write( 0,1, 'Notes on tables', self.hdr_cell_format )
79      ri = 0
80      sht.set_column(0,0,30)
81      sht.set_column(1,1,60)
82      self.sht = sht
83      for t in tableNotes:
84        ri += 1
85        for i in range(2):
86          sht.write( ri,i, t[i], self.cell_format )
87
88      if collected != None:
89        ri += 2
90        sht.write( ri, 0, 'Table', self.sect_cell_format )
91        sht.write( ri, 1, self.mcfgNote, self.sect_cell_format )
92        ttl = 0.
93        for k in sorted( collected.keys() ):
94          ri += 1
95          sht.write( ri, 0, k )
96          sht.write( ri, 1, vfmt( collected[k]*2. ) )
97          ttl += collected[k]
98
99        ri += 1
100        sht.write( ri, 0, 'TOTAL' )
101        sht.write( ri, 1, vfmt( ttl*2. ) )
102
103    if self.txt:
104      self.oo.write( string.join( ['Notes','','Notes on tables'], '\t') + '\n' )
105      for t in tableNotes:
106        self.oo.write( string.join( ['Notes',] + list(t), '\t') + '\n' )
107
108      if collected != None:
109        self.oo.write( string.join( ['Notes','Table','Reference Volume (1 deg. atmosphere, 0.5 deg. ocean)'], '\t') + '\n')
110        for k in sorted( collected.keys() ):
111          self.oo.write( string.join( ['Notes',k,vfmt( collected[k]*2. )], '\t') + '\n' )
112
113  def cmvtabrec(self,j,t,orec):
114     if self.xls:
115        for i in range(len(orec)):
116           self.sht.write( j,i, orec[i], self.cell_format )
117
118     if self.txt:
119        self.oo.write( string.join( [t,] + orec, '\t') + '\n' )
120
121  def varrec(self,j,orec):
122     if self.xls:
123        for i in range(len(orec)):
124           self.sht.write( j,i, orec[i], self.cell_format )
125
126     if self.txt:
127        self.oo.write( string.join( orec, '\t') + '\n' )
128
129  def var(self):
130      if self.xls:
131        self.sht = self.newSheet( 'var' )
132      j = 0
133      hrec = ['Long name', 'units', 'description', 'Variable Name', 'CF Standard Name' ]
134      if self.xls:
135          self.sht.set_column(1,1,40)
136          self.sht.set_column(1,2,30)
137          self.sht.set_column(1,3,60)
138          self.sht.set_column(1,4,40)
139          self.sht.set_column(1,5,40)
140
141      if self.xls:
142        for i in range(len(hrec)):
143          self.sht.write( j,i, hrec[i], self.hdr_cell_format )
144
145      if self.txt:
146        for i in range(len(hrec)):
147          self.oo.write( hrec[i] + '\t' )
148        self.oo.write( '\n' )
149
150  def cmvtab(self,t,addMips,mode='c'):
151      if self.xls:
152        self.sht = self.newSheet( t )
153      j = 0
154      ncga = 'NetCDF Global Attribute'
155      if mode == 'c':
156        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','UID','vid','stid','Structure Title']
157        hcmt = ['Default priority (generally overridden by settings in "requestVar" record)',ncga,'','','Name of variable in file','','','CMOR directive','','','CMOR name, unique within table','','','','','','','','','','CMOR variable identifier','MIP variable identifier','Structure identifier','']
158        if self.xls:
159          self.sht.set_column(1,1,40)
160          self.sht.set_column(1,3,50)
161          self.sht.set_column(1,4,30)
162          self.sht.set_column(1,5,50)
163          self.sht.set_column(1,6,30)
164          self.sht.set_column(1,9,40)
165          self.sht.set_column(1,18,40)
166          self.sht.set_column(1,19,40)
167      else:
168        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','UID']
169
170      if addMips:
171        hrec.append( 'MIPs (requesting)' )
172        hrec.append( 'MIPs (by experiment)' )
173
174      if self.xls:
175        for i in range(len(hrec)):
176          self.sht.write( j,i, hrec[i], self.hdr_cell_format )
177          if hcmt[i] != '':
178            self.sht.write_comment( j,i,hcmt[i])
179
180      if self.txt:
181        self.oo.write( 'MIP table\t' )
182        for i in range(len(hrec)):
183          self.oo.write( hrec[i] + '\t' )
184        self.oo.write( '\n' )
185        self.oo.write( t + '\t' )
186        for i in range(len(hrec)):
187          if hcmt[i] != '':
188            self.oo.write( hcmt[i] + '\t')
189          else:
190            self.oo.write( '\t')
191        self.oo.write( '\n' )
192
193  def newSheet(self,name):
194    self.worksheet = self.wb.add_worksheet(name=name)
195    return self.worksheet
196
197  def close(self):
198    if self.xls:
199      self.wb.close()
200    if self.txt:
201      self.oo.close()
202
203def vfmt( x ):
204            if x < 1.e9:
205              s = '%sM' % int( x*1.e-6 )
206            elif x < 1.e12:
207              s = '%sG' % int( x*1.e-9 )
208            elif x < 1.e13:
209              s = '%3.1fT' % ( x*1.e-12 )
210            elif x < 1.e15:
211              s = '%3iT' % int( x*1.e-12 )
212            elif x < 1.e18:
213              s = '%3iP' % int( x*1.e-15 )
214            else:
215              s = '{:,.2f}'.format( x*1.e-9 )
216            return s
217
218#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
219
220strkeys = [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']
221
222ntstr = collections.namedtuple( 'ntstr', strkeys )
223
224class cmpd(object):
225  def __init__(self,k):
226    self.k = k
227  def cmp(self,x,y):
228    return cmp( x.__dict__[self.k], y.__dict__[self.k] )
229
230class cmpd2(object):
231  def __init__(self,k1,k2):
232    self.k1 = k1
233    self.k2 = k2
234  def cmp(self,x,y):
235    if x.__dict__[self.k1] == y.__dict__[self.k1]:
236      return cmp( x.__dict__[self.k2], y.__dict__[self.k2] )
237    else:
238      return cmp( x.__dict__[self.k1], y.__dict__[self.k1] )
239
240class cmpdn(object):
241  def __init__(self,kl):
242    self.kl = kl
243  def cmp(self,x,y):
244    for k in self.kl:
245      if x.__dict__[k] != y.__dict__[k]:
246        return cmp( x.__dict__[k], y.__dict__[k] )
247   
248    return cmp( 0,0 )
249
250def cmpAnnex( x, y ):
251  ax = len(x) > 2 and x[:2] == 'em'
252  ay = len(y) > 2 and y[:2] == 'em'
253  bx = len(x) > 5 and x[:5] in ['CMIP5','CORDE','SPECS']
254  by = len(y) > 5 and y[:5] in ['CMIP5','CORDE','SPECS']
255  if ax  == ay and bx == by:
256    return cmp(x,y)
257  elif ax:
258    if by:
259      return cmp(0,1)
260    else:
261      return cmp(1,0)
262  elif ay:
263    if bx:
264      return cmp(1,0)
265    else:
266      return cmp(0,1)
267  elif bx:
268      return cmp(1,0)
269  else:
270    return cmp(0,1)
271
272
273if not oldpython:
274  kAnnex = cmp_to_key( cmpAnnex )
275
276import re
277
278class makePurl(object):
279  def __init__(self):
280    c1 = re.compile( '^[a-zA-Z][a-zA-Z0-9]*$' )
281    mv = dq.coll['var'].items
282    oo = open( 'htmlRewrite.txt', 'w' )
283    for v in mv:
284      if c1.match( v.label ):
285         oo.write( 'RewriteRule ^%s$ http://clipc-services.ceda.ac.uk/dreq/u/%s.html\n' % (v.label,v.uid) )
286      else:
287         print ('Match failed: %s' % v.label )
288    oo.close()
289     
290class makeTab(object):
291  def __init__(self, dq, subset=None, mcfgNote=None, dest='tables/test', skipped=set(), collected=None,xls=True,txt=False,txtOpts=None):
292    """txtOpts: gives option to list MIP variables instead of CMOR variables"""
293    if subset != None:
294      cmv = [x for x in dq.coll['CMORvar'].items if x.uid in subset]
295    else:
296      cmv = dq.coll['CMORvar'].items
297
298    if oldpython:
299      tables = sorted( list( set( [i.mipTable for i in cmv] ) ), cmp=cmpAnnex )
300    else:
301      tables = sorted( list( set( [i.mipTable for i in cmv] ) ), key=kAnnex )
302
303    addMips = True
304    if addMips:
305      c = vrev.checkVar(dq)
306    mode = 'c'
307    tableNotes = [
308       ('Request Version',str(dq.version)),
309       ('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 first column and DECK in the second')]
310
311    wb = xlsx( dest, xls=xls, txt=txt )
312    if mcfgNote != None:
313      wb.mcfgNote = mcfgNote
314    wb.header( tableNotes, collected)
315
316    if txtOpts != None and txtOpts.mode == 'var':
317      vl =  list( set( [v.vid for v in cmv] )  )
318      vli = [dq.inx.uid[i] for i in vl]
319      thisvli =  sorted( vli, cmp=cmpdn(['sn','label']).cmp )
320      wb.var()
321     
322      j = 0
323      for v in thisvli:
324      ###hrec = ['Long name', 'units', 'description', 'Variable Name', 'CF Standard Name' ]
325         orec = [v.title, v.units, v.description, v.label, v.sn]
326         j += 1
327         wb.varrec( j,orec )
328    else:
329      withoo = False
330      for t in tables:
331        if withoo:
332          oo = open( 'tables/test_%s.csv' % t, 'w' )
333        wb.cmvtab(t,addMips,mode='c')
334
335        j = 0
336        thiscmv =  sorted( [v for v in cmv if v.mipTable == t], cmp=cmpdn(['prov','rowIndex','label']).cmp )
337
338        for v in thiscmv:
339          cv = dq.inx.uid[ v.vid ]
340          strc = dq.inx.uid[ v.stid ]
341          if strc._h.label == 'remarks':
342            print ( 'ERROR: structure not found for %s: %s .. %s (%s)' % (v.uid,v.label,v.title,v.mipTable) )
343            ok = False
344          else:
345            sshp = dq.inx.uid[ strc.spid ]
346            tshp = dq.inx.uid[ strc.tmid ]
347            ok = all( [i._h.label != 'remarks' for i in [cv,strc,sshp,tshp]] )
348          #[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']
349
350          if not ok:
351            if (t,v.label) not in skipped:
352              ml = []
353              for i in range(4):
354                 ii = [cv,strc,sshp,tshp][i]
355                 if ii._h.label == 'remarks':
356                   ml.append( ['var','struct','time','spatial'][i] )
357              print ( 'makeTables: skipping %s %s: %s' % (t,v.label,string.join( ml, ',')) )
358              skipped.add( (t,v.label) )
359          else:
360            dims = []
361            dims += string.split( sshp.dimensions, '|' )
362            dims += string.split( tshp.dimensions, '|' )
363            dims += string.split( strc.odims, '|' )
364            dims += string.split( strc.coords, '|' )
365            dims = string.join( dims )
366            if mode == 'c':
367              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),v.uid,v.vid,v.stid,strc.title]
368            else:
369              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),cv.uid]
370            if addMips:
371              thismips = c.chkCmv( v.uid )
372              thismips2 = c.chkCmv( v.uid, byExpt=True )
373              orec.append( string.join( sorted( list( thismips) ),',') )
374              orec.append( string.join( sorted( list( thismips2) ),',') )
375
376            if withoo:
377              oo.write( string.join(orec, '\t' ) + '\n' )
378            j+=1
379            wb.cmvtabrec( j,t,orec )
380
381        if withoo:
382          oo.close()
383    wb.close()
384
385hdr = """
386function f000(value) { return (value + "").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;") };
387
388function formatter00(row, cell, value, columnDef, dataContext) {
389        var vv = value.split(" ");
390        return '<b><a href="u/' + vv[1] + '.html">' + (vv[0] + " ").replace(/&/g,"&amp;") + '</a></b>, ';
391    };
392function formatter01(row, cell, value, columnDef, dataContext) { return '<i>' + f000(value) + '</i> ' };
393function formatter02(row, cell, value, columnDef, dataContext) { return '[' + f000(value) + '] ' };
394function formatter03(row, cell, value, columnDef, dataContext) { if (value != "'unset'"  ) { return '(' + f000(value) + ') ' } else {return ''} };
395function formatter04(row, cell, value, columnDef, dataContext) { return '{' + f000(value) + '} ' };
396function formatter05(row, cell, value, columnDef, dataContext) { return '&lt;' + f000(value) + '&gt; ' };
397
398var getData  = {
399cols: function() {
400  var columns = [ {id:0, name:'Variable', field:0, width: 100, formatter:formatter00 },
401              {id:1, name:'Standard name', field:1, width: 210, formatter:formatter01 },
402              {id:2, name:'Long name', field:2, width: 180, formatter:formatter02},
403              {id:3, name:'Units', field:3, width: 180, formatter:formatter03},
404              {id:4, name:'Description', field:4, width: 180, formatter:formatter04},
405              {id:5, name:'uid', field:5, width: 180, formatter:formatter05}];
406 return columns;
407},
408
409data: function() {
410var data = [];
411"""
412ftr = """return data;
413}
414};
415"""
416##rtmpl = 'data[%(n)s] = { "id":%(n)s, 0:"%(var)s",  1:"%(sn)s", 2:"%(ln)s", 3:"%(u)s", 4:"%(uid)s" };'
417rtmpl = 'data[%(n)s] = { "id":%(n)s, 0:"%(var)s",  1:"%(sn)s", 2:"%(ln)s", 3:"%(u)s", 4:"%(d)s", 5:"%(uid)s" };'
418
419class htmlTrees(object):
420  def __init__(self,dq,odir='html/t/'):
421    self.dq = dq
422    self.odir = odir
423    self.c = vrev.checkVar( dq )
424    self.anno = {}
425    for v in dq.coll['var'].items:
426      self.makeTree( v )
427   
428  def makeTree( self, v ):
429    ee = self.c.chk2( v.label )
430    if len(ee.keys()) > 0:
431      title = 'Usage tree for %s' % v.label
432      bdy = ['<h1>%s</h1>' % title, ]
433      bdy.append( '<html><head></head><body>\n' )
434      bdy.append( '<ul>\n' )
435      for k in sorted( ee.keys() ):
436        l1, xx = ee[k]
437        lx = list( xx )
438        if len( lx ) == 0:
439          bdy.append( '<li>%s: Empty</li>\n' % l1 )
440        else:
441          bdy.append( '<li>%s:\n<ul>' % l1 )
442          for x in lx:
443            bdy.append( '<li>%s</li>\n' % x )
444          bdy.append( '</ul></li>\n' )
445      bdy.append( '</ul></body></html>\n' )
446      oo = open( '%s/%s.html' % (self.odir,v.label), 'w' )
447      oo.write( dq.pageTmpl % ( title, '', '../', '../index.html', string.join( bdy, '\n' ) ) )
448      oo.close()
449      self.anno[v.label] = '<a href="../t/%s.html">Usage</a>' % v.label
450    else:
451      self.anno[v.label] = 'Unused'
452       
453
454class makeJs(object):
455  def __init__(self,dq):
456    n = 0
457    rl = []
458    for v in dq.coll['var'].items:
459      if 'CMORvar' in dq.inx.iref_by_sect[v.uid].a and len(dq.inx.iref_by_sect[v.uid].a['CMORvar'] ) > 0:
460        var = '%s %s' % (v.label,v.uid)
461        sn = v.sn
462        ln = v.title
463        u = v.units
464        d = v.description
465        uid = v.uid
466        d = locals()
467        for k in ['sn','ln','u','var','d']:
468   
469          if string.find( d[k], '"' ) != -1:
470            print ( "WARNING ... quote in %s .. %s [%s]" % (k,var,d[k]) )
471            d[k] = string.replace( d[k], '"', "'" )
472            print ( d[k] )
473       
474        rr = rtmpl % d
475        rl.append( rr )
476        n += 1
477    oo = open( 'data3.js', 'w' )
478    oo.write( hdr )
479    for r in rl:
480      oo.write( r + '\n' )
481    oo.write( ftr )
482    oo.close()
483   
484
485
486class styles(object):
487  def __init__(self):
488    pass
489
490  def rqvLink01(self,targ,frm='',ann=''):
491    if targ._h.label == 'remarks':
492      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to request variable broken"  )
493    elif frm != "CMORvar":
494      cmv = targ._inx.uid[ targ.vid ]
495      if targ._h.label == 'remarks':
496        return '<li>%s [%s]: %s</li>' % ( cmv.label, targ.__href__(odir='../u/',label=targ.priority) , 'Variable not defined or not found'  )
497      else:
498        return '<li>%s [%s]: %s</li>' % ( cmv.label, targ.__href__(odir='../u/',label=targ.priority) , cmv.__href__(odir='../u/',label=cmv.title)  )
499    else:
500      rg = targ._inx.uid[ targ.vgid ]
501      if targ._h.label == 'remarks':
502        return '<li>%s [%s]: %s</li>' % ( targ.label, targ.__href__(label=targ.priority) , 'Link not defined or not found'  )
503      elif rg._h.label == 'remarks':
504        return '<li>%s [%s]: %s</li>' % ( rg.label, targ.__href__(label=targ.priority) , 'Group not defined or not found'  )
505      else:
506        return '<li>%s [%s]: %s</li>' % ( rg.label, targ.__href__(label=targ.priority) , rg.__href__(label=rg.mip)  )
507
508  def snLink01(self,a,targ,frm='',ann=''):
509    if targ._h.label == 'remarks':
510      return '<li>%s: Standard name under review [%s]</li>' % ( a, targ.__href__() )
511    else:
512      return '<li>%s [%s]: %s</li>' % ( targ._h.title, a, targ.__href__(label=targ.label)  )
513
514  def stidLink01(self,a,targ,frm='',ann=''):
515    if targ._h.label == 'remarks':
516      return '<li>%s: Broken link to structure  [%s]</li>' % ( a, targ.__href__() )
517    else:
518      return '<li>%s [%s]: %s [%s]</li>' % ( targ._h.title, a, targ.__href__(label=targ.title), targ.label  )
519
520  def rqlLink02(self,targ,frm='',ann=''):
521    t2 = targ._inx.uid[targ.refid]
522    if t2._h.label == 'remarks':
523      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to variable group broken"  )
524    elif frm == "requestVarGroup":
525      return '<li>%s: %s [%s]</li>' % ( targ.__href__(odir='../u/', label=targ.mip), targ.title, targ.objective  )
526    else:
527      gpsz = len(t2._inx.iref_by_sect[t2.uid].a['requestVar'])
528      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  )
529
530  def rqiLink02(self,targ,frm='',ann=''):
531    t2 = targ._inx.uid[targ.rlid]
532    if t2._h.label == 'remarks':
533      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to request link broken"  )
534    else:
535      t3 = t2._inx.uid[t2.refid]
536      if t3._h.label == 'remarks':
537        return '<li>%s [%s]: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), t2.__href__(odir='../u/', label=t2.title),"Link to request group broken"  )
538      else:
539        nv = len( t3._inx.iref_by_sect[t3.uid].a['requestVar'] )
540        return '<li>%s [%s]: %s (%s variables)</li>' % ( targ.__href__(odir='../u/', label=targ.title), t2.__href__(odir='../u/', label=t2.title), t3.__href__(odir='../u/', label=t3.title), nv )
541
542  def snLink(self,targ,frm='',ann=''):
543    return '<li>%s [%s]: %s</li>' % ( targ.title, targ.units, targ.__href__(odir='../u/') )
544
545  def varLink(self,targ,frm='',ann=''):
546    return '<li>%s: %s [%s]%s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title, targ.units, ann )
547
548  def mipLink(self,targ,frm='',ann=''):
549    if targ.url != '':
550      return '<li>%s: %s <a href="%s">[project site]</a></li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title, targ.url )
551    else:
552      return '<li>%s: %s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title )
553
554  def cmvLink(self,targ,frm='',ann=''):
555    t2 = targ._inx.uid[targ.stid]
556    if 'requestVar' in targ._inx.iref_by_sect[targ.uid].a:
557      nrq = len( targ._inx.iref_by_sect[targ.uid].a['requestVar'] )
558    else:
559      nrq = 'unused'
560    return '<li>%s {%s}: %s [%s: %s] (%s)</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.mipTable, targ.title, targ.frequency, t2.title, nrq )
561
562  def objLink(self,targ,frm='',ann=''):
563    return '<li>%s: %s</li>' % (  targ.label, targ.__href__(odir='../u/', label=targ.title,title=targ.description) )
564
565  def unitLink(self,targ,frm='',ann=''):
566    return '<li>%s [%s]: %s</li>' % (  targ.text, targ.label, targ.__href__(odir='../u/', label=targ.title) )
567
568  def strLink(self,targ,frm='',ann=''):
569    return '<li>%s: %s</li>' % (  targ.label, targ.__href__(odir='../u/', label=targ.title) )
570
571  def cmLink(self,targ,frm='',ann=''):
572    return '<li>%s [%s]: %s</li>' % (  targ.cell_methods,targ.label, targ.__href__(odir='../u/', label=targ.title) )
573
574  def objLnkLink(self,targ,frm='',ann=''):
575    if frm == 'objective':
576      t2 = targ._inx.uid[targ.rid]
577      t3 = targ._inx.uid[t2.refid]
578      thislab = '%s (%s)' % (t2.mip,t3.label)
579      return '<li>%s: %s</li>' % (  t2.title, t2.__href__(odir='../u/',label=thislab) )
580    else:
581      t2 = targ._inx.uid[targ.oid]
582      return '<li>%s: %s</li>' % (  t2.label, t2.__href__(odir='../u/',label=t2.title) )
583
584  def labTtl(self,targ,frm='',ann=''):
585    return '<li>%s: %s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title )
586
587  def vgrpLink(self,targ,frm='',ann=''):
588    gpsz = len(targ._inx.iref_by_sect[targ.uid].a['requestVar'])
589    nlnk = len(targ._inx.iref_by_sect[targ.uid].a['requestLink'])
590    return '<li>%s {%s}: %s variables, %s request links</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.mip, gpsz, nlnk )
591
592class tables(object):
593  def __init__(self,sc, odir='xls',xls=True,txt=False,txtOpts=None):
594      self.sc = sc
595      self.dq = sc.dq
596      ##self.mips = mips
597      self.odir = odir
598      self.accReset()
599      self.doXls = xls
600      self.doTxt = txt
601      self.txtOpts = txtOpts
602      self.odir = 'vs-xls'
603
604  def accReset(self):
605    self.acc = [0.,collections.defaultdict(int),collections.defaultdict( float ) ]
606
607  def accAdd(self,x):
608    self.acc[0] += x[0]
609    for k in x[2]:
610       self.acc[2][k] += x[2][k]
611
612
613  def getTable(self,m,m2,pmax,odsz,npy):
614     vs = volsum.vsum( self.sc, odsz, npy )
615     mlab = setMlab( m )
616     vs.run( m, 'requestVol_%s_%s_%s' % (mlab,self.sc.tierMax,pmax), pmax=pmax )
617
618
619## collected=summed volumes by table for first page.
620     makeTab( self.sc.dq, subset=vs.thiscmvset, dest='%s/%s-%s_%s_%s' % (self.odir,mlab,mlab2,self.sc.tierMax,pmax), collected=collector[kkc].a,
621              mcfgNote=self.sc.mcfgNote,
622              txt=self.doTxt, xls=self.doXls, txtOpts=self.txtOpts )
623  def doTable(self,m,l1,m2,pmax,collector,acc=True, mlab=None,exptids=None,cc=None):
624      """*acc* allows accumulation of values to be switched off when called in single expt mode"""
625     
626      self.verbose = False
627      if mlab == None:
628        mlab = setMlab( m )
629
630      cc0 = misc_utils.getExptSum( self.dq, mlab, l1 )
631      ks = sorted( list( cc0.keys() ) )
632      if self.verbose:
633        print ('Experiment summary: %s %s' % (mlab,string.join( ['%s: %s' % (k,len(cc0[k])) for k in ks], ', ' ) ) )
634
635      if m2 in [None, 'TOTAL']:
636        x = self.acc
637      else:
638        x = self.sc.volByExpt( l1, m2, pmax=pmax )
639
640##self.volByExpt( l1, e, pmax=pmax, cc=cc, retainRedundantRank=retainRedundantRank, intersection=intersection, adsCount=adsCount )
641        v0 = self.sc.volByMip( m, pmax=pmax,  exptid=m2 )
642####
643        if cc==None:
644          cc = collections.defaultdict( int )
645        for e in self.sc.volByE:
646          if self.verbose:
647             print ('INFO.mlab.... %s: %s: %s' % ( mlab, e, len( self.sc.volByE[e][2] ) ) )
648          for v in self.sc.volByE[e][2]:
649             cc[v] += self.sc.volByE[e][2][v]
650        xxx = 0
651        for v in cc:
652          xxx += cc[v]
653####
654        if acc:
655          for e in self.sc.volByE:
656            self.accAdd(self.sc.volByE[e])
657
658      if m2 not in [ None, 'TOTAL']:
659          im2 = self.dq.inx.uid[m2]
660          ismip = im2._h.label == 'mip'
661          mlab2 = im2.label
662
663          x0 = 0
664          for e in self.sc.volByE:
665            if exptids == None or e in exptids:
666              x = self.sc.volByE[e]
667              if x[0] > 0:
668                collector[mlab].a[mlab2] += x[0]
669                x0 += x[0]
670      else:
671          ismip = False
672          mlab2 = 'TOTAL'
673          x0 = x[0]
674
675      if mlab2 == 'TOTAL' and x0 == 0:
676        print ( 'no data detected for %s' % mlab )
677
678      if x0 > 0:
679#
680# create sum for each table
681#
682        xs = 0
683        kkc = '_%s_%s' % (mlab,mlab2)
684        kkct = '_%s_%s' % (mlab,'TOTAL')
685        if m2 in [None, 'TOTAL']:
686          x = self.acc
687          x2 = set(x[2].keys() )
688          for k in x[2].keys():
689           i = self.dq.inx.uid[k]
690           xxx =  x[2][k]
691           xs += xxx
692        else:
693          x2 = set()
694          for e in self.sc.volByE:
695            if exptids == None or e in exptids:
696              x = self.sc.volByE[e]
697              x2 = x2.union( set( x[2].keys() ) )
698              for k in x[2].keys():
699               i = self.dq.inx.uid[k]
700               xxx =  x[2][k]
701               xs += xxx
702               if xxx > 0:
703                collector[kkc].a[i.mipTable] += xxx
704                if ismip:
705                  collector[kkct].a[i.mipTable] += xxx
706
707##
708## One user was getting false error message here, with ('%s' % x0) == ('%s' % xs)
709##
710        if abs(x0 -xs) > 1.e-8*( abs(x0) + abs(xs) ):
711          print ( 'ERROR.0088: consistency problem %s  %s %s %s' % (m,m2,x0,xs) )
712        if x0 == 0:
713          print ( 'Zero size: %s, %s' % (m,m2) )
714          if len( x[2].keys() ) > 0:
715             print ( 'ERROR:zero: %s, %s: %s' % (m,m2,str(x[2].keys()) ) )
716
717        if acc and m2 not in [ None, 'TOTAL']:
718          collector[mlab].a['TOTAL'] += x0
719
720        dd = collections.defaultdict( list )
721        lll = set()
722        for v in x2:
723          vi = self.sc.dq.inx.uid[v]
724          if vi._h.label != 'remarks':
725            f,t,l,tt,d,u = (vi.frequency,vi.mipTable,vi.label,vi.title,vi.description,vi.uid)
726            lll.add(u)
727            dd[t].append( (f,t,l,tt,d,u) )
728
729        if len( dd.keys() ) > 0:
730          collector[mlab].dd[mlab2] = dd
731          if m2 not in [ None, 'TOTAL']:
732            if im2._h.label == 'experiment':
733              dothis = self.sc.tierMax >= min( im2.tier )
734###
735### BUT ... there is a treset in the request item .... it may be that some variables are excluded ...
736###         need the variable list itself .....
737###
738          makeTab( self.sc.dq, subset=lll, dest='%s/%s-%s_%s_%s' % (self.odir,mlab,mlab2,self.sc.tierMax,pmax), collected=collector[kkc].a,
739              mcfgNote=self.sc.mcfgNote,
740              txt=self.doTxt, xls=self.doXls, txtOpts=self.txtOpts )
741
742styls = styles()
743
744htmlStyle = {}
745htmlStyle['CMORvar'] = {'getIrefs':['__all__']}
746htmlStyle['requestVarGroup'] = {'getIrefs':['requestVar','requestLink']}
747htmlStyle['var'] = {'getIrefs':['CMORvar']}
748htmlStyle['objective'] = {'getIrefs':['objectiveLink']}
749htmlStyle['requestLink'] = {'getIrefs':['objectiveLink','requestItem']}
750htmlStyle['exptgroup'] = {'getIrefs':['__all__']}
751htmlStyle['requestItem'] = {'getIrefs':['__all__']}
752htmlStyle['experiment'] = {'getIrefs':['__all__']}
753htmlStyle['mip'] = {'getIrefs':['__all__']}
754htmlStyle['miptable'] = {'getIrefs':['__all__']}
755htmlStyle['remarks'] = {'getIrefs':['__all__']}
756htmlStyle['grids'] = {'getIrefs':['__all__']}
757htmlStyle['varChoice'] = {'getIrefs':['__all__']}
758htmlStyle['spatialShape'] = {'getIrefs':['__all__']}
759htmlStyle['temporalShape'] = {'getIrefs':['__all__']}
760htmlStyle['structure']    = {'getIrefs':['__all__']}
761htmlStyle['cellMethods']  = {'getIrefs':['__all__']}
762htmlStyle['standardname'] = {'getIrefs':['__all__']}
763htmlStyle['varRelations'] = {'getIrefs':['__all__']}
764htmlStyle['varRelLnk']    = {'getIrefs':['__all__']}
765htmlStyle['units']        = {'getIrefs':['__all__']}
766htmlStyle['timeSlice']    = {'getIrefs':['__all__']}
767
768if __name__ == "__main__":
769  assert 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'
770  assert 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'
771  assert 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'
772  assert os.path.isdir( 'tables' ), 'Before running this script you need to create a "tables" sub-directory, or edit the makeTab class'
773
774  dq = dreq.loadDreq( htmlStyles=htmlStyle, manifest='out/dreqManifest.txt' )
775##
776## add special styles to dq object "itemStyle" dictionary.
777##
778
779  dq.itemStyles['standardname'] = styls.snLink
780  dq.itemStyles['var'] = styls.varLink
781  dq.itemStyles['mip'] = styls.mipLink
782  dq.itemStyles['CMORvar'] = styls.cmvLink
783  dq.itemStyles['objective'] = styls.objLink
784  dq.itemStyles['units'] = styls.unitLink
785  dq.itemStyles['structure'] = styls.strLink
786  dq.itemStyles['cellMethods'] = styls.cmLink
787  dq.itemStyles['objectiveLink'] = styls.objLnkLink
788  dq.itemStyles['requestVarGroup'] = styls.vgrpLink
789  dq.itemStyles['requestLink'] = styls.rqlLink02
790  dq.itemStyles['requestItem'] = styls.rqiLink02
791  dq.itemStyles['spatialShape'] = styls.labTtl
792  dq.coll['var'].items[0].__class__._linkAttrStyle['sn'] = styls.snLink01
793  dq.coll['CMORvar'].items[0].__class__._linkAttrStyle['stid'] = styls.stidLink01
794##dq.coll['requestVarGroup'].items[0].__class__._linkAttrStyle['requestVar'] = styls.rqvLink01
795  dq.itemStyles['requestVar'] = styls.rqvLink01
796
797  dreq.dreqItemBase._extraHtml['requestVarGroup'] = rvgExtraTable.vgx1(dq).mxoGet
798  dreq.dreqItemBase.__charmeEnable__['var'] = nt__charmeEnable( 'test','http://clipc-services.ceda.ac.uk/dreq' )
799
800  ht = htmlTrees(dq)
801  dq.makeHtml( annotations={'var':ht.anno}, ttl0='Data Request [%s]' % dreq.version )
802  try:
803    import xlsxwriter
804    mt = makeTab( dq)
805  except:
806    print ('Could not make tables ...')
807    raise
808  mp = makePurl()
809  mj = makeJs( dq )
Note: See TracBrowser for help on using the repository browser.