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

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

01.beta.30

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