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

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

further import corrections

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