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

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

Adding hdldemo

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