source: CMIP6dreq/trunk/dreqPy/makeTables.py @ 827

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

early test

Line 
1
2import collections, 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='.'.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( '\t'.join( ['Notes','','Notes on tables']) + '\n' )
105      for t in tableNotes:
106        self.oo.write( '\t'.join( ['Notes',] + list(t)) + '\n' )
107
108      if collected != None:
109        self.oo.write( '\t'.join( ['Notes','Table','Reference Volume (1 deg. atmosphere, 0.5 deg. ocean)']) + '\n')
110        for k in sorted( collected.keys() ):
111          self.oo.write( '\t'.join( ['Notes',k,vfmt( collected[k]*2. )]) + '\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( '\t'.join( [t,] + orec) + '\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( '\t'.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,','.join( ml)) )
358              skipped.add( (t,v.label) )
359          else:
360            dims = []
361            dims +=  sshp.dimensions.split( '|' )
362            dims +=  tshp.dimensions.split( '|' )
363            dims +=  strc.odims.split( '|' )
364            dims +=  strc.coords.split( '|' )
365            dims = ' '.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( ','.join( sorted( list( thismips) ) ) )
374              orec.append( ','.join( sorted( list( thismips2) ) ) )
375
376            if withoo:
377              oo.write( '\t'.join(orec ) + '\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', '\n'.join( bdy ) ) )
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  d[k].find( '"' ) != -1:
470            print ( "WARNING ... quote in %s .. %s [%s]" % (k,var,d[k]) )
471            d[k] =  d[k].replace( '"', "'" )
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
603  def accReset(self):
604    self.acc = [0.,collections.defaultdict(int),collections.defaultdict( float ) ]
605
606  def accAdd(self,x):
607    self.acc[0] += x[0]
608    for k in x[2]:
609       self.acc[2][k] += x[2][k]
610
611
612  def getTable(self,m,m2,pmax,odsz,npy):
613     vs = volsum.vsum( self.sc, odsz, npy )
614     mlab = setMlab( m )
615     vs.run( m, 'requestVol_%s_%s_%s' % (mlab,self.sc.tierMax,pmax), pmax=pmax )
616
617
618## collected=summed volumes by table for first page.
619     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,
620              mcfgNote=self.sc.mcfgNote,
621              txt=self.doTxt, xls=self.doXls, txtOpts=self.txtOpts )
622  def doTable(self,m,l1,m2,pmax,collector,acc=True, mlab=None,exptids=None,cc=None):
623      """*acc* allows accumulation of values to be switched off when called in single expt mode"""
624     
625      self.verbose = False
626      if mlab == None:
627        mlab = setMlab( m )
628
629      cc0 = misc_utils.getExptSum( self.dq, mlab, l1 )
630      ks = sorted( list( cc0.keys() ) )
631      if self.verbose:
632        print ('Experiment summary: %s %s' % (mlab,', '.join( ['%s: %s' % (k,len(cc0[k])) for k in ks] ) ) )
633
634      if m2 in [None, 'TOTAL']:
635        x = self.acc
636      else:
637        x = self.sc.volByExpt( l1, m2, pmax=pmax )
638
639##self.volByExpt( l1, e, pmax=pmax, cc=cc, retainRedundantRank=retainRedundantRank, intersection=intersection, adsCount=adsCount )
640        v0 = self.sc.volByMip( m, pmax=pmax,  exptid=m2 )
641####
642        if cc==None:
643          cc = collections.defaultdict( int )
644        for e in self.sc.volByE:
645          if self.verbose:
646             print ('INFO.mlab.... %s: %s: %s' % ( mlab, e, len( self.sc.volByE[e][2] ) ) )
647          for v in self.sc.volByE[e][2]:
648             cc[v] += self.sc.volByE[e][2][v]
649        xxx = 0
650        for v in cc:
651          xxx += cc[v]
652####
653        if acc:
654          for e in self.sc.volByE:
655            self.accAdd(self.sc.volByE[e])
656
657      if m2 not in [ None, 'TOTAL']:
658          im2 = self.dq.inx.uid[m2]
659          ismip = im2._h.label == 'mip'
660          mlab2 = im2.label
661
662          x0 = 0
663          for e in self.sc.volByE:
664            if exptids == None or e in exptids:
665              x = self.sc.volByE[e]
666              if x[0] > 0:
667                collector[mlab].a[mlab2] += x[0]
668                x0 += x[0]
669      else:
670          ismip = False
671          mlab2 = 'TOTAL'
672          x0 = x[0]
673
674      if mlab2 == 'TOTAL' and x0 == 0:
675        print ( 'no data detected for %s' % mlab )
676
677      if x0 > 0:
678#
679# create sum for each table
680#
681        xs = 0
682        kkc = '_%s_%s' % (mlab,mlab2)
683        kkct = '_%s_%s' % (mlab,'TOTAL')
684        if m2 in [None, 'TOTAL']:
685          x = self.acc
686          x2 = set(x[2].keys() )
687          for k in x[2].keys():
688           i = self.dq.inx.uid[k]
689           xxx =  x[2][k]
690           xs += xxx
691        else:
692          x2 = set()
693          for e in self.sc.volByE:
694            if exptids == None or e in exptids:
695              x = self.sc.volByE[e]
696              x2 = x2.union( set( x[2].keys() ) )
697              for k in x[2].keys():
698               i = self.dq.inx.uid[k]
699               xxx =  x[2][k]
700               xs += xxx
701               if xxx > 0:
702                collector[kkc].a[i.mipTable] += xxx
703                if ismip:
704                  collector[kkct].a[i.mipTable] += xxx
705
706##
707## One user was getting false error message here, with ('%s' % x0) == ('%s' % xs)
708##
709        if abs(x0 -xs) > 1.e-8*( abs(x0) + abs(xs) ):
710          print ( 'ERROR.0088: consistency problem %s  %s %s %s' % (m,m2,x0,xs) )
711        if x0 == 0:
712          print ( 'Zero size: %s, %s' % (m,m2) )
713          if len( x[2].keys() ) > 0:
714             print ( 'ERROR:zero: %s, %s: %s' % (m,m2,str(x[2].keys()) ) )
715
716        if acc and m2 not in [ None, 'TOTAL']:
717          collector[mlab].a['TOTAL'] += x0
718
719        dd = collections.defaultdict( list )
720        lll = set()
721        for v in x2:
722          vi = self.sc.dq.inx.uid[v]
723          if vi._h.label != 'remarks':
724            f,t,l,tt,d,u = (vi.frequency,vi.mipTable,vi.label,vi.title,vi.description,vi.uid)
725            lll.add(u)
726            dd[t].append( (f,t,l,tt,d,u) )
727
728        if len( dd.keys() ) > 0:
729          collector[mlab].dd[mlab2] = dd
730          if m2 not in [ None, 'TOTAL']:
731            if im2._h.label == 'experiment':
732              dothis = self.sc.tierMax >= min( im2.tier )
733###
734### BUT ... there is a treset in the request item .... it may be that some variables are excluded ...
735###         need the variable list itself .....
736###
737          makeTab( self.sc.dq, subset=lll, dest='%s/%s-%s_%s_%s' % (self.odir,mlab,mlab2,self.sc.tierMax,pmax), collected=collector[kkc].a,
738              mcfgNote=self.sc.mcfgNote,
739              txt=self.doTxt, xls=self.doXls, txtOpts=self.txtOpts )
740
741styls = styles()
742
743htmlStyle = {}
744htmlStyle['CMORvar'] = {'getIrefs':['__all__']}
745htmlStyle['requestVarGroup'] = {'getIrefs':['requestVar','requestLink']}
746htmlStyle['var'] = {'getIrefs':['CMORvar']}
747htmlStyle['objective'] = {'getIrefs':['objectiveLink']}
748htmlStyle['requestLink'] = {'getIrefs':['objectiveLink','requestItem']}
749htmlStyle['exptgroup'] = {'getIrefs':['__all__']}
750htmlStyle['requestItem'] = {'getIrefs':['__all__']}
751htmlStyle['experiment'] = {'getIrefs':['__all__']}
752htmlStyle['mip'] = {'getIrefs':['__all__']}
753htmlStyle['miptable'] = {'getIrefs':['__all__']}
754htmlStyle['remarks'] = {'getIrefs':['__all__']}
755htmlStyle['grids'] = {'getIrefs':['__all__']}
756htmlStyle['varChoice'] = {'getIrefs':['__all__']}
757htmlStyle['spatialShape'] = {'getIrefs':['__all__']}
758htmlStyle['temporalShape'] = {'getIrefs':['__all__']}
759htmlStyle['structure']    = {'getIrefs':['__all__']}
760htmlStyle['cellMethods']  = {'getIrefs':['__all__']}
761htmlStyle['standardname'] = {'getIrefs':['__all__']}
762htmlStyle['varRelations'] = {'getIrefs':['__all__']}
763htmlStyle['varRelLnk']    = {'getIrefs':['__all__']}
764htmlStyle['units']        = {'getIrefs':['__all__']}
765htmlStyle['timeSlice']    = {'getIrefs':['__all__']}
766
767if __name__ == "__main__":
768  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'
769  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'
770  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'
771  assert os.path.isdir( 'tables' ), 'Before running this script you need to create a "tables" sub-directory, or edit the makeTab class'
772
773  dq = dreq.loadDreq( htmlStyles=htmlStyle, manifest='out/dreqManifest.txt' )
774##
775## add special styles to dq object "itemStyle" dictionary.
776##
777
778  dq.itemStyles['standardname'] = styls.snLink
779  dq.itemStyles['var'] = styls.varLink
780  dq.itemStyles['mip'] = styls.mipLink
781  dq.itemStyles['CMORvar'] = styls.cmvLink
782  dq.itemStyles['objective'] = styls.objLink
783  dq.itemStyles['units'] = styls.unitLink
784  dq.itemStyles['structure'] = styls.strLink
785  dq.itemStyles['cellMethods'] = styls.cmLink
786  dq.itemStyles['objectiveLink'] = styls.objLnkLink
787  dq.itemStyles['requestVarGroup'] = styls.vgrpLink
788  dq.itemStyles['requestLink'] = styls.rqlLink02
789  dq.itemStyles['requestItem'] = styls.rqiLink02
790  dq.itemStyles['spatialShape'] = styls.labTtl
791  dq.coll['var'].items[0].__class__._linkAttrStyle['sn'] = styls.snLink01
792  dq.coll['CMORvar'].items[0].__class__._linkAttrStyle['stid'] = styls.stidLink01
793##dq.coll['requestVarGroup'].items[0].__class__._linkAttrStyle['requestVar'] = styls.rqvLink01
794  dq.itemStyles['requestVar'] = styls.rqvLink01
795
796  dreq.dreqItemBase._extraHtml['requestVarGroup'] = rvgExtraTable.vgx1(dq).mxoGet
797  dreq.dreqItemBase.__charmeEnable__['var'] = nt__charmeEnable( 'test','http://clipc-services.ceda.ac.uk/dreq' )
798
799  ht = htmlTrees(dq)
800  dq.makeHtml( annotations={'var':ht.anno}, ttl0='Data Request [%s]' % dreq.version )
801  try:
802    import xlsxwriter
803    mt = makeTab( dq)
804  except:
805    print ('Could not make tables ...')
806    raise
807  mp = makePurl()
808  mj = makeJs( dq )
Note: See TracBrowser for help on using the repository browser.