source: CMIP6dreqbuild/trunk/src/framework/dreqPy/overviewTabs.py @ 769

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

grid id helper added; consistent volume est

Line 
1
2
3import collections, string
4import dreq
5import 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 )
31
32class c2(object):
33  def __init__(self):
34    self.a = collections.defaultdict( list )
35
36hmap0 = {'CMIP6':'Historical'}
37class r1(object):
38  def __init__(self,sc,tiermax=1,pmax=1,only=False,vols=None):
39
40    assert vols == None or type(vols) == type( () ), 'vols argument must be none or tuple of length 2: %s' % type(vols)
41    self.dq = sc.dq
42    self.mips = ['AerChemMIP', 'C4MIP', 'CFMIP', 'DAMIP', 'DCPP', 'FAFMIP', 'GeoMIP', 'GMMIP', 'HighResMIP', 'ISMIP6', 'LS3MIP', 'LUMIP', 'OMIP', 'PMIP', 'RFMIP', 'ScenarioMIP', 'VolMIP', 'CORDEX', 'DynVar', 'SIMIP', 'VIACSAB']
43    self.mipsp = ['DECK','CMIP6',] + self.mips[:-4]
44    self.sc = sc
45    self.pmax=pmax
46    self.cc = collections.defaultdict( c1 )
47    self.ee = {}
48    for m2 in self.mipsp + ['TOTAL',]:
49        xx = [i for i in self.dq.coll['experiment'].items if i.mip == m2]
50        self.ee[m2] = xx
51
52    if vols != None:
53      assert len(vols) == 3, 'vols must be a tuple of length 3 (containing dictionaries ...): %s' % len(vols)
54      self.tiermax = sc.tierMax
55      vmm, vme, vmmt = vols
56      for m in vmm:
57        for m2 in vmm[m]:
58          self.cc[m].a[m2] = vmm[m][m2]
59          self.cc[m].a['TOTAL'] += vmm[m][m2]
60
61      for m in vme:
62        for e in vme[m]:
63          i = sc.dq.inx.uid[e]
64          if i._h.label == 'experiment':
65            self.cc[m].a[i.label] = vme[m][e]
66
67      for m in vmmt:
68        for m2,t in vmmt[m]: 
69           self.cc['_%s_%s' % (m,m2)].a[t] = vmmt[m][(m2,t)]
70        self.makeMMhtml(m,m2)
71
72      self.writeMips(True)
73      return
74    self.mode = 'def'
75
76    self.tiermax=tiermax
77    sc.setTierMax( tiermax )
78    tabs = makeTables.tables( sc, self.mips )
79
80    mipsToDo = self.mips + ['TOTAL',]
81    if only != False:
82      mipsToDo = [only,]
83    for m in mipsToDo:
84      if m == 'TOTAL':
85        l1 = sc.rqiByMip( set( self.mips ) )
86      else:
87        l1 = sc.rqiByMip( m )
88
89      self.cc[m].dd = {}
90      tabs.accReset()
91##
92## need to check this option, and add a template for a view summarising the experiments for each mip-mip combinations
93##
94## sss=True not yet tested
95##
96      for m2 in self.mipsp + ['TOTAL',]:
97        sss = True
98        if sss:
99          for i in xx:
100            tabs.doTable(m,l1,i.uid,pmax,self.cc,acc=False)
101          tabs.doTable(m,l1,m2,pmax,self.cc)
102          if only == False:
103            self.makeMMhtml(m,m2)
104        else:
105          tabs.doTable(m,l1,m2,pmax,self.cc)
106
107    if only == False:
108      self.writeMips(sss)
109
110  def makeMMhtml(self,m,m2):
111    """Make a html page for data requested by MIP 'm' from MIP 'm2' experiments"""
112    fss = '%s-%s_%s_%s.html' % (m,m2,self.tiermax, self.pmax)
113    kc = '_%s_%s' % (m,m2)
114    if len( self.cc[kc].a.keys() ) == 0:
115      return
116    oo = open( 'tabs03/%s' % fss, 'w' )
117    ttl = 'Date requested by %s from %s experiments (tier %s, priority %s)' % (m,m2,self.tiermax,self.pmax)
118    jsh = ''
119    pream = '<h1>%s</h1>\n' % ttl
120    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)
121    pream += '<ul>'
122    kc = '_%s_%s' % (m,m2)
123    for k in sorted( self.cc[kc].a.keys() ):
124      pream += '<li>%s: %s</li>\n' % (k,vfmt(self.cc[kc].a[k]*2.) )
125    pream += '</ul>'
126
127    bdy = pream + '<table>\n'
128    bdy += '<tr><th>Experiment</th><th>Volume (and link to variable lists)</th></tr>\n'
129    if  m2 == 'TOTAL':
130      labs = sorted( [x for x in self.cc[m].a.keys() if x in self.sc.exptByLabel] )
131    else:
132      labs = sorted( [i.label for i in self.ee[m2] if (i.label in self.cc[m].a and i._h.label == 'experiment')] )
133
134    for ilab in labs:
135        x = self.cc[m].a[ilab]*2.
136        if x > 0:
137          s = vfmt( x )
138          bdy += '<tr><td>%s</td><td><a href="../data/tabs02/%s-%s_%s_%s.xlsx">%s</a></td></tr>\n' % (ilab,m,ilab,self.tiermax, self.pmax,s)
139    bdy += '</table>\n'
140
141    oo.write( self.dq.pageTmpl % (ttl, jsh, '../', '../index.html', bdy ) )
142    oo.close()
143   
144  def writeMips(self,sss=False):
145
146    oo = open( 'tab01_%s_%s.texfrag' % (self.tiermax,self.pmax), 'w' )
147    mmh = []
148    mhdr = [ '\\rot{80}{%s}' % hmap0.get(m,m) for m in self.mipsp + ['TOTAL',]]
149    mhdrh = [ '<th><div><span>%s</span></div></th>' % hmap0.get(m,m) for m in self.mipsp + ['TOTAL',]]
150    oo.write( string.join(['',] + mhdr, ' & ' ) + '\\\\ \n\\hline\n' )
151    mmh.append( '<table>\n<tr class="rotate">' + string.join(['<th></th>',] + mhdrh ) + '</tr>\n' )
152    htmltmpl_head = '<html><body>\n' 
153
154##
155## the "oo1" tables need a little more work to be useful
156## not supported by the "vols" entry option of this class
157##
158    doOo1 = False
159
160    for m in self.mips + ['TOTAL',]:
161      ll = [m,]
162      llh = [m,]
163      ttl = 0.
164      cct = collections.defaultdict( int )
165      xt = 0.
166      for m2 in self.mipsp + ['TOTAL',]:
167       if doOo1:
168         if m2 in self.cc[m].dd:
169           oo1 = open( 'html/tt/rq-%s-expt-%s.html' % (m,m2), 'w' )
170           oo1.write( htmltmpl_head  )
171           oo1.write( '''<div class="demo">\n<div id="tabs">\n<ul>''' )
172           ks = sorted( self.cc[m].dd[m2].keys() )
173           for t in ks:
174              this1 = '<li><a href="#tabs-%s">%s</a></li>' % (t,t )
175              oo1.write( this1 )
176           oo1.write( '</ul>' )
177           for k in ks:
178               oo1.write( '<div id="tabs-%s">\n' % k )
179               oo1.write( '<table><tr>' )
180               for h in ['Frequency','Table','Label','Title','Description','UID' ]:
181                 oo1.write( '<td>%s</td>' % h )
182               for t in self.cc[m].dd[m2][k]:
183                 oo1.write( '\n</tr><tr>\n' )
184                 oo1.write( string.join( ['<td>%s</td>' % x for x in t ] ) + '\n' )
185               oo1.write( '</tr></table></div>\n' )
186   
187           oo1.write( '</body></html>' )
188           oo1.close()
189       
190       if self.cc[m].a[m2] == 0:
191          ll.append( '' )
192          llh.append( '' )
193       else:
194          try:
195            if m2 == 'TOTAL':
196              x = xt
197            else:
198              x = self.cc[m].a[m2]*2.
199              xt += x
200
201            s = vfmt( x )
202            kc = '_%s_%s' % (m,m2)
203            if m2 == 'TOTAL':
204              sm = string.join( ['%s: %s' % (k,vfmt(cct[k]*2.)) for k in sorted( cct ) ], '; ' )
205              print m,cct
206              s1 = '<b><span title="%s">%s</span></b>' % (sm,s)
207              s = '<b>%s</b>' % s
208            else:
209               for k in self.cc[kc].a.keys():
210                cct[k] += self.cc[kc].a[k]
211            ll.append( s )
212            fn = '%s-%s_%s_%s.xlsx' % (m,m2,self.tiermax, self.pmax)
213            sm = string.join( ['%s: %s' % (k,vfmt(self.cc[kc].a[k]*2.)) for k in sorted( self.cc[kc].a.keys() ) ], '; ' )
214            if m2 == 'TOTAL':
215              #llh.append( s1 )
216              fn = '%s-%s_%s_%s.xlsx' % (m,'all',self.tiermax, self.pmax)
217            if sss:
218              fss = '%s-%s_%s_%s.html' % (m,m2,self.tiermax, self.pmax)
219              llh.append( '<a title="By table: %s" href="tabs03/%s">%s</a>' % (sm,fss,s) )
220            else:
221              llh.append( '<a title="By table: %s" href="data/tabs02/%s">%s</a>' % (sm,fn,s) )
222          except:
223            print ( 'Failed to compute element: %s,%s  %s' % (m,m2, str(self.cc[m].a[m2]) ) )
224            raise
225      oo.write( string.join(ll, ' & ' ) + '\\\\ \n\\hline\n' )
226      mmh.append( '<tr>' + string.join(['<td>%s</td>' % x for x in llh] ) + '</tr>\n' )
227    mmh.append( '</table>' )
228    ttl = 'Data volume overview, upto tier %s and priority %s -- provisional' % (self.tiermax, self.pmax) 
229    bdy = '''<h1>%s</h1>
230<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
231<a href="https://earthsystemcog.org/projects/wip/CMIP6DataRequest" title="Data Request CoG page">Data Request home page</a>.</b></p>
232''' % ttl
233    bdy += string.join( mmh, '\n' )
234    ooh = open( 'tab01_%s_%s.html' % (self.tiermax,self.pmax), 'w' )
235    ooh.write( self.dq.pageTmpl % (ttl, jsh, './', './index.html', bdy ) )
236    ooh.close()
237    oo.close()
238
239
240if __name__ == "__main__":
241  sc = scope.dreqQuery()
242  r = r1( sc, tiermax=1, pmax=1 )
243  r = r1( sc, tiermax=3, pmax=3 )
Note: See TracBrowser for help on using the repository browser.