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

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

further volume estimate bugs fixed

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