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

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

cleaning CMOR tables

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