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

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

cleaned content for GeoMIP and DynVAR

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[2].keys():
54          i = self.dq.inx.uid[k]
55          xxx =  x[2][k]
56          if xxx > 0:
57            self.cc['_%s_%s' % (m,m2)].a[i.mipTable] += xxx
58
59        self.cc[m].a['TOTAL'] += x[0]
60        dd = collections.defaultdict( list )
61        lll = set()
62        for v in x[2].keys():
63          vi = sc.dq.inx.uid[v]
64          if vi._h.label != 'remarks':
65            f,t,l,tt,d,u = (vi.frequency,vi.mipTable,vi.label,vi.title,vi.description,vi.uid)
66            lll.add(u)
67            dd[t].append( (f,t,l,tt,d,u) )
68        if len( dd.keys() ) > 0:
69          self.cc[m].dd[m2] = dd
70          makeTables.makeTab( subset=lll, dest='tab2/%s-%s_%s_%s.xlsx' % (m,m2,tiermax,pmax) )
71         
72    oo = open( 'tab01_%s_%s.texfrag' % (tiermax,pmax), 'w' )
73    mmh = []
74    mhdr = [ '\\rot{80}{%s}' % m for m in mipsp + ['TOTAL',]]
75    mhdrh = [ '<th><div><span>%s</span></div></th>' % m for m in mipsp]
76    oo.write( string.join(['',] + mhdr, ' & ' ) + '\\\\ \n\\hline\n' )
77    mmh.append( '<table>\n<tr class="rotate">' + string.join(['<th></th>',] + mhdrh ) + '</tr>\n' )
78    htmltmpl_head = '<html><body>\n' 
79    for m in mips + ['TOTAL',]:
80      ll = [m,]
81      llh = [m,]
82      ttl = 0.
83      for m2 in mipsp + ['TOTAL',]:
84       if m2 in self.cc[m].dd:
85        oo1 = open( 'html/tt/rq-%s-expt-%s.html' % (m,m2), 'w' )
86        oo1.write( htmltmpl_head  )
87        oo1.write( '''<div class="demo">\n<div id="tabs">\n<ul>''' )
88        ks = sorted( self.cc[m].dd[m2].keys() )
89        for t in ks:
90                   this1 = '<li><a href="#tabs-%s">%s</a></li>' % (t,t )
91                   oo1.write( this1 )
92        oo1.write( '</ul>' )
93        for k in ks:
94            oo1.write( '<div id="tabs-%s">\n' % k )
95            oo1.write( '<table><tr>' )
96            for h in ['Frequency','Table','Label','Title','Description','UID' ]:
97              oo1.write( '<td>%s</td>' % h )
98            for t in self.cc[m].dd[m2][k]:
99              oo1.write( '\n</tr><tr>\n' )
100              oo1.write( string.join( ['<td>%s</td>' % x for x in t ] ) + '\n' )
101            oo1.write( '</tr></table></div>\n' )
102   
103        oo1.write( '</body></html>' )
104       
105       
106       if m2 in self.cc[m].dd or m2 == 'TOTAL':
107        if self.cc[m].a[m2] == 0:
108          ll.append( '' )
109          llh.append( '' )
110        else:
111          try:
112            x = self.cc[m].a[m2]
113            s = vfmt( x )
114            ##if x < 1.e12:
115              ##s = '%sG' % int( x*1.e-9 )
116            ##elif x < 1.e13:
117              ##s = '%3.1fT' % ( x*1.e-12 )
118            ##elif x < 1.e15:
119              ##s = '%3iT' % int( x*1.e-12 )
120            ##else:
121              ##s = '{:,.2f}'.format( self.cc[m].a[m2]*1.e-9 )
122            if m2 == 'TOTAL':
123              s1 = '<b>%s</b>' % s
124              s = '{\\bf %s}' % s
125            ll.append( s )
126            fn = '%s-%s_%s_%s.xlsx' % (m,m2,tiermax, pmax)
127            kc = '_%s_%s' % (m,m2)
128            sm = string.join( ['%s: %s' % (k,vfmt(self.cc[kc].a[k])) for k in sorted( self.cc[kc].a.keys() ) ], '; ' )
129            if m2 == 'TOTAL':
130              llh.append( s1 )
131            else:
132              llh.append( '<a title="Excel variable list: %s" href="data/tabs02/%s">%s</a>' % (sm,fn,s) )
133          except:
134            print 'Failed to compute element: %s,%s  %s' % (m,m2, str(self.cc[m].a[m2]) )
135            raise
136       else:
137          ll.append( '' )
138          llh.append( '' )
139      oo.write( string.join(ll, ' & ' ) + '\\\\ \n\\hline\n' )
140      mmh.append( '<tr>' + string.join(['<td>%s</td>' % x for x in llh] ) + '</tr>\n' )
141    mmh.append( '</table>' )
142    ttl = 'Data volume overview, upto tier %s and priority %s -- provisional' % (tiermax, pmax) 
143    bdy = '''<h1>%s</h1>
144<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
145<a href="https://earthsystemcog.org/projects/wip/CMIP6DataRequest" title="Data Request CoG page">Data Request home page</a>.</b></p>
146''' % ttl
147    bdy += string.join( mmh, '\n' )
148    ooh = open( 'tab01_%s_%s.html' % (tiermax,pmax), 'w' )
149    ooh.write( self.dq.pageTmpl % (ttl, jsh, './', './index.html', bdy ) )
150    ooh.close()
151    oo.close()
152
153if __name__ == "__main__":
154  sc = scope.dreqQuery()
155  r = r1( sc, tiermax=1, pmax=1 )
156  r = r1( sc, tiermax=3, pmax=3 )
Note: See TracBrowser for help on using the repository browser.