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

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

01.00.09

Line 
1from dreqPy import dreq
2import hashlib
3import collections, string, os, utils_wb
4import htmlTemplates as tmpl
5import xml, re, uuid
6import xml.dom, xml.dom.minidom
7import sets
8import xlsxwriter
9
10mipTableMap = {'cfMon':'CFmon' }
11
12knowna = [ 'LS3MIP [LWday]', 'LS3MIP [LEday]', 'CFMIP [cf1hrClimMon]', 'HighResMIP [3hr_cloud]',
13           'CFMIP [cf3hr_sim_new]', 'C4MIP [L_3hr]', 'DAMIP [DAMIP_day]', 'DAMIP [DAMIP_3hr_p2]',
14           'DynVar [DYVR_daily_c]', 'PMIP [PMIP-6hr]', 'HighResMIP [1hrLev]', 'PMIP [PMIP-Amon-02]',
15           'PMIP [PMIP-day-02]', 'PMIP [PMIP-aero-02]']
16knownl = [ 'PMIP [PMIP-Lmon-02]']
17knowno = [ 'DAMIP [DAMIP_Omon_p2]', 'FAFMIP [fafOyr]', 'PMIP [PMIP-Omon-02]']
18
19from utils_wb import uniCleanFunc
20from utils_wb import workbook
21
22if os.path.isfile( 'refDefaultP.txt' ):
23  refpix = {}
24  for l in open( 'refDefaultP.txt' ).readlines():
25    bits = string.split( string.strip(l), '\t' )
26    assert len(bits) == 4, 'Bad record found in %s' % 'refDefaultP.txt'
27    refpix[bits[0]] = (bits[1],bits[2], int(bits[3]) )
28else:
29  refpix = None
30
31empty=re.compile('^$')
32
33src1 = '../workbook/trial2_20150831.xml'
34
35dq = dreq.loadDreq(dreqXML=src1, manifest=None)
36inx = dq.inx
37##inx.makeVarRefs()
38ix_rql_uid = {}
39ix_rqvg_uid = {}
40ix_ovar_uid = {}
41ix_gpi_uid = {}
42list_gp_ovar = collections.defaultdict( list )
43xr_var_ovar = collections.defaultdict( list )
44xr_var_gpi = collections.defaultdict( list )
45rql_by_name = collections.defaultdict( list )
46
47def makeVarRefs(uid, var, iref_by_uid):
48    varRefs = {}
49    for thisuid in var.uid.keys():
50      if iref_by_uid.has_key(thisuid):
51        ee1 = collections.defaultdict( list )
52        for k,i in iref_by_uid[thisuid]:
53          thisi = uid[i]
54          sect = thisi._h.label
55          if sect == 'groupItem':
56            ee1[sect].append( '%s.%s' % (thisi.mip, thisi.group) )
57          elif sect == 'ovar':
58            ee1[sect].append( thisi.mipTable )
59          elif sect == 'revisedTabItem':
60            ee1[sect].append( '%s.%s' % (thisi.mip, thisi.table) )
61        varRefs[thisuid] = ee1
62    return varRefs
63
64varRefs = makeVarRefs( inx.uid, inx.var, inx.iref_by_uid)
65
66class addUnits(object):
67  def __init__(self,dq,wbi='units/units.xlsx'):
68    eqs = [('N m-1', 'kg s-2', 'J m-2'), ('Pa', 'N m-2', 'kg m-1 s-2'), ('cm-1','km-1','m-1')     ]
69    eqss = ['N m-1','Pa','m-1','m','s','1','m s-2','m2','m3' ]
70
71    wb = workbook( wbi )
72    sh = wb.book.sheet_by_name('units')
73    self.repl = {}
74    self.uu = {}
75    for j in range(1,sh.nrows):
76      r = sh.row(j)
77      if len(r) > 5 and r[5].value != u'':
78        self.repl[ r[0].value ] = r[5].value
79      else:
80        self.uu[r[0].value] = [x.value for x in r]
81
82    for k in self.repl:
83      if self.repl[k] not in self.uu:
84        print 'Bad replacement found: %s --> %s' % (k,self.repl[k])
85
86    for i in dq.coll['var'].items:
87      if i.units in self.repl:
88        u = self.repl[i.units]
89      else:
90        u = i.units
91      u = string.strip(str(u))
92      if str(u) == '1.0':
93        u = '1'
94      if u not in self.uu:
95        if u == "1.0":
96          if float(u) not in self.uu:
97            print 'UNITS NOT FOUND: %s (%s)' % (u,i.label)
98        else:
99            print 'UNITS NOT FOUND: %s (%s)' % (u,i.label)
100
101  def uid(self,u0):
102    if u0 in self.repl:
103      u = self.repl[u0]
104    else:
105      u = u0
106    if u in self.uu:
107      return self.uu[u][7]
108    elif u == '1.0' and float(u) in self.uu:
109      return self.uu[float(u)][7]
110    else:
111      return None
112
113
114class updates(object):
115  delToks = sets.Set( ['inc','omit'] )
116  def __init__(self,fndup,fnmult,idir='rev1'):
117    assert os.path.isdir( idir ), 'Directory %s not found' % idir
118    self.fdup = '%s/%s' % (idir,fndup)
119    self.fmult = '%s/%s' % (idir,fnmult)
120    for p in [self.fdup,self.fmult]:
121      assert os.path.isfile( p ), 'File %s not found' % p
122    self.repl = {}
123    self.upd = {}
124    self.twins = []
125    self.ddel = {}
126    self.cmvrepl = {}
127
128  def writeCmvUpd( self, inx, fnrp='CMVreplace.csv'):
129    oo = open( fnrp, 'w' )
130    for k in self.cmvrepl.keys():
131      if inx.iref_by_uid.has_key(k):
132        kn = self.cmvrepl[k]
133        for tag,ki  in inx.iref_by_uid[k]:
134           vu = [ inx.uid.has_key(kk) for kk in [k,kn,ki] ]
135           if all( vu ):
136             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) )
137           else:
138             print 'ERROR.088.0003: Bad index in replace info: %s .. %s .. %s' % ( str([k,kn,ki]), str(vu), tag )
139      else:
140        print 'ERROR.088.0004: Bad index in replace info: %s' %  k
141    oo.close()
142
143  def writeVarUpd(self, inx, fnrp='uuidreplace.csv', fnrm='uuidremove.csv', fnup='uuidupdate.csv'):
144    oo = open( fnrp, 'w' )
145    oo2 = open( fnrm, 'w' )
146    for k in self.repl.keys():
147      if inx.iref_by_uid.has_key(k):
148        kn = self.repl[k]
149        for tag,ki  in inx.iref_by_uid[k]:
150           vu = [ inx.uid.has_key(kk) for kk in [k,kn,ki] ]
151           if all( vu ):
152             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) )
153           else:
154             print 'ERROR.088.0001: Bad index in replace info: %s .. %s .. %s' % ( str([k,kn,ki]), str(vu), tag )
155      else:
156        oo2.write( k + '\n' )
157    oo.close()
158    oo2.close()
159    oo = open( fnup, 'w' )
160    for k in self.upd.keys():
161        ee = self.upd[k]
162        oo.write( string.join( [k,ee['provNote'],string.join(ee['tags']),ee['label'], ee['title'] ], '\t') + '\n' )
163    oo.close()
164
165  def scandup(self):
166    ii = open( self.fdup ).readlines()
167    nn = (len(ii)-1)/2
168    for i in range(nn):
169      l1 = string.split( ii[i*2+1], '\t' )
170      l2 = string.split( ii[i*2+2], '\t' )
171      xx = l1[8:10]
172      yy = l2[8:10]
173      if xx[1] == '' and yy[1] == xx[0]:
174        ths = 0
175        assert not self.repl.has_key( yy[0] ), 'duplicate replacement request for %s' % yy[0]
176        self.repl[ yy[0] ] = yy[1] 
177      elif yy[1] == '' and xx[1] == yy[0]:
178        ths = 1
179        assert not self.repl.has_key( xx[0] ), 'duplicate replacement request for %s' % xx[0]
180        self.repl[ xx[0] ] = xx[1] 
181      elif l1[10] == 'twin' and  l2[10] == 'twin':
182        ths = 2
183        self.twins.append( l1[8] )
184        self.twins.append( l2[8] )
185      elif l1[10] in self.delToks and l2[10] in self.delToks:
186        ths = 3
187        self.ddel[ l1[8] ] = (l1[10],l1[11])
188        self.ddel[ l2[8] ] = (l2[10],l2[11])
189      elif xx[1] == '' and yy[1] == "":
190        print 'WARN.087.00001: uncorrected duplication ..... %s ' %  str( l1[:5] )
191      else:
192        ths = -1
193        print 'ERROR.xxx.0001: Match failed'
194        print l1
195        print l2
196        assert False
197
198  def scancmvdup(self):
199    wb = workbook( 'csv2/CMORvar.xls' )
200    sht = wb.book.sheet_by_name( 'Sheet1' )
201    for i in range(sht.nrows):
202      rr = sht.row(i)
203      if len(rr) == 21 and str( rr[20].value ) != '':
204        kn = rr[20].value
205        ko = rr[18].value
206        vn = rr[0].value
207        self.cmvrepl[ ko ] = kn
208        print '%s: replace %s with %s' % (vn,ko,kn)
209
210  def scanmult(self):
211    ii = open( self.fmult ).readlines()
212    nn = (len(ii)-1)/3
213    for i in range(nn):
214      l1 = string.split( ii[i*3+1], '\t' )
215      l2 = string.split( ii[i*3+2], '\t' )
216      l3 = string.split( ii[i*3+3], '\t' )
217      yy = [l1[9],l2[9],l3[9]]
218      xx = [l1[8],l2[8],l3[8]]
219      zz = (l1,l2,l3)
220      for j in range(3):
221        if yy[j] != '':
222          assert yy[j] in xx, 'Invalid replacement option, %s' % yy[j]
223          assert  not self.repl.has_key( xx[j] ), 'duplicate replacement request for %s' % xx[j]
224          self.repl[ xx[j] ] = yy[j]
225        elif zz[j][10] == 'twin':
226          self.twins.append( zz[j][8] )
227        elif zz[j][11] == 'update':
228          tags = map( string.strip, string.split( zz[j][13], ',' ) )
229          self.upd[ xx[j] ] = { 'provNote':zz[j][12], 'tags':tags, 'label':zz[j][0], 'title':zz[j][1] }
230
231###
232### varDup and varMult created in first parse ----- then editted to select options
233### 2nd pass through then generates the replace and remove options -- taking into account cross references
234### the results of the 2nd pass go back to ../workbook to generate a new set of inputs.
235###
236up = updates('varDup.csv', 'varMult.csv', idir='rev2')
237up.scandup()
238up.scancmvdup()
239up.scanmult()
240
241urep = False
242urep = True
243if urep:
244  up.writeVarUpd( inx, fnrp='uuidreplace.csv', fnrm='uuidremove.csv', fnup='uuidupdate.csv')
245  up.writeCmvUpd( inx, fnrp='CMVreplace.csv')
246else:
247  oo2 = open( 'uuidremove2.csv', 'w' )
248  for i in dq.coll['var'].items:
249    if not inx.iref_by_uid.has_key(i.uid):
250      oo2.write( string.join( [i.uid,i.label,i.title,i.prov,i.description], '\t') + '\n' )
251  oo2.close()
252
253### check back references.
254nbr = 0
255lbr = []
256for k in inx.iref_by_uid.keys():
257  if not inx.uid.has_key(k):
258   nbr += 1
259   lbr.append(k)
260print 'Missing references: ', nbr
261### can now apply mappings, create updated records and write to new xml?
262
263for i in dq.coll['requestLink'].items:
264   rql_by_name[i.label].append( i.uid )
265   ix_rql_uid[i.uid] = i
266
267for i in dq.coll['requestVarGroup'].items:
268   ix_rqvg_uid[i.uid] = i
269
270
271if dq.coll.has_key( 'revisedTabItem' ):
272  thisk = 'revisedTabItem'
273else:
274  thisk = 'requestVar'
275oo = open( 'uuidinsert.csv', 'w' )
276for i in dq.coll[thisk].items:
277  if i.uid == '__new__':
278    if inx.var.label.has_key( i.label ):
279      if len( inx.var.label[i.label] ) == 1:
280        v = inx.uid[ inx.var.label[i.label][0] ]
281        oo.write( string.join( ['unique',i.label,v.label,v.uid,v.prov,i.mip], '\t' ) + '\n' )
282      else:
283        oo.write( string.join( ['ambiguous',i.label,i.mip,str(len(inx.var.label[i.label] ) ) ], '\t' ) + '\n' )
284oo.close()
285   
286oo = open( 'varMult.csv', 'w' )
287oo2 = open( 'varDup.csv', 'w' )
288oo3 = open( 'varStar.csv', 'w' )
289hs = ['label','title','sn','units','description','prov','procnote','procComment','uid']
290oo.write( string.join(hs, '\t' ) + '\n' )
291oo2.write( string.join(hs, '\t' ) + '\n' )
292oo3.write( string.join(hs, '\t' ) + '\n' )
293ks = inx.var.label.keys()
294ks.sort()
295emptySet = sets.Set( ['','unset'] )
296def entryEq(a,b):
297  return a == b or (a in emptySet and b in emptySet)
298
299deferredRecs = []
300for k in ks:
301  if len(inx.var.label[k]) == 2:
302    v1 = inx.var.uid[inx.var.label[k][0]]
303    v2 = inx.var.uid[inx.var.label[k][1]]
304    cc = map( lambda x: entryEq( v1.__dict__[x], v2.__dict__[x]), ['title','sn','units','description']  )
305    if all(cc):
306### where duplicates are identical , collect and output at end of file.
307      pv1 = string.find( v1.__dict__['prov'], 'OMIP.' ) != -1
308      pv2 = string.find( v2.__dict__['prov'], 'OMIP.' ) != -1
309      if pv2:
310        vp = v2
311        vo = v1
312      else:
313        if not pv1:
314          print 'WARN.088.00002: no preference: %s, %s, %s' % (v1.__dict__['label'],v1.__dict__['prov'],v2.__dict__['prov'])
315        vp = v1
316        vo = v2
317      deferredRecs.append( string.join(map( lambda x: vo.__dict__[x], hs) + [vp.uid,'identical'], '\t' ) + '\n' )
318      deferredRecs.append( string.join(map( lambda x: vp.__dict__[x], hs) + ['',''], '\t' ) + '\n' )
319    else:
320      try:
321        oo2.write( string.join(map( lambda x: str(v1.__dict__[x]), hs) + ['',''], '\t' ) + '\n' )
322        oo2.write( string.join(map( lambda x: str(v2.__dict__[x]), hs) + ['',''], '\t' ) + '\n' )
323      except:
324        print 'SEVERE.oo2.00001',v1.__dict__
325        print 'SEVERE.oo2.00002',v2.__dict__
326     
327  elif len(inx.var.label[k]) > 1:
328    for i in inx.var.label[k]:
329      oo.write( string.join(map( lambda x: inx.var.uid[i].__dict__[x], hs), '\t' ) + '\n' )
330
331  if k[-2:] == '--':
332    for i in (inx.var.label[k] + inx.var.label[k[:-2]]):
333      oo3.write( string.join(map( lambda x: inx.var.uid[i].__dict__[x], hs), '\t' ) + '\n' )
334
335## output auto-filled records for identical duplicates at end of varDup file.
336for r in deferredRecs:
337  oo2.write( r )
338oo.close()
339oo2.close()
340oo3.close()
341
342
343
344vns = inx.var.label.keys()
345vns.sort()
346for v in vns:
347  if len( inx.var.label[v] ) > 1:
348     print 'INFO.001.0001:',v, string.join( map( lambda x: inx.var.uid[x].sn, inx.var.label[v] ), ';' )
349
350nok = 0
351nerr = 0
352if dq.coll.has_key( 'ovar' ):
353  thisk = 'ovar'
354else:
355  thisk = 'CMORvar'
356for i in dq.coll[thisk].items:
357   vid = i.vid
358   ix_ovar_uid[i.uid] = i
359   xr_var_ovar[vid].append( i.uid )
360   if not inx.var.uid.has_key(vid):
361     print 'missing key:',i.label, i.prov, vid
362     nerr += 1
363   else:
364     nok += 1
365
366class rqHtml(object):
367
368  def __init__(self,odir='./htmlSc/'):
369    self.odir = odir
370    if not os.path.isdir(odir):
371      os.mkdir(odir)
372
373  def mkRqlHtml(self,name):
374     ## [u'comment', u'uid', u'tab', u'title', u'label', u'grid', 'defaults', u'objective', u'mip', 'globalDefault', u'gridreq']
375    if len( rql_by_name[name] ) == 1:
376      self.mkRqlHtml01(rql_by_name[name][0], name )
377    else:
378      self.mkRqlHtmlGp(name)
379
380  def mkRqlHtmlGp(self,name):
381    ee = {}
382    ee['title'] = 'CMIP Request Link %s (with multiple definitions)' % name
383    self.pageName = 'rql__%s.html' % name
384    al =[]
385    for i in range( len( rql_by_name[name] ) ):
386      this = ix_rql_uid[rql_by_name[name][i]]
387      al.append( tmpl.item % {'item':'<a href="rql__%s__%s.html">[%s]</a>: %s' % (name,i,i,this.title) } )
388    ee['items'] = string.join(al, '\n' )
389    ee['introduction'] = ''
390    ee['htmlBody'] = tmpl.indexWrapper % ee
391    ee['htmlHead'] = '''<title>%(title)s</title>''' % ee
392    self.pageHtml = tmpl.pageWrapper % ee
393    self.write()
394    for i in range( len( rql_by_name[name] ) ):
395      self.mkRqlHtml01(rql_by_name[name][i],i)
396
397  def mkRqlHtml01(self,id, tag):
398    this = ix_rql_uid[id]
399    ee = {}
400    if this.label == tag:
401      ee['title'] = 'CMIP Request Link %s' % tag
402      self.pageName = 'rql__%s.html' % tag
403    else:
404      ee['title'] = 'CMIP Request Link %s[%s]' % (this.label,tag)
405      self.pageName = 'rql__%s__%s.html' % (this.label,tag)
406    atts = this.__dict__.keys()
407    atts.sort()
408    al =[]
409    for a in atts:
410      if a not in ['defaults','globalDefault']:
411        al.append( tmpl.item % {'item':'<b>%s</b>: %s' % (a,this.__dict__.get(a,'-- Not Set --')) } )
412    ee['items'] = string.join(al, '\n' )
413    ee['introduction'] = ''
414    ee['htmlBody'] = tmpl.indexWrapper % ee
415    ee['htmlHead'] = '''<title>%(title)s</title>''' % ee
416    self.pageHtml = tmpl.pageWrapper % ee
417    self.write()
418     
419  def mkVarHtml(self,name):
420    if len( inx.var.label[name] ) == 1:
421      self.mkVarHtml01(inx.var.label[name][0], name )
422    else:
423      self.mkVarHtmlGp(name)
424
425  def mkVarHtmlGp(self,name):
426    ee = {}
427    ee['title'] = 'CMIP Variable %s (with multiple definitions)' % name
428    self.pageName = 'var__%s.html' % name
429    al =[]
430    for i in range( len( inx.var.label[name] ) ):
431      this = inx.var.uid[inx.var.label[name][i]]
432      al.append( tmpl.item % {'item':'<a href="var__%s__%s.html">[%s]</a>: %s' % (name,i,i,this.title) } )
433    ee['items'] = string.join(al, '\n' )
434    ee['introduction'] = ''
435    ee['htmlBody'] = tmpl.indexWrapper % ee
436    ee['htmlHead'] = '''<title>%(title)s</title>''' % ee
437    self.pageHtml = tmpl.pageWrapper % ee
438    self.write()
439    ##print 'Multi var: %s' % name
440    for i in range( len( inx.var.label[name] ) ):
441      self.mkVarHtml01(inx.var.label[name][i],i)
442
443  def mkVarHtml01(self,id, tag):
444    this = inx.var.uid[id]
445    ee = {}
446    if this.label == tag:
447      ee['title'] = 'CMIP Variable %s' % tag
448      self.pageName = 'var__%s.html' % tag
449    else:
450      ee['title'] = 'CMIP Variable %s[%s]' % (this.label,tag)
451      self.pageName = 'var__%s__%s.html' % (this.label,tag)
452    atts = this.__dict__.keys()
453    atts.sort()
454    al =[]
455    for a in atts:
456      if a not in ['defaults','globalDefault']:
457        al.append( tmpl.item % {'item':'<b>%s</b>: %s' % (a,this.__dict__.get(a,'-- Not Set --')) } )
458
459    if inx.iref_by_uid.has_key(this.uid):
460      assert varRefs.has_key(this.uid), 'Problem with collected references'
461      ee1 = varRefs[this.uid]
462      ks = ee1.keys()
463      ks.sort()
464      for k in ks:
465        al.append( tmpl.item % {'item':'<b>%s</b>: %s' % (k,string.join(ee1[k])) } )
466    ee['items'] = string.join(al, '\n' )
467    ee['introduction'] = ''
468    ee['htmlBody'] = tmpl.indexWrapper % ee
469    ee['htmlHead'] = '''<title>%(title)s</title>''' % ee
470    self.pageHtml = tmpl.pageWrapper % ee
471    self.write()
472
473  def varHtml(self):
474    for k in inx.var.label.keys():
475      self.mkVarHtml(k)
476 
477  def rqlHtml(self):
478    for k in rql_by_name.keys():
479      self.mkRqlHtml(k)
480 
481  def write(self):
482    oo = open( '%s/%s' % (self.odir,self.pageName), 'w' )
483    oo.write( self.pageHtml )
484    oo.close()
485
486   
487vh = rqHtml()
488vh.varHtml()
489vh.rqlHtml()
490
491if nerr == 0:
492  print 'CHECK 001: %s records checked, no missing references' % nok
493
494shps = {'': 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}
495vshpchkMap = {'':'', u'all model levels above 400hPa':'alevStrat', u'all':'Xlev', 3.0:'plev3', '4.0':'plev4', \
496            36.0:'plev36', u'soil levels':'sdepth', \
497            1.0:'sfc?', \
498           16.0:'plev16', 7.0:'plev7', 40.0:'plev40', u'all*':'Xlev', 14.0:'plev14', u'Model levels or 27Plevs':'alev|plev27', \
499           u'17 (or 23 )':'plev17|plev23', u'17 (or 23)':'plev17|plev23', \
500           27.0:'plev27', 17.0:'plev17', u'17 (or23)':'plev17|plev23', 8.0:'plev8', u'all model levels':'alev', 5.0:'plev5'}
501ks = vshpchkMap.keys()
502for k in ks:
503  if type(k) == type(0.):
504     vshpchkMap[str(k)] = vshpchkMap[k]
505
506tsmap = { 'mean':[u'daily mean', u'time mean', u'time: day',
507                u'Cumulative annual fraction', u'Time mean', u'weighted time mean', u'time: mean', u'mean', u'Mean'],
508          '__unknown__':['','dummyAt'],
509          'point':[ u'Instantaneous (end of year)', u'point', u'Synoptic', u'instantaneous', u'time: point', u'synoptic'] }
510tsmap2 = {}
511for k in tsmap.keys():
512  for i in tsmap[k]:
513    tsmap2[i] = k
514
515if dq.coll.has_key( 'groupItem' ):
516  ee = collections.defaultdict( int )
517  for i in dq.coll['groupItem'].items:
518    tst = tsmap2[ i.tstyle ]
519    dd = ''
520    if 'X' in i.shape:
521      dd += 'latitude '
522    if 'Y' in i.shape:
523      dd += 'longitude '
524    if 'Z' in i.shape:
525      if i.levels == '':
526        print 'ERROR.001.0001: no levels specified', i.label, i.title
527      else:
528        zdim = vshpchkMap[i.levels]
529        dd +=  zdim
530  ## print '%s::%s::%s|%s' % (i.shape, i.levels, i.tstyle, dd)
531  for i in dq.coll['groupItem'].items:
532     list_gp_ovar[i.gpid].append( i.uid )
533
534  nok = 0
535  nerr = 0
536  for i in dq.coll['groupItem'].items:
537     vid = i.vid
538     ix_gpi_uid[i.uid] = i
539     xr_var_gpi[vid].append( i.uid )
540     if not inx.var.uid.has_key(vid):
541       nerr += 1
542     else:
543       nok += 1
544  ##print 'groupItem to var crossref: nok = %s, nerr = %s' % (nok, nerr)
545
546
547class tcmp(object):
548  def __init__(self):
549    pass
550  def cmp(self,x,y):
551    return cmp(x.title,y.title)
552
553def atRepr(l,x,optional=False):
554  if x != None:
555    if optional:
556      v = l.__dict__.get(x, '' )
557    else:
558      v = l.__dict__[x]
559  else:
560    v = l
561  if v == '__unset__':
562    return ''
563  elif type(v) in [ type([]), type(())]:
564    return string.join([str(i) for i in v])
565  else:
566    return v
567
568class xlsx(object):
569  def __init__(self,fn):
570    self.wb = xlsxwriter.Workbook(fn)
571
572  def newSheet(self,name):
573    self.worksheet = self.wb.add_worksheet(name=name)
574    return self.worksheet
575
576  def close(self):
577    self.wb.close()
578 
579def dumpxlsx( fn, key, atl):
580  wb = xlsx( fn )
581  sht = wb.newSheet( key )
582  j = 0
583  for i in range(len(atl)):
584     sht.write( j,i, atl[i] )
585  ll = dq.coll[key].items[:]
586  ll.sort( tcmp().cmp )
587  for l in ll:
588    uid = atRepr(l,'uid')
589    j+=1
590    i=0
591    for x in atl:
592       sht.write( j,i, atRepr(l,x) )
593       i+=1
594    if key == 'var' and refpix != None:
595      if uid in refpix:
596        p = refpix[uid][2]
597      else:
598        p = 201
599      sht.write( j,i, p )
600  wb.close()
601     
602def dumpcsv( fn, key, atl, optionalSet='' ):
603  oo = open(fn, 'w' )
604  ll = dq.coll[key].items[:]
605  ll.sort( tcmp().cmp )
606  oo.write( string.join( atl, '\t' ) + '\n' )
607  for l in ll:
608    try:
609      oo.write( string.join( map( lambda x: str(atRepr(l,x,x in optionalSet)), atl), '\t' ) + '\n' )
610    except:
611      print 'SEVERE.090.0001: print %s' % str(atl)
612      print l
613      print key
614      raise
615  oo.close()
616
617def atlSort( ll ):
618  oo = []
619  l1 = ['label','title']
620  l2 = ['uid','defaults','globalDefault']
621  for i in l1:
622    if i in ll:
623      oo.append(i)
624  ll.sort()
625  for i in ll:
626    if i not in l1 + l2:
627      oo.append(i)
628  if 'uid' in ll:
629    oo.append( 'uid' )
630  return oo
631
632for k in dq.coll.keys():
633  if len( dq.coll[k].items ) > 0:
634    expl = dq.coll[k].items[0]
635    atl = atlSort( expl.__dict__.keys() )
636    atl1 = [a for a in atl if a != 'parent' and a[0] != '_']
637    ###print k, atl1
638    optionalSet = set( [a for a in atl1 if not expl.__class__.__dict__[a].required] )
639    dumpcsv( 'csv2/%s.csv' % k, k, atl1, optionalSet=optionalSet )
640    if k == 'var':
641       dumpxlsx( 'csv2/var.xlsx', k, atl1 )
642 
643class annotate(object):
644  def __init__(self,src,dreq):
645    assert os.path.isfile( src), '%s not found' % src
646    self.doc = xml.dom.minidom.parse( src  )
647    self.dreq = dreq
648    self.removedUids = {}
649
650  def iniVar(self,dq):
651    a = addUnits(dq)
652    this = self.doc.getElementsByTagName('var')[0]
653    dil = this.getElementsByTagName('item')
654    self.vid = {}
655    for item in dil:
656      uid = item.getAttribute( 'uid' ) 
657      title = item.getAttribute( 'title' ) 
658      label = item.getAttribute( 'label' ) 
659      self.vid[uid] = (label,title)
660      units = item.getAttribute( 'units' ) 
661      if units in a.repl:
662        print 'INFO.units.0001: replacing %s --> %s' % (units,a.repl[ units ])
663        units = a.repl[ units ]
664      u2 = a.uid( units )
665      if u2 == None:
666        units = string.strip( str(units) )
667        u2 = a.uid( units )
668      if u2 != None:
669        item.setAttribute( 'unid', u2 )
670      else:
671        print 'Units not recognised: %s (%s) -- %s' % (units,label, type(units))
672     
673  def tableMap(self,dq):
674    that = self.doc.getElementsByTagName('CMORvar')[0]
675    dil = that.getElementsByTagName('item')
676    ee1 = {}
677    for item in dil:
678      mt = item.getAttribute( 'mipTable' )
679      if mt in mipTableMap:
680        mt1 = mipTableMap[mt]
681        item.setAttribute( 'mipTable', mt1 )
682        item.setAttribute( 'mtid', 'MIPtable::%s' % mt1 )
683     
684  def strTtl(self,dq):
685    this = self.doc.getElementsByTagName('cellMethods')[0]
686    dil = this.getElementsByTagName('item')
687    eecm = {}
688    for item in dil:
689      eecm[item.getAttribute( 'uid' )] = item.getAttribute( 'label' )
690
691    that = self.doc.getElementsByTagName('spatialShape')[0]
692    dil = that.getElementsByTagName('item')
693    ee1 = {}
694    for item in dil:
695      uid = item.getAttribute( 'uid' )
696      lab = item.getAttribute( 'label' )
697      ttl = item.getAttribute( 'title' )
698      ee1[uid] = (lab,ttl)
699
700    this = self.doc.getElementsByTagName('structure')[0]
701    dil = this.getElementsByTagName('item')
702   
703    filterStr = True
704    estr = []
705    strForce = ['str-a076','str-x269','str-x100']
706    for item in dil:
707      uid = item.getAttribute( 'uid' ) 
708      lab = item.getAttribute( 'label' ) 
709      if len( dq.inx.iref_by_uid[uid] ) == 0 and filterStr:
710         if lab not in strForce:
711           print 'UNUSED STRUCTURE: %s, %s' % (lab,uid)
712           this.removeChild( item )
713           self.removedUids[uid] = 'structure: %s' % lab
714      else:
715        tmid = item.getAttribute( 'tmid' ) 
716        spid = item.getAttribute( 'spid' ) 
717        cmid = item.getAttribute( 'cmid' ) 
718        cml = eecm.get( cmid, '' )
719        if cml != '':
720          cml = ' [%s]' % cml
721        o = item.getAttribute( 'odims' ) 
722        c = item.getAttribute( 'coords' ) 
723        if spid not in ee1:
724          print 'SEVERE:spid.0001: spid not found: %s' % spid
725          sl = '__unknowm__'
726          st = '__unknowm__'
727        else:
728          sl,st = ee1[spid]
729        if tmid not in dq.inx.uid:
730          print 'BAD time record uid: ',tmid
731          print lab, uid
732          raise
733        title = '%s, %s [%s]' % (dq.inx.uid[tmid].title, st, sl) 
734        if string.strip( c ) != '' or string.strip( o ) != '':
735          title += ' {%s:%s}' % (o,c)
736        title += cml
737        if title != item.getAttribute( 'title' ):
738           print 'STRUCT: %s:: %s' % (title, item.getAttribute( 'title' ) )
739           if item.getAttribute( 'title' )[:4] == 'str-':
740             item.setAttribute( 'title', title )
741             estr.append( item.getAttribute( 'label' ) )
742    if len(estr) > 0:
743      oo = open( 'scandreq_estr.txt', 'w' )
744      for i in estr:
745        oo.write( i + '\n' )
746      oo.close()
747   
748  def rvgCheck(self,dq):
749    """Remove request variable groups which have no requestLink"""
750    this = self.doc.getElementsByTagName('requestVarGroup')[0]
751    dil = this.getElementsByTagName('item')
752    nn = 0
753    for item in dil:
754        uid = item.getAttribute( 'uid' ) 
755        if ('requestLink' not in dq.inx.iref_by_sect[uid].a) and ('tableSection' not in dq.inx.iref_by_sect[uid].a):
756          if item.getAttribute( 'label' ) in ['aermonthly']:
757             print 'WARN.0010: overriding variable group pruning: ',item.getAttribute( 'label' )
758          else:
759            ##self.removedUids[ uid ] = 'requestVarGroup:  %s' % item.getAttribute( 'label' )
760            ##this.removeChild(item)
761            print 'INFO.rvg.0001: New rvg?? ',uid, item.getAttribute( 'label' )
762            nn+=1
763    ##print 'WARN.Unused variable groups removed: %s' % nn
764    this = self.doc.getElementsByTagName('requestVar')[0]
765    dil = this.getElementsByTagName('item')
766    nn = 0
767    s1 = {i.uid for i in dq.coll['requestVarGroup'].items if i.uid not in self.removedUids}
768    self.usedCmv = set()
769    for item in dil:
770        uid = item.getAttribute( 'uid' ) 
771        vid = item.getAttribute( 'vid' )
772        vgid = item.getAttribute( 'vgid' )
773        if vgid not in s1:
774          this.removeChild(item)
775          self.removedUids[ uid ] = 'requestVar:  %s' % item.getAttribute( 'label' )
776          nn+=1
777        else:
778          self.usedCmv.add( vid )
779    print 'Unused request variables removed: %s' % nn
780       
781  def rqvCheck(self,dq):
782    wb = workbook( 'ingest/rqv_cmv_remap.xls' )
783    rqvredirect = {('aermonthly','siconc'):'SImon' }
784    sh = wb.book.sheet_by_name('maps')
785    self.repl = {}
786    self.uu = {}
787    for j in range(sh.nrows):
788      r = [str(x.value) for x in sh.row(j)]
789      rqvredirect[ ( r[0], r[1] ) ] = r[2]
790
791    this = self.doc.getElementsByTagName('requestVar')[0]
792    dil = this.getElementsByTagName('item')
793    badrqv = set()
794    self.removedCmv = set()
795    for item in dil:
796        uid = item.getAttribute( 'uid' ) 
797        vid = item.getAttribute( 'vid' ) 
798        if vid not in dq.inx.uid:
799          badrqv.add( uid )
800        elif dq.inx.uid[vid]._h.label == 'remarks':
801          badrqv.add( uid )
802        else:
803          cmv = (dq.inx.uid[vid].mipTable,dq.inx.uid[vid].label)
804          if cmv in rqvredirect:
805            targ = (rqvredirect[cmv],dq.inx.uid[vid].label)
806            if targ not in self.cmvLookUp:
807              print 'SEVERE.rgvrdi.00001: attempt to redirect to non-existant var: %s --> %s' % (str(cmv),str(targ))
808            else:
809               nid = self.cmvLookUp[targ]
810               item.setAttribute( 'vid', nid )
811               self.removedCmv.add( vid )
812               print 'INFO.rgvrdi.00002: redirect rql to new CMOR var: %s --> %s' % (str(cmv),str(targ))
813   
814  def cmvCheck2(self,dq):
815    this = self.doc.getElementsByTagName('CMORvar')[0]
816    dil = this.getElementsByTagName('item')
817    self.usedVar = set()
818
819    self.keepVar = {'ugrido',}
820    for item in dil:
821        uid = item.getAttribute( 'uid' ) 
822        if ((uid not in self.usedCmv) or (uid in self.removedCmv)) and (item.getAttribute( 'label' ) not in self.keepVar):
823          print 'INFO.cmv.04004: removing unused CMORvar: %s, %s, %s, %s: ' % (uid,item.getAttribute( 'label' ),item.getAttribute( 'table' ),item.getAttribute( 'mipTable' ))
824          this.removeChild(item)
825          self.removedUids[ uid ] = 'CMORvar:  %s' % item.getAttribute( 'label' )
826        else:
827          self.usedVar.add( item.getAttribute( 'vid' ) )
828
829    this = self.doc.getElementsByTagName('var')[0]
830    dil = this.getElementsByTagName('item')
831    self.varLookUp = {}
832    for item in dil:
833        uid = item.getAttribute( 'uid' ) 
834        self.varLookUp[ item.getAttribute( 'label' ) ] = uid
835        if uid not in self.usedVar and item.getAttribute( 'label' ) not in self.keepVar:
836          print 'INFO.var.04004: removing unused var: %s, %s, %s, %s: ' % (uid,item.getAttribute( 'label' ),item.getAttribute( 'table' ),item.getAttribute( 'units' ))
837          this.removeChild(item)
838          self.removedUids[ uid ] = 'var:  %s' % item.getAttribute( 'label' )
839
840    this = self.doc.getElementsByTagName('CMORvar')[0]
841    wb = workbook( 'ingest/extraCmv.xls' )
842    sh = wb.book.sheet_by_name('extra')
843    extra = []
844    self.uu = {}
845    for j in range(1,sh.nrows):
846      extra.append( [str(x.value) for x in sh.row(j)] + ['',''] )
847    extra_old = [('E6hrZ','ps','str-a076','ps','atmos','Surface Pressure','Surface Pressure .. needed for vertical coordinates','6hr', 'CMIP extra','scanDreq.py','1','float',''),
848             ('AERmon','ps','str-013','ps','atmos','Surface Pressure','Surface Pressure .. needed for vertical coordinates','mon', 'CMIP extra','scanDreq.py','1','float',''),
849             ('E3hrPt','ps','str-d11','ps','atmos','Surface Pressure','Surface Pressure .. needed for vertical coordinates','3hr', 'CMIP extra','scanDreq.py','1','float',''),]
850    eh = ['label','modeling_realm','title','description','frequency','provNote','prov','defaultPriority','type','positive']
851    hids = set()
852    idfp = eh.index('defaultPriority') + 3
853    for e in extra:
854     assert e[11] in ['float'], 'bad type in cmv extra ... see ingest/extraCmv.xls: %s' % e[11] 
855     if (e[0],e[1]) not in self.cmvLookUp:
856       e[idfp] = str( int( float( e[idfp] ) ) )
857       stid = self.strLookUp[e[2]]
858       vid = self.varLookUp[e[1]]
859       new = self.doc.createElement( 'item' )
860       new.setAttribute( 'mipTable', e[0] )
861       new.setAttribute( 'mtid', 'MIPtable::%s' % e[0] )
862       new.setAttribute( 'stid', stid )
863       new.setAttribute( 'vid', vid )
864       new.setAttribute( 'rowIndex', '0' )
865       for a in ['deflate','deflate_level','shuffle']:
866          new.setAttribute( a, '' )
867       hid = hashlib.new( 'sha1', 'extra-fields::' + ':'.join(e[:8]) ).hexdigest()
868       assert hid not in hids
869       new.setAttribute( 'uid', hid )
870       print 'INFO.extra.00011: ',e
871
872       for k in range(len(eh) ):
873         new.setAttribute( eh[k], e[3+k] )
874       this.appendChild( new )
875     else:
876       print 'SKIPPING extraCMV: %s.%s' % (e[0],e[1])
877         
878     
879
880  def cmvCheck(self,dq):
881    this = self.doc.getElementsByTagName('CMORvar')[0]
882    dil = this.getElementsByTagName('item')
883    kk = 0
884    kka = 0
885    nrm0 = 0
886    nrm1 = 0
887    self.cmvLookUp = {}
888    for item in dil:
889      title = item.getAttribute( 'title' ) 
890      if title[:6] == '__from':
891        kka += 1
892        vid = item.getAttribute( 'vid' ) 
893        if vid in self.vid:
894          title2 = self.vid[vid][1]
895          item.setAttribute( 'title', title2 )
896          kk += 1
897      realm = item.getAttribute( 'modeling_realm' )
898      if realm in ['','?']:
899        stid = item.getAttribute( 'stid' )
900        st = dq.inx.uid[stid]
901        odims = st.odims
902        this = None
903        if odims == 'iceband':
904          this = 'seaIce'
905        elif odims not in ['','?']:
906          this = 'atmos'
907        else:
908          sp = dq.inx.uid[st.spid]
909          if sp.label in ['TR-na','XY-O', 'YB-O', 'YB-R']:
910            this = 'ocean'
911          elif sp.label != 'XY-na':
912            this = 'atmos'
913          else:
914            prov = item.getAttribute( 'prov' )
915            if prov in knowna:
916              this = 'atmos'
917            elif prov in knowno:
918              this = 'ocean'
919            elif prov in knownl:
920              this = 'land'
921            else:
922              lab  = item.getAttribute( 'label' )
923              print 'ERROR.cmv.00006: no realm: %s, %s, %s, %s ..' % (lab,odims, sp.label, prov)
924        if this == None:
925          nrm1 += 1
926        else:
927          nrm0 += 1
928          item.setAttribute( 'modeling_realm', this )
929      self.cmvLookUp[(item.getAttribute( 'mipTable' ),item.getAttribute( 'label' ) )] = item.getAttribute( 'uid' )
930    print ('CMOR Var realms set: %s' % nrm0 )
931    if nrm1 > 0:
932      print ('SEVERE.cmv.00005: realm unset: %s' % nrm1)
933    print ('CMOR Var titles reset: %s [%s]' % (kk,kka))
934   
935  def mipProv(self,dq):
936    s1 = re.compile( '\[([a-zA-Z0-9]*)\]' )
937    cc = collections.defaultdict(list)
938    dd = collections.defaultdict(int)
939    mips = set()
940    for i in dq.coll['mip'].items:
941      mips.add( i.uid )
942    for i in dq.coll['var'].items:
943      cc[i.prov].append( i.label )
944
945    ee = {}
946    for i in sorted( cc.keys() ):
947      if i[:9] == 'CMIP6 end':
948        m = s1.findall( i )
949        assert len( m ) == 1, 'FAILED TO PARSE: %s' % i
950        this = m[0]
951      else:
952        i5 = i.find( 'CMIP5' ) != -1
953        io = i.find( 'OMIP' ) != -1
954        icx = i.find( 'CORDEX' ) != -1
955        ip = i.find( 'PMIP' ) != -1
956        icc = i.find( 'CCMI' ) != -1
957        isp = i.find( 'SPECS' ) != -1
958        icf = i.find( 'CFMIP' ) != -1
959        iac = i.find( 'AerChemMIP' ) != -1
960        if i5 and io:
961          print 'WARNING .. unclear provenance: ',i,cc[i]
962          this = 'CMIP5/OMIP'
963        elif i5:
964          this = 'CMIP5'
965        elif io:
966          this = 'OMIP'
967        elif icx:
968          this = 'CORDEX'
969        elif ip:
970          this = 'PMIP'
971        elif icc:
972          this = 'CCMI'
973        elif isp:
974          this = 'SPECS'
975        elif icf:
976          this = 'CFMIP'
977        elif iac:
978          this = 'AerChemMIP'
979        else:
980          print 'WARNING .. unclear provenance [2]: ',i,cc[i]
981          this = 'unknown'
982   
983      ee[i] = this
984      dd[this] += len( cc[i] )
985    self.dd = dd
986    self.ee = ee
987    this = self.doc.getElementsByTagName('var')[0]
988    dil = this.getElementsByTagName('item')
989    print 'FIXING var provmip attribute, %s items' % len(dil)
990    kk = 0
991    for item in dil:
992      kk += 1
993      p = item.getAttribute( 'prov' ) 
994      p0 = item.getAttribute( 'provmip' ) 
995      if p0 not in mips:
996        if p in mips:
997          item.setAttribute( 'provmip', p )
998        else:
999          assert ee.has_key(p), 'Unmatched key: %s' % p
1000          assert ee[p] in mips, 'Unknown provenance: %s, %s' % (p,ee[p])
1001          item.setAttribute( 'provmip', ee[p] )
1002     
1003  def fixCellMethods(self,dq):
1004    this = self.doc.getElementsByTagName('structure')[0]
1005    dil = this.getElementsByTagName('item')
1006    cmrep = collections.defaultdict( set )
1007    cmc = collections.defaultdict( int )
1008    self.strLookUp = {}
1009    nrep = 0
1010    for item in dil:
1011      self.strLookUp[ item.getAttribute( 'label' ) ] = item.getAttribute( 'uid' )
1012      cm = item.getAttribute( 'cell_methods' ) 
1013      if string.find( cm, "area: where" ) != -1:
1014        cm1 = string.replace( cm, "area: where", "area: mean where" )
1015        item.setAttribute( 'cell_methods', cm1 ) 
1016        cmrep[cm].add(cm1)
1017        cmc[cm1] += 1
1018        nrep += 1
1019      elif string.find( cm, "time:mean" ) != -1:
1020        cm1 = string.replace( cm, "time:mean", "time: mean" )
1021        item.setAttribute( 'cell_methods', cm1 ) 
1022        cmrep[cm].add(cm1)
1023        cmc[cm1] += 1
1024        nrep += 1
1025      elif string.find( cm, "weighted b " ) != -1:
1026        cm1 = string.replace( cm, "weighted b ", "weighted by " )
1027        item.setAttribute( 'cell_methods', cm1 ) 
1028        cmrep[cm].add(cm1)
1029        cmc[cm1] += 1
1030        nrep += 1
1031    print ('FIXED CELL METHODS .. %s' % nrep )
1032    for k in cmc:
1033      print ('%s: %s' % (k,cmc[k]) )
1034
1035
1036##
1037## defective code .. can not easily do structure mapping here .. need to think about that ...
1038##
1039  def sectionCopy(self,dq):
1040    this = self.doc.getElementsByTagName('CMORvar')[0]
1041    thisRqv = self.doc.getElementsByTagName('requestVar')[0]
1042    xx = [i for i in dq.coll['requestVarGroup'].items if i.label == 'OMIP-Omon']
1043    assert len(xx) == 1, 'OMIP-Omon request variable group not found'
1044    omipOmonUid = xx[0].uid
1045    dil = this.getElementsByTagName('item')
1046    for item in dil:
1047      mipt = item.getAttribute( 'mipTable' ) 
1048      prov = item.getAttribute( 'prov' ) 
1049      provn = item.getAttribute( 'provNote' ) 
1050      if mipt == 'Oyr' and prov[:12] == "CMIP6 [OMIP]" and provn == 'bgc':
1051        rowix = int( item.getAttribute( 'rowIndex' ) )
1052        if rowix < 65:
1053          var = item.getAttribute( 'label' )
1054          new = item.cloneNode(True)
1055          new.setAttribute( 'defaultPriority', '2' )
1056          new.setAttribute( 'mipTable', 'Omon' )
1057          new.setAttribute( 'prov', 'Copy from Oyr' )
1058          new.setAttribute( 'provNote', 'sdq.001' )
1059          vid =  str( uuid.uuid1() ) 
1060          new.setAttribute( 'uid', vid )
1061          this.appendChild( new )
1062##
1063## create request var
1064##
1065          new2 = self.doc.createElement( 'item' )
1066          uid =  str( uuid.uuid1() ) 
1067          new2.setAttribute( 'uid', uid )
1068          new2.setAttribute( 'priority', '2' )
1069          new2.setAttribute( 'vid', vid )
1070          new2.setAttribute( 'vgid', omipOmonUid )
1071          new2.setAttribute( 'mip', 'OMIP' )
1072          new2.setAttribute( 'table', 'OMIP-Omon' )
1073
1074          if omipOmonUid not in dq.inx.uid:
1075            print 'ERROR.005.0001: vgid %s not found' % omipOmonUid
1076         
1077          thisRqv.appendChild(new2)
1078
1079  def missingRefs(self,mrefs,dq,clear=True):
1080    this = self.doc.getElementsByTagName('remarks')[0]
1081    if clear:
1082      dil = this.getElementsByTagName('item')
1083      for d in dil:
1084        this.removeChild(d)
1085    for k in mrefs.keys():
1086      if len(  mrefs[k] ) == 1:
1087        tid = mrefs[k][0][2]
1088        tattr = mrefs[k][0][1]
1089        tn = None
1090      else:
1091        tid = None
1092        ee = collections.defaultdict(int)
1093        tn = str( len( mrefs[k] ) )
1094        for t in mrefs[k]:
1095          s = self.dreq.inx.uid[t[2]]._h.label
1096          ee['%s.%s' % (s,t[1])] += 1
1097        if len( ee.keys() ) == 1:
1098          tattr = ee.keys()[0]
1099        else:
1100          tattr = '__multiple__'
1101      if tid == None or (tid not in self.removedUids):
1102        item = self.doc.createElement( 'item' )
1103        assert type(k) == type( '' ), 'Attempt to set uid with bad type: %s' % str(k)
1104        item.setAttribute( 'uid', k ) 
1105        item.setAttribute( 'tattr', tattr ) 
1106        if tn != None:
1107          item.setAttribute( 'techNote', tn ) 
1108        if tid != None:
1109          item.setAttribute( 'tid', tid ) 
1110          if tid not in dq.inx.uid:
1111            print 'ERROR.005.0002: tid %s not found' % tid
1112        item.setAttribute( 'class', 'missingLink' ) 
1113        item.setAttribute( 'description', 'Missing links detected and marked for fixing' ) 
1114        item.setAttribute( 'prov', 'scanDreq.py:annotate' ) 
1115        this.appendChild( item )
1116 
1117    parent = self.doc.getElementsByTagName('annex')[0]
1118    for this in parent.childNodes:
1119      if this.nodeType == this.ELEMENT_NODE:
1120        dil = this.getElementsByTagName('item')
1121        print 'INFO.nodescan.00001: ',this.localName,len(dil)
1122        for item in dil:
1123          for k in item.attributes.keys():
1124            v = item.getAttribute( k )
1125            if type( v ) not in [type( '' ),type( u'' )]:
1126              print 'SEVERE.0001: tuple in attribute value',this.localName,k,v
1127    txt = self.doc.toprettyxml(indent='\t', newl='\n', encoding=None)
1128    oo = open( 'out/annotated_20150731_i1.xml', 'w' )
1129    lines = string.split( txt, '\n' )
1130    for line in lines:
1131      l = utils_wb.uniCleanFunc( string.strip(line) )
1132      if empty.match(l):
1133        continue
1134      else:
1135        oo.write(l + '\n')
1136    oo.close()
1137
1138def anno():
1139  oo = open( 'var1.csv', 'w' )
1140  ks = ['label','title','sn','units','description','prov','procnote','procComment','uid']
1141  ks2 = [ 'ovar','groupItem','revisedTabItem']
1142  oo.write( string.join(ks + ks2, '\t' ) + '\n' )
1143  for i in dq.coll['var'].items:
1144     if i.label[-2:] != '--':
1145       ee1 = varRefs.get( i.uid, {} )
1146       r2 = map( lambda x: string.join( atRepr( ee1.get(x, [] ), None ) ), ks2 )
1147       oo.write( string.join(map( lambda x: atRepr(i,x), ks) + r2, '\t' ) + '\n' )
1148  oo.close()
1149
1150  print 'ANNOTATING: ', dq.c.docl[0][0]
1151  an = annotate( dq.c.docl[0][0], dq )
1152###############################################################################
1153### mode 3: using exports/a1/ ...
1154### should add structures to exports/a1/ ... i.e. structures + spatial and temporal shapes + CMOR dimensions.
1155###
1156  ###an.sectionCopy(dq)
1157  an.iniVar( dq )
1158  an.fixCellMethods(dq)
1159  an.mipProv(dq)
1160  an.cmvCheck(dq)
1161  an.rvgCheck(dq)
1162  an.strTtl(dq)
1163  an.rqvCheck(dq)
1164  an.cmvCheck2(dq)
1165  for k in an.removedUids:
1166    print 'WARN.REMOVED: %s: %s' % (k,an.removedUids[k])
1167  an.missingRefs( dq.inx.missingIds, dq )
1168
1169if __name__ == '__main__':
1170  anno()
Note: See TracBrowser for help on using the repository browser.