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

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

new distrib

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','vid','stid','Structure Title']
137        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','']
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 = [
287       ('Request Version',str(dq.version)),
288       ('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')]
289
290    wb = xlsx( dest, xls=xls, txt=txt )
291    if mcfgNote != None:
292      wb.mcfgNote = mcfgNote
293    wb.header( tableNotes, collected)
294
295    if txtOpts != None and txtOpts.mode == 'var':
296      vl =  list( set( [v.vid for v in cmv] )  )
297      vli = [dq.inx.uid[i] for i in vl]
298      thisvli =  sorted( vli, cmp=cmpdn(['sn','label']).cmp )
299      wb.var()
300     
301      j = 0
302      for v in thisvli:
303      ###hrec = ['Long name', 'units', 'description', 'Variable Name', 'CF Standard Name' ]
304         orec = [v.title, v.units, v.description, v.label, v.sn]
305         j += 1
306         wb.varrec( j,orec )
307    else:
308      withoo = False
309      for t in tables:
310        if withoo:
311          oo = open( 'tables/test_%s.csv' % t, 'w' )
312        wb.cmvtab(t,addMips,mode='c')
313
314        j = 0
315        thiscmv =  sorted( [v for v in cmv if v.mipTable == t], cmp=cmpdn(['prov','rowIndex','label']).cmp )
316
317        for v in thiscmv:
318          cv = dq.inx.uid[ v.vid ]
319          strc = dq.inx.uid[ v.stid ]
320          if strc._h.label == 'remarks':
321            print ( 'ERROR: structure not found for %s: %s .. %s (%s)' % (v.uid,v.label,v.title,v.mipTable) )
322            ok = False
323          else:
324            sshp = dq.inx.uid[ strc.spid ]
325            tshp = dq.inx.uid[ strc.tmid ]
326            ok = all( [i._h.label != 'remarks' for i in [cv,strc,sshp,tshp]] )
327          #[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']
328
329          if not ok:
330            if (t,v.label) not in skipped:
331              ml = []
332              for i in range(4):
333                 ii = [cv,strc,sshp,tshp][i]
334                 if ii._h.label == 'remarks':
335                   ml.append( ['var','struct','time','spatial'][i] )
336              print ( 'makeTables: skipping %s %s: %s' % (t,v.label,string.join( ml, ',')) )
337              skipped.add( (t,v.label) )
338          else:
339            dims = []
340            dims += string.split( sshp.dimensions, '|' )
341            dims += string.split( tshp.dimensions, '|' )
342            dims += string.split( strc.odims, '|' )
343            dims += string.split( strc.coords, '|' )
344            dims = string.join( dims )
345            if mode == 'c':
346              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]
347            else:
348              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]
349            if addMips:
350              thismips = c.chkCmv( v.uid )
351              thismips2 = c.chkCmv( v.uid, byExpt=True )
352              orec.append( string.join( sorted( list( thismips) ),',') )
353              orec.append( string.join( sorted( list( thismips2) ),',') )
354
355            if withoo:
356              oo.write( string.join(orec, '\t' ) + '\n' )
357            j+=1
358            wb.cmvtabrec( j,t,orec )
359
360        if withoo:
361          oo.close()
362    wb.close()
363
364hdr = """
365function f000(value) { return (value + "").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;") };
366
367function formatter00(row, cell, value, columnDef, dataContext) {
368        var vv = value.split(" ");
369        return '<b><a href="u/' + vv[1] + '.html">' + (vv[0] + " ").replace(/&/g,"&amp;") + '</a></b>, ';
370    };
371function formatter01(row, cell, value, columnDef, dataContext) { return '<i>' + f000(value) + '</i> ' };
372function formatter02(row, cell, value, columnDef, dataContext) { return '[' + f000(value) + '] ' };
373function formatter03(row, cell, value, columnDef, dataContext) { if (value != "'unset'"  ) { return '(' + f000(value) + ') ' } else {return ''} };
374function formatter04(row, cell, value, columnDef, dataContext) { return '{' + f000(value) + '} ' };
375function formatter05(row, cell, value, columnDef, dataContext) { return '&lt;' + f000(value) + '&gt; ' };
376
377var getData  = {
378cols: function() {
379  var columns = [ {id:0, name:'Variable', field:0, width: 100, formatter:formatter00 },
380              {id:1, name:'Standard name', field:1, width: 210, formatter:formatter01 },
381              {id:2, name:'Long name', field:2, width: 180, formatter:formatter02},
382              {id:3, name:'Units', field:3, width: 180, formatter:formatter03},
383              {id:4, name:'Description', field:4, width: 180, formatter:formatter04},
384              {id:5, name:'uid', field:5, width: 180, formatter:formatter05}];
385 return columns;
386},
387
388data: function() {
389var data = [];
390"""
391ftr = """return data;
392}
393};
394"""
395##rtmpl = 'data[%(n)s] = { "id":%(n)s, 0:"%(var)s",  1:"%(sn)s", 2:"%(ln)s", 3:"%(u)s", 4:"%(uid)s" };'
396rtmpl = 'data[%(n)s] = { "id":%(n)s, 0:"%(var)s",  1:"%(sn)s", 2:"%(ln)s", 3:"%(u)s", 4:"%(d)s", 5:"%(uid)s" };'
397
398class htmlTrees(object):
399  def __init__(self,dq,odir='html/t/'):
400    self.dq = dq
401    self.odir = odir
402    self.c = vrev.checkVar( dq )
403    self.anno = {}
404    for v in dq.coll['var'].items:
405      self.makeTree( v )
406   
407  def makeTree( self, v ):
408    ee = self.c.chk2( v.label )
409    if len(ee.keys()) > 0:
410      title = 'Usage tree for %s' % v.label
411      bdy = ['<h1>%s</h1>' % title, ]
412      bdy.append( '<html><head></head><body>\n' )
413      bdy.append( '<ul>\n' )
414      for k in sorted( ee.keys() ):
415        l1, xx = ee[k]
416        lx = list( xx )
417        if len( lx ) == 0:
418          bdy.append( '<li>%s: Empty</li>\n' % l1 )
419        else:
420          bdy.append( '<li>%s:\n<ul>' % l1 )
421          for x in lx:
422            bdy.append( '<li>%s</li>\n' % x )
423          bdy.append( '</ul></li>\n' )
424      bdy.append( '</ul></body></html>\n' )
425      oo = open( '%s/%s.html' % (self.odir,v.label), 'w' )
426      oo.write( dq.pageTmpl % ( title, '', '../', '../index.html', string.join( bdy, '\n' ) ) )
427      oo.close()
428      self.anno[v.label] = '<a href="../t/%s.html">Usage</a>' % v.label
429    else:
430      self.anno[v.label] = 'Unused'
431       
432
433class makeJs(object):
434  def __init__(self,dq):
435    n = 0
436    rl = []
437    for v in dq.coll['var'].items:
438      var = '%s %s' % (v.label,v.uid)
439      sn = v.sn
440      ln = v.title
441      u = v.units
442      d = v.description
443      uid = v.uid
444      d = locals()
445      for k in ['sn','ln','u','var','d']:
446   
447        if string.find( d[k], '"' ) != -1:
448          print ( "WARNING ... quote in %s .. %s [%s]" % (k,var,d[k]) )
449          d[k] = string.replace( d[k], '"', "'" )
450          print ( d[k] )
451       
452      rr = rtmpl % d
453      rl.append( rr )
454      n += 1
455    oo = open( 'data3.js', 'w' )
456    oo.write( hdr )
457    for r in rl:
458      oo.write( r + '\n' )
459    oo.write( ftr )
460    oo.close()
461   
462
463
464class styles(object):
465  def __init__(self):
466    pass
467
468  def rqvLink01(self,targ,frm='',ann=''):
469    if targ._h.label == 'remarks':
470      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to request variable broken"  )
471    elif frm != "CMORvar":
472      cmv = targ._inx.uid[ targ.vid ]
473      if targ._h.label == 'remarks':
474        return '<li>%s [%s]: %s</li>' % ( cmv.label, targ.__href__(odir='../u/',label=targ.priority) , 'Variable not defined or not found'  )
475      else:
476        return '<li>%s [%s]: %s</li>' % ( cmv.label, targ.__href__(odir='../u/',label=targ.priority) , cmv.__href__(odir='../u/',label=cmv.title)  )
477    else:
478      rg = targ._inx.uid[ targ.vgid ]
479      if targ._h.label == 'remarks':
480        return '<li>%s [%s]: %s</li>' % ( targ.label, targ.__href__(label=targ.priority) , 'Link not defined or not found'  )
481      elif rg._h.label == 'remarks':
482        return '<li>%s [%s]: %s</li>' % ( rg.label, targ.__href__(label=targ.priority) , 'Group not defined or not found'  )
483      else:
484        return '<li>%s [%s]: %s</li>' % ( rg.label, targ.__href__(label=targ.priority) , rg.__href__(label=rg.mip)  )
485
486  def snLink01(self,a,targ,frm='',ann=''):
487    if targ._h.label == 'remarks':
488      return '<li>%s: Standard name under review [%s]</li>' % ( a, targ.__href__() )
489    else:
490      return '<li>%s [%s]: %s</li>' % ( targ._h.title, a, targ.__href__(label=targ.label)  )
491
492  def stidLink01(self,a,targ,frm='',ann=''):
493    if targ._h.label == 'remarks':
494      return '<li>%s: Broken link to structure  [%s]</li>' % ( a, targ.__href__() )
495    else:
496      return '<li>%s [%s]: %s [%s]</li>' % ( targ._h.title, a, targ.__href__(label=targ.title), targ.label  )
497
498  def rqlLink02(self,targ,frm='',ann=''):
499    t2 = targ._inx.uid[targ.refid]
500    if t2._h.label == 'remarks':
501      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to variable group broken"  )
502    elif frm == "requestVarGroup":
503      return '<li>%s: %s [%s]</li>' % ( targ.__href__(odir='../u/', label=targ.mip), targ.title, targ.objective  )
504    else:
505      gpsz = len(t2._inx.iref_by_sect[t2.uid].a['requestVar'])
506      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  )
507
508  def rqiLink02(self,targ,frm='',ann=''):
509    t2 = targ._inx.uid[targ.rlid]
510    if t2._h.label == 'remarks':
511      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to request link broken"  )
512    else:
513      t3 = t2._inx.uid[t2.refid]
514      if t3._h.label == 'remarks':
515        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"  )
516      else:
517        nv = len( t3._inx.iref_by_sect[t3.uid].a['requestVar'] )
518        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 )
519
520  def snLink(self,targ,frm='',ann=''):
521    return '<li>%s [%s]: %s</li>' % ( targ.title, targ.units, targ.__href__(odir='../u/') )
522
523  def varLink(self,targ,frm='',ann=''):
524    return '<li>%s: %s [%s]%s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title, targ.units, ann )
525
526  def mipLink(self,targ,frm='',ann=''):
527    if targ.url != '':
528      return '<li>%s: %s <a href="%s">[project site]</a></li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title, targ.url )
529    else:
530      return '<li>%s: %s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title )
531
532  def cmvLink(self,targ,frm='',ann=''):
533    t2 = targ._inx.uid[targ.stid]
534    if 'requestVar' in targ._inx.iref_by_sect[targ.uid].a:
535      nrq = len( targ._inx.iref_by_sect[targ.uid].a['requestVar'] )
536    else:
537      nrq = 'unused'
538    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 )
539
540  def objLink(self,targ,frm='',ann=''):
541    return '<li>%s: %s</li>' % (  targ.label, targ.__href__(odir='../u/', label=targ.title,title=targ.description) )
542
543  def unitLink(self,targ,frm='',ann=''):
544    return '<li>%s [%s]: %s</li>' % (  targ.text, targ.label, targ.__href__(odir='../u/', label=targ.title) )
545
546  def strLink(self,targ,frm='',ann=''):
547    return '<li>%s: %s</li>' % (  targ.label, targ.__href__(odir='../u/', label=targ.title) )
548
549  def cmLink(self,targ,frm='',ann=''):
550    return '<li>%s [%s]: %s</li>' % (  targ.cell_methods,targ.label, targ.__href__(odir='../u/', label=targ.title) )
551
552  def objLnkLink(self,targ,frm='',ann=''):
553    if frm == 'objective':
554      t2 = targ._inx.uid[targ.rid]
555      t3 = targ._inx.uid[t2.refid]
556      thislab = '%s (%s)' % (t2.mip,t3.label)
557      return '<li>%s: %s</li>' % (  t2.title, t2.__href__(odir='../u/',label=thislab) )
558    else:
559      t2 = targ._inx.uid[targ.oid]
560      return '<li>%s: %s</li>' % (  t2.label, t2.__href__(odir='../u/',label=t2.title) )
561
562  def labTtl(self,targ,frm='',ann=''):
563    return '<li>%s: %s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title )
564
565  def vgrpLink(self,targ,frm='',ann=''):
566    gpsz = len(targ._inx.iref_by_sect[targ.uid].a['requestVar'])
567    nlnk = len(targ._inx.iref_by_sect[targ.uid].a['requestLink'])
568    return '<li>%s {%s}: %s variables, %s request links</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.mip, gpsz, nlnk )
569
570class tables(object):
571  def __init__(self,sc, mips, odir='xls',xls=True,txt=False,txtOpts=None):
572      self.sc = sc
573      self.dq = sc.dq
574      self.mips = mips
575      self.odir = odir
576      self.accReset()
577      self.doXls = xls
578      self.doTxt = txt
579      self.txtOpts = txtOpts
580
581  def accReset(self):
582    self.acc = [0.,collections.defaultdict(int),collections.defaultdict( float ) ]
583
584  def accAdd(self,x):
585    self.acc[0] += x[0]
586    for k in x[2]:
587       self.acc[2][k] += x[2][k]
588
589  def doTable(self,m,l1,m2,pmax,collector,acc=True, mlab=None,exptids=None,cc=None):
590      """*acc* allows accumulation of values to be switched off when called in single expt mode"""
591     
592      self.verbose = False
593      if mlab == None:
594        mlab = setMlab( m )
595
596      cc0 = scope_utils.getExptSum( self.dq, mlab, l1 )
597      ks = sorted( list( cc0.keys() ) )
598      if self.verbose:
599        print ('Experiment summary: %s %s' % (mlab,string.join( ['%s: %s' % (k,len(cc0[k])) for k in ks], ', ' ) ) )
600
601      if m2 in [None, 'TOTAL']:
602        x = self.acc
603      else:
604        x = self.sc.volByExpt( l1, m2, pmax=pmax )
605
606##self.volByExpt( l1, e, pmax=pmax, cc=cc, retainRedundantRank=retainRedundantRank, intersection=intersection, adsCount=adsCount )
607        v0 = self.sc.volByMip( m, pmax=pmax,  exptid=m2 )
608####
609        if cc==None:
610          cc = collections.defaultdict( int )
611        for e in self.sc.volByE:
612          if self.verbose:
613             print ('INFO.mlab.... %s: %s: %s' % ( mlab, e, len( self.sc.volByE[e][2] ) ) )
614          for v in self.sc.volByE[e][2]:
615             cc[v] += self.sc.volByE[e][2][v]
616        xxx = 0
617        for v in cc:
618          xxx += cc[v]
619####
620        if acc:
621          for e in self.sc.volByE:
622            self.accAdd(self.sc.volByE[e])
623
624      if m2 not in [ None, 'TOTAL']:
625          im2 = self.dq.inx.uid[m2]
626          ismip = im2._h.label == 'mip'
627          mlab2 = im2.label
628
629          x0 = 0
630          for e in self.sc.volByE:
631            if exptids == None or e in exptids:
632              x = self.sc.volByE[e]
633              if x[0] > 0:
634                collector[mlab].a[mlab2] += x[0]
635                x0 += x[0]
636      else:
637          ismip = False
638          mlab2 = 'TOTAL'
639          x0 = x[0]
640
641      if mlab2 == 'TOTAL' and x0 == 0:
642        print ( 'no data detected for %s' % mlab )
643
644      if x0 > 0:
645#
646# create sum for each table
647#
648        xs = 0
649        kkc = '_%s_%s' % (mlab,mlab2)
650        kkct = '_%s_%s' % (mlab,'TOTAL')
651        if m2 in [None, 'TOTAL']:
652          x = self.acc
653          x2 = set(x[2].keys() )
654          for k in x[2].keys():
655           i = self.dq.inx.uid[k]
656           xxx =  x[2][k]
657           xs += xxx
658        else:
659          x2 = set()
660          for e in self.sc.volByE:
661            if exptids == None or e in exptids:
662              x = self.sc.volByE[e]
663              x2 = x2.union( set( x[2].keys() ) )
664              for k in x[2].keys():
665               i = self.dq.inx.uid[k]
666               xxx =  x[2][k]
667               xs += xxx
668               if xxx > 0:
669                collector[kkc].a[i.mipTable] += xxx
670                if ismip:
671                  collector[kkct].a[i.mipTable] += xxx
672
673##
674## One user was getting false error message here, with ('%s' % x0) == ('%s' % xs)
675##
676        if abs(x0 -xs) > 1.e-8*( abs(x0) + abs(xs) ):
677          print ( 'ERROR.0088: consistency problem %s  %s %s %s' % (m,m2,x0,xs) )
678        if x0 == 0:
679          print ( 'Zero size: %s, %s' % (m,m2) )
680          if len( x[2].keys() ) > 0:
681             print ( 'ERROR:zero: %s, %s: %s' % (m,m2,str(x[2].keys()) ) )
682
683        if acc and m2 not in [ None, 'TOTAL']:
684          collector[mlab].a['TOTAL'] += x0
685
686        ##print 'xxxxq', collector[mlab].a[mlab2], collector[mlab].a['TOTAL']
687        ##print 'xxxxz', kkc, collector[kkc].a['Amon'], collector[kkct].a['Amon'], ismip
688        dd = collections.defaultdict( list )
689        lll = set()
690        for v in x2:
691          vi = self.sc.dq.inx.uid[v]
692          if vi._h.label != 'remarks':
693            f,t,l,tt,d,u = (vi.frequency,vi.mipTable,vi.label,vi.title,vi.description,vi.uid)
694            lll.add(u)
695            dd[t].append( (f,t,l,tt,d,u) )
696
697        ##print 'xxxxx',mlab,mlab2, x0, len( dd.keys() )
698        if len( dd.keys() ) > 0:
699          collector[mlab].dd[mlab2] = dd
700          if m2 not in [ None, 'TOTAL']:
701            if im2._h.label == 'experiment':
702              dothis = self.sc.tierMax >= min( im2.tier )
703###
704### BUT ... there is a treset in the request item .... it may be that some variables are excluded ...
705###         need the variable list itself .....
706###
707          ##print '> maketab: ','%s/%s-%s_%s_%s.xlsx' % (self.odir,mlab,mlab2,self.sc.tierMax,pmax)
708          makeTab( self.sc.dq, subset=lll, dest='%s/%s-%s_%s_%s' % (self.odir,mlab,mlab2,self.sc.tierMax,pmax), collected=collector[kkc].a,
709              mcfgNote=self.sc.mcfgNote,
710              txt=self.doTxt, xls=self.doXls, txtOpts=self.txtOpts )
711
712styls = styles()
713
714htmlStyle = {}
715htmlStyle['CMORvar'] = {'getIrefs':['__all__']}
716htmlStyle['requestVarGroup'] = {'getIrefs':['requestVar','requestLink']}
717htmlStyle['var'] = {'getIrefs':['CMORvar']}
718htmlStyle['objective'] = {'getIrefs':['objectiveLink']}
719htmlStyle['requestLink'] = {'getIrefs':['objectiveLink','requestItem']}
720htmlStyle['exptgroup'] = {'getIrefs':['__all__']}
721htmlStyle['requestItem'] = {'getIrefs':['__all__']}
722htmlStyle['experiment'] = {'getIrefs':['__all__']}
723htmlStyle['mip'] = {'getIrefs':['__all__']}
724htmlStyle['miptable'] = {'getIrefs':['__all__']}
725htmlStyle['remarks'] = {'getIrefs':['__all__']}
726htmlStyle['grids'] = {'getIrefs':['__all__']}
727htmlStyle['varChoice'] = {'getIrefs':['__all__']}
728htmlStyle['spatialShape'] = {'getIrefs':['__all__']}
729htmlStyle['temporalShape'] = {'getIrefs':['__all__']}
730htmlStyle['structure'] = {'getIrefs':['__all__']}
731htmlStyle['cellMethods'] = {'getIrefs':['__all__']}
732htmlStyle['standardname'] = {'getIrefs':['__all__']}
733htmlStyle['varRelations'] = {'getIrefs':['__all__']}
734htmlStyle['varRelLnk'] = {'getIrefs':['__all__']}
735htmlStyle['units'] = {'getIrefs':['__all__']}
736
737if __name__ == "__main__":
738  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'
739  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'
740  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'
741  assert os.path.isdir( 'tables' ), 'Before running this script you need to create a "tables" sub-directory, or edit the makeTab class'
742
743  dq = dreq.loadDreq( htmlStyles=htmlStyle, manifest='out/dreqManifest.txt' )
744##
745## add special styles to dq object "itemStyle" dictionary.
746##
747
748  dq.itemStyles['standardname'] = styls.snLink
749  dq.itemStyles['var'] = styls.varLink
750  dq.itemStyles['mip'] = styls.mipLink
751  dq.itemStyles['CMORvar'] = styls.cmvLink
752  dq.itemStyles['objective'] = styls.objLink
753  dq.itemStyles['units'] = styls.unitLink
754  dq.itemStyles['structure'] = styls.strLink
755  dq.itemStyles['cellMethods'] = styls.cmLink
756  dq.itemStyles['objectiveLink'] = styls.objLnkLink
757  dq.itemStyles['requestVarGroup'] = styls.vgrpLink
758  dq.itemStyles['requestLink'] = styls.rqlLink02
759  dq.itemStyles['requestItem'] = styls.rqiLink02
760  dq.itemStyles['spatialShape'] = styls.labTtl
761  dq.coll['var'].items[0].__class__._linkAttrStyle['sn'] = styls.snLink01
762  dq.coll['CMORvar'].items[0].__class__._linkAttrStyle['stid'] = styls.stidLink01
763##dq.coll['requestVarGroup'].items[0].__class__._linkAttrStyle['requestVar'] = styls.rqvLink01
764  dq.itemStyles['requestVar'] = styls.rqvLink01
765
766  ht = htmlTrees(dq)
767  dq.makeHtml( annotations={'var':ht.anno}, ttl0='Data Request [%s]' % dreq.version )
768  try:
769    import xlsxwriter
770    mt = makeTab( dq)
771  except:
772    print ('Could not make tables ...')
773    raise
774  mp = makePurl()
775  mj = makeJs( dq )
Note: See TracBrowser for help on using the repository browser.