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

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

cleaned scope.py

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