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

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

intermediate

Line 
1import xml, os, sys, shelve, json, hashlib
2import re
3import xml.dom, xml.dom.minidom
4import collections
5
6import utils_wb
7
8structure_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')]]
9
10empty=re.compile('^$')
11
12skipNull = [ ('requestItem','treset'),('requestItem','nexmax'), ('requestItem','tslice'),
13             ('structure','cids'),('structure','dids'),
14             ('spatialShape','dimids'),
15             ('temporalShape','dimid'),
16             ('grids','standardName'),
17             ('remarks','tid'),
18             ('timeSlice','start'), ('timeSlice','end'), ('timeSlice','sliceLen') ]
19
20class main(object):
21  def __init__(self,src, defn, idir='exports/l0sh'):
22    self.skipNull = set()
23    self.src = src
24    self.defn = defn
25    self.idir = idir
26    self.defnDoc = xml.dom.minidom.parse( self.defn  )
27    self.parseDefn()
28    self.uidset = set()
29    self.doc = xml.dom.minidom.parse( self.src  )
30    self.scanmaps()
31    self.nodes = dict()
32    for chapter in ['main','annex']:
33      parent = self.doc.getElementsByTagName( chapter )[0]
34      for c in parent.childNodes:
35        tag = c.nodeName
36        if tag != '#text':
37          dil = c.getElementsByTagName('item')
38          for d in dil:
39            c.removeChild(d)
40          print tag
41          assert os.path.isfile( '%s/%s' % (idir,tag) )
42          assert tag not in self.nodes, 'section name re-used: %s' % tag
43          self.nodes[tag] = (chapter,c)
44
45    sh = shelve.open( '%s/%s' % (idir,'remarks'), 'r' )
46    urmk = set( [k for k in sh.keys() if k[0:1] != '__' ] )
47    sh.close()
48    tags = self.nodes.keys()
49    tags.remove( 'remarks' )
50    tags.remove( 'CMORvar' )
51    tags = sorted( tags ) + ['CMORvar','remarks',]
52    self.lnks = set()
53    forceInt = ['ntot','nstart','yps']
54    forceIntList = ['ensz','tier']
55    sn = shelve.open( '%s/standardname' % idir, 'r' )
56    self.usedSn = set()
57    varinfo = dict()
58
59    for tag in tags:
60        chapter,c = self.nodes[tag]
61        sh = shelve.open( '%s/%s' % (idir,tag), 'r' )
62        cols = sh['__cols__']
63        if tag == 'remarks':
64          icl = cols.index( 'class' )
65        elif tag == 'var':
66          ids = cols.index( 'description' )
67          isn = cols.index( 'sn' )
68
69        for k in sh.keys():
70          if len(k) == 0 or k[:2] != '__' or k == '__cm_not_found__':
71            if tag == 'remarks' and k not in self.lnks and sh[k][icl] != 'Supplement':
72              print 'skipping remark: ',k,sh[k]
73            else:
74              item = self.doc.createElement( 'item' )
75              dropRecord = False
76              descOverWrite = False
77              ttlOverWrite = False
78              for i in range( len(cols) ):
79                if not ( (tag,cols[i]) in self.skipNull and sh[k][i] == '' ):
80                   try:
81                     v = str( utils_wb.uniCleanFunc( sh[k][i] ) )
82                   except:
83                     print 'FAILED TO EVALUATE str: sh[k]', k
84                     print sh[k]
85                     print tag
86                     raise
87                   if tag == 'CMORvar' and cols[i] == 'stid':
88                     if v in self.smapu['structure']:
89                        v1 = self.smapu['structure'][v]
90                        print 'MAPPING stid: %s --> %s' % (v,v1)
91                        v = v1
92                   elif tag == 'varChoiceLinkC' and cols[i] == 'cfg':
93                        v = v.lower()
94                   elif tag == 'spatialShape' and cols[i] == 'levelFlag':
95                        v = v.lower()
96                   elif tag in [ 'var','CMORvar'] and cols[i] == 'description':
97                        if v == '':
98                             descOverWrite = True
99                   elif tag in [ 'CMORvar'] and cols[i] == 'title':
100                        if v == '':
101                             ttlOverWrite = True
102                   elif tag == 'var' and cols[i] == 'sn':
103                        if descOverWrite and v in sn.keys():
104                            d2 = sn[v][2]
105                            item.setAttribute( 'description', d2 )
106                        self.usedSn.add( v )
107                   elif cols[i] in forceInt:
108                        try:
109                           v = str( int( float( v ) ) )
110                        except:
111                           print 'failed to convert to integer: %s:: %s' % (cols[i],v)
112                           raise
113                   elif cols[i] in forceIntList:
114                        v = ' '.join( [str( int( float( x ) ) ) for x in v.split() ] )
115                   item.setAttribute( cols[i], v )
116                   if cols[i] == 'uid':
117                     if v in self.uidset:
118                       if tag == 'remarks':
119                         print "ERROR.uid.00001: uid reused in remarks .... dropping record: %s" % v
120                         dropRecord = True
121                       else:
122                         print "ERROR[SEVERE].uid.00002: uid reused: %s" % v
123                     self.uidset.add(v)
124                   if cols[i] not in self.aindex[tag]:
125                     print 'WARNING.aindex: attribute not recognised: %s, %s' % (tag,cols[i])
126                   else:
127                     if self.aindex[tag][cols[i]][2] in ['internalLink','internalLinkList']:
128                       if self.aindex[tag][cols[i]][2] == 'internalLink' or v.find( ' ' ) == -1:
129                         vl = [v,]
130                       else:
131                         vl = v.split()
132                       for v in vl:
133                         if v == '':
134                           if (tag,cols[i]) == ('var','sn'):
135                             v = 'missing'
136                             item.setAttribute( cols[i], v )
137                           else:
138                             print 'ERROR: blank in internal link: ',tag,cols[i],sh[k]
139                       
140                         self.lnks.add(v)
141
142              if not dropRecord:
143                if tag == 'var':
144                  varinfo[item.getAttribute('uid')] = (item.getAttribute('title'),item.getAttribute('description'))
145                elif tag == 'CMORvar' and 'descOverWrite':
146                   item.setAttribute( 'description', varinfo[item.getAttribute('vid')][1] )
147                elif tag == 'CMORvar' and 'ttlOverWrite':
148                   item.setAttribute( 'title', varinfo[item.getAttribute('vid')][0] )
149                c.appendChild( item )
150        sh.close()
151    chapter,c = self.nodes['remarks']
152    for k in self.usedSn:
153       if k not in self.uidset:
154         item = self.doc.createElement( 'item' )
155         item.setAttribute( 'uid', k )
156         item.setAttribute( 'label', k.replace('_','') )
157         item.setAttribute( 'tattr', 'sn' )
158         item.setAttribute( 'class', 'missingLink' )
159         item.setAttribute( 'title', 'Missing standard name: %s' % k )
160         item.setAttribute( 'description', 'Missing standard name, record generated by scanDreq2.py' )
161         item.setAttribute( 'prov', 'Auto-generated by scanDreq2.py')
162         c.appendChild( item )
163         
164
165  def parseDefn(self):
166    self.aindex = collections.defaultdict( dict )
167    for tab in self.defnDoc.getElementsByTagName( 'table' ) + self.defnDoc.getElementsByTagName( 'annextable' ):
168      section = tab.getAttribute( 'label' )
169      for row in tab.getElementsByTagName( 'rowAttribute' ):
170        self.aindex[section][row.getAttribute('label')] = (row.getAttribute('type'),row.getAttribute('title'),row.getAttribute('useClass'))
171        if row.getAttribute('required') != 'true':
172           self.skipNull.add( (section,row.getAttribute('label')) )
173    for s in sorted( self.aindex.keys() ):
174       print s, self.aindex[s]
175
176  def scanmaps(self):
177    sh = shelve.open( '%s_maps/importMaps' % self.idir, 'r' )
178    self.smapu = collections.defaultdict( dict )
179    self.smapl = collections.defaultdict( dict )
180    for t,f in structure_m2:
181      self.smapu['structure'][f[1]] = t[1]
182    for k in sh.keys():
183      s,u,l = k.split( ' ' )
184      v = sh[k]
185      self.smapu[s][u] = v
186      self.smapl[s][l] = v
187    sh.close()
188     
189  def write(self,ofile):
190    txt = self.doc.toprettyxml(indent='\t', newl='\n', encoding=None)
191    oo = open( ofile, 'w' )
192    lines = txt.split( '\n' )
193    for line in lines:
194      l = utils_wb.uniCleanFunc( line.strip() )
195      if empty.match(l):
196        continue
197      else:
198        oo.write(l + '\n')
199    oo.close()
200             
201mode = 'dreq2'
202sampleXml = '../out/%sSample.xml' % mode
203defnXml = '../out/%sDefn.xml' % mode
204
205m = main(sampleXml,defnXml,  idir='exports/l1sh')
206print 'SCANNED'
207m.write( 'test.xml' )
Note: See TracBrowser for help on using the repository browser.