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

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

debugging and code cleaning of overview tables

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            else:
23              s = '{:,.2f}'.format( x*1.e-9 ) 
24            return s
25
26class c1(object):
27  def __init__(self):
28    self.a = collections.defaultdict( int )
29class c2(object):
30  def __init__(self):
31    self.a = collections.defaultdict( list )
32
33class r1(object):
34  def __init__(self,sc,tiermax=1,pmax=1):
35    self.pmax=pmax
36    self.tiermax=tiermax
37    self.sc = sc
38    sc.setTierMax( tiermax )
39    self.cc = collections.defaultdict( c1 )
40    self.dq = sc.dq
41    self.mips = ['AerChemMIP', 'C4MIP', 'CFMIP', 'DAMIP', 'DCPP', 'FAFMIP', 'GeoMIP', 'GMMIP', 'HighResMIP', 'ISMIP6', 'LS3MIP', 'LUMIP', 'OMIP', 'PMIP', 'RFMIP', 'ScenarioMIP', 'VolMIP', 'CORDEX', 'DynVar', 'SIMIP', 'VIACSAB']
42    self.mipsp = ['DECK','CMIP6',] + self.mips[:-4]
43    for m in self.mips + ['TOTAL',]:
44      if m == 'TOTAL':
45        l1 = sc.rqiByMip( set( self.mips ) )
46      else:
47        l1 = sc.rqiByMip( m )
48
49      self.cc[m].dd = {}
50      self.cc[m].ee = {}
51      for m2 in self.mipsp:
52        xx = [i for i in self.dq.coll['experiment'].items if i.mip == m2]
53        self.cc[m].ee[m2] = xx
54##
55## need to check this option, and add a template for a view summarising the experiments for each mip-mip combinations
56##
57## sss=True not yet tested
58##
59        sss = False
60        if sss:
61          for i in xx:
62            self.doTable(m,l1,i.uid,self.cc)
63        else:
64          self.doTable(m,l1,m2,self.cc)
65
66    self.writeMips()
67
68  def writeMips(self):
69
70    oo = open( 'tab01_%s_%s.texfrag' % (self.tiermax,self.pmax), 'w' )
71    mmh = []
72    mhdr = [ '\\rot{80}{%s}' % m for m in self.mipsp + ['TOTAL',]]
73    mhdrh = [ '<th><div><span>%s</span></div></th>' % m for m in self.mipsp]
74    oo.write( string.join(['',] + mhdr, ' & ' ) + '\\\\ \n\\hline\n' )
75    mmh.append( '<table>\n<tr class="rotate">' + string.join(['<th></th>',] + mhdrh ) + '</tr>\n' )
76    htmltmpl_head = '<html><body>\n' 
77
78    for m in self.mips + ['TOTAL',]:
79      ll = [m,]
80      llh = [m,]
81      ttl = 0.
82      for m2 in self.mipsp + ['TOTAL',]:
83       if m2 in self.cc[m].dd:
84        oo1 = open( 'html/tt/rq-%s-expt-%s.html' % (m,m2), 'w' )
85        oo1.write( htmltmpl_head  )
86        oo1.write( '''<div class="demo">\n<div id="tabs">\n<ul>''' )
87        ks = sorted( self.cc[m].dd[m2].keys() )
88        for t in ks:
89                   this1 = '<li><a href="#tabs-%s">%s</a></li>' % (t,t )
90                   oo1.write( this1 )
91        oo1.write( '</ul>' )
92        for k in ks:
93            oo1.write( '<div id="tabs-%s">\n' % k )
94            oo1.write( '<table><tr>' )
95            for h in ['Frequency','Table','Label','Title','Description','UID' ]:
96              oo1.write( '<td>%s</td>' % h )
97            for t in self.cc[m].dd[m2][k]:
98              oo1.write( '\n</tr><tr>\n' )
99              oo1.write( string.join( ['<td>%s</td>' % x for x in t ] ) + '\n' )
100            oo1.write( '</tr></table></div>\n' )
101   
102        oo1.write( '</body></html>' )
103       
104       
105       if m2 in self.cc[m].dd or m2 == 'TOTAL':
106        if self.cc[m].a[m2] == 0:
107          ll.append( '' )
108          llh.append( '' )
109        else:
110          try:
111            x = self.cc[m].a[m2]*2.
112            s = vfmt( x )
113            if m2 == 'TOTAL':
114              s1 = '<b>%s</b>' % s
115              s = '{\\bf %s}' % s
116            ll.append( s )
117            fn = '%s-%s_%s_%s.xlsx' % (m,m2,self.tiermax, self.pmax)
118            kc = '_%s_%s' % (m,m2)
119            sm = string.join( ['%s: %s' % (k,vfmt(self.cc[kc].a[k])) for k in sorted( self.cc[kc].a.keys() ) ], '; ' )
120            if m2 == 'TOTAL':
121              llh.append( s1 )
122            else:
123              llh.append( '<a title="Excel variable list: %s" href="data/tabs02/%s">%s</a>' % (sm,fn,s) )
124          except:
125            print 'Failed to compute element: %s,%s  %s' % (m,m2, str(self.cc[m].a[m2]) )
126            raise
127       else:
128          ll.append( '' )
129          llh.append( '' )
130      print ll
131      oo.write( string.join(ll, ' & ' ) + '\\\\ \n\\hline\n' )
132      mmh.append( '<tr>' + string.join(['<td>%s</td>' % x for x in llh] ) + '</tr>\n' )
133    mmh.append( '</table>' )
134    ttl = 'Data volume overview, upto tier %s and priority %s -- provisional' % (self.tiermax, self.pmax) 
135    bdy = '''<h1>%s</h1>
136<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
137<a href="https://earthsystemcog.org/projects/wip/CMIP6DataRequest" title="Data Request CoG page">Data Request home page</a>.</b></p>
138''' % ttl
139    bdy += string.join( mmh, '\n' )
140    ooh = open( 'tab01_%s_%s.html' % (self.tiermax,self.pmax), 'w' )
141    ooh.write( self.dq.pageTmpl % (ttl, jsh, './', './index.html', bdy ) )
142    ooh.close()
143    oo.close()
144
145  def doTable(self,m,l1,m2,collector):
146       
147        x = sc.volByExpt( l1, m2, expFullEx=True,pmax=self.pmax )
148        collector[m].a[m2] += x[0]
149#
150# create sum for each table
151#
152        for k in x[2].keys():
153          i = self.dq.inx.uid[k]
154          xxx =  x[2][k]
155          if xxx > 0:
156            collector['_%s_%s' % (m,m2)].a[i.mipTable] += xxx
157        if m == 'FAFMIP' and m2 == 'DECK':
158          print 'FAFMIP [1]:: ',x[1].keys()
159          print 'FAFMIP [2]:: ',collector['_FAFMIP_DECK'].a.keys()
160
161        collector[m].a['TOTAL'] += x[0]
162        dd = collections.defaultdict( list )
163        lll = set()
164        for v in x[2].keys():
165          vi = sc.dq.inx.uid[v]
166          if vi._h.label != 'remarks':
167            f,t,l,tt,d,u = (vi.frequency,vi.mipTable,vi.label,vi.title,vi.description,vi.uid)
168            lll.add(u)
169            dd[t].append( (f,t,l,tt,d,u) )
170        if len( dd.keys() ) > 0:
171          collector[m].dd[m2] = dd
172          makeTables.makeTab( subset=lll, dest='tab2/%s-%s_%s_%s.xlsx' % (m,m2,self.tiermax,self.pmax) )
173         
174
175if __name__ == "__main__":
176  sc = scope.dreqQuery()
177  #r = r1( sc, tiermax=1, pmax=1 )
178  r = r1( sc, tiermax=3, pmax=3 )
Note: See TracBrowser for help on using the repository browser.