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

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

checked distrib cand

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