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

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

misc

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 )
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,only=False):
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    mipsToDo = self.mips + ['TOTAL',]
48    if only != False:
49      mipsToDo = [only,]
50    for m in mipsToDo:
51      if m == 'TOTAL':
52        l1 = sc.rqiByMip( set( self.mips ) )
53      else:
54        l1 = sc.rqiByMip( m )
55
56      self.cc[m].dd = {}
57      self.cc[m].ee = {}
58      tabs.accReset()
59      for m2 in self.mipsp + ['TOTAL',]:
60        xx = [i for i in self.dq.coll['experiment'].items if i.mip == m2]
61        self.cc[m].ee[m2] = xx
62##
63## need to check this option, and add a template for a view summarising the experiments for each mip-mip combinations
64##
65## sss=True not yet tested
66##
67        sss = True
68        if sss:
69          for i in xx:
70            tabs.doTable(m,l1,i.uid,pmax,self.cc,acc=False)
71          tabs.doTable(m,l1,m2,pmax,self.cc)
72          if only == False:
73            self.makeMMhtml(m,m2)
74        else:
75          tabs.doTable(m,l1,m2,pmax,self.cc)
76
77    if only == False:
78      self.writeMips(sss)
79
80  def makeMMhtml(self,m,m2):
81    """Make a html page for data requested by MIP 'm' from MIP 'm2' experiments"""
82    fss = '%s-%s_%s_%s.html' % (m,m2,self.tiermax, self.pmax)
83    kc = '_%s_%s' % (m,m2)
84    if len( self.cc[kc].a.keys() ) == 0:
85      return
86    oo = open( 'tabs03/%s' % fss, 'w' )
87    ttl = 'Date requested by %s from %s experiments (tier %s, priority %s)' % (m,m2,self.tiermax,self.pmax)
88    jsh = ''
89    pream = '<h1>%s</h1>\n' % ttl
90    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)
91    pream += '<ul>'
92    kc = '_%s_%s' % (m,m2)
93    for k in sorted( self.cc[kc].a.keys() ):
94      pream += '<li>%s: %s</li>\n' % (k,vfmt(self.cc[kc].a[k]*2.) )
95    pream += '</ul>'
96
97    bdy = pream + '<table>\n'
98    bdy += '<tr><th>Experiment</th><th>Volume (and link to variable lists)</th></tr>\n'
99    if  m2 == 'TOTAL':
100      labs = sorted( [x for x in self.cc[m].a.keys() if x in self.sc.exptByLabel] )
101    else:
102      labs = sorted( [i.label for i in self.cc[m].ee[m2] if (i.label in self.cc[m].a and i._h.label == 'experiment')] )
103
104    for ilab in labs:
105        x = self.cc[m].a[ilab]*2.
106        if x > 0:
107          s = vfmt( x )
108          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)
109    bdy += '</table>\n'
110
111    oo.write( self.dq.pageTmpl % (ttl, jsh, '../', '../index.html', bdy ) )
112    oo.close()
113   
114  def writeMips(self,sss=False):
115
116    oo = open( 'tab01_%s_%s.texfrag' % (self.tiermax,self.pmax), 'w' )
117    mmh = []
118    mhdr = [ '\\rot{80}{%s}' % m for m in self.mipsp + ['TOTAL',]]
119    mhdrh = [ '<th><div><span>%s</span></div></th>' % m for m in self.mipsp]
120    oo.write( string.join(['',] + mhdr, ' & ' ) + '\\\\ \n\\hline\n' )
121    mmh.append( '<table>\n<tr class="rotate">' + string.join(['<th></th>',] + mhdrh ) + '</tr>\n' )
122    htmltmpl_head = '<html><body>\n' 
123
124    for m in self.mips + ['TOTAL',]:
125      ll = [m,]
126      llh = [m,]
127      ttl = 0.
128      cct = collections.defaultdict( int )
129      xt = 0.
130      for m2 in self.mipsp + ['TOTAL',]:
131       if m2 in self.cc[m].dd:
132        oo1 = open( 'html/tt/rq-%s-expt-%s.html' % (m,m2), 'w' )
133        oo1.write( htmltmpl_head  )
134        oo1.write( '''<div class="demo">\n<div id="tabs">\n<ul>''' )
135        ks = sorted( self.cc[m].dd[m2].keys() )
136        for t in ks:
137                   this1 = '<li><a href="#tabs-%s">%s</a></li>' % (t,t )
138                   oo1.write( this1 )
139        oo1.write( '</ul>' )
140        for k in ks:
141            oo1.write( '<div id="tabs-%s">\n' % k )
142            oo1.write( '<table><tr>' )
143            for h in ['Frequency','Table','Label','Title','Description','UID' ]:
144              oo1.write( '<td>%s</td>' % h )
145            for t in self.cc[m].dd[m2][k]:
146              oo1.write( '\n</tr><tr>\n' )
147              oo1.write( string.join( ['<td>%s</td>' % x for x in t ] ) + '\n' )
148            oo1.write( '</tr></table></div>\n' )
149   
150        oo1.write( '</body></html>' )
151       
152       if m2 in self.cc[m].dd or m2 == 'TOTAL':
153        if self.cc[m].a[m2] == 0:
154          ll.append( '' )
155          llh.append( '' )
156        else:
157          try:
158            if m2 == 'TOTAL':
159              x = xt
160            else:
161              x = self.cc[m].a[m2]*2.
162              xt += x
163
164            s = vfmt( x )
165            kc = '_%s_%s' % (m,m2)
166            if m2 == 'TOTAL':
167              sm = string.join( ['%s: %s' % (k,vfmt(cct[k]*2.)) for k in sorted( cct ) ], '; ' )
168              print m,cct
169              s1 = '<b><span title="%s">%s</span></b>' % (sm,s)
170              s = '<b>%s</b>' % s
171            else:
172               for k in self.cc[kc].a.keys():
173                cct[k] += self.cc[kc].a[k]
174            ll.append( s )
175            fn = '%s-%s_%s_%s.xlsx' % (m,m2,self.tiermax, self.pmax)
176            sm = string.join( ['%s: %s' % (k,vfmt(self.cc[kc].a[k]*2.)) for k in sorted( self.cc[kc].a.keys() ) ], '; ' )
177            if m2 == 'TOTAL':
178              #llh.append( s1 )
179              fn = '%s-%s_%s_%s.xlsx' % (m,'all',self.tiermax, self.pmax)
180            if sss:
181              fss = '%s-%s_%s_%s.html' % (m,m2,self.tiermax, self.pmax)
182              llh.append( '<a title="By table: %s" href="tabs03/%s">%s</a>' % (sm,fss,s) )
183            else:
184              llh.append( '<a title="By table: %s" href="data/tabs02/%s">%s</a>' % (sm,fn,s) )
185          except:
186            print ( 'Failed to compute element: %s,%s  %s' % (m,m2, str(self.cc[m].a[m2]) ) )
187            raise
188       else:
189          ll.append( '' )
190          llh.append( '' )
191      oo.write( string.join(ll, ' & ' ) + '\\\\ \n\\hline\n' )
192      mmh.append( '<tr>' + string.join(['<td>%s</td>' % x for x in llh] ) + '</tr>\n' )
193    mmh.append( '</table>' )
194    ttl = 'Data volume overview, upto tier %s and priority %s -- provisional' % (self.tiermax, self.pmax) 
195    bdy = '''<h1>%s</h1>
196<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
197<a href="https://earthsystemcog.org/projects/wip/CMIP6DataRequest" title="Data Request CoG page">Data Request home page</a>.</b></p>
198''' % ttl
199    bdy += string.join( mmh, '\n' )
200    ooh = open( 'tab01_%s_%s.html' % (self.tiermax,self.pmax), 'w' )
201    ooh.write( self.dq.pageTmpl % (ttl, jsh, './', './index.html', bdy ) )
202    ooh.close()
203    oo.close()
204
205
206if __name__ == "__main__":
207  sc = scope.dreqQuery()
208  r = r1( sc, tiermax=1, pmax=1 )
209  r = r1( sc, tiermax=3, pmax=3 )
Note: See TracBrowser for help on using the repository browser.