source: CMIP6dreqbuild/trunk/src/framework/reviseMipTab.py @ 979

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

01.00.07

Line 
1
2import xml, string, glob
3import xml.dom, xml.dom.minidom
4import utils_wb
5import re
6from ingest import mipTab
7
8empty=re.compile('^$')
9
10class docedit(object):
11  def __init__(self):
12
13    self.src = 'out/annotated_20150731.xml'
14    self.dest = 'out/annotated_20150731_mt.xml'
15    self.doc = xml.dom.minidom.parse( self.src  )
16
17  def write(self):
18    txt = self.doc.toprettyxml(indent='\t', newl='\n', encoding=None)
19    oo = open( self.dest, 'w' )
20    lines = string.split( txt, '\n' )
21    for line in lines:
22      l = utils_wb.uniCleanFunc( string.strip(line) )
23      if empty.match(l):
24        continue
25      else:
26        oo.write(l + '\n')
27    oo.close()
28
29ee = {}
30key='requestVar'
31tags = [u'label', u'mip', u'priority', u'title', u'uid', u'vgid', u'vid']
32ee[key] = tags
33
34key='var'
35tags = [u'description', u'label', u'procComment', u'procnote', u'prov', u'provmip', u'sn', u'title', u'uid', u'unid', u'units']
36ee[key] = tags
37
38key='CMORvar'
39tags = [u'label', u'mipTable',u'description', u'frequency',u'defaultPriority', u'deflate', u'deflate_level', u'mipTableSection', u'modeling_realm', u'mtid', u'positive', u'processing', u'prov', u'provNote', u'rowIndex', u'shuffle', u'stid', u'subGroup', u'title', u'type', u'uid', u'vid']
40ee[key] = tags
41
42class edits(object):
43  def __init__(self,dir='exports/a1'):
44    fl = glob.glob( '%s/*.xlsx' % dir )
45    self.rmv = set()
46    self.cha = dict()
47    for f in fl:
48      kk = f.split('/')[-1].split('.')[0]
49      assert kk in ee
50      tags = ee[kk]
51      iu = tags.index( 'uid' ) + 1
52      self.wb = utils_wb.workbook( f )
53      sht = self.wb.book.sheet_by_name( 'data' )
54      for k in range( sht.nrows ):
55        r = sht.row(k)
56        r0 = str(r[0].value)
57        if r0 != '':
58          if r0[:3] == 'DEL':
59            self.rmv.add( str( r[iu].value ) )
60          elif r0[:3] == 'CHA':
61            dd = {}
62            for t in tags:
63              if t != 'uid':
64                dd[t] = str( r[tags.index(t)+1].value )
65            self.cha[ str( r[iu].value ) ] = dd
66
67    print 'DEL: ',self.rmv
68    print 'CHA: ',self.cha
69   
70 
71class revise(object):
72
73  def __init__(self,docObject,edits=None):
74
75    self.mm = mipTab.mipt()
76    self.mmCheck()
77    self.doc = docObject.doc
78    self.edits = edits
79    print self.edits.cha
80
81    maps = {'grids':['tables'], 'var':['prov'], 'CMORvar':['mipTable','mtid','prov','provNote','mipTableSection'], 
82            'requestVarGroup':['label','title','refNote'],
83            'requestLink':['tab','label','title'],
84            'requestItem':['label','title','tab'] }
85    for section in maps:
86      this = self.doc.getElementsByTagName(section)[0]
87      dil = this.getElementsByTagName('item')
88      nn = 0
89      for item in dil:
90        for atr in maps[section]:
91          tabs = item.getAttribute( atr )
92          tabs0 = tabs
93          tabs = self.filter(tabs)
94          if tabs != tabs0:
95            nn += 1
96            item.setAttribute( atr, tabs )
97      print section,len(dil), nn
98    this = self.doc.getElementsByTagName('miptable')[0]
99    dil = this.getElementsByTagName('item')
100    for item in dil:
101      this.removeChild(item)
102    for l in self.mm.ll:
103      item = self.doc.createElement( 'item' )
104      item.setAttribute( 'altLabel', l[0] )
105      item.setAttribute( 'label', l[1] )
106      item.setAttribute( 'uid', 'MIPtable::%s' % l[1] )
107      item.setAttribute( 'title', l[2] )
108      item.setAttribute( 'description', l[3] )
109      item.setAttribute( 'comment', l[4] )
110      item.setAttribute( 'frequency', l[5] )
111      this.appendChild( item )
112
113    if edits != None:
114      print 'EDITS: scanning doc'
115      self.uid = dict()
116      for item in self.doc.getElementsByTagName('item'):
117        self.uid[ item.getAttribute( 'uid' ) ] = item
118      self.applyEdits()
119       
120    self.revRealm()
121
122  def applyEdits(self):
123    print self.edits.rmv
124    for s in self.edits.rmv:
125      item = self.uid[s]
126      item.parentNode.removeChild( item )
127      print 'REMOVED %s' % s
128
129    for c in self.edits.cha:
130      item = self.uid[c]
131      for k,v in self.edits.cha[c].items():
132        if v != item.getAttribute(k):
133          item.setAttribute(k,v)
134          print 'CHANGED %s, %s, %s' % (c,k,v)
135     
136     
137
138  def revRealm(self):
139      this = self.doc.getElementsByTagName('CMORvar')[0]
140      dil = this.getElementsByTagName('item')
141      nn = 0
142      for item in dil:
143        r = item.getAttribute( 'modeling_realm' )
144        r0 = r
145        if r.find( 'landice' ) != -1:
146          r = r.replace( 'landice', 'landIce' )
147        if r.find( 'seaice' ) != -1:
148          r = r.replace( 'seaice', 'seaIce' )
149        if r.find( 'ocnBgchem' ) != -1:
150          r = r.replace( 'ocnBgchem', 'ocnBgChem' )
151        if r != r0:
152          item.setAttribute( 'modeling_realm', r )
153          nn += 1
154      print 'INFO.realm.00404: number of editted realms = %s' % nn
155
156  def mmCheck(self):
157      l1 = dict()
158      for l in self.mm.ll:
159        if l[0] != l[1]:
160          l1[ l[0] ] = l[1]
161      self.extra = {'em1hrclimmon':'E1hrClimMon','em3hrpt':'E3hrPt',
162                     'emDayZ':'EdayZ', 'emMonZ':'EmonZ','aermonthlyz':'AERmonZ'}
163      for d in self.extra:
164        del l1[d]
165      if False:
166       for l in self.mm.ll:
167        if l[0] != l[1] and l[0] not in defer:
168          ff = set()
169          for l2 in l1:
170            if l2 != l[0]:
171               if l2 in l[0]:
172                 assert l[0].replace( l2, l1[l2] ) == l[1], 'Ambiguos mapping: %s -- %s' % (l2,l[0] )
173                 ff.add(l2)
174          for l2 in ff:
175            del l1[l2]
176      l1['6hrLev_aer'] = '6hrLev'
177      self.maps = l1
178      print l1
179                 
180  def filter(self, ss):
181      for k in self.extra:
182          if k in ss:
183            ss = ss.replace( k, self.extra[k] )
184      for k in self.maps:
185          if k in ss:
186            ss = ss.replace( k, self.maps[k] )
187      return ss
188       
189opt=1
190if opt == 1:
191  de = docedit()
192  e = edits()
193  adv = revise(de, edits=e)
194  de.write()
195else:
196  e = edits()
Note: See TracBrowser for help on using the repository browser.