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

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

updates

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
13class c1(object):
14  def __init__(self):
15    self.a = collections.defaultdict( int )
16class c2(object):
17  def __init__(self):
18    self.a = collections.defaultdict( list )
19
20class r1(object):
21  def __init__(self,sc,tiermax=1,pmax=1):
22    self.sc = sc
23    sc.setTierMax( tiermax )
24    self.cc = collections.defaultdict( c1 )
25    self.dq = sc.dq
26    mips = ['AerChemMIP', 'C4MIP', 'CFMIP', 'DAMIP', 'DCPP', 'FAFMIP', 'GeoMIP', 'GMMIP', 'HighResMIP', 'ISMIP6', 'LS3MIP', 'LUMIP', 'OMIP', 'PMIP', 'RFMIP', 'ScenarioMIP', 'VolMIP', 'CORDEX', 'DynVar', 'SIMIP', 'VIACSAB']
27    mipsp = ['DECK','CMIP6',] + mips[:-4]
28    for m in mips + ['TOTAL',]:
29      if m == 'TOTAL':
30        l1 = sc.rqiByMip( set( mips ) )
31      else:
32        l1 = sc.rqiByMip( m )
33      self.cc[m].dd = {}
34      for m2 in mipsp:
35        x = sc.volByExpt( l1, m2, expFullEx=True )
36        self.cc[m].a[m2] += x[0]
37        self.cc[m].a['TOTAL'] += x[0]
38        dd = collections.defaultdict( list )
39        lll = set()
40        for v in x[2].keys():
41          vi = sc.dq.inx.uid[v]
42          if vi._h.label != 'remarks':
43            f,t,l,tt,d,u = (vi.frequency,vi.mipTable,vi.label,vi.title,vi.description,vi.uid)
44            lll.add(u)
45            dd[t].append( (f,t,l,tt,d,u) )
46        if len( dd.keys() ) > 0:
47          self.cc[m].dd[m2] = dd
48          makeTables.makeTab( subset=lll, dest='tab2/%s-%s_%s_%s.xlsx' % (m,m2,tiermax,pmax) )
49         
50    oo = open( 'tab01_%s_%s.texfrag' % (tiermax,pmax), 'w' )
51    mmh = []
52    mhdr = [ '\\rot{80}{%s}' % m for m in mipsp + ['TOTAL',]]
53    mhdrh = [ '<th><div><span>%s</span></div></th>' % m for m in mipsp]
54    oo.write( string.join(['',] + mhdr, ' & ' ) + '\\\\ \n\\hline\n' )
55    mmh.append( '<table>\n<tr class="rotate">' + string.join(['<th></th>',] + mhdrh ) + '</tr>\n' )
56    htmltmpl_head = '<html><body>\n' 
57    for m in mips + ['TOTAL',]:
58      ll = [m,]
59      llh = [m,]
60      ttl = 0.
61      for m2 in mipsp + ['TOTAL',]:
62       if m2 in self.cc[m].dd:
63        oo1 = open( 'html/tt/rq-%s-expt-%s.html' % (m,m2), 'w' )
64        oo1.write( htmltmpl_head  )
65        oo1.write( '''<div class="demo">\n<div id="tabs">\n<ul>''' )
66        ks = sorted( self.cc[m].dd[m2].keys() )
67        for t in ks:
68                   this1 = '<li><a href="#tabs-%s">%s</a></li>' % (t,t )
69                   oo1.write( this1 )
70        oo1.write( '</ul>' )
71        for k in ks:
72            oo1.write( '<div id="tabs-%s">\n' % k )
73            oo1.write( '<table><tr>' )
74            for h in ['Frequency','Table','Label','Title','Description','UID' ]:
75              oo1.write( '<td>%s</td>' % h )
76            for t in self.cc[m].dd[m2][k]:
77              oo1.write( '\n</tr><tr>\n' )
78              oo1.write( string.join( ['<td>%s</td>' % x for x in t ] ) + '\n' )
79            oo1.write( '</tr></table></div>\n' )
80   
81        oo1.write( '</body></html>' )
82       
83       
84       if m2 in self.cc[m].dd or m2 == 'TOTAL':
85        if self.cc[m].a[m2] == 0:
86          ll.append( '' )
87          llh.append( '' )
88        else:
89          try:
90            x = self.cc[m].a[m2]
91            if x < 1.e12:
92              s = '%sG' % int( x*1.e-9 ) 
93            elif x < 1.e13:
94              s = '%3.1fT' % ( x*1.e-12 )
95            elif x < 1.e15:
96              s = '%3iT' % int( x*1.e-12 )
97            else:
98              s = '{:,.2f}'.format( self.cc[m].a[m2]*1.e-9 ) 
99            if m2 == 'TOTAL':
100              s = '{\\bf %s}' % s
101            ll.append( s )
102            fn = '%s-%s_%s_%s.xlsx' % (m,m2,tiermax, pmax)
103            llh.append( '<a title="Excel variable list" href="data/tabs02/%s">%s</a>' % (fn,s) )
104          except:
105            print 'Failed to compute element: %s,%s  %s' % (m,m2, str(self.cc[m].a[m2]) )
106            raise
107       else:
108          ll.append( '' )
109          llh.append( '' )
110      oo.write( string.join(ll, ' & ' ) + '\\\\ \n\\hline\n' )
111      mmh.append( '<tr>' + string.join(['<td>%s</td>' % x for x in llh] ) + '</tr>\n' )
112    mmh.append( '</table>' )
113    ttl = 'Data volume overview, upto tier %s and priority %s -- provisional' % (tiermax, pmax) 
114    bdy = '''<h1>%s</h1>
115<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
116<a href="https://earthsystemcog.org/projects/wip/CMIP6DataRequest" title="Data Request CoG page">Data Request home page</a>.</b></p>
117''' % ttl
118    bdy += string.join( mmh, '\n' )
119    ooh = open( 'tab01_%s_%s.htmlfrag' % (tiermax,pmax), 'w' )
120    ooh.write( self.dq.pageTmpl % (ttl, jsh, './', './index.html', bdy ) )
121    ooh.close()
122    oo.close()
123
124if __name__ == "__main__":
125  sc = scope.dreqQuery()
126  r = r1( sc, tiermax=1, pmax=1 )
127  r = r1( sc, tiermax=3, pmax=3 )
Note: See TracBrowser for help on using the repository browser.