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

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

cleaned overview tabs

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