source: CMIP6dreq/trunk/makeTables.py @ 460

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreq/trunk/makeTables.py@460
Revision 460, 9.5 KB checked in by mjuckes, 5 years ago (diff)

Updated request

Line 
1
2from dreqPy import dreq
3import collections, string, xlsxwriter, os
4import vrev
5
6class xlsx(object):
7  def __init__(self,fn):
8    self.wb = xlsxwriter.Workbook(fn)
9
10  def newSheet(self,name):
11    self.worksheet = self.wb.add_worksheet(name=name)
12    return self.worksheet
13
14  def close(self):
15    self.wb.close()
16
17#priority       long name       units   comment         questions & notes       output variable name    standard name   unconfirmed or proposed standard name   unformatted units       cell_methods    valid min       valid max       mean absolute min       mean absolute max       positive        type    CMOR dimensions CMOR variable name      realm   frequency       cell_measures   flag_values     flag_meanings
18
19strkeys = [u'procNote', u'uid', u'odims', u'flag_meanings', u'prov', u'title', u'tmid', u'label', u'cell_methods', u'coords', u'cell_measures', u'spid', u'flag_values', u'description']
20
21ntstr = collections.namedtuple( 'ntstr', strkeys )
22
23class cmpd(object):
24  def __init__(self,k):
25    self.k = k
26  def cmp(self,x,y):
27    return cmp( x.__dict__[self.k], y.__dict__[self.k] )
28
29class cmpd2(object):
30  def __init__(self,k1,k2):
31    self.k1 = k1
32    self.k2 = k2
33  def cmp(self,x,y):
34    if x.__dict__[self.k1] == y.__dict__[self.k1]:
35      return cmp( x.__dict__[self.k2], y.__dict__[self.k2] )
36    else:
37      return cmp( x.__dict__[self.k1], y.__dict__[self.k1] )
38
39class cmpdn(object):
40  def __init__(self,kl):
41    self.kl = kl
42  def cmp(self,x,y):
43    for k in self.kl:
44      if x.__dict__[k] != y.__dict__[k]:
45        return cmp( x.__dict__[k], y.__dict__[k] )
46   
47    return cmp( 0,0 )
48
49def cmpAnnex( x, y ):
50  ax = len(x) > 2 and x[:2] == 'em'
51  ay = len(y) > 2 and y[:2] == 'em'
52  bx = len(x) > 5 and x[:5] in ['CMIP5','CORDE','SPECS']
53  by = len(y) > 5 and y[:5] in ['CMIP5','CORDE','SPECS']
54  if ax  == ay and bx == by:
55    return cmp(x,y)
56  elif ax:
57    if by:
58      return cmp(0,1)
59    else:
60      return cmp(1,0)
61  elif ay:
62    if bx:
63      return cmp(1,0)
64    else:
65      return cmp(0,1)
66  elif bx:
67      return cmp(1,0)
68  else:
69    return cmp(0,1)
70
71import re
72
73
74class makePurl(object):
75  def __init__(self):
76    c1 = re.compile( '^[a-zA-Z][a-zA-Z0-9]*$' )
77    mv = dq.coll['var'].items
78    oo = open( 'htmlRewrite.txt', 'w' )
79    for v in mv:
80      if c1.match( v.label ):
81         oo.write( 'RewriteRule ^%s$ http://clipc-services.ceda.ac.uk/dreq/u/%s.html\n' % (v.label,v.uid) )
82      else:
83         print 'Match failed: ', v.label
84    oo.close()
85     
86class makeTab(object):
87  def __init__(self):
88    cmv = dq.coll['CMORvar'].items
89    tables = sorted( list( {i.mipTable for i in cmv} ), cmp=cmpAnnex )
90
91    addMips = True
92    if addMips:
93      c = vrev.checkVar(dq)
94
95    wb = xlsx( 'tables/test.xlsx' )
96
97    cell_format = wb.wb.add_format({'text_wrap': True})
98
99    mode = 'c'
100
101    ncga = 'NetCDF Global Attribute'
102    for t in tables:
103      oo = open( 'tables/test_%s.csv' % t, 'w' )
104      sht = wb.newSheet( t )
105      j = 0
106      if mode == 'c':
107        hrec = ['Priority','Long name', 'units', 'description', 'comment', 'Variable Name', 'CF Standard Name', 'cell_methods', 'positive', 'type', 'dimensions', 'CMOR Name', 'modeling_realm', 'frequency', 'cell_measures', 'prov', 'provNote','rowIndex']
108        hcmt = ['Default priority (generally overridden by settings in "requestVar" record)',ncga,'','','Name of variable in file','','','CMOR directive','','','CMOR name, unique within table','','','','','','','','','']
109        sht.set_column(1,1,40)
110        sht.set_column(3,3,50)
111        sht.set_column(4,4,30)
112        sht.set_column(5,5,50)
113        sht.set_column(6,6,30)
114        sht.set_column(9,9,40)
115      else:
116        hrec = ['','Long name', 'units', 'description', '', 'Variable Name', 'CF Standard Name', '','', 'cell_methods', 'valid_min', 'valid_max', 'ok_min_mean_abs', 'ok_max_mean_abs', 'positive', 'type', 'dimensions', 'CMOR name', 'modeling_realm', 'frequency', 'cell_measures', 'flag_values', 'flag_meanings', 'prov', 'provNote','rowIndex']
117      if addMips:
118        hrec.append( 'MIPs' )
119
120      hdr_cell_format = wb.wb.add_format({'text_wrap': True, 'font_size': 14, 'font_color':'#0000ff', 'bold':1, 'fg_color':'#aaaacc'})
121      sht.set_row(0,40)
122      for i in range(len(hrec)):
123          sht.write( j,i, hrec[i], hdr_cell_format )
124          if hcmt[i] != '':
125            sht.write_comment( j,i,hcmt[i])
126      thiscmv =  sorted( [v for v in cmv if v.mipTable == t], cmp=cmpdn(['prov','rowIndex','label']).cmp )
127     
128      for v in thiscmv:
129          cv = dq.inx.uid[ v.vid ]
130          strc = dq.inx.uid[ v.stid ]
131          sshp = dq.inx.uid[ strc.spid ]
132          tshp = dq.inx.uid[ strc.tmid ]
133          ok = all( [i._h.label != 'remarks' for i in [cv,strc,sshp,tshp]] )
134          #[u'shuffle', u'ok_max_mean_abs', u'vid', '_contentInitialised', u'valid_min', u'frequency', u'uid', u'title', u'rowIndex', u'positive', u'stid', u'mipTable', u'label', u'type', u'description', u'deflate_level', u'deflate', u'provNote', u'ok_min_mean_abs', u'modeling_realm', u'prov', u'valid_max']
135
136          if not ok:
137            print 'skipping %s %s' % (t,v.label)
138          else:
139            dims = []
140            dims += string.split( sshp.dimensions, '|' )
141            dims += string.split( tshp.dimensions, '|' )
142            dims += string.split( strc.odims, '|' )
143            dims += string.split( strc.coords, '|' )
144            dims = string.join( dims )
145            if mode == 'c':
146              orec = [str(v.defaultPriority),cv.title, cv.units, cv.description, v.description, cv.label, cv.sn, strc.cell_methods, v.positive, v.type, dims, v.label, v.modeling_realm, v.frequency, strc.cell_measures, v.prov,v.provNote,str(v.rowIndex)]
147            else:
148              orec = ['',cv.title, cv.units, v.description, '', cv.label, cv.sn, '','', strc.cell_methods, v.valid_min, v.valid_max, v.ok_min_mean_abs, v.ok_max_mean_abs, v.positive, v.type, dims, v.label, v.modeling_realm, v.frequency, strc.cell_measures, strc.flag_values, strc.flag_meanings,v.prov,v.provNote,str(v.rowIndex)]
149            if addMips:
150              thismips = c.chkCmv( v.uid )
151              orec.append( string.join( sorted( list( thismips) ),',') )
152
153            oo.write( string.join(orec, '\t' ) + '\n' )
154            j+=1
155            for i in range(len(orec)):
156              sht.write( j,i, orec[i], cell_format )
157      oo.close()
158    wb.close()
159
160hdr = """
161var getData  = {
162cols: function() {
163  var columns = [ {id:0, name:'Variable', field:0, width: 100},
164              {id:1, name:'Standard name', field:1, width: 210 },
165              {id:2, name:'Long name', field:2, width: 180},
166              {id:3, name:'Units', field:3, width: 180},
167              {id:4, name:'uid', field:4, width: 180}];
168 return columns;
169},
170data: function() {
171var data = [];
172"""
173ftr = """return data;
174}
175};
176"""
177rtmpl = 'data[%(n)s] = { "id":%(n)s, 0:"%(var)s",  1:"%(sn)s", 2:"%(ln)s", 3:"%(u)s", 4:"%(uid)s" };'
178
179class makeJs(object):
180  def __init__(self,dq):
181    n = 0
182    rl = []
183    for v in dq.coll['var'].items:
184      var = '%s %s' % (v.label,v.uid)
185      sn = v.sn
186      ln = v.title
187      u = v.units
188      uid = v.uid
189      rr = rtmpl % locals()
190      rl.append( rr )
191      n += 1
192    oo = open( 'data2.js', 'w' )
193    oo.write( hdr )
194    for r in rl:
195      oo.write( r + '\n' )
196    oo.write( ftr )
197    oo.close()
198   
199
200
201class styles(object):
202  def __init__(self):
203    pass
204
205  def snLink01(self,a,targ,frm=''):
206    if targ._h.label == 'remarks':
207      return '<li>%s: Standard name under review [%s]</li>' % ( a, targ.__href__() )
208    else:
209      return '<li>%s [%s]: %s</li>' % ( targ._h.title, a, targ.__href__(label=targ.label)  )
210
211  def rqlLink02(self,targ,frm=''):
212    t2 = targ._inx.uid[targ.refid]
213    if t2._h.label == 'remarks':
214      return '<li>%s: %s</li>' % ( targ.__href__(odir='../u/', label=targ.title), "Link to variable group broken"  )
215    elif frm == "requestVarGroup":
216      return '<li>%s: %s [%s]</li>' % ( targ.__href__(odir='../u/', label=targ.mip), targ.title, targ.objective  )
217    else:
218      gpsz = len(t2._inx.iref_by_sect[t2.uid].a['requestVar'])
219      return '<li>%s: Link to group: %s [%s]</li>' % ( targ.__href__(odir='../u/', label=targ.title), t2.__href__(odir='../u/', label=t2.title), gpsz  )
220
221  def snLink(self,targ,frm=''):
222    return '<li>%s [%s]: %s</li>' % ( targ.title, targ.units, targ.__href__(odir='../u/') )
223
224  def varLink(self,targ,frm=''):
225    return '<li>%s: %s [%s]</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.title, targ.units )
226  def cmvLink(self,targ,frm=''):
227    return '<li>%s {%s}: %s [%s]</li>' % (  targ.__href__(odir='../u/', label=targ.label), targ.mipTable, targ.title, targ.frequency )
228
229styls = styles()
230
231assert os.path.isdir( 'html' ), 'Before running this script you need to create "html", "html/index" and "html/u" sub-directories, or edit the call to dq.makeHtml'
232assert os.path.isdir( 'html/u' ), 'Before running this script you need to create "html", "html/index" and "html/u" sub-directories, or edit the call to dq.makeHtml, and refernces to "u" in style lines below'
233assert os.path.isdir( 'html/index' ), 'Before running this script you need to create "html", "html/index" and "html/u" sub-directories, or edit the call to dq.makeHtml, and refernces to "u" in style lines below'
234assert os.path.isdir( 'tables' ), 'Before running this script you need to create a "tables" sub-directory, or edit the makeTab class'
235dq = dreq.loadDreq()
236##
237## add special styles to dq object "itemStyle" dictionary.
238##
239
240dq.itemStyles['standardname'] = styls.snLink
241dq.itemStyles['var'] = styls.varLink
242dq.itemStyles['CMORvar'] = styls.cmvLink
243dq.itemStyles['requestLink'] = styls.rqlLink02
244dq.coll['var'].items[0].__class__._linkAttrStyle['sn'] = styls.snLink01
245
246dq.makeHtml()
247mt = makeTab()
248mp = makePurl()
249mj = makeJs( dq )
Note: See TracBrowser for help on using the repository browser.