source: CMIP6dreqbuild/trunk/src/framework/scripts/slist.py @ 1322

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/scripts/slist.py
Revision 1322, 5.8 KB checked in by mjuckes, 9 months ago (diff)

misc

Line 
1import collections
2import docx
3from docx.enum.table import WD_TABLE_ALIGNMENT
4from docx.enum.text import WD_ALIGN_PARAGRAPH
5from utils import dreq, collect
6dq = dreq.loadDreq()
7collect.add( dq )
8
9print ( 'VERSION: %s' % dq.version )
10
11class DocxTable(object):
12  def __init__(self,ofn):
13    self.doc = docx.Document('Doc1.docx')
14    self.doc.save( ofn )
15    self.ofn = ofn
16    self.pos = 2
17    self.nrow = 3
18    self.table = self.doc.tables[0]
19
20  def addRow(self,ll,notes=False):
21    """Add a row of test values to a table, provided as a list.
22
23    notes: if set True, add an additional row, merging cells after the first.
24    """
25
26    self.pos += 1
27    if self.pos > self.nrow:
28      self.table.add_row()
29      self.nrow += 1
30    for k in range( len(ll) ):
31      self.table.cell(self.pos-1, k).text = str(ll[k])
32
33    if notes:
34      self.table.add_row()
35      self.nrow += 1
36      self.pos += 1
37      c = self.table.cell(self.pos-1, 0)
38      p = c.add_paragraph( 'Notes' )
39      p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
40      a = self.table.cell(self.pos-1,1)
41      b = self.table.cell(self.pos-1,len(ll)-1)
42      a.merge(b)
43    self.doc.save( self.ofn )
44
45  def close(self):
46    self.doc.save( self.ofn )
47     
48
49
50class Stabs(object):
51  defaults = { 'uid':'Identifier, unique within a given version of the data request.',
52               'label':'A single word,  with restricted character set. Specialization of SKOS prefLabel.',
53               'title':'A few words describing the object. Specialization of Dublin Core title.',
54               'description':'An extended description of the object/concept. Specialization of SKOS definition.' }
55  def __init__(self,dq):
56    self.dq = dq
57    self.es = dict()
58
59## load in description ... which doesn't make it into the main structure ... yet
60    self.es2 = dict()
61    for t in dq.c.ttl2:
62      self.es2[t.uid] = dq.c.__desc__.get( t.label, '' )
63
64    self.cc = collections.defaultdict(dict)
65    for i in dq.coll['__sect__'].items:
66      self.es[i.label] = i
67    for i in dq.coll['__main__'].items:
68      a,b = i.uid.split( '::' )
69      x,y = b.split('.')
70      self.cc[x][y] = i
71
72    ee = dict()
73    oo = open( 'inputs.texlet', 'w' )
74    for s in dq.coll.keys():
75      if s[0] != '_':
76        if s in self.cc:
77          ee[ self.es[s].title ] = s
78        else:
79          print ('SECTION NOT FOUND: %s' % s )
80
81    ns = len( ee.keys() )
82    na = sum( [len(self.cc[sect].keys()) for sect in self.cc] )
83    for t in sorted( ee.keys() ):
84          s = ee[t]
85          oo.write( '\\input{slist_%s.texlet}\n' % s )
86          self.psect(s)
87    oo.close()
88    print ( 'ns=%s, na=%s' % (ns,na) )
89
90  def _latex(self,x):
91    return x.replace( '_', '\\_' )
92
93  def psect(self,sect):
94    assert sect in self.es, 'Section not found in __sect__: %s' % sect
95    assert sect in self.cc, 'Section not found in __main__: %s' % sect
96    print (self.es[sect].title)
97    print (self.cc[sect].keys())
98    oo = open( 'slist_%s.texlet' % sect, 'w' )
99    oo.write( '\\section*{%s [%s]}\n' % (self.es[sect].title,self.es[sect].label) )
100   
101    oo.write( '%s\n\n' % self._latex(self.dq.c._desc[self.es[sect].label] ) )
102
103    f = lambda x: '%s: %s' % ({'label':'00','title':'01','description':'02','uid':'03'}.get(x,'99'),x)
104
105    oo.write( '\\sectionTable{\n' )
106    ox = DocxTable( 'docxDocs/%s.docx' % sect )
107    for k in sorted( self.cc[sect].keys(), key=f ):
108      this = self.cc[sect][k]
109
110      dd = this.description.strip()
111      print ( '**** %s, %s:: [%s]' % (sect,this.label,this.description) )
112      thatx = [this.label, this.title, this.description, this.type]
113      if this.label in self.defaults and dd == '':
114        this.description = '{\\it %s}' % self.defaults[k]
115        thatx[2] = '%s [DEF]' % self.defaults[k]
116        print ( '--> %s' % this.description )
117
118      lab = this.label
119      desc = thatx[2]
120      if this.useClass == None:
121        clss = ''
122      else:
123        clss = this.useClass.strip()
124
125      lab += ' [%s]' % thatx[3]
126      if clss != '':
127        lab += ' {%s}' % clss
128      if not this.required:
129        lab += ' (OPT)'
130      thatx[0] = lab
131      ##if usage != '':
132        ##desc += ' [%s]' % usage
133        ##thatx[2] = desc
134
135      that = [this.label, this.title, this.description, '\\ttt{%s}' % this.type, '\\ttt{%s}' % this.uid ]
136      line = '\\hline\n' + ' & '.join( [self._latex(x) for x in that[:4]] ) + ' \\\\ \n'
137      oo.write( line )
138      withNotes = sect in ['grids']
139      ox.addRow( thatx[:3], notes=withNotes )
140       
141    oo.write( '}% End of sectionTable argument\n' )
142    oo.close()
143    ox.close()
144
145   
146   
147
148for k in sorted( dq.coll.keys() ):
149  if len( dq.coll[k].items ) > 0:
150    i = dq.coll[k].items[0]
151    print ( '%s & %s & %s &  \\' % (k,len( dq.coll[k].items ), i._h.title ) )
152
153
154nn = 0
155for i in dq.coll['requestLink'].items:
156  n1 = len( dq.inx.iref_by_sect[i.refid].a['requestVar'] )
157  n2 = len( i._get__expt() )
158  n3 = len( dq.inx.iref_by_sect[i.uid].a['objectiveLink'] )
159  nn += n1*n2*n3
160
161nnn = 1
162for y in [len(dq.coll[x].items) for x in ['CMORvar','experiment','objective']]:
163  nnn = nnn*y
164
165print ( 'Virtual requests (var-expt-objective): %s [%s, %4.2f%%]' % (nn, nnn, float(100*nn)/nnn) )
166
167nn = 0
168ee = dict()
169for i in dq.coll['experiment'].items:
170  n1 = len( i._get__CMORvar() )
171  ee[i.label] = n1
172  nn += n1
173
174ks =  sorted( ee.keys(), key=lambda x: ee[x], reverse=True)
175
176
177nnn = 1
178for y in [len(dq.coll[x].items) for x in ['CMORvar','experiment']]:
179  nnn = nnn*y
180
181print ( 'Virtual requests (var-expt): %s [%s, %4.2f%%]' % (nn, nnn, float(100*nn)/nnn) )
182
183c1 = [x for x in dq.coll['CMORvar'].items  if 'requestVar' not in dq.inx.iref_by_sect[x].a]
184nnn = len( dq.coll['CMORvar'].items )
185print ( 'CMORVvars: %s [%s]' % (nnn,len(c1)) )
186for k in ks[:5]:
187  print ( 'Var count (top): %s [%s, %4.2f%%]' % (k,ee[k], float(100*ee[k])/nnn) )
188for k in ks[-5:]:
189  print ( 'Var count (bottom): %s [%s, %4.2f%%]' % (k,ee[k], float(100*ee[k])/nnn) )
190
191ss = Stabs(dq)
Note: See TracBrowser for help on using the repository browser.