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

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

01.beta.33

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