source: CMIP6dreqbuild/trunk/src/workbook/importShDreq.py @ 375

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/workbook/importShDreq.py@375
Revision 375, 13.2 KB checked in by mjuckes, 5 years ago (diff)

various

Line 
1"""Import data request from shelves and put onto compliant XML document.
2------------------------------------------------------------------------
3A new uuid is generated for elements of the "revisedtabitem" section/table (because it is not present in the shelve).
4
5NOTES
6-----
7July 27th: there is an unresolved problem about preserving uuids when updates are provided in source format .....
8"""
9import xlrd, xml, os, sys, string
10import utils_wb, uuid
11import xml.dom, xml.dom.minidom
12import collections, string, re
13from utils_wb import uniCleanFunc
14
15empty=re.compile('^$')
16
17def test( x,m):
18  if not x:
19    print m
20  return x
21
22class lcm(object):
23  def __init__(self,a,b):
24    self.a = {}
25    self.b = {}
26    for i in a:
27      self.a[string.lower(i)] = i
28    for i in b:
29      self.b[string.lower(i)] = i
30
31class main(object):
32
33  def __init__(self,src,rq):
34    self.src=src
35    self.repl = collections.defaultdict( list )
36    self.err0010 = collections.defaultdict( int )
37    self.replItems = {}
38    self.importRepl()
39    self.importRemove()
40    self.importUpdate()
41    self.importInsert()
42   
43    fok = [test(os.path.isfile(src),'%s not found' % src), ]
44
45    assert all( fok), 'Required input file(s) missing'
46
47    for sh in [rq.refti, rq.revti, rq.vars, rq.grps, rq.rqvg, rq.rqli, rq.rqit]:
48       print sh['__info__']
49
50    doc = xml.dom.minidom.parse( src  )
51    main = doc.childNodes[0]
52    xsn = []
53    ff = {}
54    for c in main.childNodes:
55      tag = c.nodeName
56      if tag != '#text':
57        xsn.append(tag)
58        il = []
59        for i in c.childNodes:
60          if i.nodeName == 'item':
61            il.append(i)
62        xx = dict( il[0].attributes.items() )
63        ff[string.lower(tag)] = (c,xx)
64   
65    print xsn
66    print ff.keys()
67   
68    self.eern = collections.defaultdict( list )
69    self.eern2 = {}
70    ixrn = 5
71    dups = []
72    for k in rq.rqvg.keys():
73      if k[0] != '_':
74        kk = ['uid', 'mip', 'tab', 'objective', 'grid', 'gridreq', 'comment', 'ref', 'refNote', 'refid']
75        kk = ['uuid', 'mip', 'label', 'title', 'ref', 'refNote']
76        i = rq.rqvg[k]
77       
78        self.eern[i[ixrn]].append( i[0] )
79        k2 = '%s__%s' % (i[ixrn-1],i[ixrn])
80        if self.eern2.has_key( k2 ):
81           dups.append( k2 )
82        self.eern2[k2] = i[0]
83        assert i[0] == k, 'Bad key/uuid'
84
85    assert len( dups ) == 0, 'Duplicate refs: %s' % str(dups)
86       
87    for k in [ 'var','ovar','groupitem', 'revisedtabitem', 'requestlink', 'requestitem','requestvargroup' ]:
88    ##for k in [ 'var']:
89      thissh = {'var':rq.vars,'ovar':rq.refti, 'groupitem':rq.grps, \
90         'revisedtabitem':rq.revti, 'requestlink':rq.rqli, 'requestitem':rq.rqit, \
91         'requestvargroup':rq.rqvg}[k]
92      lll = []
93      for i in thissh.keys():
94        if i[0] != '_':
95          lll.append(i)
96      idk = 0
97      if len(lll) > 0:
98        dil = ff[k][0].getElementsByTagName('item')
99        for d in dil:
100          ff[k][0].removeChild(d)
101        vare = {}
102        vare2 = {}
103        for i in lll:
104          ll = map( uniCleanFunc, thissh[i] )
105          assert len(ll) == len( thissh[i] ), 'Lost list elements after uniClean'
106          idk += 1
107#################################################################
108######### NEED TO CLEAN THIS IF ITEMS FROM OTHER SECTIONS ARE FILTERED
109#######################################################################
110          if k != 'var':
111            item = doc.createElement( 'item' )
112            item.setAttribute( 'id', 'tmpid.%4.4i' % idk )
113          dothis = True
114          if k == 'var':
115##- sn; units; description; procnote; procComment; prov
116##['label', 'title', 'sn', 'units', 'description', 'procnote', 'procComment', 'prov']
117            thisl = string.strip(str( ll[0] ) )
118            thisuuid = str(i)
119            if not ( self.replItems.has_key( str(i) ) or self.remo.has_key(str(i)) ):
120              item = doc.createElement( 'item' )
121              item.setAttribute( 'id', 'tmpid.%4.4i' % idk )
122              item.setAttribute( 'uuid', str(i) )
123              item.setAttribute( 'title', str(ll[1]) )
124              item.setAttribute( 'sn', str(ll[2]) )
125              item.setAttribute( 'units', str(ll[3]) )
126              item.setAttribute( 'description', str(ll[4]) )
127              item.setAttribute( 'procnote', str(ll[5]) )
128              item.setAttribute( 'procComment', str(ll[6]) )
129              item.setAttribute( 'prov', str(ll[7]) )
130              vare[ll[3]] =  ll[1]
131              if self.upda.has_key( thisuuid ):
132                for tag in self.upda[thisuuid]['tags']:
133                  if tag == 'label':
134                    thisl = self.upda[thisuuid][tag]
135                  else:
136                    item.setAttribute( tag, self.upda[thisuuid][tag] )
137            else: 
138              print 'Omitting: ',ll
139              dothis = False
140          elif k == 'ovar':
141## 
142            tab2freq = {u'CMIP5_cfOff':'subhr', u'CORDEX_mon':'mon', u'SPECS_day':'day', u'CMIP5_day':'day', \
143       u'PMIP3_OImon':'mon', u'CORDEX_day':'day', u'CMIP5_LImon':'mon', u'CMIP5_OImon':'mon', \
144       u'CMIP5_Lmon':'mon', u'CMIP5_3hr':'3hr', u'CMIP5_Omon':'mon', u'PMIP3_OIclim':'monClim', \
145       u'PMIP3_fx':'fx', u'CORDEX_fx':'fx', u'PMIP3_LImon':'mon', u'CMIP5_6hrPlev':'6hr', u'PMIP3_Lmon':'mon', \
146       u'PMIP3_Amon':'mon', u'SPECS_Omon':'mon', u'CCMI1_fixed':'fx', u'PMIP3_Aclim':'monClim', u'CMIP5_6hrLev':'6hr', \
147       u'CMIP5_Oclim':'monClim', u'PMIP3_LIclim':'monClim', u'CCMI1_monthly':'mon', u'CMIP5_fx':'fx', \
148       u'CMIP5_cfDay':'day', u'CORDEX_6h':'6hr', u'PMIP3_day':'day', u'SPECS_OImon':'mon', u'CMIP5_cfMon':'mon', \
149       u'CORDEX_sem':'monClim', u'SPECS_6hr':'6hr', u'CMIP5_cfSites':'subhr', u'CCMI1_hourly':'hr', u'CMIP5_aero':'day', \
150       u'CMIP5_Amon':'mon', u'PMIP3_Omon':'mon', u'CCMI1_daily':'day', u'SPECS_fx':'fx', u'PMIP3_Lclim':'monClim', \
151       u'PMIP3_Oclim':'monClim', u'SPECS_Amon':'mon', u'SPECS_Lmon':'mon', u'CMIP5_cf3hr':'3hr', u'CORDEX_3h':'3hr', \
152       u'CCMI1_annual':'yr', u'CMIP5_Oyr':'yr'}
153            kk = ['uuid', 'comment', 'deflate_level', 'shuffle', 'ok_max_mean_abs', 'flag_meanings', 'type', 'ok_min_mean_abs', 'sn', 'deflate', 'title', 'valid_min', 'cell_methods', 'flag_values', 'cell_measures', 'out_name', 'modeling_realm', 'units', 'cell_methods_xx', 'valid_max', 'positive', 'var', 'mipTable', 'dimensions', 'vid']
154## uuid; comment; deflate_level; shuffle; ok_max_mean_abs; flag_meanings; type; ok_min_mean_abs; sn; deflate; valid_min; cell_methods; flag_values; cell_measures; out_name; modeling_realm; units; cell_methods_xx; valid_max; positive; var; mipTable; dimensions; vid
155            thisl = string.strip(str( ll[21] ) )
156            for j in range(len(kk)):
157              if j != 21:
158                item.setAttribute( kk[j], str( ll[j] ) )
159            item.setAttribute( 'frequency', tab2freq[ll[22]] )
160            thisuuid = ll[0]
161            if self.repl.has_key( thisuuid ):
162              for tag,old,new in self.repl[thisuuid]:
163                thisold = item.getAttribute( tag )
164                assert thisold == old, 'Attempt to replace value which is not present'
165                item.setAttribute( tag, new )
166          elif k == 'groupitem':
167            kk = ['group', 'var', 'table', 'freq', 'descriptionEx', 'shape', 'levels', 'tstyle', 'mask', 'misc', 'mip', 'uuid', 'new', 'gpid', 'vkey', 'vid']
168            assert len(kk) == len(ll), 'length mismatch, %s  %s' % (len(kk),len(ll))
169# - group;  table; freq; descriptionEx; shape; levels; tstyle; mask; mip; mip2; uuid; new; vid
170            thisl = string.strip(str( ll[1] ) )
171            for j in range(len(kk)):
172              if j != 1:
173                item.setAttribute( kk[j], str( ll[j] ) )
174            item.setAttribute( 'title', thisl )
175            if string.find(thisl, ' ') != -1:
176              thisl = string.split(thisl)[0]
177            thisuuid = ll[11]
178            if self.repl.has_key( thisuuid ):
179              for tag,old,new in self.repl[thisuuid]:
180                thisold = item.getAttribute( tag )
181                assert thisold == old, 'Attempt to replace value which is not present'
182                item.setAttribute( tag, new )
183##################################
184          elif k == 'revisedtabitem':
185## - table; mip; uuid; priority
186            kk = ['var', 'table', 'mip', 'vid', 'priority']
187            kvg = 'rev__%s.%s' % ( ll[2],ll[1] )
188            if self.eern2.has_key(kvg):
189              vgid = self.eern2[kvg]
190            else:
191              vgid = '__none__'
192              self.err0010[kvg] += 1
193            thisuuid = str( uuid.uuid1() )
194            thisl = string.strip(str( ll[0] ) )
195            for j in range(len(kk)):
196              if j != 0:
197                item.setAttribute( kk[j], str( ll[j] ) )
198            item.setAttribute( 'title', thisl )
199            item.setAttribute( 'uuid', thisuuid )
200            item.setAttribute( 'vgid', vgid )
201            if self.insert.has_key(thisl):
202                thisold = item.getAttribute( 'vid' )
203                if thisold == '__new__':
204                  item.setAttribute( 'vid', self.insert[thisl] )
205
206##################################
207          elif k == 'requestlink':
208 ## - uuid; mip; tab; objective; grid; gridreq; comment
209            kk = ['uid', 'mip', 'tab', 'objective', 'grid', 'gridreq', 'comment', 'ref', 'refNote', 'refid']
210            emap = {'uid':'uuid'}
211            thisl = string.strip(str( ll[2] ) )
212            for j in range(len(kk)):
213                thiskk = emap.get(  kk[j],  kk[j] )
214                item.setAttribute( thiskk, str( ll[j] ) )
215            item.setAttribute( 'title', thisl )
216##################################
217          elif k == 'requestitem':
218 ## - mip; tab; expt; rlid; ny
219            kk = ['mip', 'tab', 'expt', 'rlid', 'ny']
220            thisl = string.strip(str( '%s-%s-%s' % (ll[0],ll[1],ll[2]) ) )
221            for j in range(len(kk)):
222                if kk[j] == 'ny':
223                  thisv = str( int(ll[j]) )
224                else:
225                  thisv = str( ll[j] )
226                item.setAttribute( kk[j], thisv )
227            item.setAttribute( 'title', '%s, %s, %s' % (ll[0],ll[1],ll[2]) )
228            item.setAttribute( 'uuid', str(i) )
229##################################
230          elif k == 'requestvargroup':
231            kk = ['uuid', 'mip', 'label', 'title', 'ref', 'refNote']
232            thisl = string.replace( str( ll[2] ), '.', '-' )
233            for j in range(len(kk)):
234                item.setAttribute( kk[j], str( ll[j] ) )
235####
236          if dothis:
237            if string.find( thisl, '_' ) != -1:
238              #print 'WARNING: underscore in label', ll
239              thisl = string.replace( thisl, '_', '-' )
240            if string.find( thisl, '*' ) != -1:
241              #print 'WARNING: star in label', ll
242              thisl = string.replace( thisl, '*', '-' )
243            if string.find( thisl, '!' ) != -1:
244              #print 'WARNING: exclamation in label', ll
245              thisl = string.replace( thisl, '!', '-' )
246            if string.find( thisl, ' ' ) != -1:
247              #print 'WARNING: space in label', ll
248              thisl = string.replace( thisl, ' ', '-' )
249            if string.find( thisl, ':' ) != -1:
250              #print 'WARNING: colon in label', ll
251              thisl = string.replace( thisl, ':', '-' )
252            item.setAttribute( 'label', thisl )
253            if k == 'var':
254              vare2[item.getAttribute('units')] =  item.getAttribute('label')
255            ff[k][0].appendChild( item )
256        if k == 'var':
257            print '******************************************'
258            print vare.keys()
259            print vare2.keys()
260            print '******************************************'
261           
262    this = doc.getElementsByTagName('remarks')[0]
263    dil = this.getElementsByTagName('item')
264    for d in dil:
265          this.removeChild(d)
266
267    txt = doc.toprettyxml(indent='\t', newl='\n', encoding=None)
268    oo = open( 'trial_20150831.xml', 'w' )
269    lines = string.split( txt, '\n' )
270    for line in lines:
271      l = utils_wb.uniCleanFunc( string.strip(line) )
272      if empty.match(l):
273        continue
274      else: 
275        oo.write(l + '\n')
276    oo.close()
277
278  def importRepl(self,rfile='uuidreplace.csv'):
279    for l in open(rfile).readlines():
280      bits = string.split( string.strip(l), '\t' )
281      assert len(bits) == 7, 'Could not parse item replacement file'
282      self.repl[ bits[3] ].append( (bits[2],bits[0],bits[1] ) )
283      self.replItems[bits[0]] = bits[1]
284
285  def importRemove(self,rfile='uuidremove.csv'):
286    self.remo = {}
287    for l in open(rfile).readlines():
288      self.remo[ string.strip(l) ] = 1
289
290  def importUpdate(self,rfile='uuidupdate.csv'):
291    self.upda = {}
292    for l in open(rfile).readlines():
293      bits = string.split( string.strip(l), '\t' )
294      tgs = string.strip( bits[2] )
295      if string.find( tgs, ' ' ) == -1:
296        tags = [tgs,]
297      else:
298        tags = string.split( tgs )
299      self.upda[ bits[0] ] =  {'comment':bits[1], 'tags':tags, 'label':bits[3], 'title':bits[4] }
300
301  def importInsert(self,rfile='uuidinsert.csv'):
302    self.insert = {}
303    for l in open(rfile).readlines():
304      bits = string.split( string.strip(l), '\t' )
305      if bits[0] == 'unique':
306         self.insert[bits[1]] = bits[3]
307
308sampleXml = '../framework/out/dreqSample.xml'
309from scansh import rq
310m = main(sampleXml, rq)
311if len(m.err0010.keys()) > 0:
312  ks = m.err0010.keys()
313  ks.sort()
314  for k in ks:
315    print 'ERROR.001.0010: variable group not identified: %s [%s]' % (k,m.err0010[k])
Note: See TracBrowser for help on using the repository browser.