source: CMIP6dreqbuild/trunk/src/framework/ing02/scanDreq2.py @ 1029

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

fixed expts

Line 
1
2import xml, os, sys, shelve, json, hashlib
3import re
4import xml.dom, xml.dom.minidom
5import collections
6
7import utils_wb
8
9structure_m2 = [[('str-h022', 'fa21f210-267c-11e7-9bed-ac72891c3257'), ('str-h016', '529e44a0-1ed7-11e7-9366-ac72891c3257')], [('str-h025', 'fa22430a-267c-11e7-9bed-ac72891c3257'), ('str-h012', '529da6e4-1ed7-11e7-9366-ac72891c3257')], [('str-h030', '52a0fe48-1ed7-11e7-9366-ac72891c3257'), ('str-h045', 'fa246518-267c-11e7-9bed-ac72891c3257')], [('str-h033', 'fa22e74c-267c-11e7-9bed-ac72891c3257'), ('str-h001', '529d09d2-1ed7-11e7-9366-ac72891c3257')], [('str-h034', 'fa230ab0-267c-11e7-9bed-ac72891c3257'), ('str-h013', '529dda38-1ed7-11e7-9366-ac72891c3257')], [('str-h038', 'fa237568-267c-11e7-9bed-ac72891c3257'), ('str-h010', '529d9c30-1ed7-11e7-9366-ac72891c3257')]]
10
11empty=re.compile('^$')
12
13skipNull = [ ('requestItem','treset'),('requestItem','nexmax'), ('requestItem','tslice'),
14             ('structure','cids'),('structure','dids'),
15             ('spatialShape','dimids'),
16             ('temporalShape','dimid'),
17             ('grids','standardName'),
18             ('remarks','tid'),
19             ('timeSlice','start'), ('timeSlice','end'), ('timeSlice','sliceLen') ]
20
21class main(object):
22  def __init__(self,src, defn, idir='exports/l0sh'):
23    self.skipNull = set()
24    self.src = src
25    self.defn = defn
26    self.idir = idir
27    self.defnDoc = xml.dom.minidom.parse( self.defn  )
28    self.parseDefn()
29    self.uidset = set()
30    self.doc = xml.dom.minidom.parse( self.src  )
31    self.scanmaps()
32    self.nodes = dict()
33    for chapter in ['main','annex']:
34      parent = self.doc.getElementsByTagName( chapter )[0]
35      for c in parent.childNodes:
36        tag = c.nodeName
37        if tag != '#text':
38          dil = c.getElementsByTagName('item')
39          for d in dil:
40            c.removeChild(d)
41          print tag
42          assert os.path.isfile( '%s/%s' % (idir,tag) )
43          assert tag not in self.nodes, 'section name re-used: %s' % tag
44          self.nodes[tag] = (chapter,c)
45
46    sh = shelve.open( '%s/%s' % (idir,'remarks'), 'r' )
47    urmk = set( [k for k in sh.keys() if k[0:1] != '__' ] )
48    sh.close()
49    tags = self.nodes.keys()
50    tags.remove( 'remarks' )
51    tags = sorted( tags ) + ['remarks',]
52    self.lnks = set()
53
54    for tag in tags:
55        chapter,c = self.nodes[tag]
56        sh = shelve.open( '%s/%s' % (idir,tag), 'r' )
57        cols = sh['__cols__']
58        for k in sh.keys():
59          if len(k) == 0 or k[:2] != '__' or k == '__cm_not_found__':
60            if tag == 'remarks' and k not in self.lnks:
61              print 'skipping remark: ',k,sh[k]
62            else:
63              item = self.doc.createElement( 'item' )
64              for i in range( len(cols) ):
65                if not ( (tag,cols[i]) in self.skipNull and sh[k][i] == '' ):
66                   try:
67                     v = str( sh[k][i] )
68                   except:
69                     print 'FAILED TO EVALUATE str: %s' % sh[k][i]
70                     print sh[k]
71                     print tag
72                     raise
73                   if tag == 'CMORvar' and cols[i] == 'stid':
74                     if v in self.smapu['structure']:
75                        v1 = self.smapu['structure'][v]
76                        print 'MAPPING stid: %s --> %s' % (v,v1)
77                        v = v1
78                   elif tag == 'varChoiceLinkC' and cols[i] == 'cfg':
79                        v = v.lower()
80                   elif tag == 'spatialShape' and cols[i] == 'levelFlag':
81                        v = v.lower()
82                   item.setAttribute( cols[i], v )
83                   if cols[i] == 'uid':
84                     if v in self.uidset:
85                       print "ERROR[SEVERE].uid.00001: uid reused: %s" % uid
86                     self.uidset.add(v)
87                   if cols[i] not in self.aindex[tag]:
88                     print 'WARNING.aindex: attribute not recognised: %s, %s' % (tag,cols[i])
89                   else:
90                     if self.aindex[tag][cols[i]][2] in ['internalLink','internalLinkList']:
91                       if self.aindex[tag][cols[i]][2] == 'internalLink' or v.find( ' ' ) == -1:
92                         vl = [v,]
93                       else:
94                         vl = v.split()
95                       for v in vl:
96                         if v == '':
97                           if (tag,cols[i]) == ('var','sn'):
98                             v = 'missing'
99                             item.setAttribute( cols[i], v )
100                           else:
101                             print 'ERROR: blank in internal link: ',tag,cols[i],sh[k]
102                       
103                         self.lnks.add(v)
104
105              c.appendChild( item )
106        sh.close()
107
108  def parseDefn(self):
109    self.aindex = collections.defaultdict( dict )
110    for tab in self.defnDoc.getElementsByTagName( 'table' ) + self.defnDoc.getElementsByTagName( 'annextable' ):
111      section = tab.getAttribute( 'label' )
112      for row in tab.getElementsByTagName( 'rowAttribute' ):
113        self.aindex[section][row.getAttribute('label')] = (row.getAttribute('type'),row.getAttribute('title'),row.getAttribute('useClass'))
114        if row.getAttribute('required') != 'true':
115           self.skipNull.add( (section,row.getAttribute('label')) )
116    for s in sorted( self.aindex.keys() ):
117       print s, self.aindex[s]
118
119  def scanmaps(self):
120    sh = shelve.open( '%s_maps/importMaps' % self.idir, 'r' )
121    self.smapu = collections.defaultdict( dict )
122    self.smapl = collections.defaultdict( dict )
123    for t,f in structure_m2:
124      self.smapu['structure'][f[1]] = t[1]
125    for k in sh.keys():
126      s,u,l = k.split( ' ' )
127      v = sh[k]
128      self.smapu[s][u] = v
129      self.smapl[s][l] = v
130    sh.close()
131     
132  def write(self,ofile):
133    txt = self.doc.toprettyxml(indent='\t', newl='\n', encoding=None)
134    oo = open( ofile, 'w' )
135    lines = txt.split( '\n' )
136    for line in lines:
137      l = utils_wb.uniCleanFunc( line.strip() )
138      if empty.match(l):
139        continue
140      else:
141        oo.write(l + '\n')
142    oo.close()
143             
144mode = 'dreq2'
145sampleXml = '../out/%sSample.xml' % mode
146defnXml = '../out/%sDefn.xml' % mode
147
148m = main(sampleXml,defnXml,  idir='exports/l1sh')
149print 'SCANNED'
150m.write( 'test.xml' )
Note: See TracBrowser for help on using the repository browser.