source: CMIP6dreq/trunk/src/scanDreq.py @ 357

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreq/trunk/src/scanDreq.py@357
Revision 357, 10.3 KB checked in by mjuckes, 6 years ago (diff)

added 'manage' directory

Line 
1import dreq, collections, string, os
2import htmlTemplates as tmpl
3
4from dreq import inx
5
6ix_rql_uuid = {}
7ix_rqvg_uuid = {}
8ix_ovar_uuid = {}
9ix_gpi_uuid = {}
10list_gp_ovar = collections.defaultdict( list )
11xr_var_ovar = collections.defaultdict( list )
12xr_var_gpi = collections.defaultdict( list )
13rql_by_name = collections.defaultdict( list )
14
15
16### check back references.
17nbr = 0
18lbr = []
19for k in inx.iref_by_uuid.keys():
20  if not inx.uuid.has_key(k):
21   nbr += 1
22   lbr.append(k)
23print 'Missing references: ', nbr
24### can now apply mappings, create updated records and write to new xml?
25
26for i in dreq.c.tableItems['requestLink']:
27   rql_by_name[i.label].append( i.uuid )
28   ix_rql_uuid[i.uuid] = i
29
30for i in dreq.c.tableItems['requestVarGroup']:
31   ix_rqvg_uuid[i.uuid] = i
32
33
34
35oo = open( 'uuidinsert.csv', 'w' )
36for i in dreq.c.tableItems['revisedTabItem']:
37  if i.uuid == '__new__':
38    if inx.var_by_name.has_key( i.label ):
39      if len( inx.var_by_name[i.label] ) == 1:
40        v = inx.uuid[ inx.var_by_name[i.label][0] ][1]
41        oo.write( string.join( ['unique',i.label,v.label,v.uuid,v.prov,i.mip], '\t' ) + '\n' )
42      else:
43        oo.write( string.join( ['ambiguous',i.label,i.mip,str(len(inx.var_by_name[i.label] ) ) ], '\t' ) + '\n' )
44oo.close()
45   
46oo = open( 'varMult.csv', 'w' )
47oo2 = open( 'varDup.csv', 'w' )
48oo3 = open( 'varStar.csv', 'w' )
49hs = ['label','title','sn','units','description','prov','procnote','procComment','uuid']
50oo.write( string.join(hs, '\t' ) + '\n' )
51oo2.write( string.join(hs, '\t' ) + '\n' )
52oo3.write( string.join(hs, '\t' ) + '\n' )
53ks = inx.var_by_name.keys()
54ks.sort()
55for k in ks:
56  if len(inx.var_by_name[k]) == 2:
57    v1 = inx.var_uuid[inx.var_by_name[k][0]]
58    v2 = inx.var_uuid[inx.var_by_name[k][1]]
59    cc = map( lambda x: v1.__dict__[x] == v2.__dict__[x], ['title','sn','units','description']  )
60    if all(cc):
61      oo2.write( string.join(map( lambda x: v1.__dict__[x], hs) + [v2.uuid,'identical'], '\t' ) + '\n' )
62    else:
63      oo2.write( string.join(map( lambda x: v1.__dict__[x], hs) + ['',''], '\t' ) + '\n' )
64    oo2.write( string.join(map( lambda x: v2.__dict__[x], hs) + ['',''], '\t' ) + '\n' )
65     
66  elif len(inx.var_by_name[k]) > 1:
67    for i in inx.var_by_name[k]:
68      oo.write( string.join(map( lambda x: inx.var_uuid[i].__dict__[x], hs), '\t' ) + '\n' )
69
70  if k[-2:] == '--':
71    for i in (inx.var_by_name[k] + inx.var_by_name[k[:-2]]):
72      oo3.write( string.join(map( lambda x: inx.var_uuid[i].__dict__[x], hs), '\t' ) + '\n' )
73oo.close()
74oo2.close()
75oo3.close()
76
77
78for i in dreq.c.tableItems['groupItem']:
79   list_gp_ovar[i.gpid].append( i.uuid )
80
81nok = 0
82nerr = 0
83for i in dreq.c.tableItems['ovar']:
84   vid = i.vid
85   ix_ovar_uuid[i.uuid] = i
86   xr_var_ovar[vid].append( i.uuid )
87   if not inx.var_uuid.has_key(vid):
88     print 'missing key:',i.__dict__
89     nerr += 1
90   else:
91     nok += 1
92
93nok = 0
94nerr = 0
95for i in dreq.c.tableItems['groupItem']:
96   vid = i.vid
97   ix_gpi_uuid[i.uuid] = i
98   xr_var_gpi[vid].append( i.uuid )
99   if not inx.var_uuid.has_key(vid):
100     nerr += 1
101   else:
102     nok += 1
103print 'groupItem to var crossref: nok = %s, nerr = %s',nok, nerr
104
105class rqHtml(object):
106
107  def __init__(self,odir='./html/'):
108    self.odir = odir
109    if not os.path.isdir(odir):
110      os.mkdir(odir)
111
112  def mkRqlHtml(self,name):
113     ## [u'comment', u'uuid', u'tab', u'title', u'label', u'grid', 'defaults', u'objective', u'mip', 'globalDefault', u'gridreq']
114    if len( rql_by_name[name] ) == 1:
115      self.mkRqlHtml01(rql_by_name[name][0], name )
116    else:
117      self.mkRqlHtmlGp(name)
118
119  def mkRqlHtmlGp(self,name):
120    ee = {}
121    ee['title'] = 'CMIP Request Link %s (with multiple definitions)' % name
122    self.pageName = 'rql__%s.html' % name
123    al =[]
124    for i in range( len( rql_by_name[name] ) ):
125      this = ix_rql_uuid[rql_by_name[name][i]]
126      al.append( tmpl.item % {'item':'<a href="rql__%s__%s.html">[%s]</a>: %s' % (name,i,i,this.title) } )
127    ee['items'] = string.join(al, '\n' )
128    ee['introduction'] = ''
129    ee['htmlBody'] = tmpl.indexWrapper % ee
130    ee['htmlHead'] = '''<title>%(title)s</title>''' % ee
131    self.pageHtml = tmpl.pageWrapper % ee
132    self.write()
133    for i in range( len( rql_by_name[name] ) ):
134      self.mkRqlHtml01(rql_by_name[name][i],i)
135
136  def mkRqlHtml01(self,id, tag):
137    this = ix_rql_uuid[id]
138    ee = {}
139    if this.label == tag:
140      ee['title'] = 'CMIP Request Link %s' % tag
141      self.pageName = 'rql__%s.html' % tag
142    else:
143      ee['title'] = 'CMIP Request Link %s[%s]' % (this.label,tag)
144      self.pageName = 'rql__%s__%s.html' % (this.label,tag)
145    atts = this.__dict__.keys()
146    atts.sort()
147    al =[]
148    for a in atts:
149      if a not in ['defaults','globalDefault']:
150        al.append( tmpl.item % {'item':'<b>%s</b>: %s' % (a,this.__dict__.get(a,'-- Not Set --')) } )
151    ee['items'] = string.join(al, '\n' )
152    ee['introduction'] = ''
153    ee['htmlBody'] = tmpl.indexWrapper % ee
154    ee['htmlHead'] = '''<title>%(title)s</title>''' % ee
155    self.pageHtml = tmpl.pageWrapper % ee
156    self.write()
157     
158  def mkVarHtml(self,name):
159    if len( inx.var_by_name[name] ) == 1:
160      self.mkVarHtml01(inx.var_by_name[name][0], name )
161    else:
162      self.mkVarHtmlGp(name)
163
164  def mkVarHtmlGp(self,name):
165    ee = {}
166    ee['title'] = 'CMIP Variable %s (with multiple definitions)' % name
167    self.pageName = 'var__%s.html' % name
168    al =[]
169    for i in range( len( inx.var_by_name[name] ) ):
170      this = inx.var_uuid[inx.var_by_name[name][i]]
171      al.append( tmpl.item % {'item':'<a href="var__%s__%s.html">[%s]</a>: %s' % (name,i,i,this.title) } )
172    ee['items'] = string.join(al, '\n' )
173    ee['introduction'] = ''
174    ee['htmlBody'] = tmpl.indexWrapper % ee
175    ee['htmlHead'] = '''<title>%(title)s</title>''' % ee
176    self.pageHtml = tmpl.pageWrapper % ee
177    self.write()
178    for i in range( len( inx.var_by_name[name] ) ):
179      self.mkVarHtml01(inx.var_by_name[name][i],i)
180
181  def mkVarHtml01(self,id, tag):
182    this = inx.var_uuid[id]
183    ee = {}
184    if this.label == tag:
185      ee['title'] = 'CMIP Variable %s' % tag
186      self.pageName = 'var__%s.html' % tag
187    else:
188      ee['title'] = 'CMIP Variable %s[%s]' % (this.label,tag)
189      self.pageName = 'var__%s__%s.html' % (this.label,tag)
190    atts = this.__dict__.keys()
191    atts.sort()
192    al =[]
193    for a in atts:
194      if a not in ['defaults','globalDefault']:
195        al.append( tmpl.item % {'item':'<b>%s</b>: %s' % (a,this.__dict__.get(a,'-- Not Set --')) } )
196
197    if inx.iref_by_uuid.has_key(this.uuid):
198      assert inx.varRefs.has_key(this.uuid), 'Problem with collected references'
199      ee1 = inx.varRefs[this.uuid]
200      ks = ee1.keys()
201      ks.sort()
202      for k in ks:
203        al.append( tmpl.item % {'item':'<b>%s</b>: %s' % (k,string.join(ee1[k])) } )
204    ee['items'] = string.join(al, '\n' )
205    ee['introduction'] = ''
206    ee['htmlBody'] = tmpl.indexWrapper % ee
207    ee['htmlHead'] = '''<title>%(title)s</title>''' % ee
208    self.pageHtml = tmpl.pageWrapper % ee
209    self.write()
210
211  def varHtml(self):
212    for k in inx.var_by_name.keys():
213      self.mkVarHtml(k)
214 
215  def rqlHtml(self):
216    for k in rql_by_name.keys():
217      self.mkRqlHtml(k)
218 
219  def write(self):
220    oo = open( '%s/%s' % (self.odir,self.pageName), 'w' )
221    oo.write( self.pageHtml )
222    oo.close()
223
224   
225vh = rqHtml()
226vh.varHtml()
227vh.rqlHtml()
228
229if nerr == 0:
230  print 'CHECK 001: %s records checked, no missing references' % nok
231
232##for k in xr_var_ovar.keys():
233  ##if len( xr_var_ovar[k] ) > 1:
234     ##print inx.var_uuid[k].label, map( lambda x: ix_ovar_uuid[x].mipTable,  xr_var_ovar[k]  )
235
236shps = {'': 64, 'XYZKT': 13, '4-element vector': 2, 'XYT': 476, '2D vector field ': 2, 'KZT': 4, '2D vector field': 2, 'XYZ': 27, 'XYZT': 204, '2D': 83, 'scalar': 14, 'XY': 88, '?': 21, '2D ': 1, 'XYKT': 3, 'YZT': 16, 'ZST1': 15, 'XKT': 2, 'BasinYT': 1}
237vshpchkMap = {'':'', u'all model levels above 400hPa':'alevStrat', u'all':'Xlev', 3.0:'plev3', '4.0':'plev4', \
238            36.0:'plev36', u'soil levels':'sdepth', \
239            1.0:'sfc?', \
240           16.0:'plev16', 7.0:'plev7', 40.0:'plev40', u'all*':'Xlev', 14.0:'plev14', u'Model levels or 27Plevs':'alev|plev27', \
241           27.0:'plev27', 17.0:'plev17', u'17 (or23)':'plev17|plev23', 8.0:'plev8', u'all model levels':'alev', 5.0:'plev5'}
242ks = vshpchkMap.keys()
243for k in ks:
244  if type(k) == type(0.):
245     vshpchkMap[str(k)] = vshpchkMap[k]
246
247print vshpchkMap.keys()
248
249tsmap = { 'mean':[u'daily mean', u'time mean', u'time: day',
250                u'Cumulative annual fraction', u'Time mean', u'weighted time mean', u'time: mean', u'mean', u'Mean'],
251          '__unknown__':[''],
252          'point':[ u'Instantaneous (end of year)', u'point', u'Synoptic', u'instantaneous', u'time: point', u'synoptic'] }
253tsmap2 = {}
254for k in tsmap.keys():
255  for i in tsmap[k]:
256    tsmap2[i] = k
257
258ee = collections.defaultdict( int )
259for i in dreq.c.tableItems['groupItem']:
260  tst = tsmap2[ i.tstyle ]
261  dd = ''
262  if 'X' in i.shape:
263    dd += 'latitude '
264  if 'Y' in i.shape:
265    dd += 'longitude '
266  if 'Z' in i.shape:
267    if i.levels == '':
268      print 'ERROR.001.0001: no levels specified', i.label, i.title
269    else:
270      zdim = vshpchkMap[i.levels]
271      dd +=  zdim
272  ## print '%s::%s::%s|%s' % (i.shape, i.levels, i.tstyle, dd)
273
274class tcmp(object):
275  def __init__(self):
276    pass
277  def cmp(self,x,y):
278    return cmp(x.title,y.title)
279
280def dumpcsv( fn, key, atl ):
281  oo = open(fn, 'w' )
282  ll = dreq.c.tableItems[key][:]
283  ll.sort( tcmp().cmp )
284  oo.write( string.join( atl, '\t' ) + '\n' )
285  for l in ll:
286    oo.write( string.join( map( lambda x: l.__dict__[x], atl), '\t' ) + '\n' )
287  oo.close()
288
289def atlSort( ll ):
290  oo = []
291  l1 = ['label','title']
292  l2 = ['uuid','defaults','globalDefault']
293  for i in l1:
294    if i in ll:
295      oo.append(i)
296  ll.sort()
297  for i in ll:
298    if i not in l1 + l2:
299      oo.append(i)
300  if 'uuid' in ll:
301    oo.append( 'uuid' )
302  return oo
303
304for k in dreq.c.tableItems.keys():
305  expl = dreq.c.tableItems[k][0]
306  atl = atlSort( expl.__dict__.keys() )
307  dumpcsv( 'csv2/%s.csv' % k, k, atl )
308 
309oo = open( 'var1.csv', 'w' )
310ks = ['label','title','sn','units','description','prov','procnote','procComment','uuid']
311ks2 = [ 'ovar','groupItem','revisedTabItem']
312oo.write( string.join(ks + ks2, '\t' ) + '\n' )
313for i in dreq.c.tableItems['var']:
314   if i.label[-2:] != '--':
315     ee1 = inx.varRefs.get( i.uuid, {} )
316     r2 = map( lambda x: string.join( ee1.get(x, [] ) ), ks2 )
317     inx.var_by_sn[i.sn].append( i.uuid )
318     oo.write( string.join(map( lambda x: i.__dict__[x], ks) + r2, '\t' ) + '\n' )
319oo.close()
Note: See TracBrowser for help on using the repository browser.