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

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

further debugging on overview tables; per expt view

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            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    for m in self.mips + ['TOTAL',]:
46      if m == 'TOTAL':
47        l1 = sc.rqiByMip( set( self.mips ) )
48      else:
49        l1 = sc.rqiByMip( m )
50
51      self.cc[m].dd = {}
52      self.cc[m].ee = {}
53      for m2 in self.mipsp:
54        xx = [i for i in self.dq.coll['experiment'].items if i.mip == m2]
55        self.cc[m].ee[m2] = xx
56##
57## need to check this option, and add a template for a view summarising the experiments for each mip-mip combinations
58##
59## sss=True not yet tested
60##
61        sss = True
62        if sss:
63          for i in xx:
64            self.doTable(m,l1,i.uid,self.cc,acc=False)
65          self.makeMMhtml(m,m2)
66          self.doTable(m,l1,m2,self.cc)
67        else:
68          self.doTable(m,l1,m2,self.cc)
69
70    self.writeMips(sss)
71
72  def makeMMhtml(self,m,m2):
73    fss = '%s-%s_%s_%s.html' % (m,m2,self.tiermax, self.pmax)
74    oo = open( 'tabs03/%s' % fss, 'w' )
75    ttl = 'Date requested by %s from %s experiments' % (m,m2)
76    jsh = ''
77    bdy = '<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)
78
79    bdy += '<table>\n'
80    for i in self.cc[m].ee[m2]:
81      x = self.cc[m].a[i.uid]*2.
82      s = vfmt( x )
83      bdy += '<tr><td>%s</td><td><a href="../data/tabs02/%s-%s_%s_%s.xlsx">%s</a></td></tr>\n' % (i.label,m,i.uid,self.tiermax, self.pmax,s)
84    bdy += '</table>\n'
85
86    oo.write( self.dq.pageTmpl % (ttl, jsh, '../', '../index.html', bdy ) )
87    oo.close()
88   
89   
90
91  def writeMips(self,sss=False):
92
93    oo = open( 'tab01_%s_%s.texfrag' % (self.tiermax,self.pmax), 'w' )
94    mmh = []
95    mhdr = [ '\\rot{80}{%s}' % m for m in self.mipsp + ['TOTAL',]]
96    mhdrh = [ '<th><div><span>%s</span></div></th>' % m for m in self.mipsp]
97    oo.write( string.join(['',] + mhdr, ' & ' ) + '\\\\ \n\\hline\n' )
98    mmh.append( '<table>\n<tr class="rotate">' + string.join(['<th></th>',] + mhdrh ) + '</tr>\n' )
99    htmltmpl_head = '<html><body>\n' 
100
101    for m in self.mips + ['TOTAL',]:
102      ll = [m,]
103      llh = [m,]
104      ttl = 0.
105      for m2 in self.mipsp + ['TOTAL',]:
106       if m2 in self.cc[m].dd:
107        oo1 = open( 'html/tt/rq-%s-expt-%s.html' % (m,m2), 'w' )
108        oo1.write( htmltmpl_head  )
109        oo1.write( '''<div class="demo">\n<div id="tabs">\n<ul>''' )
110        ks = sorted( self.cc[m].dd[m2].keys() )
111        for t in ks:
112                   this1 = '<li><a href="#tabs-%s">%s</a></li>' % (t,t )
113                   oo1.write( this1 )
114        oo1.write( '</ul>' )
115        for k in ks:
116            oo1.write( '<div id="tabs-%s">\n' % k )
117            oo1.write( '<table><tr>' )
118            for h in ['Frequency','Table','Label','Title','Description','UID' ]:
119              oo1.write( '<td>%s</td>' % h )
120            for t in self.cc[m].dd[m2][k]:
121              oo1.write( '\n</tr><tr>\n' )
122              oo1.write( string.join( ['<td>%s</td>' % x for x in t ] ) + '\n' )
123            oo1.write( '</tr></table></div>\n' )
124   
125        oo1.write( '</body></html>' )
126       
127       if m2 in self.cc[m].dd or m2 == 'TOTAL':
128        if self.cc[m].a[m2] == 0:
129          ll.append( '' )
130          llh.append( '' )
131        else:
132          try:
133            x = self.cc[m].a[m2]*2.
134            s = vfmt( x )
135            if m2 == 'TOTAL':
136              s1 = '<b>%s</b>' % s
137              s = '{\\bf %s}' % s
138            ll.append( s )
139            fn = '%s-%s_%s_%s.xlsx' % (m,m2,self.tiermax, self.pmax)
140            kc = '_%s_%s' % (m,m2)
141            sm = string.join( ['%s: %s' % (k,vfmt(self.cc[kc].a[k]*2.)) for k in sorted( self.cc[kc].a.keys() ) ], '; ' )
142            if m2 == 'TOTAL':
143              llh.append( s1 )
144            elif sss:
145              fss = '%s-%s_%s_%s.html' % (m,m2,self.tiermax, self.pmax)
146              llh.append( '<a title="Excel variable list: %s" href="tabs03/%s">%s</a>' % (sm,fss,s) )
147            else:
148              llh.append( '<a title="Excel variable list: %s" href="data/tabs02/%s">%s</a>' % (sm,fn,s) )
149          except:
150            print 'Failed to compute element: %s,%s  %s' % (m,m2, str(self.cc[m].a[m2]) )
151            raise
152       else:
153          ll.append( '' )
154          llh.append( '' )
155      oo.write( string.join(ll, ' & ' ) + '\\\\ \n\\hline\n' )
156      mmh.append( '<tr>' + string.join(['<td>%s</td>' % x for x in llh] ) + '</tr>\n' )
157    mmh.append( '</table>' )
158    ttl = 'Data volume overview, upto tier %s and priority %s -- provisional' % (self.tiermax, self.pmax) 
159    bdy = '''<h1>%s</h1>
160<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
161<a href="https://earthsystemcog.org/projects/wip/CMIP6DataRequest" title="Data Request CoG page">Data Request home page</a>.</b></p>
162''' % ttl
163    bdy += string.join( mmh, '\n' )
164    ooh = open( 'tab01_%s_%s.html' % (self.tiermax,self.pmax), 'w' )
165    ooh.write( self.dq.pageTmpl % (ttl, jsh, './', './index.html', bdy ) )
166    ooh.close()
167    oo.close()
168
169  def doTable(self,m,l1,m2,collector,acc=True):
170        """acc allows accumulation of values to be switched off when called in single expt mode"""
171       
172        x = sc.volByExpt( l1, m2, expFullEx=(m2 in self.mips), pmax=self.pmax )
173        collector[m].a[m2] += x[0]
174#
175# create sum for each table
176#
177        xs = 0
178        for k in x[2].keys():
179          i = self.dq.inx.uid[k]
180          xxx =  x[2][k]
181          xs += xxx
182          if xxx > 0:
183            collector['_%s_%s' % (m,m2)].a[i.mipTable] += xxx
184        assert x[0] == xs, 'ERROR.0088: consistency problem %s  %s %s %s' % (m,m2,x[0],xs)
185        if m == 'FAFMIP' and m2 == 'DECK':
186          print 'FAFMIP [1]:: ',x[1].keys()
187          print 'FAFMIP [2]:: ',collector['_FAFMIP_DECK'].a.keys()
188
189        if acc:
190          collector[m].a['TOTAL'] += x[0]
191        dd = collections.defaultdict( list )
192        lll = set()
193        for v in x[2].keys():
194          vi = sc.dq.inx.uid[v]
195          if vi._h.label != 'remarks':
196            f,t,l,tt,d,u = (vi.frequency,vi.mipTable,vi.label,vi.title,vi.description,vi.uid)
197            lll.add(u)
198            dd[t].append( (f,t,l,tt,d,u) )
199        if len( dd.keys() ) > 0:
200          collector[m].dd[m2] = dd
201          makeTables.makeTab( subset=lll, dest='tab2/%s-%s_%s_%s.xlsx' % (m,m2,self.tiermax,self.pmax) )
202
203if __name__ == "__main__":
204  sc = scope.dreqQuery()
205  r = r1( sc, tiermax=1, pmax=1 )
206  r = r1( sc, tiermax=3, pmax=3 )
Note: See TracBrowser for help on using the repository browser.