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

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

bugs in volume estimates in tables

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