source: CMIP6dreqbuild/trunk/src/framework/dreqPy/overviewTabs.py @ 766

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

cleaned overview tabs

Line 
1
2
3import collections, string
4import dreq
5import 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            elif x < 1.e18:
23              s = '%3iP' % int( x*1.e-15 )
24            else:
25              s = '{:,.2f}'.format( x*1.e-9 ) 
26            return s
27
28class c1(object):
29  def __init__(self):
30    self.a = collections.defaultdict( int )
31class c2(object):
32  def __init__(self):
33    self.a = collections.defaultdict( list )
34
35hmap0 = {'CMIP6':'Historical'}
36class r1(object):
37  def __init__(self,sc,tiermax=1,pmax=1,only=False):
38    self.pmax=pmax
39    self.tiermax=tiermax
40    self.sc = sc
41    sc.setTierMax( tiermax )
42    self.cc = collections.defaultdict( c1 )
43    self.dq = sc.dq
44    self.mips = ['AerChemMIP', 'C4MIP', 'CFMIP', 'DAMIP', 'DCPP', 'FAFMIP', 'GeoMIP', 'GMMIP', 'HighResMIP', 'ISMIP6', 'LS3MIP', 'LUMIP', 'OMIP', 'PMIP', 'RFMIP', 'ScenarioMIP', 'VolMIP', 'CORDEX', 'DynVar', 'SIMIP', 'VIACSAB']
45    self.mipsp = ['DECK','CMIP6',] + self.mips[:-4]
46    tabs = makeTables.tables( sc, self.mips )
47
48    mipsToDo = self.mips + ['TOTAL',]
49    if only != False:
50      mipsToDo = [only,]
51    for m in mipsToDo:
52      if m == 'TOTAL':
53        l1 = sc.rqiByMip( set( self.mips ) )
54      else:
55        l1 = sc.rqiByMip( m )
56
57      self.cc[m].dd = {}
58      self.cc[m].ee = {}
59      tabs.accReset()
60      for m2 in self.mipsp + ['TOTAL',]:
61        xx = [i for i in self.dq.coll['experiment'].items if i.mip == m2]
62        self.cc[m].ee[m2] = xx
63##
64## need to check this option, and add a template for a view summarising the experiments for each mip-mip combinations
65##
66## sss=True not yet tested
67##
68        sss = True
69        if sss:
70          for i in xx:
71            tabs.doTable(m,l1,i.uid,pmax,self.cc,acc=False)
72          tabs.doTable(m,l1,m2,pmax,self.cc)
73          if only == False:
74            self.makeMMhtml(m,m2)
75        else:
76          tabs.doTable(m,l1,m2,pmax,self.cc)
77
78    if only == False:
79      self.writeMips(sss)
80
81  def makeMMhtml(self,m,m2):
82    """Make a html page for data requested by MIP 'm' from MIP 'm2' experiments"""
83    fss = '%s-%s_%s_%s.html' % (m,m2,self.tiermax, self.pmax)
84    kc = '_%s_%s' % (m,m2)
85    if len( self.cc[kc].a.keys() ) == 0:
86      return
87    oo = open( 'tabs03/%s' % fss, 'w' )
88    ttl = 'Date requested by %s from %s experiments (tier %s, priority %s)' % (m,m2,self.tiermax,self.pmax)
89    jsh = ''
90    pream = '<h1>%s</h1>\n' % ttl
91    pream += '<p>All variables in one <a href="../data/tabs02/%s-%s_%s_%s.xlsx">Excel file</a></p>\n' % (m,m2,self.tiermax, self.pmax)
92    pream += '<ul>'
93    kc = '_%s_%s' % (m,m2)
94    for k in sorted( self.cc[kc].a.keys() ):
95      pream += '<li>%s: %s</li>\n' % (k,vfmt(self.cc[kc].a[k]*2.) )
96    pream += '</ul>'
97
98    bdy = pream + '<table>\n'
99    bdy += '<tr><th>Experiment</th><th>Volume (and link to variable lists)</th></tr>\n'
100    if  m2 == 'TOTAL':
101      labs = sorted( [x for x in self.cc[m].a.keys() if x in self.sc.exptByLabel] )
102    else:
103      labs = sorted( [i.label for i in self.cc[m].ee[m2] if (i.label in self.cc[m].a and i._h.label == 'experiment')] )
104
105    for ilab in labs:
106        x = self.cc[m].a[ilab]*2.
107        if x > 0:
108          s = vfmt( x )
109          bdy += '<tr><td>%s</td><td><a href="../data/tabs02/%s-%s_%s_%s.xlsx">%s</a></td></tr>\n' % (ilab,m,ilab,self.tiermax, self.pmax,s)
110    bdy += '</table>\n'
111
112    oo.write( self.dq.pageTmpl % (ttl, jsh, '../', '../index.html', bdy ) )
113    oo.close()
114   
115  def writeMips(self,sss=False):
116
117    oo = open( 'tab01_%s_%s.texfrag' % (self.tiermax,self.pmax), 'w' )
118    mmh = []
119    mhdr = [ '\\rot{80}{%s}' % hmap0.get(m,m) for m in self.mipsp + ['TOTAL',]]
120    mhdrh = [ '<th><div><span>%s</span></div></th>' % hmap0.get(m,m) for m in self.mipsp + ['TOTAL',]]
121    oo.write( string.join(['',] + mhdr, ' & ' ) + '\\\\ \n\\hline\n' )
122    mmh.append( '<table>\n<tr class="rotate">' + string.join(['<th></th>',] + mhdrh ) + '</tr>\n' )
123    htmltmpl_head = '<html><body>\n' 
124
125    for m in self.mips + ['TOTAL',]:
126      ll = [m,]
127      llh = [m,]
128      ttl = 0.
129      cct = collections.defaultdict( int )
130      xt = 0.
131      for m2 in self.mipsp + ['TOTAL',]:
132       if m2 in self.cc[m].dd:
133        oo1 = open( 'html/tt/rq-%s-expt-%s.html' % (m,m2), 'w' )
134        oo1.write( htmltmpl_head  )
135        oo1.write( '''<div class="demo">\n<div id="tabs">\n<ul>''' )
136        ks = sorted( self.cc[m].dd[m2].keys() )
137        for t in ks:
138                   this1 = '<li><a href="#tabs-%s">%s</a></li>' % (t,t )
139                   oo1.write( this1 )
140        oo1.write( '</ul>' )
141        for k in ks:
142            oo1.write( '<div id="tabs-%s">\n' % k )
143            oo1.write( '<table><tr>' )
144            for h in ['Frequency','Table','Label','Title','Description','UID' ]:
145              oo1.write( '<td>%s</td>' % h )
146            for t in self.cc[m].dd[m2][k]:
147              oo1.write( '\n</tr><tr>\n' )
148              oo1.write( string.join( ['<td>%s</td>' % x for x in t ] ) + '\n' )
149            oo1.write( '</tr></table></div>\n' )
150   
151        oo1.write( '</body></html>' )
152       
153       if m2 in self.cc[m].dd or m2 == 'TOTAL':
154        if self.cc[m].a[m2] == 0:
155          ll.append( '' )
156          llh.append( '' )
157        else:
158          try:
159            if m2 == 'TOTAL':
160              x = xt
161            else:
162              x = self.cc[m].a[m2]*2.
163              xt += x
164
165            s = vfmt( x )
166            kc = '_%s_%s' % (m,m2)
167            if m2 == 'TOTAL':
168              sm = string.join( ['%s: %s' % (k,vfmt(cct[k]*2.)) for k in sorted( cct ) ], '; ' )
169              print m,cct
170              s1 = '<b><span title="%s">%s</span></b>' % (sm,s)
171              s = '<b>%s</b>' % s
172            else:
173               for k in self.cc[kc].a.keys():
174                cct[k] += self.cc[kc].a[k]
175            ll.append( s )
176            fn = '%s-%s_%s_%s.xlsx' % (m,m2,self.tiermax, self.pmax)
177            sm = string.join( ['%s: %s' % (k,vfmt(self.cc[kc].a[k]*2.)) for k in sorted( self.cc[kc].a.keys() ) ], '; ' )
178            if m2 == 'TOTAL':
179              #llh.append( s1 )
180              fn = '%s-%s_%s_%s.xlsx' % (m,'all',self.tiermax, self.pmax)
181            if sss:
182              fss = '%s-%s_%s_%s.html' % (m,m2,self.tiermax, self.pmax)
183              llh.append( '<a title="By table: %s" href="tabs03/%s">%s</a>' % (sm,fss,s) )
184            else:
185              llh.append( '<a title="By table: %s" href="data/tabs02/%s">%s</a>' % (sm,fn,s) )
186          except:
187            print ( 'Failed to compute element: %s,%s  %s' % (m,m2, str(self.cc[m].a[m2]) ) )
188            raise
189       else:
190          ll.append( '' )
191          llh.append( '' )
192      oo.write( string.join(ll, ' & ' ) + '\\\\ \n\\hline\n' )
193      mmh.append( '<tr>' + string.join(['<td>%s</td>' % x for x in llh] ) + '</tr>\n' )
194    mmh.append( '</table>' )
195    ttl = 'Data volume overview, upto tier %s and priority %s -- provisional' % (self.tiermax, self.pmax) 
196    bdy = '''<h1>%s</h1>
197<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
198<a href="https://earthsystemcog.org/projects/wip/CMIP6DataRequest" title="Data Request CoG page">Data Request home page</a>.</b></p>
199''' % ttl
200    bdy += string.join( mmh, '\n' )
201    ooh = open( 'tab01_%s_%s.html' % (self.tiermax,self.pmax), 'w' )
202    ooh.write( self.dq.pageTmpl % (ttl, jsh, './', './index.html', bdy ) )
203    ooh.close()
204    oo.close()
205
206
207if __name__ == "__main__":
208  sc = scope.dreqQuery()
209  r = r1( sc, tiermax=1, pmax=1 )
210  r = r1( sc, tiermax=3, pmax=3 )
Note: See TracBrowser for help on using the repository browser.