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

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

Updated setup for tag 01.beta.43

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