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

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

misc

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