source: CMIP6dreqbuild/trunk/src/framework/overviewTabs.py @ 550

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/overviewTabs.py@550
Revision 550, 5.8 KB checked in by mjuckes, 5 years ago (diff)

added more volume info to overview table

Line 
1
2
3import collections, string
4from dreqPy import dreq
5from dreqPy import scope
6import xlsxwriter
7import makeTables
8
9jsh='''
10<link type="text/css" href="/css/dreq.css" rel="Stylesheet" />
11'''
12
13def vfmt( x ):
14            if x < 1.e9:
15              s = '%sM' % int( x*1.e-6 )
16            elif x < 1.e12:
17              s = '%sG' % int( x*1.e-9 )
18            elif x < 1.e13:
19              s = '%3.1fT' % ( x*1.e-12 )
20            elif x < 1.e15:
21              s = '%3iT' % int( x*1.e-12 )
22            else:
23              s = '{:,.2f}'.format
24            return s
25
26class c1(object):
27  def __init__(self):
28    self.a = collections.defaultdict( int )
29class c2(object):
30  def __init__(self):
31    self.a = collections.defaultdict( list )
32
33class r1(object):
34  def __init__(self,sc,tiermax=1,pmax=1):
35    self.sc = sc
36    sc.setTierMax( tiermax )
37    self.cc = collections.defaultdict( c1 )
38    self.dq = sc.dq
39    mips = ['AerChemMIP', 'C4MIP', 'CFMIP', 'DAMIP', 'DCPP', 'FAFMIP', 'GeoMIP', 'GMMIP', 'HighResMIP', 'ISMIP6', 'LS3MIP', 'LUMIP', 'OMIP', 'PMIP', 'RFMIP', 'ScenarioMIP', 'VolMIP', 'CORDEX', 'DynVar', 'SIMIP', 'VIACSAB']
40    mipsp = ['DECK','CMIP6',] + mips[:-4]
41    for m in mips + ['TOTAL',]:
42      if m == 'TOTAL':
43        l1 = sc.rqiByMip( set( mips ) )
44      else:
45        l1 = sc.rqiByMip( m )
46      self.cc[m].dd = {}
47      for m2 in mipsp:
48        x = sc.volByExpt( l1, m2, expFullEx=True )
49        self.cc[m].a[m2] += x[0]
50#
51# create sum for each table
52#
53        for k in x[1].keys():
54          xxx =  sum( [ x[1][k][kk] for kk in x[1][k] ] )
55          if xxx > 0:
56            self.cc['_%s_%s' % (m,m2)].a[k] += xxx
57
58        self.cc[m].a['TOTAL'] += x[0]
59        dd = collections.defaultdict( list )
60        lll = set()
61        for v in x[2].keys():
62          vi = sc.dq.inx.uid[v]
63          if vi._h.label != 'remarks':
64            f,t,l,tt,d,u = (vi.frequency,vi.mipTable,vi.label,vi.title,vi.description,vi.uid)
65            lll.add(u)
66            dd[t].append( (f,t,l,tt,d,u) )
67        if len( dd.keys() ) > 0:
68          self.cc[m].dd[m2] = dd
69          makeTables.makeTab( subset=lll, dest='tab2/%s-%s_%s_%s.xlsx' % (m,m2,tiermax,pmax) )
70         
71    oo = open( 'tab01_%s_%s.texfrag' % (tiermax,pmax), 'w' )
72    mmh = []
73    mhdr = [ '\\rot{80}{%s}' % m for m in mipsp + ['TOTAL',]]
74    mhdrh = [ '<th><div><span>%s</span></div></th>' % m for m in mipsp]
75    oo.write( string.join(['',] + mhdr, ' & ' ) + '\\\\ \n\\hline\n' )
76    mmh.append( '<table>\n<tr class="rotate">' + string.join(['<th></th>',] + mhdrh ) + '</tr>\n' )
77    htmltmpl_head = '<html><body>\n' 
78    for m in mips + ['TOTAL',]:
79      ll = [m,]
80      llh = [m,]
81      ttl = 0.
82      for m2 in mipsp + ['TOTAL',]:
83       if m2 in self.cc[m].dd:
84        oo1 = open( 'html/tt/rq-%s-expt-%s.html' % (m,m2), 'w' )
85        oo1.write( htmltmpl_head  )
86        oo1.write( '''<div class="demo">\n<div id="tabs">\n<ul>''' )
87        ks = sorted( self.cc[m].dd[m2].keys() )
88        for t in ks:
89                   this1 = '<li><a href="#tabs-%s">%s</a></li>' % (t,t )
90                   oo1.write( this1 )
91        oo1.write( '</ul>' )
92        for k in ks:
93            oo1.write( '<div id="tabs-%s">\n' % k )
94            oo1.write( '<table><tr>' )
95            for h in ['Frequency','Table','Label','Title','Description','UID' ]:
96              oo1.write( '<td>%s</td>' % h )
97            for t in self.cc[m].dd[m2][k]:
98              oo1.write( '\n</tr><tr>\n' )
99              oo1.write( string.join( ['<td>%s</td>' % x for x in t ] ) + '\n' )
100            oo1.write( '</tr></table></div>\n' )
101   
102        oo1.write( '</body></html>' )
103       
104       
105       if m2 in self.cc[m].dd or m2 == 'TOTAL':
106        if self.cc[m].a[m2] == 0:
107          ll.append( '' )
108          llh.append( '' )
109        else:
110          try:
111            x = self.cc[m].a[m2]
112            s = vfmt( x )
113            ##if x < 1.e12:
114              ##s = '%sG' % int( x*1.e-9 )
115            ##elif x < 1.e13:
116              ##s = '%3.1fT' % ( x*1.e-12 )
117            ##elif x < 1.e15:
118              ##s = '%3iT' % int( x*1.e-12 )
119            ##else:
120              ##s = '{:,.2f}'.format( self.cc[m].a[m2]*1.e-9 )
121            if m2 == 'TOTAL':
122              s = '{\\bf %s}' % s
123            ll.append( s )
124            fn = '%s-%s_%s_%s.xlsx' % (m,m2,tiermax, pmax)
125            kc = '_%s_%s' % (m,m2)
126            sm = string.join( ['%s: %s' % (k,vfmt(self.cc[kc].a[k])) for k in sorted( self.cc[kc].a.keys() ) ], '; ' )
127            llh.append( '<a title="Excel variable list: %s" href="data/tabs02/%s">%s</a>' % (sm,fn,s) )
128          except:
129            print 'Failed to compute element: %s,%s  %s' % (m,m2, str(self.cc[m].a[m2]) )
130            raise
131       else:
132          ll.append( '' )
133          llh.append( '' )
134      oo.write( string.join(ll, ' & ' ) + '\\\\ \n\\hline\n' )
135      mmh.append( '<tr>' + string.join(['<td>%s</td>' % x for x in llh] ) + '</tr>\n' )
136    mmh.append( '</table>' )
137    ttl = 'Data volume overview, upto tier %s and priority %s -- provisional' % (tiermax, pmax) 
138    bdy = '''<h1>%s</h1>
139<p>Data volumes are estimated for nominal model with 1 degree resolution and 40 levels in the atmosphere and 0.5 degrees with 60 levels in the ocean.  The "Requesting MIP" (rows) is the MIP specifying the data required to meet their scientific objectives. The "designing MIP" (columns) is the MIP specifying the experimental design. <b>The figures below represent work in progress: there are still omissions and flaws, more details are on the
140<a href="https://earthsystemcog.org/projects/wip/CMIP6DataRequest" title="Data Request CoG page">Data Request home page</a>.</b></p>
141''' % ttl
142    bdy += string.join( mmh, '\n' )
143    ooh = open( 'tab01_%s_%s.htmlfrag' % (tiermax,pmax), 'w' )
144    ooh.write( self.dq.pageTmpl % (ttl, jsh, './', './index.html', bdy ) )
145    ooh.close()
146    oo.close()
147
148if __name__ == "__main__":
149  sc = scope.dreqQuery()
150  r = r1( sc, tiermax=1, pmax=1 )
151  r = r1( sc, tiermax=3, pmax=3 )
Note: See TracBrowser for help on using the repository browser.