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

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

release cand

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