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

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

python version tolerance

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