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

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

cleaned

Line 
1import dreq, collections, string, os
2import htmlTemplates as tmpl
3import xml, re
4import xml.dom, xml.dom.minidom
5
6from utils_dreq import uniCleanFunc
7
8empty=re.compile('^$')
9
10dq = dreq.loadDreq()
11inx = dq.inx
12##inx.makeVarRefs()
13ix_rql_uuid = {}
14ix_rqvg_uuid = {}
15ix_ovar_uuid = {}
16ix_gpi_uuid = {}
17list_gp_ovar = collections.defaultdict( list )
18xr_var_ovar = collections.defaultdict( list )
19xr_var_gpi = collections.defaultdict( list )
20rql_by_name = collections.defaultdict( list )
21
22def makeVarRefs(uuid, var, iref_by_uuid):
23    varRefs = {}
24    for thisuuid in var.uuid.keys():
25      if iref_by_uuid.has_key(thisuuid):
26        ee1 = collections.defaultdict( list )
27        for k,i in iref_by_uuid[thisuuid]:
28          sect,thisi = uuid[i]
29          if sect == 'groupItem':
30            ee1[sect].append( '%s.%s' % (thisi.mip, thisi.group) )
31          elif sect == 'ovar':
32            ee1[sect].append( thisi.mipTable )
33          elif sect == 'revisedTabItem':
34            ee1[sect].append( '%s.%s' % (thisi.mip, thisi.table) )
35      varRefs[thisuuid] = ee1
36    return varRefs
37
38varRefs = makeVarRefs( inx.uuid, inx.var, inx.iref_by_uuid)
39
40
41### check back references.
42nbr = 0
43lbr = []
44for k in inx.iref_by_uuid.keys():
45  if not inx.uuid.has_key(k):
46   nbr += 1
47   lbr.append(k)
48print 'Missing references: ', nbr
49### can now apply mappings, create updated records and write to new xml?
50
51for i in dq.coll['requestLink'].items:
52   rql_by_name[i.label].append( i.uuid )
53   ix_rql_uuid[i.uuid] = i
54
55for i in dq.coll['requestVarGroup'].items:
56   ix_rqvg_uuid[i.uuid] = i
57
58
59oo = open( 'uuidinsert.csv', 'w' )
60for i in dq.coll['revisedTabItem'].items:
61  if i.uuid == '__new__':
62    if inx.var.label.has_key( i.label ):
63      if len( inx.var.label[i.label] ) == 1:
64        v = inx.uuid[ inx.var.label[i.label][0] ][1]
65        oo.write( string.join( ['unique',i.label,v.label,v.uuid,v.prov,i.mip], '\t' ) + '\n' )
66      else:
67        oo.write( string.join( ['ambiguous',i.label,i.mip,str(len(inx.var.label[i.label] ) ) ], '\t' ) + '\n' )
68oo.close()
69   
70oo = open( 'varMult.csv', 'w' )
71oo2 = open( 'varDup.csv', 'w' )
72oo3 = open( 'varStar.csv', 'w' )
73hs = ['label','title','sn','units','description','prov','procnote','procComment','uuid']
74oo.write( string.join(hs, '\t' ) + '\n' )
75oo2.write( string.join(hs, '\t' ) + '\n' )
76oo3.write( string.join(hs, '\t' ) + '\n' )
77ks = inx.var.label.keys()
78ks.sort()
79for k in ks:
80  if len(inx.var.label[k]) == 2:
81    v1 = inx.var.uuid[inx.var.label[k][0]]
82    v2 = inx.var.uuid[inx.var.label[k][1]]
83    cc = map( lambda x: v1.__dict__[x] == v2.__dict__[x], ['title','sn','units','description']  )
84    if all(cc):
85      oo2.write( string.join(map( lambda x: v1.__dict__[x], hs) + [v2.uuid,'identical'], '\t' ) + '\n' )
86    else:
87      oo2.write( string.join(map( lambda x: v1.__dict__[x], hs) + ['',''], '\t' ) + '\n' )
88    oo2.write( string.join(map( lambda x: v2.__dict__[x], hs) + ['',''], '\t' ) + '\n' )
89     
90  elif len(inx.var.label[k]) > 1:
91    for i in inx.var.label[k]:
92      oo.write( string.join(map( lambda x: inx.var.uuid[i].__dict__[x], hs), '\t' ) + '\n' )
93
94  if k[-2:] == '--':
95    for i in (inx.var.label[k] + inx.var.label[k[:-2]]):
96      oo3.write( string.join(map( lambda x: inx.var.uuid[i].__dict__[x], hs), '\t' ) + '\n' )
97oo.close()
98oo2.close()
99oo3.close()
100
101
102for i in dq.coll['groupItem'].items:
103   list_gp_ovar[i.gpid].append( i.uuid )
104
105vns = inx.var.label.keys()
106vns.sort()
107for v in vns:
108  if len( inx.var.label[v] ) > 1:
109     print 'INFO.001.0001:',v, string.join( map( lambda x: inx.var.uuid[x].sn, inx.var.label[v] ), ';' )
110
111nok = 0
112nerr = 0
113for i in dq.coll['ovar'].items:
114   vid = i.vid
115   ix_ovar_uuid[i.uuid] = i
116   xr_var_ovar[vid].append( i.uuid )
117   if not inx.var.uuid.has_key(vid):
118     print 'missing key:',i.__dict__
119     nerr += 1
120   else:
121     nok += 1
122
123nok = 0
124nerr = 0
125for i in dq.coll['groupItem'].items:
126   vid = i.vid
127   ix_gpi_uuid[i.uuid] = i
128   xr_var_gpi[vid].append( i.uuid )
129   if not inx.var.uuid.has_key(vid):
130     nerr += 1
131   else:
132     nok += 1
133print 'groupItem to var crossref: nok = %s, nerr = %s' % (nok, nerr)
134
135class rqHtml(object):
136
137  def __init__(self,odir='./html/'):
138    self.odir = odir
139    if not os.path.isdir(odir):
140      os.mkdir(odir)
141
142  def mkRqlHtml(self,name):
143     ## [u'comment', u'uuid', u'tab', u'title', u'label', u'grid', 'defaults', u'objective', u'mip', 'globalDefault', u'gridreq']
144    if len( rql_by_name[name] ) == 1:
145      self.mkRqlHtml01(rql_by_name[name][0], name )
146    else:
147      self.mkRqlHtmlGp(name)
148
149  def mkRqlHtmlGp(self,name):
150    ee = {}
151    ee['title'] = 'CMIP Request Link %s (with multiple definitions)' % name
152    self.pageName = 'rql__%s.html' % name
153    al =[]
154    for i in range( len( rql_by_name[name] ) ):
155      this = ix_rql_uuid[rql_by_name[name][i]]
156      al.append( tmpl.item % {'item':'<a href="rql__%s__%s.html">[%s]</a>: %s' % (name,i,i,this.title) } )
157    ee['items'] = string.join(al, '\n' )
158    ee['introduction'] = ''
159    ee['htmlBody'] = tmpl.indexWrapper % ee
160    ee['htmlHead'] = '''<title>%(title)s</title>''' % ee
161    self.pageHtml = tmpl.pageWrapper % ee
162    self.write()
163    for i in range( len( rql_by_name[name] ) ):
164      self.mkRqlHtml01(rql_by_name[name][i],i)
165
166  def mkRqlHtml01(self,id, tag):
167    this = ix_rql_uuid[id]
168    ee = {}
169    if this.label == tag:
170      ee['title'] = 'CMIP Request Link %s' % tag
171      self.pageName = 'rql__%s.html' % tag
172    else:
173      ee['title'] = 'CMIP Request Link %s[%s]' % (this.label,tag)
174      self.pageName = 'rql__%s__%s.html' % (this.label,tag)
175    atts = this.__dict__.keys()
176    atts.sort()
177    al =[]
178    for a in atts:
179      if a not in ['defaults','globalDefault']:
180        al.append( tmpl.item % {'item':'<b>%s</b>: %s' % (a,this.__dict__.get(a,'-- Not Set --')) } )
181    ee['items'] = string.join(al, '\n' )
182    ee['introduction'] = ''
183    ee['htmlBody'] = tmpl.indexWrapper % ee
184    ee['htmlHead'] = '''<title>%(title)s</title>''' % ee
185    self.pageHtml = tmpl.pageWrapper % ee
186    self.write()
187     
188  def mkVarHtml(self,name):
189    if len( inx.var.label[name] ) == 1:
190      self.mkVarHtml01(inx.var.label[name][0], name )
191    else:
192      self.mkVarHtmlGp(name)
193
194  def mkVarHtmlGp(self,name):
195    ee = {}
196    ee['title'] = 'CMIP Variable %s (with multiple definitions)' % name
197    self.pageName = 'var__%s.html' % name
198    al =[]
199    for i in range( len( inx.var.label[name] ) ):
200      this = inx.var.uuid[inx.var.label[name][i]]
201      al.append( tmpl.item % {'item':'<a href="var__%s__%s.html">[%s]</a>: %s' % (name,i,i,this.title) } )
202    ee['items'] = string.join(al, '\n' )
203    ee['introduction'] = ''
204    ee['htmlBody'] = tmpl.indexWrapper % ee
205    ee['htmlHead'] = '''<title>%(title)s</title>''' % ee
206    self.pageHtml = tmpl.pageWrapper % ee
207    self.write()
208    ##print 'Multi var: %s' % name
209    for i in range( len( inx.var.label[name] ) ):
210      self.mkVarHtml01(inx.var.label[name][i],i)
211
212  def mkVarHtml01(self,id, tag):
213    this = inx.var.uuid[id]
214    ee = {}
215    if this.label == tag:
216      ee['title'] = 'CMIP Variable %s' % tag
217      self.pageName = 'var__%s.html' % tag
218    else:
219      ee['title'] = 'CMIP Variable %s[%s]' % (this.label,tag)
220      self.pageName = 'var__%s__%s.html' % (this.label,tag)
221    atts = this.__dict__.keys()
222    atts.sort()
223    al =[]
224    for a in atts:
225      if a not in ['defaults','globalDefault']:
226        al.append( tmpl.item % {'item':'<b>%s</b>: %s' % (a,this.__dict__.get(a,'-- Not Set --')) } )
227
228    if inx.iref_by_uuid.has_key(this.uuid):
229      assert varRefs.has_key(this.uuid), 'Problem with collected references'
230      ee1 = varRefs[this.uuid]
231      ks = ee1.keys()
232      ks.sort()
233      for k in ks:
234        al.append( tmpl.item % {'item':'<b>%s</b>: %s' % (k,string.join(ee1[k])) } )
235    ee['items'] = string.join(al, '\n' )
236    ee['introduction'] = ''
237    ee['htmlBody'] = tmpl.indexWrapper % ee
238    ee['htmlHead'] = '''<title>%(title)s</title>''' % ee
239    self.pageHtml = tmpl.pageWrapper % ee
240    self.write()
241
242  def varHtml(self):
243    for k in inx.var.label.keys():
244      self.mkVarHtml(k)
245 
246  def rqlHtml(self):
247    for k in rql_by_name.keys():
248      self.mkRqlHtml(k)
249 
250  def write(self):
251    oo = open( '%s/%s' % (self.odir,self.pageName), 'w' )
252    oo.write( self.pageHtml )
253    oo.close()
254
255   
256vh = rqHtml()
257vh.varHtml()
258vh.rqlHtml()
259
260if nerr == 0:
261  print 'CHECK 001: %s records checked, no missing references' % nok
262
263##for k in xr_var_ovar.keys():
264  ##if len( xr_var_ovar[k] ) > 1:
265     ##print inx.var.uuid[k].label, map( lambda x: ix_ovar_uuid[x].mipTable,  xr_var_ovar[k]  )
266
267shps = {'': 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}
268vshpchkMap = {'':'', u'all model levels above 400hPa':'alevStrat', u'all':'Xlev', 3.0:'plev3', '4.0':'plev4', \
269            36.0:'plev36', u'soil levels':'sdepth', \
270            1.0:'sfc?', \
271           16.0:'plev16', 7.0:'plev7', 40.0:'plev40', u'all*':'Xlev', 14.0:'plev14', u'Model levels or 27Plevs':'alev|plev27', \
272           27.0:'plev27', 17.0:'plev17', u'17 (or23)':'plev17|plev23', 8.0:'plev8', u'all model levels':'alev', 5.0:'plev5'}
273ks = vshpchkMap.keys()
274for k in ks:
275  if type(k) == type(0.):
276     vshpchkMap[str(k)] = vshpchkMap[k]
277
278print vshpchkMap.keys()
279
280tsmap = { 'mean':[u'daily mean', u'time mean', u'time: day',
281                u'Cumulative annual fraction', u'Time mean', u'weighted time mean', u'time: mean', u'mean', u'Mean'],
282          '__unknown__':[''],
283          'point':[ u'Instantaneous (end of year)', u'point', u'Synoptic', u'instantaneous', u'time: point', u'synoptic'] }
284tsmap2 = {}
285for k in tsmap.keys():
286  for i in tsmap[k]:
287    tsmap2[i] = k
288
289ee = collections.defaultdict( int )
290for i in dq.coll['groupItem'].items:
291  tst = tsmap2[ i.tstyle ]
292  dd = ''
293  if 'X' in i.shape:
294    dd += 'latitude '
295  if 'Y' in i.shape:
296    dd += 'longitude '
297  if 'Z' in i.shape:
298    if i.levels == '':
299      print 'ERROR.001.0001: no levels specified', i.label, i.title
300    else:
301      zdim = vshpchkMap[i.levels]
302      dd +=  zdim
303  ## print '%s::%s::%s|%s' % (i.shape, i.levels, i.tstyle, dd)
304
305class tcmp(object):
306  def __init__(self):
307    pass
308  def cmp(self,x,y):
309    return cmp(x.title,y.title)
310
311def atRepr(l,x):
312  v = l.__dict__[x]
313  if v == '__unset__':
314    return ''
315  else:
316    return v
317 
318def dumpcsv( fn, key, atl ):
319  oo = open(fn, 'w' )
320  ll = dq.coll[key].items[:]
321  ll.sort( tcmp().cmp )
322  oo.write( string.join( atl, '\t' ) + '\n' )
323  for l in ll:
324    oo.write( string.join( map( lambda x: atRepr(l,x), atl), '\t' ) + '\n' )
325  oo.close()
326
327def atlSort( ll ):
328  oo = []
329  l1 = ['label','title']
330  l2 = ['uuid','defaults','globalDefault']
331  for i in l1:
332    if i in ll:
333      oo.append(i)
334  ll.sort()
335  for i in ll:
336    if i not in l1 + l2:
337      oo.append(i)
338  if 'uuid' in ll:
339    oo.append( 'uuid' )
340  return oo
341
342for k in dq.coll.keys():
343  if len( dq.coll[k].items ) > 0:
344    expl = dq.coll[k].items[0]
345    atl = atlSort( expl.__dict__.keys() )
346    print k, atl
347    dumpcsv( 'csv2/%s.csv' % k, k, atl )
348 
349oo = open( 'var1.csv', 'w' )
350ks = ['label','title','sn','units','description','prov','procnote','procComment','uuid']
351ks2 = [ 'ovar','groupItem','revisedTabItem']
352oo.write( string.join(ks + ks2, '\t' ) + '\n' )
353for i in dq.coll['var'].items:
354   if i.label[-2:] != '--':
355     ee1 = varRefs.get( i.uuid, {} )
356     r2 = map( lambda x: string.join( ee1.get(x, [] ) ), ks2 )
357     oo.write( string.join(map( lambda x: i.__dict__[x], ks) + r2, '\t' ) + '\n' )
358oo.close()
359
360class annotate(object):
361  def __init__(self,src,dreq):
362    assert os.path.isfile( src), '%s not found' % src
363    self.doc = xml.dom.minidom.parse( src  )
364    self.dreq = dreq
365
366  def missingRefs(self,mrefs,clear=True):
367    this = self.doc.getElementsByTagName('remarks')[0]
368    if clear:
369      dil = this.getElementsByTagName('item')
370      for d in dil:
371        this.removeChild(d)
372    for k in mrefs.keys():
373      if len(  mrefs[k] ) == 1:
374        tid = mrefs[k][0][2]
375        tattr = mrefs[k][0][1]
376        tn = None
377      else:
378        tid = None
379        ee = collections.defaultdict(int)
380        tn = str( len( mrefs[k] ) )
381        for t in mrefs[k]:
382          s = self.dreq.inx.uuid[t[2]][0]
383          ee['%s.%s' % (s,t[1])] += 1
384        if len( ee.keys() ) == 1:
385          tattr = ee.keys()[0]
386        else:
387          tattr = '__multiple__'
388      item = self.doc.createElement( 'item' )
389      item.setAttribute( 'uuid', k ) 
390      item.setAttribute( 'tattr', tattr ) 
391      if tn != None:
392        item.setAttribute( 'techNote', tn ) 
393      if tid != None:
394        item.setAttribute( 'tid', tid ) 
395      item.setAttribute( 'class', 'missingLink' ) 
396      item.setAttribute( 'description', 'Missing links detected and marked for fixing' ) 
397      item.setAttribute( 'prov', 'scanDreq.py:annotate' ) 
398      this.appendChild( item )
399 
400    txt = self.doc.toprettyxml(indent='\t', newl='\n', encoding=None)
401    oo = open( 'annotated_20150731.xml', 'w' )
402    lines = string.split( txt, '\n' )
403    for line in lines:
404      l = uniCleanFunc( string.strip(line) )
405      if empty.match(l):
406        continue
407      else:
408        oo.write(l + '\n')
409    oo.close()
410
411doAnno = True
412if doAnno:
413  an = annotate( dq.c.vsamp, dq )
414  an.missingRefs( dq.inx.missingIds )
Note: See TracBrowser for help on using the repository browser.