source: CMIP6dreqbuild/trunk/src/framework/scanDreq.py @ 629

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/scanDreq.py@629
Revision 629, 29.3 KB checked in by mjuckes, 4 years ago (diff)

cleaned scope.py

Line 
1from dreqPy import dreq
2import collections, string, os, utils_wb
3import htmlTemplates as tmpl
4import xml, re, uuid
5import xml.dom, xml.dom.minidom
6import sets
7import xlsxwriter
8
9from utils_wb import uniCleanFunc
10from utils_wb import workbook
11
12if os.path.isfile( 'refDefaultP.txt' ):
13  refpix = {}
14  for l in open( 'refDefaultP.txt' ).readlines():
15    bits = string.split( string.strip(l), '\t' )
16    assert len(bits) == 4, 'Bad record found in %s' % 'refDefaultP.txt'
17    refpix[bits[0]] = (bits[1],bits[2], int(bits[3]) )
18else:
19  refpix = None
20
21empty=re.compile('^$')
22
23src1 = '../workbook/trial2_20150831.xml'
24
25dq = dreq.loadDreq(dreqXML=src1)
26inx = dq.inx
27##inx.makeVarRefs()
28ix_rql_uid = {}
29ix_rqvg_uid = {}
30ix_ovar_uid = {}
31ix_gpi_uid = {}
32list_gp_ovar = collections.defaultdict( list )
33xr_var_ovar = collections.defaultdict( list )
34xr_var_gpi = collections.defaultdict( list )
35rql_by_name = collections.defaultdict( list )
36
37def makeVarRefs(uid, var, iref_by_uid):
38    varRefs = {}
39    for thisuid in var.uid.keys():
40      if iref_by_uid.has_key(thisuid):
41        ee1 = collections.defaultdict( list )
42        for k,i in iref_by_uid[thisuid]:
43          thisi = uid[i]
44          sect = thisi._h.label
45          if sect == 'groupItem':
46            ee1[sect].append( '%s.%s' % (thisi.mip, thisi.group) )
47          elif sect == 'ovar':
48            ee1[sect].append( thisi.mipTable )
49          elif sect == 'revisedTabItem':
50            ee1[sect].append( '%s.%s' % (thisi.mip, thisi.table) )
51        varRefs[thisuid] = ee1
52    return varRefs
53
54varRefs = makeVarRefs( inx.uid, inx.var, inx.iref_by_uid)
55
56class updates(object):
57  delToks = sets.Set( ['inc','omit'] )
58  def __init__(self,fndup,fnmult,idir='rev1'):
59    assert os.path.isdir( idir ), 'Directory %s not found' % idir
60    self.fdup = '%s/%s' % (idir,fndup)
61    self.fmult = '%s/%s' % (idir,fnmult)
62    for p in [self.fdup,self.fmult]:
63      assert os.path.isfile( p ), 'File %s not found' % p
64    self.repl = {}
65    self.upd = {}
66    self.twins = []
67    self.ddel = {}
68    self.cmvrepl = {}
69
70  def writeCmvUpd( self, inx, fnrp='CMVreplace.csv'):
71    oo = open( fnrp, 'w' )
72    for k in self.cmvrepl.keys():
73      if inx.iref_by_uid.has_key(k):
74        kn = self.cmvrepl[k]
75        for tag,ki  in inx.iref_by_uid[k]:
76           vu = [ inx.uid.has_key(kk) for kk in [k,kn,ki] ]
77           if all( vu ):
78             oo.write( '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' % (k,kn,tag,ki, inx.uid[k].label,  inx.uid[kn].label, inx.uid[ki].label) )
79           else:
80             print 'ERROR.088.0003: Bad index in replace info: %s .. %s .. %s' % ( str([k,kn,ki]), str(vu), tag )
81      else:
82        print 'ERROR.088.0004: Bad index in replace info: %s' %  k
83    oo.close()
84
85  def writeVarUpd(self, inx, fnrp='uuidreplace.csv', fnrm='uuidremove.csv', fnup='uuidupdate.csv'):
86    oo = open( fnrp, 'w' )
87    oo2 = open( fnrm, 'w' )
88    for k in self.repl.keys():
89      if inx.iref_by_uid.has_key(k):
90        kn = self.repl[k]
91        for tag,ki  in inx.iref_by_uid[k]:
92           vu = [ inx.uid.has_key(kk) for kk in [k,kn,ki] ]
93           if all( vu ):
94             oo.write( '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' % (k,kn,tag,ki, inx.uid[k].label,  inx.uid[kn].label, inx.uid[ki].label) )
95           else:
96             print 'ERROR.088.0001: Bad index in replace info: %s .. %s .. %s' % ( str([k,kn,ki]), str(vu), tag )
97      else:
98        oo2.write( k + '\n' )
99    oo.close()
100    oo2.close()
101    oo = open( fnup, 'w' )
102    for k in self.upd.keys():
103        ee = self.upd[k]
104        oo.write( string.join( [k,ee['provNote'],string.join(ee['tags']),ee['label'], ee['title'] ], '\t') + '\n' )
105    oo.close()
106
107  def scandup(self):
108    ii = open( self.fdup ).readlines()
109    nn = (len(ii)-1)/2
110    for i in range(nn):
111      l1 = string.split( ii[i*2+1], '\t' )
112      l2 = string.split( ii[i*2+2], '\t' )
113      xx = l1[8:10]
114      yy = l2[8:10]
115      if xx[1] == '' and yy[1] == xx[0]:
116        ths = 0
117        assert not self.repl.has_key( yy[0] ), 'duplicate replacement request for %s' % yy[0]
118        self.repl[ yy[0] ] = yy[1] 
119      elif yy[1] == '' and xx[1] == yy[0]:
120        ths = 1
121        assert not self.repl.has_key( xx[0] ), 'duplicate replacement request for %s' % xx[0]
122        self.repl[ xx[0] ] = xx[1] 
123      elif l1[10] == 'twin' and  l2[10] == 'twin':
124        ths = 2
125        self.twins.append( l1[8] )
126        self.twins.append( l2[8] )
127      elif l1[10] in self.delToks and l2[10] in self.delToks:
128        ths = 3
129        self.ddel[ l1[8] ] = (l1[10],l1[11])
130        self.ddel[ l2[8] ] = (l2[10],l2[11])
131      elif xx[1] == '' and yy[1] == "":
132        print 'WARN.087.00001: uncorrected duplication ..... %s ' %  str( l1[:5] )
133      else:
134        ths = -1
135        print 'ERROR.xxx.0001: Match failed'
136        print l1
137        print l2
138        assert False
139
140  def scancmvdup(self):
141    wb = workbook( 'csv2/CMORvar.xls' )
142    sht = wb.book.sheet_by_name( 'Sheet1' )
143    for i in range(sht.nrows):
144      rr = sht.row(i)
145      if len(rr) == 21 and str( rr[20].value ) != '':
146        kn = rr[20].value
147        ko = rr[18].value
148        vn = rr[0].value
149        self.cmvrepl[ ko ] = kn
150        print '%s: replace %s with %s' % (vn,ko,kn)
151
152  def scanmult(self):
153    ii = open( self.fmult ).readlines()
154    nn = (len(ii)-1)/3
155    for i in range(nn):
156      l1 = string.split( ii[i*3+1], '\t' )
157      l2 = string.split( ii[i*3+2], '\t' )
158      l3 = string.split( ii[i*3+3], '\t' )
159      yy = [l1[9],l2[9],l3[9]]
160      xx = [l1[8],l2[8],l3[8]]
161      zz = (l1,l2,l3)
162      for j in range(3):
163        if yy[j] != '':
164          assert yy[j] in xx, 'Invalid replacement option, %s' % yy[j]
165          assert  not self.repl.has_key( xx[j] ), 'duplicate replacement request for %s' % xx[j]
166          self.repl[ xx[j] ] = yy[j]
167        elif zz[j][10] == 'twin':
168          self.twins.append( zz[j][8] )
169        elif zz[j][11] == 'update':
170          tags = map( string.strip, string.split( zz[j][13], ',' ) )
171          self.upd[ xx[j] ] = { 'provNote':zz[j][12], 'tags':tags, 'label':zz[j][0], 'title':zz[j][1] }
172
173###
174### varDup and varMult created in first parse ----- then editted to select options
175### 2nd pass through then generates the replace and remove options -- taking into account cross references
176### the results of the 2nd pass go back to ../workbook to generate a new set of inputs.
177###
178up = updates('varDup.csv', 'varMult.csv', idir='rev2')
179up.scandup()
180up.scancmvdup()
181up.scanmult()
182
183urep = False
184urep = True
185if urep:
186  up.writeVarUpd( inx, fnrp='uuidreplace.csv', fnrm='uuidremove.csv', fnup='uuidupdate.csv')
187  up.writeCmvUpd( inx, fnrp='CMVreplace.csv')
188  ##oo = open( 'uuidreplace.csv', 'w' )
189  ##oo2 = open( 'uuidremove.csv', 'w' )
190  ##for k in up.repl.keys():
191    ##if inx.iref_by_uid.has_key(k):
192      ##kn = up.repl[k]
193      ##for tag,ki  in inx.iref_by_uid[k]:
194         ##vu = [ inx.uid.has_key(kk) for kk in [k,kn,ki] ]
195         ##if all( vu ):
196           ##oo.write( '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' % (k,kn,tag,ki, inx.uid[k].label,  inx.uid[kn].label, inx.uid[ki].label) )
197         ##else:
198           ##print 'ERROR.088.0001: Bad index in replace info: %s .. %s .. %s' % ( str([k,kn,ki]), str(vu), tag )
199    ##else:
200      ##oo2.write( k + '\n' )
201  ##oo.close()
202  ##oo2.close()
203  ##oo = open( 'uuidupdate.csv', 'w' )
204  ##for k in up.upd.keys():
205      ##ee = up.upd[k]
206      ##oo.write( string.join( [k,ee['provNote'],string.join(ee['tags']),ee['label'], ee['title'] ], '\t') + '\n' )
207  ##oo.close()
208else:
209  oo2 = open( 'uuidremove2.csv', 'w' )
210  for i in dq.coll['var'].items:
211    if not inx.iref_by_uid.has_key(i.uid):
212      oo2.write( string.join( [i.uid,i.label,i.title,i.prov,i.description], '\t') + '\n' )
213  oo2.close()
214
215### check back references.
216nbr = 0
217lbr = []
218for k in inx.iref_by_uid.keys():
219  if not inx.uid.has_key(k):
220   nbr += 1
221   lbr.append(k)
222print 'Missing references: ', nbr
223### can now apply mappings, create updated records and write to new xml?
224
225for i in dq.coll['requestLink'].items:
226   rql_by_name[i.label].append( i.uid )
227   ix_rql_uid[i.uid] = i
228
229for i in dq.coll['requestVarGroup'].items:
230   ix_rqvg_uid[i.uid] = i
231
232
233if dq.coll.has_key( 'revisedTabItem' ):
234  thisk = 'revisedTabItem'
235else:
236  thisk = 'requestVar'
237oo = open( 'uuidinsert.csv', 'w' )
238for i in dq.coll[thisk].items:
239  if i.uid == '__new__':
240    if inx.var.label.has_key( i.label ):
241      if len( inx.var.label[i.label] ) == 1:
242        v = inx.uid[ inx.var.label[i.label][0] ]
243        oo.write( string.join( ['unique',i.label,v.label,v.uid,v.prov,i.mip], '\t' ) + '\n' )
244      else:
245        oo.write( string.join( ['ambiguous',i.label,i.mip,str(len(inx.var.label[i.label] ) ) ], '\t' ) + '\n' )
246oo.close()
247   
248oo = open( 'varMult.csv', 'w' )
249oo2 = open( 'varDup.csv', 'w' )
250oo3 = open( 'varStar.csv', 'w' )
251hs = ['label','title','sn','units','description','prov','procnote','procComment','uid']
252oo.write( string.join(hs, '\t' ) + '\n' )
253oo2.write( string.join(hs, '\t' ) + '\n' )
254oo3.write( string.join(hs, '\t' ) + '\n' )
255ks = inx.var.label.keys()
256ks.sort()
257emptySet = sets.Set( ['','unset'] )
258def entryEq(a,b):
259  return a == b or (a in emptySet and b in emptySet)
260
261deferredRecs = []
262for k in ks:
263  if len(inx.var.label[k]) == 2:
264    v1 = inx.var.uid[inx.var.label[k][0]]
265    v2 = inx.var.uid[inx.var.label[k][1]]
266    cc = map( lambda x: entryEq( v1.__dict__[x], v2.__dict__[x]), ['title','sn','units','description']  )
267    if all(cc):
268### where duplicates are identical , collect and output at end of file.
269      pv1 = string.find( v1.__dict__['prov'], 'OMIP.' ) != -1
270      pv2 = string.find( v2.__dict__['prov'], 'OMIP.' ) != -1
271      if pv2:
272        vp = v2
273        vo = v1
274      else:
275        if not pv1:
276          print 'WARN.088.00002: no preference: %s, %s, %s' % (v1.__dict__['label'],v1.__dict__['prov'],v2.__dict__['prov'])
277        vp = v1
278        vo = v2
279      deferredRecs.append( string.join(map( lambda x: vo.__dict__[x], hs) + [vp.uid,'identical'], '\t' ) + '\n' )
280      deferredRecs.append( string.join(map( lambda x: vp.__dict__[x], hs) + ['',''], '\t' ) + '\n' )
281    else:
282      oo2.write( string.join(map( lambda x: v1.__dict__[x], hs) + ['',''], '\t' ) + '\n' )
283      oo2.write( string.join(map( lambda x: v2.__dict__[x], hs) + ['',''], '\t' ) + '\n' )
284     
285  elif len(inx.var.label[k]) > 1:
286    for i in inx.var.label[k]:
287      oo.write( string.join(map( lambda x: inx.var.uid[i].__dict__[x], hs), '\t' ) + '\n' )
288
289  if k[-2:] == '--':
290    for i in (inx.var.label[k] + inx.var.label[k[:-2]]):
291      oo3.write( string.join(map( lambda x: inx.var.uid[i].__dict__[x], hs), '\t' ) + '\n' )
292
293## output auto-filled records for identical duplicates at end of varDup file.
294for r in deferredRecs:
295  oo2.write( r )
296oo.close()
297oo2.close()
298oo3.close()
299
300
301
302vns = inx.var.label.keys()
303vns.sort()
304for v in vns:
305  if len( inx.var.label[v] ) > 1:
306     print 'INFO.001.0001:',v, string.join( map( lambda x: inx.var.uid[x].sn, inx.var.label[v] ), ';' )
307
308nok = 0
309nerr = 0
310if dq.coll.has_key( 'ovar' ):
311  thisk = 'ovar'
312else:
313  thisk = 'CMORvar'
314for i in dq.coll[thisk].items:
315   vid = i.vid
316   ix_ovar_uid[i.uid] = i
317   xr_var_ovar[vid].append( i.uid )
318   if not inx.var.uid.has_key(vid):
319     print 'missing key:',i.label, i.prov, vid
320     nerr += 1
321   else:
322     nok += 1
323
324class rqHtml(object):
325
326  def __init__(self,odir='./htmlSc/'):
327    self.odir = odir
328    if not os.path.isdir(odir):
329      os.mkdir(odir)
330
331  def mkRqlHtml(self,name):
332     ## [u'comment', u'uid', u'tab', u'title', u'label', u'grid', 'defaults', u'objective', u'mip', 'globalDefault', u'gridreq']
333    if len( rql_by_name[name] ) == 1:
334      self.mkRqlHtml01(rql_by_name[name][0], name )
335    else:
336      self.mkRqlHtmlGp(name)
337
338  def mkRqlHtmlGp(self,name):
339    ee = {}
340    ee['title'] = 'CMIP Request Link %s (with multiple definitions)' % name
341    self.pageName = 'rql__%s.html' % name
342    al =[]
343    for i in range( len( rql_by_name[name] ) ):
344      this = ix_rql_uid[rql_by_name[name][i]]
345      al.append( tmpl.item % {'item':'<a href="rql__%s__%s.html">[%s]</a>: %s' % (name,i,i,this.title) } )
346    ee['items'] = string.join(al, '\n' )
347    ee['introduction'] = ''
348    ee['htmlBody'] = tmpl.indexWrapper % ee
349    ee['htmlHead'] = '''<title>%(title)s</title>''' % ee
350    self.pageHtml = tmpl.pageWrapper % ee
351    self.write()
352    for i in range( len( rql_by_name[name] ) ):
353      self.mkRqlHtml01(rql_by_name[name][i],i)
354
355  def mkRqlHtml01(self,id, tag):
356    this = ix_rql_uid[id]
357    ee = {}
358    if this.label == tag:
359      ee['title'] = 'CMIP Request Link %s' % tag
360      self.pageName = 'rql__%s.html' % tag
361    else:
362      ee['title'] = 'CMIP Request Link %s[%s]' % (this.label,tag)
363      self.pageName = 'rql__%s__%s.html' % (this.label,tag)
364    atts = this.__dict__.keys()
365    atts.sort()
366    al =[]
367    for a in atts:
368      if a not in ['defaults','globalDefault']:
369        al.append( tmpl.item % {'item':'<b>%s</b>: %s' % (a,this.__dict__.get(a,'-- Not Set --')) } )
370    ee['items'] = string.join(al, '\n' )
371    ee['introduction'] = ''
372    ee['htmlBody'] = tmpl.indexWrapper % ee
373    ee['htmlHead'] = '''<title>%(title)s</title>''' % ee
374    self.pageHtml = tmpl.pageWrapper % ee
375    self.write()
376     
377  def mkVarHtml(self,name):
378    if len( inx.var.label[name] ) == 1:
379      self.mkVarHtml01(inx.var.label[name][0], name )
380    else:
381      self.mkVarHtmlGp(name)
382
383  def mkVarHtmlGp(self,name):
384    ee = {}
385    ee['title'] = 'CMIP Variable %s (with multiple definitions)' % name
386    self.pageName = 'var__%s.html' % name
387    al =[]
388    for i in range( len( inx.var.label[name] ) ):
389      this = inx.var.uid[inx.var.label[name][i]]
390      al.append( tmpl.item % {'item':'<a href="var__%s__%s.html">[%s]</a>: %s' % (name,i,i,this.title) } )
391    ee['items'] = string.join(al, '\n' )
392    ee['introduction'] = ''
393    ee['htmlBody'] = tmpl.indexWrapper % ee
394    ee['htmlHead'] = '''<title>%(title)s</title>''' % ee
395    self.pageHtml = tmpl.pageWrapper % ee
396    self.write()
397    ##print 'Multi var: %s' % name
398    for i in range( len( inx.var.label[name] ) ):
399      self.mkVarHtml01(inx.var.label[name][i],i)
400
401  def mkVarHtml01(self,id, tag):
402    this = inx.var.uid[id]
403    ee = {}
404    if this.label == tag:
405      ee['title'] = 'CMIP Variable %s' % tag
406      self.pageName = 'var__%s.html' % tag
407    else:
408      ee['title'] = 'CMIP Variable %s[%s]' % (this.label,tag)
409      self.pageName = 'var__%s__%s.html' % (this.label,tag)
410    atts = this.__dict__.keys()
411    atts.sort()
412    al =[]
413    for a in atts:
414      if a not in ['defaults','globalDefault']:
415        al.append( tmpl.item % {'item':'<b>%s</b>: %s' % (a,this.__dict__.get(a,'-- Not Set --')) } )
416
417    if inx.iref_by_uid.has_key(this.uid):
418      assert varRefs.has_key(this.uid), 'Problem with collected references'
419      ee1 = varRefs[this.uid]
420      ks = ee1.keys()
421      ks.sort()
422      for k in ks:
423        al.append( tmpl.item % {'item':'<b>%s</b>: %s' % (k,string.join(ee1[k])) } )
424    ee['items'] = string.join(al, '\n' )
425    ee['introduction'] = ''
426    ee['htmlBody'] = tmpl.indexWrapper % ee
427    ee['htmlHead'] = '''<title>%(title)s</title>''' % ee
428    self.pageHtml = tmpl.pageWrapper % ee
429    self.write()
430
431  def varHtml(self):
432    for k in inx.var.label.keys():
433      self.mkVarHtml(k)
434 
435  def rqlHtml(self):
436    for k in rql_by_name.keys():
437      self.mkRqlHtml(k)
438 
439  def write(self):
440    oo = open( '%s/%s' % (self.odir,self.pageName), 'w' )
441    oo.write( self.pageHtml )
442    oo.close()
443
444   
445vh = rqHtml()
446vh.varHtml()
447vh.rqlHtml()
448
449if nerr == 0:
450  print 'CHECK 001: %s records checked, no missing references' % nok
451
452
453shps = {'': 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}
454vshpchkMap = {'':'', u'all model levels above 400hPa':'alevStrat', u'all':'Xlev', 3.0:'plev3', '4.0':'plev4', \
455            36.0:'plev36', u'soil levels':'sdepth', \
456            1.0:'sfc?', \
457           16.0:'plev16', 7.0:'plev7', 40.0:'plev40', u'all*':'Xlev', 14.0:'plev14', u'Model levels or 27Plevs':'alev|plev27', \
458           u'17 (or 23 )':'plev17|plev23', u'17 (or 23)':'plev17|plev23', \
459           27.0:'plev27', 17.0:'plev17', u'17 (or23)':'plev17|plev23', 8.0:'plev8', u'all model levels':'alev', 5.0:'plev5'}
460ks = vshpchkMap.keys()
461for k in ks:
462  if type(k) == type(0.):
463     vshpchkMap[str(k)] = vshpchkMap[k]
464
465tsmap = { 'mean':[u'daily mean', u'time mean', u'time: day',
466                u'Cumulative annual fraction', u'Time mean', u'weighted time mean', u'time: mean', u'mean', u'Mean'],
467          '__unknown__':['','dummyAt'],
468          'point':[ u'Instantaneous (end of year)', u'point', u'Synoptic', u'instantaneous', u'time: point', u'synoptic'] }
469tsmap2 = {}
470for k in tsmap.keys():
471  for i in tsmap[k]:
472    tsmap2[i] = k
473
474if dq.coll.has_key( 'groupItem' ):
475  ee = collections.defaultdict( int )
476  for i in dq.coll['groupItem'].items:
477    tst = tsmap2[ i.tstyle ]
478    dd = ''
479    if 'X' in i.shape:
480      dd += 'latitude '
481    if 'Y' in i.shape:
482      dd += 'longitude '
483    if 'Z' in i.shape:
484      if i.levels == '':
485        print 'ERROR.001.0001: no levels specified', i.label, i.title
486      else:
487        zdim = vshpchkMap[i.levels]
488        dd +=  zdim
489  ## print '%s::%s::%s|%s' % (i.shape, i.levels, i.tstyle, dd)
490  for i in dq.coll['groupItem'].items:
491     list_gp_ovar[i.gpid].append( i.uid )
492
493  nok = 0
494  nerr = 0
495  for i in dq.coll['groupItem'].items:
496     vid = i.vid
497     ix_gpi_uid[i.uid] = i
498     xr_var_gpi[vid].append( i.uid )
499     if not inx.var.uid.has_key(vid):
500       nerr += 1
501     else:
502       nok += 1
503  ##print 'groupItem to var crossref: nok = %s, nerr = %s' % (nok, nerr)
504
505
506class tcmp(object):
507  def __init__(self):
508    pass
509  def cmp(self,x,y):
510    return cmp(x.title,y.title)
511
512def atRepr(l,x):
513  if x != None:
514    v = l.__dict__[x]
515  else:
516    v = l
517  if v == '__unset__':
518    return ''
519  elif type(v) == type([]):
520    return string.join([str(i) for i in v])
521  else:
522    return v
523
524class xlsx(object):
525  def __init__(self,fn):
526    self.wb = xlsxwriter.Workbook(fn)
527
528  def newSheet(self,name):
529    self.worksheet = self.wb.add_worksheet(name=name)
530    return self.worksheet
531
532  def close(self):
533    self.wb.close()
534 
535def dumpxlsx( fn, key, atl):
536  wb = xlsx( fn )
537  sht = wb.newSheet( key )
538  j = 0
539  for i in range(len(atl)):
540     sht.write( j,i, atl[i] )
541  ll = dq.coll[key].items[:]
542  ll.sort( tcmp().cmp )
543  for l in ll:
544    uid = atRepr(l,'uid')
545    j+=1
546    i=0
547    for x in atl:
548       sht.write( j,i, atRepr(l,x) )
549       i+=1
550    if key == 'var' and refpix != None:
551      if uid in refpix:
552        p = refpix[uid][2]
553      else:
554        p = 201
555      sht.write( j,i, p )
556  wb.close()
557     
558def dumpcsv( fn, key, atl ):
559  oo = open(fn, 'w' )
560  ll = dq.coll[key].items[:]
561  ll.sort( tcmp().cmp )
562  oo.write( string.join( atl, '\t' ) + '\n' )
563  for l in ll:
564    try:
565      oo.write( string.join( map( lambda x: str(atRepr(l,x)), atl), '\t' ) + '\n' )
566    except:
567      print 'SEVERE.090.0001: print %s' % str(atl)
568      print l
569      raise
570  oo.close()
571
572def atlSort( ll ):
573  oo = []
574  l1 = ['label','title']
575  l2 = ['uid','defaults','globalDefault']
576  for i in l1:
577    if i in ll:
578      oo.append(i)
579  ll.sort()
580  for i in ll:
581    if i not in l1 + l2:
582      oo.append(i)
583  if 'uid' in ll:
584    oo.append( 'uid' )
585  return oo
586
587for k in dq.coll.keys():
588  if len( dq.coll[k].items ) > 0:
589    expl = dq.coll[k].items[0]
590    atl = atlSort( expl.__dict__.keys() )
591    atl1 = [a for a in atl if a != 'parent' and a[0] != '_']
592    ###print k, atl1
593    dumpcsv( 'csv2/%s.csv' % k, k, atl1 )
594    if k == 'var':
595       dumpxlsx( 'csv2/var.xlsx', k, atl1 )
596 
597oo = open( 'var1.csv', 'w' )
598ks = ['label','title','sn','units','description','prov','procnote','procComment','uid']
599ks2 = [ 'ovar','groupItem','revisedTabItem']
600oo.write( string.join(ks + ks2, '\t' ) + '\n' )
601for i in dq.coll['var'].items:
602   if i.label[-2:] != '--':
603     ee1 = varRefs.get( i.uid, {} )
604     r2 = map( lambda x: string.join( atRepr( ee1.get(x, [] ), None ) ), ks2 )
605     oo.write( string.join(map( lambda x: atRepr(i,x), ks) + r2, '\t' ) + '\n' )
606oo.close()
607
608class annotate(object):
609  def __init__(self,src,dreq):
610    assert os.path.isfile( src), '%s not found' % src
611    self.doc = xml.dom.minidom.parse( src  )
612    self.dreq = dreq
613    self.removedUids = {}
614    this = self.doc.getElementsByTagName('var')[0]
615    dil = this.getElementsByTagName('item')
616    self.vid = {}
617    for item in dil:
618      uid = item.getAttribute( 'uid' ) 
619      title = item.getAttribute( 'title' ) 
620      label = item.getAttribute( 'label' ) 
621      self.vid[uid] = (label,title)
622     
623  def strTtl(self,dq):
624    this = self.doc.getElementsByTagName('structure')[0]
625    dil = this.getElementsByTagName('item')
626   
627   
628    filterStr = True
629    for item in dil:
630      uid = item.getAttribute( 'uid' ) 
631      lab = item.getAttribute( 'label' ) 
632      if len( dq.inx.iref_by_uid[uid] ) == 0 and filterStr:
633         print 'UNUSED STRUCTURE: %s, %s' % (lab,uid)
634         this.removeChild( item )
635         self.removedUids[uid] = 'structure: %s' % lab
636      else:
637        tmid = item.getAttribute( 'tmid' ) 
638        spid = item.getAttribute( 'spid' ) 
639        o = item.getAttribute( 'odims' ) 
640        c = item.getAttribute( 'coords' ) 
641        s = dq.inx.uid[spid]
642        title = '%s, %s [%s]' % (dq.inx.uid[tmid].title, s.title, s.label) 
643        if string.strip( c ) != '' or string.strip( o ) != '':
644          title += ' {%s:%s}' % (o,c)
645        print 'STRUCT: ',title,o,c
646        item.setAttribute( 'title', title )
647   
648
649  def rvgCheck(self,dq):
650    """Remove request variable groups which have no requestLink"""
651    this = self.doc.getElementsByTagName('requestVarGroup')[0]
652    dil = this.getElementsByTagName('item')
653    nn = 0
654    for item in dil:
655        uid = item.getAttribute( 'uid' ) 
656        if ('requestLink' not in dq.inx.iref_by_sect[uid].a) and ('tableSection' not in dq.inx.iref_by_sect[uid].a):
657          if item.getAttribute( 'label' ) in ['aermonthly']:
658             print 'WARN.0010: overriding variable group pruning: ',item.getAttribute( 'label' )
659          else:
660            self.removedUids[ uid ] = 'requestVarGroup:  %s' % item.getAttribute( 'label' )
661            this.removeChild(item)
662            nn+=1
663    print 'WARN.Unused variable groups removed: %s' % nn
664    this = self.doc.getElementsByTagName('requestVar')[0]
665    dil = this.getElementsByTagName('item')
666    nn = 0
667    s1 = {i.uid for i in dq.coll['requestVarGroup'].items if i.uid not in self.removedUids}
668    for item in dil:
669        uid = item.getAttribute( 'uid' ) 
670        vid = item.getAttribute( 'vid' )
671        vgid = item.getAttribute( 'vgid' )
672        if vgid not in s1:
673          this.removeChild(item)
674          self.removedUids[ uid ] = 'requestVar:  %s' % item.getAttribute( 'label' )
675          nn+=1
676    print 'Unused request variables removed: %s' % nn
677       
678
679  def cmvCheck(self,dq):
680    this = self.doc.getElementsByTagName('CMORvar')[0]
681    dil = this.getElementsByTagName('item')
682    kk = 0
683    kka = 0
684    for item in dil:
685      title = item.getAttribute( 'title' ) 
686      if title[:6] == '__from':
687        kka += 1
688        vid = item.getAttribute( 'vid' ) 
689        if vid in self.vid:
690          title2 = self.vid[vid][1]
691          item.setAttribute( 'title', title2 )
692          kk += 1
693    print ('CMOR Var titles reset: %s [%s]' % (kk,kka))
694   
695  def mipProv(self,dq):
696    s1 = re.compile( '\[([a-zA-Z0-9]*)\]' )
697    cc = collections.defaultdict(list)
698    dd = collections.defaultdict(int)
699    for i in dq.coll['var'].items:
700      cc[i.prov].append( i.label )
701
702    ee = {}
703    for i in sorted( cc.keys() ):
704      if i[:9] == 'CMIP6 end':
705        m = s1.findall( i )
706        assert len( m ) == 1, 'FAILED TO PARSE: %s' % i
707        this = m[0]
708      else:
709        i5 = i.find( 'CMIP5' ) != -1
710        io = i.find( 'OMIP' ) != -1
711        icx = i.find( 'CORDEX' ) != -1
712        ip = i.find( 'PMIP' ) != -1
713        icc = i.find( 'CCMI' ) != -1
714        isp = i.find( 'SPECS' ) != -1
715        icf = i.find( 'CFMIP' ) != -1
716        iac = i.find( 'AerChemMIP' ) != -1
717        if i5 and io:
718          print 'WARNING .. unclear provenance: ',i,cc[i]
719          this = 'CMIP5/OMIP'
720        elif i5:
721          this = 'CMIP5'
722        elif io:
723          this = 'OMIP'
724        elif icx:
725          this = 'CORDEX'
726        elif ip:
727          this = 'PMIP'
728        elif icc:
729          this = 'CCMI'
730        elif isp:
731          this = 'SPECS'
732        elif icf:
733          this = 'CFMIP'
734        elif iac:
735          this = 'AerChemMIP'
736        else:
737          print 'WARNING .. unclear provenance [2]: ',i,cc[i]
738          this = 'unknown'
739   
740      ee[i] = this
741      dd[this] += len( cc[i] )
742    self.dd = dd
743    self.ee = ee
744    this = self.doc.getElementsByTagName('var')[0]
745    dil = this.getElementsByTagName('item')
746    print 'FIXING var provmip attribute, %s items' % len(dil)
747    kk = 0
748    for item in dil:
749      kk += 1
750      p = item.getAttribute( 'prov' ) 
751      assert ee.has_key(p), 'Unmatched key: %s' % p
752      item.setAttribute( 'provmip', ee[p] )
753     
754  def fixCellMethods(self,dq):
755    this = self.doc.getElementsByTagName('structure')[0]
756    dil = this.getElementsByTagName('item')
757    cmrep = collections.defaultdict( set )
758    cmc = collections.defaultdict( int )
759    nrep = 0
760    for item in dil:
761      cm = item.getAttribute( 'cell_methods' ) 
762      if string.find( cm, "area: where" ) != -1:
763        cm1 = string.replace( cm, "area: where", "area: mean where" )
764        item.setAttribute( 'cell_methods', cm1 ) 
765        cmrep[cm].add(cm1)
766        cmc[cm1] += 1
767        nrep += 1
768      elif string.find( cm, "time:mean" ) != -1:
769        cm1 = string.replace( cm, "time:mean", "time: mean" )
770        item.setAttribute( 'cell_methods', cm1 ) 
771        cmrep[cm].add(cm1)
772        cmc[cm1] += 1
773        nrep += 1
774      elif string.find( cm, "weighted b " ) != -1:
775        cm1 = string.replace( cm, "weighted b ", "weighted by " )
776        item.setAttribute( 'cell_methods', cm1 ) 
777        cmrep[cm].add(cm1)
778        cmc[cm1] += 1
779        nrep += 1
780    print ('FIXED CELL METHODS .. %s' % nrep )
781    for k in cmc:
782      print ('%s: %s' % (k,cmc[k]) )
783
784
785  def sectionCopy(self,dq):
786    this = self.doc.getElementsByTagName('CMORvar')[0]
787    thisRqv = self.doc.getElementsByTagName('requestVar')[0]
788    xx = [i for i in dq.coll['requestVarGroup'].items if i.label == 'OMIP-Omon']
789    assert len(xx) == 1, 'OMIP-Omon request variable group not found'
790    omipOmonUid = xx[0].uid
791    dil = this.getElementsByTagName('item')
792    for item in dil:
793      mipt = item.getAttribute( 'mipTable' ) 
794      prov = item.getAttribute( 'prov' ) 
795      provn = item.getAttribute( 'provNote' ) 
796      if mipt == 'Oyr' and prov[:12] == "CMIP6 [OMIP]" and provn == 'bgc':
797        rowix = int( item.getAttribute( 'rowIndex' ) )
798        if rowix < 65:
799          var = item.getAttribute( 'label' )
800          new = item.cloneNode(True)
801          new.setAttribute( 'defaultPriority', '2' )
802          new.setAttribute( 'mipTable', 'Omon' )
803          new.setAttribute( 'prov', 'Copy from Oyr' )
804          new.setAttribute( 'provNote', 'sdq.001' )
805          vid =  str( uuid.uuid1() ) 
806          new.setAttribute( 'uid', vid )
807          this.appendChild( new )
808##
809## create request var
810##
811          new2 = self.doc.createElement( 'item' )
812          uid =  str( uuid.uuid1() ) 
813          new2.setAttribute( 'uid', uid )
814          new2.setAttribute( 'priority', '2' )
815          new2.setAttribute( 'vid', vid )
816          new2.setAttribute( 'vgid', omipOmonUid )
817          new2.setAttribute( 'mip', 'OMIP' )
818          new2.setAttribute( 'table', 'OMIP-Omon' )
819          ##if vid not in dq.inx.uid:
820            ##print 'ERROR.005.0001: vid %s not found' % vid
821          if omipOmonUid not in dq.inx.uid:
822            print 'ERROR.005.0001: vgid %s not found' % omipOmonUid
823         
824          thisRqv.appendChild(new2)
825
826
827  def missingRefs(self,mrefs,dq,clear=True):
828    this = self.doc.getElementsByTagName('remarks')[0]
829    if clear:
830      dil = this.getElementsByTagName('item')
831      for d in dil:
832        this.removeChild(d)
833    for k in mrefs.keys():
834      if len(  mrefs[k] ) == 1:
835        tid = mrefs[k][0][2]
836        tattr = mrefs[k][0][1]
837        tn = None
838      else:
839        tid = None
840        ee = collections.defaultdict(int)
841        tn = str( len( mrefs[k] ) )
842        for t in mrefs[k]:
843          s = self.dreq.inx.uid[t[2]]._h.label
844          ee['%s.%s' % (s,t[1])] += 1
845        if len( ee.keys() ) == 1:
846          tattr = ee.keys()[0]
847        else:
848          tattr = '__multiple__'
849      if tid == None or (tid not in self.removedUids):
850        item = self.doc.createElement( 'item' )
851        item.setAttribute( 'uid', k ) 
852        item.setAttribute( 'tattr', tattr ) 
853        if tn != None:
854          item.setAttribute( 'techNote', tn ) 
855        if tid != None:
856          item.setAttribute( 'tid', tid ) 
857          if tid not in dq.inx.uid:
858            print 'ERROR.005.0002: tid %s not found' % tid
859        item.setAttribute( 'class', 'missingLink' ) 
860        item.setAttribute( 'description', 'Missing links detected and marked for fixing' ) 
861        item.setAttribute( 'prov', 'scanDreq.py:annotate' ) 
862        this.appendChild( item )
863 
864    txt = self.doc.toprettyxml(indent='\t', newl='\n', encoding=None)
865    oo = open( 'out/annotated_20150731.xml', 'w' )
866    lines = string.split( txt, '\n' )
867    for line in lines:
868      l = utils_wb.uniCleanFunc( string.strip(line) )
869      if empty.match(l):
870        continue
871      else:
872        oo.write(l + '\n')
873    oo.close()
874
875doAnno = True
876if doAnno:
877  an = annotate( dq.c.vsamp, dq )
878  ###an.sectionCopy(dq)
879  an.fixCellMethods(dq)
880  an.mipProv(dq)
881  an.cmvCheck(dq)
882  an.rvgCheck(dq)
883  an.strTtl(dq)
884  for k in an.removedUids:
885    print 'WARN.REMOVED: %s: %s' % (k,an.removedUids[k])
886  an.missingRefs( dq.inx.missingIds, dq )
Note: See TracBrowser for help on using the repository browser.