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

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

debugging commandline options -- removing hidden settings

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','valid_min', 'valid_max', 'ok_min_mean_abs', 'ok_max_mean_abs']
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 "qcranges" in dq.inx.iref_by_sect[v.uid].a:
401              u = dq.inx.iref_by_sect[v.uid].a['qcranges'][0]
402              qc = dq.inx.uid[u]
403              ll = []
404              for k in ['valid_min', 'valid_max', 'ok_min_mean_abs', 'ok_max_mean_abs']:
405                if qc.hasattr(k):
406                  ll.append( '%s %s' % (qc.__dict__[k],qc.__dict__['%s_status' % k][0]) )
407                else:
408                  ll.append( '' )
409              valid_min, valid_max, ok_min_mean_abs, ok_max_mean_abs = tuple( ll )
410            else:
411              valid_min, valid_max, ok_min_mean_abs, ok_max_mean_abs = ('','','','')
412               
413            if mode == 'c':
414              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, valid_min, valid_max, ok_min_mean_abs, ok_max_mean_abs]
415            else:
416              orec = ['',cv.title, cv.units, v.description, '', cv.label, cv.sn, '','', strc.cell_methods, valid_min, valid_max, ok_min_mean_abs, 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]
417
418            if byFreqRealm:
419              orec = [v.mipTable,] + orec
420
421            if addMips:
422              thismips = c.chkCmv( v.uid )
423              thismips2 = c.chkCmv( v.uid, byExpt=True )
424              orec.append( ','.join( sorted( list( thismips) ) ) )
425              orec.append( ','.join( sorted( list( thismips2) ) ) )
426
427            if tslice != None:
428              if v.uid not in tslice:
429                orec += ['All', '','']
430              elif type( tslice[v.uid] ) == type( 0 ):
431                print 'ERROR: unexpected tslice type: %s, %s' % (v.uid, tslice[v.uid] )
432              elif len(  tslice[v.uid] ) == 2:
433                x,priority = tslice[v.uid]
434                orec[0] = priority
435              else:
436                tslab,tsmode,a,b,priority = tslice[v.uid]
437                orec[0] = priority
438                     
439                if tsmode[:4] in ['simp','bran']:
440                   nys = b + 1 - a
441                   ys = range(a,b+1)
442                   orec += [str(nys), '',str(ys)]
443                elif tsmode[:4] in ['YEAR']:
444                   nys = a
445                   ys = b
446                   orec += [str(nys), '',str(ys)]
447                else:
448                   orec += ['slice', tslab,'']
449               
450            if withoo:
451              oo.write( '\t'.join(orec ) + '\n' )
452            j+=1
453            wb.cmvtabrec( j,t,orec )
454
455        if withoo:
456          oo.close()
457    wb.close()
458
459hdr = """
460function f000(value) { return (value + "").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;") };
461
462function formatter00(row, cell, value, columnDef, dataContext) {
463        var vv = value.split(" ");
464        return '<b><a href="u/' + vv[1] + '.html">' + (vv[0] + " ").replace(/&/g,"&amp;") + '</a></b>, ';
465    };
466function formatter01(row, cell, value, columnDef, dataContext) { return '<i>' + f000(value) + '</i> ' };
467function formatter02(row, cell, value, columnDef, dataContext) { return '[' + f000(value) + '] ' };
468function formatter03(row, cell, value, columnDef, dataContext) { if (value != "'unset'"  ) { return '(' + f000(value) + ') ' } else {return ''} };
469function formatter04(row, cell, value, columnDef, dataContext) { return '{' + f000(value) + '} ' };
470function formatter05(row, cell, value, columnDef, dataContext) { return '&lt;' + f000(value) + '&gt; ' };
471
472var getData  = {
473cols: function() {
474  var columns = [ {id:0, name:'Variable', field:0, width: 100, formatter:formatter00 },
475              {id:1, name:'Standard name', field:1, width: 210, formatter:formatter01 },
476              {id:2, name:'Long name', field:2, width: 180, formatter:formatter02},
477              {id:3, name:'Units', field:3, width: 180, formatter:formatter03},
478              {id:4, name:'Description', field:4, width: 180, formatter:formatter04},
479              {id:5, name:'uid', field:5, width: 180, formatter:formatter05}];
480 return columns;
481},
482
483data: function() {
484var data = [];
485"""
486ftr = """return data;
487}
488};
489"""
490##rtmpl = 'data[%(n)s] = { "id":%(n)s, 0:"%(var)s",  1:"%(sn)s", 2:"%(ln)s", 3:"%(u)s", 4:"%(uid)s" };'
491rtmpl = 'data[%(n)s] = { "id":%(n)s, 0:"%(var)s",  1:"%(sn)s", 2:"%(ln)s", 3:"%(u)s", 4:"%(d)s", 5:"%(uid)s" };'
492
493class htmlTrees(object):
494  def __init__(self,dq,odir='html/t/'):
495    self.dq = dq
496    self.odir = odir
497    self.c = vrev.checkVar( dq )
498    self.anno = {}
499    for v in dq.coll['var'].items:
500      self.makeTree( v )
501   
502  def makeTree( self, v ):
503    ee = self.c.chk2( v.label )
504    if len(ee.keys()) > 0:
505      title = 'Usage tree for %s' % v.label
506      bdy = ['<h1>%s</h1>' % title, ]
507      bdy.append( '<html><head></head><body>\n' )
508      bdy.append( '<ul>\n' )
509      for k in sorted( ee.keys() ):
510        l1, xx = ee[k]
511        lx = list( xx )
512        if len( lx ) == 0:
513          bdy.append( '<li>%s: Empty</li>\n' % l1 )
514        else:
515          bdy.append( '<li>%s:\n<ul>' % l1 )
516          for x in lx:
517            bdy.append( '<li>%s</li>\n' % x )
518          bdy.append( '</ul></li>\n' )
519      bdy.append( '</ul></body></html>\n' )
520      oo = open( '%s/%s.html' % (self.odir,v.label), 'w' )
521      oo.write( dq.pageTmpl % ( title, '', '../', '../index.html', '\n'.join( bdy ) ) )
522      oo.close()
523      self.anno[v.label] = '<a href="../t/%s.html">Usage</a>' % v.label
524    else:
525      self.anno[v.label] = 'Unused'
526       
527
528class makeJs(object):
529  def __init__(self,dq):
530    n = 0
531    rl = []
532    for v in dq.coll['var'].items:
533      if 'CMORvar' in dq.inx.iref_by_sect[v.uid].a and len(dq.inx.iref_by_sect[v.uid].a['CMORvar'] ) > 0:
534        var = '%s %s' % (v.label,v.uid)
535        sn = v.sn
536        ln = v.title
537        u = v.units
538        d = v.description
539        uid = v.uid
540        d = locals()
541        for k in ['sn','ln','u','var','d']:
542   
543          if  d[k].find( '"' ) != -1:
544            print ( "WARNING ... quote in %s .. %s [%s]" % (k,var,d[k]) )
545            d[k] =  d[k].replace( '"', "'" )
546            print ( d[k] )
547       
548        rr = rtmpl % d
549        rl.append( rr )
550        n += 1
551    oo = open( 'data3.js', 'w' )
552    oo.write( hdr )
553    for r in rl:
554      oo.write( r + '\n' )
555    oo.write( ftr )
556    oo.close()
557   
558
559
560class styles(object):
561  def __init__(self):
562    pass
563
564  def rqvLink01(self,targ,frm='',ann=''):
565    if targ._h.label == 'remarks':
566      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to request variable broken"  )
567    elif frm != "CMORvar":
568      cmv = targ._inx.uid[ targ.vid ]
569      if targ._h.label == 'remarks':
570        return '<li>%s [%s]: %s</li>' % ( cmv.label, targ.__href__(odir='../u/',label=targ.priority) , 'Variable not defined or not found'  )
571      else:
572        return '<li>%s [%s]: %s</li>' % ( cmv.label, targ.__href__(odir='../u/',label=targ.priority) , cmv.__href__(odir='../u/',label=cmv.title)  )
573    else:
574      rg = targ._inx.uid[ targ.vgid ]
575      if targ._h.label == 'remarks':
576        return '<li>%s [%s]: %s</li>' % ( targ.label, targ.__href__(label=targ.priority) , 'Link not defined or not found'  )
577      elif rg._h.label == 'remarks':
578        return '<li>%s [%s]: %s</li>' % ( rg.label, targ.__href__(label=targ.priority) , 'Group not defined or not found'  )
579      else:
580        return '<li>%s [%s]: %s</li>' % ( rg.label, targ.__href__(label=targ.priority) , rg.__href__(label=rg.mip)  )
581
582  def snLink01(self,a,targ,frm='',ann=''):
583    if targ._h.label == 'remarks':
584      return '<li>%s: Standard name under review [%s]</li>' % ( a, targ.__href__() )
585    else:
586      return '<li>%s [%s]: %s</li>' % ( targ._h.title, a, targ.__href__(label=targ.label)  )
587
588  def stidLink01(self,a,targ,frm='',ann=''):
589    if targ._h.label == 'remarks':
590      return '<li>%s: Broken link to structure  [%s]</li>' % ( a, targ.__href__() )
591    else:
592      return '<li>%s [%s]: %s [%s]</li>' % ( targ._h.title, a, targ.__href__(label=targ.title), targ.label  )
593
594  def rqlLink02(self,targ,frm='',ann=''):
595    t2 = targ._inx.uid[targ.refid]
596    if t2._h.label == 'remarks':
597      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to variable group broken"  )
598    elif frm == "requestVarGroup":
599      return '<li>%s: %s [%s]</li>' % ( targ.__href__(odir='../u/', label=targ.mip), targ.title, targ.objective  )
600    else:
601      gpsz = len(t2._inx.iref_by_sect[t2.uid].a['requestVar'])
602      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  )
603
604  def rqiLink02(self,targ,frm='',ann=''):
605    t2 = targ._inx.uid[targ.rlid]
606    if t2._h.label == 'remarks':
607      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to request link broken"  )
608    else:
609      t3 = t2._inx.uid[t2.refid]
610      if t3._h.label == 'remarks':
611        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"  )
612      else:
613        nv = len( t3._inx.iref_by_sect[t3.uid].a['requestVar'] )
614        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 )
615
616  def snLink(self,targ,frm='',ann=''):
617    return '<li>%s [%s]: %s</li>' % ( targ.title, targ.units, targ.__href__(odir='../u/') )
618
619  def varLink(self,targ,frm='',ann=''):
620    return '<li>%s: %s [%s]%s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title, targ.units, ann )
621
622  def mipLink(self,targ,frm='',ann=''):
623    if targ.url != '':
624      return '<li>%s: %s <a href="%s">[project site]</a></li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title, targ.url )
625    else:
626      return '<li>%s: %s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title )
627
628  def cmvLink(self,targ,frm='',ann=''):
629    t2 = targ._inx.uid[targ.stid]
630    if 'requestVar' in targ._inx.iref_by_sect[targ.uid].a:
631      nrq = len( targ._inx.iref_by_sect[targ.uid].a['requestVar'] )
632    else:
633      nrq = 'unused'
634    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 )
635
636  def objLink(self,targ,frm='',ann=''):
637    return '<li>%s: %s</li>' % (  targ.label, targ.__href__(odir='../u/', label=targ.title,title=targ.description) )
638
639  def unitLink(self,targ,frm='',ann=''):
640    return '<li>%s [%s]: %s</li>' % (  targ.text, targ.label, targ.__href__(odir='../u/', label=targ.title) )
641
642  def strLink(self,targ,frm='',ann=''):
643    return '<li>%s: %s</li>' % (  targ.label, targ.__href__(odir='../u/', label=targ.title) )
644
645  def cmLink(self,targ,frm='',ann=''):
646    return '<li>%s [%s]: %s</li>' % (  targ.cell_methods,targ.label, targ.__href__(odir='../u/', label=targ.title) )
647
648  def objLnkLink(self,targ,frm='',ann=''):
649    if frm == 'objective':
650      t2 = targ._inx.uid[targ.rid]
651      t3 = targ._inx.uid[t2.refid]
652      thislab = '%s (%s)' % (t2.mip,t3.label)
653      return '<li>%s: %s</li>' % (  t2.title, t2.__href__(odir='../u/',label=thislab) )
654    else:
655      t2 = targ._inx.uid[targ.oid]
656      return '<li>%s: %s</li>' % (  t2.label, t2.__href__(odir='../u/',label=t2.title) )
657
658  def labTtl(self,targ,frm='',ann=''):
659    return '<li>%s: %s</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title )
660
661  def vgrpLink(self,targ,frm='',ann=''):
662    gpsz = len(targ._inx.iref_by_sect[targ.uid].a['requestVar'])
663    nlnk = len(targ._inx.iref_by_sect[targ.uid].a['requestLink'])
664    return '<li>%s {%s}: %s variables, %s request links</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.mip, gpsz, nlnk )
665
666def obsolete_getTable(sc,m,m2,pmax,odsz,npy,odir='d1',txt=False,xls=False,txtOpts=None):
667     """replaces tables.getTable( self, m,m2,pmax,odsz,npy)"""
668##
669## this creates a new instance, and calls doTable ....
670## very messy ...
671##
672     vs = volsum.vsum( sc, odsz, npy, makeTab, tables )
673     mlab = setMlab( m )
674     vs.run( m, 'requestVol_%s_%s_%s' % (mlab,sc.tierMax,pmax), pmax=pmax )
675
676
677## collected=summed volumes by table for first page.
678     makeTab( sc.dq, subset=vs.thiscmvset, dest='%s/%s-%s_%s_%s' % (odir,mlab,mlab2,sc.tierMax,pmax), collected=collector[kkc].a,
679              mcfgNote=sc.mcfgNote,
680              txt=doTxt, xls=doXls, txtOpts=txtOpts )
681
682class tables(object):
683  def __init__(self,sc, odir='xls',xls=True,txt=False,txtOpts=None):
684      self.sc = sc
685      self.dq = sc.dq
686      ##self.mips = mips
687      self.odir = odir
688      self.accReset()
689      self.doXls = xls
690      self.doTxt = txt
691      self.txtOpts = txtOpts
692
693  def accReset(self):
694    self.acc = [0.,collections.defaultdict(int),collections.defaultdict( float ) ]
695
696  def accAdd(self,x):
697    self.acc[0] += x[0]
698    for k in x[2]:
699       self.acc[2][k] += x[2][k]
700
701
702  def doTable(self,m,l1,m2,pmax,collector,acc=True, mlab=None,exptids=None,cc=None):
703      """*acc* allows accumulation of values to be switched off when called in single expt mode"""
704     
705      self.verbose = False
706      if mlab == None:
707        mlab = setMlab( m )
708
709      cc0 = misc_utils.getExptSum( self.dq, mlab, l1 )
710      ks = sorted( list( cc0.keys() ) )
711      if self.verbose:
712        print ('Experiment summary: %s %s' % (mlab,', '.join( ['%s: %s' % (k,len(cc0[k])) for k in ks] ) ) )
713
714      if m2 in [None, 'TOTAL']:
715        x = self.acc
716      else:
717        x = self.sc.volByExpt( l1, m2, pmax=pmax )
718
719##self.volByExpt( l1, e, pmax=pmax, cc=cc, retainRedundantRank=retainRedundantRank, intersection=intersection, adsCount=adsCount )
720        v0 = self.sc.volByMip( m, pmax=pmax,  exptid=m2 )
721####
722        if cc==None:
723          cc = collections.defaultdict( int )
724        for e in self.sc.volByE:
725          if self.verbose:
726             print ('INFO.mlab.... %s: %s: %s' % ( mlab, e, len( self.sc.volByE[e][2] ) ) )
727          for v in self.sc.volByE[e][2]:
728             cc[v] += self.sc.volByE[e][2][v]
729        xxx = 0
730        for v in cc:
731          xxx += cc[v]
732####
733        if acc:
734          for e in self.sc.volByE:
735            self.accAdd(self.sc.volByE[e])
736
737      if m2 not in [ None, 'TOTAL']:
738          im2 = self.dq.inx.uid[m2]
739          ismip = im2._h.label == 'mip'
740          mlab2 = im2.label
741
742          x0 = 0
743          for e in self.sc.volByE:
744            if exptids == None or e in exptids:
745              x = self.sc.volByE[e]
746              if x[0] > 0:
747                collector[mlab].a[mlab2] += x[0]
748                x0 += x[0]
749      else:
750          ismip = False
751          mlab2 = 'TOTAL'
752          x0 = x[0]
753
754      if mlab2 == 'TOTAL' and x0 == 0:
755        print ( 'no data detected for %s' % mlab )
756
757      if x0 > 0:
758#
759# create sum for each table
760#
761        xs = 0
762        kkc = '_%s_%s' % (mlab,mlab2)
763        kkct = '_%s_%s' % (mlab,'TOTAL')
764        if m2 in [None, 'TOTAL']:
765          x = self.acc
766          x2 = set(x[2].keys() )
767          for k in x[2].keys():
768           i = self.dq.inx.uid[k]
769           xxx =  x[2][k]
770           xs += xxx
771        else:
772          x2 = set()
773          for e in self.sc.volByE:
774            if exptids == None or e in exptids:
775              x = self.sc.volByE[e]
776              x2 = x2.union( set( x[2].keys() ) )
777              for k in x[2].keys():
778               i = self.dq.inx.uid[k]
779               xxx =  x[2][k]
780               xs += xxx
781               if xxx > 0:
782                collector[kkc].a[i.mipTable] += xxx
783                if ismip:
784                  collector[kkct].a[i.mipTable] += xxx
785
786##
787## One user was getting false error message here, with ('%s' % x0) == ('%s' % xs)
788##
789        if abs(x0 -xs) > 1.e-8*( abs(x0) + abs(xs) ):
790          print ( 'ERROR.0088: consistency problem %s  %s %s %s' % (m,m2,x0,xs) )
791        if x0 == 0:
792          print ( 'Zero size: %s, %s' % (m,m2) )
793          if len( x[2].keys() ) > 0:
794             print ( 'ERROR:zero: %s, %s: %s' % (m,m2,str(x[2].keys()) ) )
795
796        if acc and m2 not in [ None, 'TOTAL']:
797          collector[mlab].a['TOTAL'] += x0
798
799        dd = collections.defaultdict( list )
800        lll = set()
801        for v in x2:
802          vi = self.sc.dq.inx.uid[v]
803          if vi._h.label != 'remarks':
804            f,t,l,tt,d,u = (vi.frequency,vi.mipTable,vi.label,vi.title,vi.description,vi.uid)
805            lll.add(u)
806            dd[t].append( (f,t,l,tt,d,u) )
807
808        if len( dd.keys() ) > 0:
809          collector[mlab].dd[mlab2] = dd
810          if m2 not in [ None, 'TOTAL']:
811            if im2._h.label == 'experiment':
812              dothis = self.sc.tierMax >= min( im2.tier )
813###
814### BUT ... there is a treset in the request item .... it may be that some variables are excluded ...
815###         need the variable list itself .....
816###
817          makeTab( self.sc.dq, subset=lll, dest='%s/%s-%s_%s_%s' % (self.odir,mlab,mlab2,self.sc.tierMax,pmax), collected=collector[kkc].a,
818              mcfgNote=self.sc.mcfgNote,
819              txt=self.doTxt, xls=self.doXls, txtOpts=self.txtOpts )
820
821styls = styles()
822
823htmlStyle = {}
824htmlStyle['CMORvar'] = {'getIrefs':['__all__']}
825htmlStyle['requestVarGroup'] = {'getIrefs':['requestVar','requestLink']}
826htmlStyle['var'] = {'getIrefs':['CMORvar']}
827htmlStyle['objective'] = {'getIrefs':['objectiveLink']}
828htmlStyle['requestLink'] = {'getIrefs':['objectiveLink','requestItem']}
829htmlStyle['exptgroup'] = {'getIrefs':['__all__']}
830htmlStyle['requestItem'] = {'getIrefs':['__all__']}
831htmlStyle['experiment'] = {'getIrefs':['__all__']}
832htmlStyle['mip'] = {'getIrefs':['__all__']}
833htmlStyle['miptable'] = {'getIrefs':['__all__']}
834htmlStyle['remarks'] = {'getIrefs':['__all__']}
835htmlStyle['grids'] = {'getIrefs':['__all__']}
836htmlStyle['varChoice'] = {'getIrefs':['__all__']}
837htmlStyle['spatialShape'] = {'getIrefs':['__all__']}
838htmlStyle['temporalShape'] = {'getIrefs':['__all__']}
839htmlStyle['structure']    = {'getIrefs':['__all__']}
840htmlStyle['cellMethods']  = {'getIrefs':['__all__']}
841htmlStyle['standardname'] = {'getIrefs':['__all__']}
842htmlStyle['varRelations'] = {'getIrefs':['__all__']}
843htmlStyle['varRelLnk']    = {'getIrefs':['__all__']}
844htmlStyle['units']        = {'getIrefs':['__all__']}
845htmlStyle['timeSlice']    = {'getIrefs':['__all__']}
846
847if __name__ == "__main__":
848  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'
849  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'
850  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'
851  assert os.path.isdir( 'tables' ), 'Before running this script you need to create a "tables" sub-directory, or edit the makeTab class'
852
853  dq = dreq.loadDreq( htmlStyles=htmlStyle, manifest='out/dreqManifest.txt' )
854##
855## add special styles to dq object "itemStyle" dictionary.
856##
857
858  dq.itemStyles['standardname'] = styls.snLink
859  dq.itemStyles['var'] = styls.varLink
860  dq.itemStyles['mip'] = styls.mipLink
861  dq.itemStyles['CMORvar'] = styls.cmvLink
862  dq.itemStyles['objective'] = styls.objLink
863  dq.itemStyles['units'] = styls.unitLink
864  dq.itemStyles['structure'] = styls.strLink
865  dq.itemStyles['cellMethods'] = styls.cmLink
866  dq.itemStyles['objectiveLink'] = styls.objLnkLink
867  dq.itemStyles['requestVarGroup'] = styls.vgrpLink
868  dq.itemStyles['requestLink'] = styls.rqlLink02
869  dq.itemStyles['requestItem'] = styls.rqiLink02
870  dq.itemStyles['spatialShape'] = styls.labTtl
871  dq.coll['var'].items[0].__class__._linkAttrStyle['sn'] = styls.snLink01
872  dq.coll['CMORvar'].items[0].__class__._linkAttrStyle['stid'] = styls.stidLink01
873##dq.coll['requestVarGroup'].items[0].__class__._linkAttrStyle['requestVar'] = styls.rqvLink01
874  dq.itemStyles['requestVar'] = styls.rqvLink01
875
876  dreq.dreqItemBase._extraHtml['requestVarGroup'] = rvgExtraTable.vgx1(dq).mxoGet
877  dreq.dreqItemBase.__charmeEnable__['var'] = nt__charmeEnable( 'test','http://clipc-services.ceda.ac.uk/dreq' )
878
879  ht = htmlTrees(dq)
880  dq.makeHtml( annotations={'var':ht.anno}, ttl0='Data Request [%s]' % dreq.version )
881  try:
882    import xlsxwriter
883    mt = makeTab( dq)
884  except:
885    print ('Could not make tables ...')
886    raise
887  mp = makePurl()
888  mj = makeJs( dq )
Note: See TracBrowser for help on using the repository browser.