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

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

release cand

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