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

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

check

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