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

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

added choice configuration

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
14import ivg
15
16freqmap = {'daily':'day', u'Annual':'yr', u'Timestep':'subhr',  u'1day':'day', u'1mon':'mon', 'month':'mon', 'year':'yr', 'monthly':'mon', 'Day':'day', '6h':'6hr', '3 hourly':'3hr'  }
17
18class s1(object):
19  def __init__(self):
20    self.a = collections.defaultdict( list )
21
22def mycc(s):
23      s = string.replace( s, '&', '' )
24      if len(s) > 0 and s[-1] == '+':
25        s = s[:-1] + 'ETC'
26## camelcase the input string
27      s1 = string.lower( string.replace(string.strip(str( s) ), '-', ' ') )
28      return string.replace( string.capwords( s1 ), ' ', '' )
29
30empty=re.compile('^$')
31
32def test( x,m):
33  if not x:
34    print m
35  return x
36
37class lcm(object):
38  def __init__(self,a,b):
39    self.a = {}
40    self.b = {}
41    for i in a:
42      self.a[string.lower(i)] = i
43    for i in b:
44      self.b[string.lower(i)] = i
45
46class main(object):
47
48  def __init__(self,src,rq,doRepl=False,run=False,schemaMode='dreq'):
49    self.schemaMode = schemaMode
50    self.src=src
51    fok = [test(os.path.isfile(src),'%s not found' % src), ]
52    assert all( fok), 'Required input file(s) missing'
53
54    for sh in [rq.expt,rq.exgp,rq.objec,rq.refti, rq.revti, rq.vars, rq.grps, rq.rqvg, rq.rqli, rq.rqit, rq.rqsect]:
55       print sh['__info__']
56
57    self.repl = collections.defaultdict( list )
58    self.err0010 = collections.defaultdict( int )
59    self.replItems = {}
60    self.remo = {}
61    self.upda = {}
62    self.insert = {}
63
64    self.objectives = collections.defaultdict( dict )
65    self.objectiveLinks = collections.defaultdict( s1 )
66    self.dsortdd = {}
67
68    if doRepl:
69      self.importRepl()
70      self.importRemove()
71      self.importUpdate()
72      self.importInsert()
73    self.e15_10 = 0
74    self.doc = xml.dom.minidom.parse( self.src  )
75    self.skey = {'experiment':rq.expt, 'exptgroup':rq.exgp, \
76         'objective':rq.objec, 'var':rq.vars,'ovar':rq.refti, 'groupitem':rq.grps, \
77         'revisedtabitem':rq.revti, 'requestlink':rq.rqli, 'requestitem':rq.rqit, \
78         'requestvargroup':rq.rqvg, 'tablesection':rq.rqsect, 'requestvar':rq.revti}
79
80    self.prep(rq)
81    if run:
82      self.run(rq)
83      if self.schemaMode == 'dreq2':
84        self.write2()
85      self.finish()
86
87  def prep(self,rq):
88## keys here match section element names in schema
89    #for k in [ 'var','ovar','groupitem', 'revisedtabitem']:
90## lists for 3 new sections
91### uuid, spid, tmid, cell_methods, cell_measures, description, procNote, prov
92    structure = [] 
93### uuid, label, dimensions, shape, levels, levelFlag
94    spatialshp = []
95### uuid, label, dimension, tstyle
96    temporalshp = []
97### cmor variables
98    self.cmv = []
99    self.cmvinfo = ('uuid','stid','label','title','description','vid', \
100                    'deflate_level', 'shuffle', 'ok_max_mean_abs', 'flag_meanings', 'type', 'ok_min_mean_abs',  \
101                    'deflate', 'valid_min', 'flag_values', 'modeling_realm', 'valid_max', 'positive', 'mipTable', \
102                    'prov', 'provNote', 'frequency', 'rowIndex', 'coordinates')
103    self.rqvinfo = ('uuid','label','vid','gpid','priority','mip','table' )
104### request variables
105    self.rqv = []
106    for ksect in [ 'ovar','groupitem']:
107      thissh = self.skey[ksect]
108      if ksect == 'ovar':
109            setu1 = set()
110            tab2freq = {u'CMIP5_cfOff':'subhr', u'CORDEX_mon':'mon', u'SPECS_day':'day', u'CMIP5_day':'day', \
111       u'PMIP3_OImon':'mon', u'CORDEX_day':'day', u'CMIP5_LImon':'mon', u'CMIP5_OImon':'mon', \
112       u'CMIP5_Lmon':'mon', u'CMIP5_3hr':'3hr', u'CMIP5_Omon':'mon', u'PMIP3_OIclim':'monClim', \
113       u'PMIP3_fx':'fx', u'CORDEX_fx':'fx', u'PMIP3_LImon':'mon', u'CMIP5_6hrPlev':'6hr', u'PMIP3_Lmon':'mon', \
114       u'PMIP3_Amon':'mon', u'SPECS_Omon':'mon', u'CCMI1_fixed':'fx', u'PMIP3_Aclim':'monClim', u'CMIP5_6hrLev':'6hr', \
115       u'CMIP5_Oclim':'monClim', u'PMIP3_LIclim':'monClim', u'CCMI1_monthly':'mon', u'CMIP5_fx':'fx', \
116       u'CMIP5_cfDay':'day', u'CORDEX_6h':'6hr', u'PMIP3_day':'day', u'SPECS_OImon':'mon', u'CMIP5_cfMon':'mon', \
117       u'CORDEX_sem':'monClim', u'SPECS_6hr':'6hr', u'CMIP5_cfSites':'subhr', u'CCMI1_hourly':'hr', u'CMIP5_aero':'day', \
118       u'CMIP5_Amon':'mon', u'PMIP3_Omon':'mon', u'CCMI1_daily':'day', u'SPECS_fx':'fx', u'PMIP3_Lclim':'monClim', \
119       u'PMIP3_Oclim':'monClim', u'SPECS_Amon':'mon', u'SPECS_Lmon':'mon', u'CMIP5_cf3hr':'3hr', u'CORDEX_3h':'3hr', \
120       u'CCMI1_annual':'yr', u'CMIP5_Oyr':'yr'}
121            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', 'gpid','rowIndex','priority']
122            id = kk.index('dimensions')
123            thisnt = collections.namedtuple( 'ovar', kk )
124            ov = []
125            dset = set()
126            ds2 = set()
127            ovuu = {}
128            for k in thissh:
129              if k[0] != '_':
130                rr = thissh[k][:]
131                if rr[id] == 's|c|a|l|a|r':
132                  print 'ERROR.060.0001: bad dimension string detected and corrected: %s' % rr[id]
133                  rr[id] = 'scalar'
134                tt = thisnt._make( rr ) 
135                if tt.uuid in setu1:
136                  print 'ERROR.099.0002: duplicate uuid: %s: %s' % (uuid,str(rr))
137                setu1.add(tt.uuid)
138                ov.append( tt )
139                dset.add( ov[-1].dimensions )
140                ds2.add( (tt.dimensions,tt.cell_methods,tt.cell_measures) )
141                ovuu[tt.uuid] = tt
142                if rr[22][-3:] in ['mon','day','3hr']:
143                  fr = rr[22][-3:]
144                elif rr[22][-2:] in [ 'yr','fx']:
145                  fr = rr[22][-2:]
146                else:
147                  fr = tab2freq[rr[22]]
148   
149                if tt.mipTable[:5] == 'OMIP':
150                  prov = 'CMIP6 [OMIP]'
151                elif string.find( tt.mipTable, '_' ) != -1:
152                  prov = '%s [%s]' % tuple( string.split( tt.mipTable, '_' ) )
153                else:
154                  prov = '%s' %  tt.mipTable
155
156                if tt.var[:5] == 'ccmi_':
157                  pass
158                else:
159                  lab = tt.var
160                  if lab in {'*','include Oyr 3D tracers'}:
161                    lab = '-copy-'
162                  self.cmv.append( (tt.uuid, (tt.dimensions,tt.cell_methods,tt.cell_measures), lab, tt.title, tt.comment, tt.vid, \
163                    tt.deflate_level, tt.shuffle, tt.ok_max_mean_abs, tt.flag_meanings, tt.type, tt.ok_min_mean_abs, \
164                    tt.deflate, tt.valid_min, tt.flag_values, tt.modeling_realm, tt.valid_max, tt.positive, tt.mipTable, \
165                    prov, '', fr, tt.rowIndex, '') )
166                  self.rqv.append( (str( uuid.uuid1() ),lab, tt.uuid, tt.gpid, tt.priority,tt.mipTable,tt.mipTable) )
167    ##self.rqvinfo = ('uuid','label','vid','gpid','priority','mip','table' )
168            self.dsort( dset )
169            print self.dsortdd[ksect][0].keys()
170      elif ksect == 'groupitem':
171            kk = ['group', 'var', 'table', 'freq', 'descriptionEx', 'shape', 'levels', 'tstyle', 'mask', 'misc', 'mip', 'uuid', 'new', 'gpid', 'vkey', 'vid']
172            thisnt = collections.namedtuple( 'groupitem', kk + ['cmorv',] )
173            il = kk.index( 'levels' )
174            iu = kk.index( 'uuid' )
175            dset = set()
176            dsgpi = set()
177            gi = []
178            s1 = set()
179            sm = set()
180            varsets = []
181            nov = 0
182            setu = set()
183            for k in thissh.keys():
184              if k[0] != '_':
185                rr = thissh[k][:]
186##
187## split variable, create 2nd record at 23 levels.
188##
189                if rr[iu] in setu:
190                  print 'ERROR.099.0001: duplicate uuid in varGroups ... %s:: %s' % (uuid,str(rr))
191                if rr[iu] in setu1:
192                  print 'ERROR.099.0003: duplicate uuid in varGroups/ovar ... %s:: %s' % (uuid,str(rr))
193                setu.add(rr[iu])
194                if rr[il] in  {u'17 (or 23 )', u'17 (or 23)', u'17 (or23)'}:
195                  rr0 = rr + [rr[1] + '23',]
196                  rr0[il] = 23
197                  rr0[iu] = str( uuid.uuid1() )
198                  tt = thisnt._make( rr0 )
199                  gi.append( tt )
200                  rr[il] = 17
201                  tt = thisnt._make( rr + [rr[1],] )
202                  varsets.append( (rr0[iu], 2, rr[iu], 1, 'HighResMIP variables at multiple vertical resolutions' ) )
203                elif rr[il] == u'Model levels or 27Plevs':
204                  rr0 = rr + [rr[1] + '27',]
205                  rr0[il] = 27
206                  rr0[iu] = str( uuid.uuid1() )
207                  tt = thisnt._make( rr0 )
208                  gi.append( tt )
209                  rr[il] = 'all'
210                  tt = thisnt._make( rr + [rr[1],] )
211                  varsets.append( (rr0[iu], 0, rr[iu], 0, 'Variables on model levels or 27 pressure levels' ) )
212                else:
213                  tt = thisnt._make( rr + [rr[1],] )
214                 
215                gi.append( tt )
216                sm.add( tt.mask )
217
218            print '####### masks: ',sm
219            smdd = {}
220            dsn = {'floating ice shelf':u'floating ice sheet', u'ocean':u'sea' }
221            d1 = {u'land':(False,'area: mean where land'), \
222                  u'grounded ice sheet':(True,'area: mean where grounded_ice_sheet'), \
223                  u'ice sheet':(True,'area: mean where ice_sheet'), \
224                  u'floating ice sheet':(True,'area: mean where floating_ice_sheet'), \
225                  u'floating ice shelf':(True,'area: mean where floating_ice_sheet'),
226                  u'sea':(False,'area: mean where sea') }
227            for s in sm:
228              if s in  ['', u'none',u'Southern hemisphere', u'Northern hemisphere']:
229                smdd[s] = (False,'')
230              else:
231                smdd[s] = d1[ dsn.get( s,s ) ]
232
233            setu = set()
234            for tt in gi:
235                gr = 'a'
236                if tt.mip == 'OMIP' or any( [string.find(tt.table,i) != -1 for i in ['Omon','Oyr','Oclim','OImon'] ] ):
237                  gr = 'o'
238                dset.add( (tt.shape,tt.levels,tt.tstyle,gr) )
239                dsgpi.add( (tt.shape,tt.levels,tt.tstyle,gr,smdd[tt.mask]) )
240### need to check where variables are, perhaps, refering to "ovar"
241            ##kk = ['group', 'var', 'table', 'freq', 'descriptionEx', 'shape', 'levels', 'tstyle', 'mask', 'misc', 'mip', 'uuid', 'new', 'gpid', 'vkey', 'vid']
242                prov = '%s [%s]' % (tt.mip,tt.group)
243                provNote = ''
244                lab = tt.var
245                if lab in {'*','include Oyr 3D tracers'}:
246                  lab = '-copy-'
247                elif lab == 'wap (omega)':
248                  lab = 'wap'
249                  provNote = 'wap (omega)'
250                lab = string.replace( string.strip(lab), '_', '-' )
251                if tt.uuid in setu:
252                     print 'SEVERE[1]: duplicate uuid: ',tt.__dict__
253                setu.add( tt.uuid )
254                if ovuu.has_key(tt.vid):
255                  tt1 = ovuu[tt.vid]
256                  self.cmv.append( (tt.uuid, (tt.shape,tt.levels,tt.tstyle,gr,smdd[tt.mask]), lab, 'from %s' % tt.table, tt.descriptionEx, tt1.vid, \
257                    tt1.deflate_level, tt1.shuffle, tt1.ok_max_mean_abs, tt1.flag_meanings, tt1.type, tt1.ok_min_mean_abs, \
258                    tt1.deflate, tt1.valid_min, tt1.flag_values, tt1.modeling_realm, tt1.valid_max, tt1.positive, 'n%s' % tt.freq, \
259                    prov, provNote, tt.freq, -1, '') )
260                  self.rqv.append( (str( uuid.uuid1() ),lab, tt.uuid, tt.gpid, tt1.priority, tt.mip, tt.group) )
261                  nov += 1
262                else:
263                  self.cmv.append( (tt.uuid, (tt.shape,tt.levels,tt.tstyle,gr,smdd[tt.mask]), lab, 'from %s' % tt.table, tt.descriptionEx, tt.vid, \
264                    0, 0, 0, 0, '', 0, \
265                    0,0,0, '', 0, '', 'n%s' % tt.freq, \
266                    prov, provNote, tt.freq, -1, '') )
267                  self.rqv.append( (str( uuid.uuid1() ),lab, tt.uuid, tt.gpid, 1, tt.mip, tt.group) )
268## Variables marked with shape '?' from PMIP are actually defined by OMIP ....
269                if tt.shape == '?':
270                  print 'WARN: shape not set: %s, %s, %s' % ( tt.shape,tt.mip,tt.var)
271
272            ##['', u'none', u'land', u'grounded ice sheet', u'floating ice sheet', u'floating ice shelf', u'ocean', u'ice sheet', u'sea', u'Southern hemisphere', u'Northern hemisphere']
273            self.dsort( dset,mode=ksect )
274            print ' ............. nov=%s [%s]' % (nov,len(gi))
275
276
277#######################################################################################
278#################
279    std = set()
280    ssd = set()
281    etd = {}
282    esd = {}
283    tshp = { 'time':['time-mean','Temporal mean'], 'time1':['time-point','Instantaneous value (i.e. synoptic or time-step value)'], \
284             'time2':['climatoglogy','Climatological mean'], \
285             '':['None','No spatial dimensions ... fixed field'], 'xxxx':['unknown','dimension not recognised'] }
286    for ksect in [ 'ovar','groupitem']:
287#### create structure list for spatial and temporal dimensions
288      for t in self.dsortdd[ksect][0].keys():
289        tdim, tt = self.dsort_u1( self.dsortdd[ksect][0][t], self.dsortdd[ksect][1] )
290
291        std.add( tdim )
292        ssd.add( tt )
293        ##ssd.add( (sdim,lfl,nl) )
294
295    for s in std:
296       label, description = tshp.get(s,tshp['xxxx'])
297       u = str( uuid.uuid1() )
298       etd[s] = (u,label,description,s)
299    kk = 0
300    for s in ssd:
301       d,lfl,nl = s
302       u = str( uuid.uuid1() )
303       kk+=1
304       lab = 'ssd-%3.3i' % kk
305       description = 'ssd.%3.3i' % kk
306       esd[s] = (u,lab,description,d,lfl,nl)
307
308    self.dimsTime = etd
309    self.dimsTimeInfo = ['uuid','label','title','dimensions']
310    self.dimsSpace = esd
311    self.dimsSpaceInfo = ['uuid','label','title','dimensions','levelFlag','levels']
312       
313    sshp = set()
314    eshp = set()
315    ll = []
316    nt_dims = collections.namedtuple( 'dims', ['uuid','label','spid','tmid','odims','coords','cell_methods','cell_measures','description','procNote','prov'] )
317    kk = 0
318    strdd = {}
319    for dims,cmet,cmea in ds2:
320        tdim, tt = self.dsort_u1( self.dsortdd['ovar'][0][dims], self.dsortdd['ovar'][1] )
321        d1,odim,d2,crd = self.dsortdd['ovar'][0][dims]
322        sdim,lfl,nl = tt
323        u = str( uuid.uuid1() )
324        spid = esd[tt][0]
325        tmid = etd[tdim][0]
326        kk += 1
327        label = 'str-%3.3i' % kk
328        proc = ''
329        prov = 'CMIP5/OMIP'
330        desc = ''
331        strdd[(dims,cmet,cmea)] = u
332        ll.append( nt_dims._make( [u,label,spid,tmid, odim, crd, cmet, cmea, desc, proc, prov] ) )
333
334    ttt = [ {u'Instantaneous (end of year)', 'instantaneous', 'point', 'Synoptic', u'synoptic', u'time: point'},
335        {'Mean', u'time: mean', u'Time mean', u'daily mean', u'mean', u'time mean', u'time: day', u'time: mean', u'weighted time mean', 'Cumulative annual fraction'}, set(), {''}]
336    cmetl = ['time: point', 'time: mean', 'time: mean within years time: mean over years ', '']
337    for shp,lvls,sty,gr,tmsk in dsgpi:
338        t = (shp,lvls,sty,gr)
339        tdim, tt = self.dsort_u1( self.dsortdd['groupitem'][0][t], self.dsortdd['groupitem'][1] )
340        d1,odim,d2,crd = self.dsortdd['groupitem'][0][t]
341        print 'INFO.099: ',d1,odim,d2,crd
342        tflm, msk = tmsk
343        sdim,lfl,nl = tt
344        u = str( uuid.uuid1() )
345        spid = esd[tt][0]
346        tmid = etd[tdim][0]
347        cmea = 'area: areacell%s' % gr
348        cmet = ''
349        for i in range(4):
350          if sty in ttt[i]:
351            cmet = cmetl[i]
352        if cmet == '':
353          cmet = msk
354        elif msk != '':
355          cmet += ' ' + msk
356        kk += 1
357        label = 'str-%3.3i' % kk
358        proc = ''
359        prov = 'CMIP5, endorsed MIPs'
360        desc = ''
361        strdd[(shp,lvls,sty,gr,tmsk)] = u
362        ll.append( nt_dims._make( [u,label,spid,tmid, odim, crd, cmet, cmea, desc, proc, prov] ) )
363
364    self.structList = ll
365    self.strdd = strdd
366    oo = open( 'test.csv', 'w' )
367    for l in ll:
368      oo.write( '%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,\n' % l )
369    oo.close()
370
371  def dsort_u1(self,eed,sde):
372        tdim = eed[2]
373        sdim = eed[0]
374        nl = sde[sdim]
375        lfl = 'true'
376        if nl == -1:
377          lfl = 'false'
378          nl = 0
379        elif nl == -2:
380          nl = 1
381          pass
382        return (tdim, (sdim,lfl,nl) )
383
384
385  def dsort( self, dset, mode='ovar' ):
386      """Sort the dimensions string into spatial, temporal and other sections,
387       returns a dictionary of tuples: spatial dimensions, other, temporal, coords and a 2nd, keyyed on spatial dimensions with a level count indicator.  """
388      vdims = {'plev7':7, 'plev':4, 'plevs':17, 'plev3':3,'plev8':8,'alt40':40,'alev1':1, 'alevhalf':-1,'olevel':-1,'rho':-1,'sdepth':-1,'alevel':-1}
389      odims = {'sza5','vegtype','scatratio','dbze','typepdec','vgidx','tau'}
390      dl = sorted( list(dset) )
391      if mode == 'ovar':
392        eed = {}
393        sss = [set(),set(),set(),set()]
394        for s in dl:
395          if s[:4] == 'time':
396            bits = ['',s[4:]]
397          else:
398            bits = string.split(s, '|time', maxsplit=1 )
399          if len(bits) == 1:
400            ts = ''
401          else:
402            ts = 'time'
403
404          b0 = bits[0]
405          b1 = ''
406          bb = string.split(bits[0],'|')
407          if bb[-1] in odims:
408            if bb[-1] == 'tau':
409                b0 = bits[0][:-4]
410                ts = 'tau|time'
411            else:
412              b0 = string.join( bb[:-1], '|' )
413              b1 = bb[-1]
414           
415          if len(bits) == 1:
416              tup = (b0,b1,'','')
417          elif len(bits) == 2:
418              b2 = string.split( bits[1], '|', maxsplit=1 )
419              if len(b2) == 2:
420                  tup = (b0,b1, ts + b2[0], b2[1])
421              else:
422                  tup = (b0,b1, ts + bits[1], '')
423          eed[s] = tup
424          for k in range(4):
425            sss[k].add(tup[k])
426
427        ##print 'dimensions:',dl
428        ##print 'spatial:',sss[0]
429        ##print 'other:',sss[1]
430        ##print 'temporal:',sss[2]
431        ##print 'coord:',sss[3]
432        lcount = {}
433        for s in sss[0]:
434          bits = string.split( s, '|' )
435          nl = -2
436          thisb = None
437          for b in bits:
438            if vdims.has_key(b):
439              assert nl == -2, 'Duplicate vertical level count in %s' % s
440              nl = vdims[b]
441              thisb = b
442          lcount[s] = nl
443          if nl == -1 and s == 'latitude|basin':
444            print 'SEVERE: error in level deduction'
445            print s, bits, nl, thisb
446            raise
447      else:
448        ## input is a set of tuples,  shape, levels, tstyle, o/a
449        ## aim is to extract spatial, other, temporal dimensions + coords.
450        sss = [set(),set(),set()]
451        ttt = [ (u'Instantaneous (end of year)', 'instantaneous', 'point', 'Synoptic', u'synoptic', u'time: point'),
452        ('Mean', u'time: mean', u'Time mean', u'daily mean', u'mean', u'time mean', u'time: day', u'time: mean', u'weighted time mean', 'Cumulative annual fraction'), (), ('',)]
453        ttdd = {}
454        kkk = ['time1','time','time2','']
455        for i in range(4):
456          for k in ttt[i]:
457            ttdd[k] = kkk[i]
458
459        ##lll =  {[u'1.0', u'14.0', u'16.0',  u'17.0', u'27.0', u'3.0', u'36.0', u'4.0', u'40.0', u'7.0', ]:'flt', [u'17 (or 23 )', u'17 (or 23)', u'17 (or23)']:'obs', [u'Model levels or 27Plevs', u'all', u'all model levels', u'all model levels above 400hPa', u'all*', u'integrated over depth'], [u'single level',], [u'soil levels',], [u'surface',], [[u'100 m',] }
460        dds = {'2D':'XYT', 'XY':'XYT', '':'?', '2D ':'XYT', 'XYZ':'XYZT', } 
461## 'K'?? 'XYK'
462        dd = {'XKT':('latitude|basin','','time','',False), \
463             'XYZKT':('longitude|latitude|%s','effectRad','time','',True), \
464             'XYZT':('longitude|latitude|%s','','time','',True), \
465              'KZT':('alevel','spectband','time','',False), \
466              'XYT':('longitude|latitude','','time','',False), \
467              'XYKT':('longitude|latitude','angle','time','',False), \
468              'YZT':('longitude|%s','','time','',True), \
469              'XYK':('longitude|latitude','snowband','time','',False), \
470              'K':('sistraits','','time','',False), \
471              'scalar':('','','time','',False), \
472              'ZST1':('alevel','site','time','',False), \
473              'BasinYT':('latitude|basin','','time','',False), \
474              '?':( '?', '?','?',False)
475             }
476             
477        for d in dl:
478          for k in range(3):
479            sss[k].add( d[k] )
480        ##print 'shape: ',sss[0]
481        ##print 'levels: ',sss[1]
482        ##print 'tstyle: ',sss[2]
483        ls0 = set()
484        ls1 = set()
485##
486## sort shapes
487##
488        for s in sss[0]:
489          if not dd.has_key( dds.get(s,s) ):
490            print 'NO SOLUTION FOUND FOR SHAPE: "%s"' % s
491          else:
492            tt = dd[dds.get(s,s)]
493            if tt[-1]:
494              ls0.add( s )
495##
496## look at shapes which require additional information about vertical coord
497##
498        for d in dl:
499          if d[0] in ls0:
500             ls1.add( d[1] )
501
502        lset = {'soil levels':'slevel', 'all model levels above 400hPa':'aslevel'} 
503        lsdd = {}
504        for l in ls1:
505          ii = 0
506          if l in ['all','all*','all model levels']:
507            ii = -1
508            this = '%slevel' 
509          elif lset.has_key(l):
510            ii = -1
511            this = lset[l]
512          elif l == '':
513            ii = -2
514            this = l
515          else:
516            ii = int( float(l) )
517            if ii > 1.5:
518              this = 'plev%s' % ii
519            else:
520              this = ''
521          lsdd[l] = (ii,this)
522##['', 1.0, u'all', 3.0, 4.0, u'soil levels', 7.0, 40.0, u'all model levels', u'17 (or 23)', u'all*', 14.0, u'Model levels or 27Plevs', 16.0, 17.0, u'all model levels above 400hPa', u'17 (or23)', 36.0, u'17 (or 23 )', 27.0]
523             
524        lcount = {}
525        eed = {}
526        for d in dl:
527          s = d[0]
528          if not dd.has_key( dds.get(s,s) ):
529            print 'NO SOLUTION FOUND FOR SHAPE: "%s"' % s
530          else:
531            tt = dd[dds.get(s,s)]
532            if tt[-1]:
533              n,zz = lsdd[d[1]]
534              if len(zz) > 0 and zz[0] == '%':
535                zz = zz % d[3]
536              sc = tt[0] % zz
537            else:
538              sc = tt[0]
539              if (string.find( sc, 'alevel' ) != -1) or (string.find( sc, 'olevel' ) != -1):
540                n = -1
541              else:
542                n = -2
543          lcount[sc] = n
544          if n == -1 and sc == 'latitude|basin':
545            print 'SEVERE [2]: error in level deduction'
546            print sc, tt[0], tt[-1], n
547            raise
548          eed[d] = (sc,tt[1],ttdd[d[2]],tt[3])
549      self.dsortdd[mode] = (eed,lcount)
550
551  def run(self,rq):
552
553    xx = self.doc.getElementsByTagName( 'main' )
554    assert len(xx) == 1, 'Expecting one element named "main", found %s' % len(xx)
555    main = xx[0]
556    xsn = []
557    ff = {}
558    for c in main.childNodes:
559      tag = c.nodeName
560      if tag != '#text':
561        xsn.append(tag)
562        il = []
563        for i in c.childNodes:
564          if i.nodeName == 'item':
565            il.append(i)
566        xx = dict( il[0].attributes.items() )
567        ff[string.lower(tag)] = (c,xx)
568   
569    print xsn
570    print ff.keys()
571    self.ff = ff
572
573   
574    addex = True
575    self.prqv = ivg.prepRequestVar(addex)
576    self.prqv.run()
577    ##exrqvg = {}
578    ##if addex:
579      ###
580      ##extravg = [['OMIP', u'OMIP-Oyr', u'OMIP: OMIP-Oyr', 'CMIP5Rev', u'OMIP.Oyr'],
581               ##['OMIP', u'OMIP-Omon', u'OMIP: OMIP-Omon', 'CMIP5Rev', u'OMIP.Omon'],
582               ##['OMIP', u'OMIP-day', u'OMIP: OMIP-day', 'CMIP5Rev', u'OMIP.day'],
583               ##['OMIP', u'OMIP-fx', u'OMIP: OMIP-fx', 'CMIP5Rev', u'OMIP.fx'] ]
584      ##for r in extravg:
585        ##thisuuid = str( uuid.uuid1() )
586        ##exrqvg[thisuuid] = [thisuuid ,] + r[:]
587   
588    ##self.eern = collections.defaultdict( list )
589    ##self.eern2 = {}
590    ##ixrn = 5
591    ##dups = []
592    ####for k in rq.rqvg.keys():
593      ####if k[0] != '_':
594    ##for i,k in [ (rq.rqvg[k],k) for k in  rq.rqvg.keys() if k[0] != '_'] + [(exrqvg[k],k) for k in exrqvg.keys()]:
595        ##kk = ['uid', 'mip', 'tab', 'objective', 'grid', 'gridreq', 'comment', 'ref', 'refNote', 'refid']
596        ##kk = ['uuid', 'mip', 'label', 'title', 'ref', 'refNote']
597        ##i = rq.rqvg[k]
598       
599        ##self.eern[i[ixrn]].append( i[0] )
600        ##k2 = '%s__%s' % (i[ixrn-1],i[ixrn])
601        ##if self.eern2.has_key( k2 ):
602           ##dups.append( (k2,k,self.eern2[k2]) )
603        ##self.eern2[k2] = i[0]
604        ##assert i[0] == k, 'Bad key/uuid'
605
606    ##assert len( dups ) == 0, 'Duplicate refs: %s, %s' % (str(dups),str(map( lambda x: rq.rqvg[x[1]], dups )) )
607       
608## keys here match section element names in schema
609    sectlist = [ 'experiment','exptgroup','objective','var', 'requestlink', 'requestitem','requestvargroup','tablesection' ]
610    if self.schemaMode != 'dreq2':
611      sectlist = ['ovar','groupitem','revisedtabitem'] + sectlist
612    else:
613      sectlist.append( 'requestvar' )
614
615    for k in sectlist:
616      thissh = self.skey[k]
617## set labmod False for section in which label coercion is not wanted
618      labmod = True
619      lll = []
620      for i in thissh.keys():
621        if i[0] != '_':
622          lll.append(i)
623      idk = 0
624      if len(lll) > 0:
625##
626## remove example items, xcept where this has been done in previous function
627##
628        if k not in ['xxxx']:
629          dil = ff[k][0].getElementsByTagName('item')
630          for d in dil:
631            ff[k][0].removeChild(d)
632
633        vare = {}
634        vare2 = {}
635        for i in lll:
636          ll = map( uniCleanFunc, thissh[i] )
637          assert len(ll) == len( thissh[i] ), 'Lost list elements after uniClean'
638          idk += 1
639#################################################################
640######### NEED TO CLEAN THIS IF ITEMS FROM OTHER SECTIONS ARE FILTERED
641#######################################################################
642          dothis = True
643          if k != 'var':
644            item = self.doc.createElement( 'item' )
645
646          if k == 'objective':
647 ## - mip; tab; expt; rlid; ny
648            labmod = False
649            kk = ['mip', 'label', 'title', 'description']
650            ##thisl = string.replace(string.strip(str( ll[1] ) ), '-', ' ')
651## camelcase this label.
652            ##thisl = string.replace( string.capwords( thisl ), ' ', '' )
653            thisl = mycc( ll[1] )
654            mip = str( ll[0] )
655            self.objectives[mip][thisl] = i
656            for j in range(len(kk)):
657                thisv = str( ll[j] )
658                item.setAttribute( kk[j], thisv )
659            item.setAttribute( 'uuid', str(i) )
660          elif k == 'experiment':
661            labmod = False
662            kk = ['uuid','egid','label','description','mip','mcfg','tier','nstart','starty','endy','yps','ensz','ntot','comment']
663            thisl = str( ll[2] )
664            for j in range(len(kk)):
665                thisv = str( uniCleanFunc(ll[j]) )
666                item.setAttribute( kk[j], thisv )
667          elif k == 'exptgroup':
668            labmod = False
669            kk = ['uuid','label','tierMin','ntot']
670            thisl = str( ll[1] )
671            for j in range(len(kk)):
672                thisv = str( ll[j] )
673                item.setAttribute( kk[j], thisv )
674          elif k == 'var':
675##- sn; units; description; procnote; procComment; prov
676##['label', 'title', 'sn', 'units', 'description', 'procnote', 'procComment', 'prov']
677            thisl = string.replace(string.strip(str( ll[0] ) ), '_', '-' )
678            thisuuid = str(i)
679            if not ( self.replItems.has_key( str(i) ) or self.remo.has_key(str(i)) ):
680              item = self.doc.createElement( 'item' )
681              item.setAttribute( 'id', 'tmpid.%4.4i' % idk )
682              item.setAttribute( 'uuid', str(i) )
683              item.setAttribute( 'title', str(ll[1]) )
684              item.setAttribute( 'sn', str(ll[2]) )
685              item.setAttribute( 'units', str(ll[3]) )
686              item.setAttribute( 'description', str(ll[4]) )
687              item.setAttribute( 'procnote', str(ll[5]) )
688              item.setAttribute( 'procComment', str(ll[6]) )
689              item.setAttribute( 'prov', str(ll[7]) )
690              vare[ll[3]] =  ll[1]
691              if self.upda.has_key( thisuuid ):
692                for tag in self.upda[thisuuid]['tags']:
693                  if tag == 'label':
694                    thisl = self.upda[thisuuid][tag]
695                  else:
696                    item.setAttribute( tag, self.upda[thisuuid][tag] )
697            else: 
698              print 'Omitting: ',ll
699              dothis = False
700          elif k == 'ovar':
701## 
702            tab2freq = {u'CMIP5_cfOff':'subhr', u'CORDEX_mon':'mon', u'SPECS_day':'day', u'CMIP5_day':'day', \
703       u'PMIP3_OImon':'mon', u'CORDEX_day':'day', u'CMIP5_LImon':'mon', u'CMIP5_OImon':'mon', \
704       u'CMIP5_Lmon':'mon', u'CMIP5_3hr':'3hr', u'CMIP5_Omon':'mon', u'PMIP3_OIclim':'monClim', \
705       u'PMIP3_fx':'fx', u'CORDEX_fx':'fx', u'PMIP3_LImon':'mon', u'CMIP5_6hrPlev':'6hr', u'PMIP3_Lmon':'mon', \
706       u'PMIP3_Amon':'mon', u'SPECS_Omon':'mon', u'CCMI1_fixed':'fx', u'PMIP3_Aclim':'monClim', u'CMIP5_6hrLev':'6hr', \
707       u'CMIP5_Oclim':'monClim', u'PMIP3_LIclim':'monClim', u'CCMI1_monthly':'mon', u'CMIP5_fx':'fx', \
708       u'CMIP5_cfDay':'day', u'CORDEX_6h':'6hr', u'PMIP3_day':'day', u'SPECS_OImon':'mon', u'CMIP5_cfMon':'mon', \
709       u'CORDEX_sem':'monClim', u'SPECS_6hr':'6hr', u'CMIP5_cfSites':'subhr', u'CCMI1_hourly':'hr', u'CMIP5_aero':'day', \
710       u'CMIP5_Amon':'mon', u'PMIP3_Omon':'mon', u'CCMI1_daily':'day', u'SPECS_fx':'fx', u'PMIP3_Lclim':'monClim', \
711       u'PMIP3_Oclim':'monClim', u'SPECS_Amon':'mon', u'SPECS_Lmon':'mon', u'CMIP5_cf3hr':'3hr', u'CORDEX_3h':'3hr', \
712       u'CCMI1_annual':'yr', u'CMIP5_Oyr':'yr'}
713            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', 'gpid','rowIndex','priority']
714## 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
715            ix_gpid = kk.index( 'gpid' )
716
717            thisl = string.strip( str( ll[21] ) )
718            for j in range( min(len(kk),len(ll)) ):
719              if kk[j] == 'priority':
720                ll[j] = int(ll[j])
721               
722              if j != 21:
723                item.setAttribute( kk[j], str( ll[j] ) )
724
725            if len(ll) < len(kk):
726              print 'ERROR.015.0001: record length short %s (%s):: %s' % (len(ll),len(kk),ll)
727
728            if ll[22][-3:] in ['mon','day','3hr']:
729              fr = ll[22][-3:]
730            elif ll[22][-2:] in [ 'yr','fx']:
731              fr = ll[22][-2:]
732            else:
733              fr = tab2freq[ll[22]]
734   
735            item.setAttribute( 'frequency', fr )
736            thisuuid = ll[0]
737            if self.repl.has_key( thisuuid ):
738              for tag,old,new in self.repl[thisuuid]:
739                thisold = item.getAttribute( tag )
740                assert thisold == old, 'Attempt to replace value which is not present'
741                item.setAttribute( tag, new )
742          elif k == 'groupitem':
743            kk = ['group', 'var', 'table', 'freq', 'descriptionEx', 'shape', 'levels', 'tstyle', 'mask', 'misc', 'mip', 'uuid', 'new', 'gpid', 'vkey', 'vid']
744            assert len(kk) == len(ll), 'length mismatch, %s  %s' % (len(kk),len(ll))
745# - group;  table; freq; descriptionEx; shape; levels; tstyle; mask; mip; mip2; uuid; new; vid
746            ix_gpid = kk.index( 'gpid' )
747            thisl = string.strip(str( ll[1] ) )
748            for j in range(len(kk)):
749              if j != 1:
750                ##item.setAttribute( kk[j], str( ll[j] ) )
751                if kk[j] == 'misc':
752                  item.setAttribute( 'priority', str( ll[j] ) )
753                else:
754                  item.setAttribute( kk[j], str( ll[j] ) )
755            item.setAttribute( 'title', thisl )
756            if string.find(thisl, ' ') != -1:
757              thisl = string.split(thisl)[0]
758            thisuuid = ll[11]
759
760            gpid = str(ll[ix_gpid])
761            if not rq.rqvg.has_key(gpid):
762              print 'ERROR.015.0010: gpid not found %s' % str(ll)
763              self.e15_10 += 1
764            if self.repl.has_key( thisuuid ):
765              for tag,old,new in self.repl[thisuuid]:
766                thisold = item.getAttribute( tag )
767                assert thisold == old, 'Attempt to replace value which is not present'
768                item.setAttribute( tag, new )
769##################################
770          elif k in ['revisedtabitem','requestvar']:
771#### need to fill gaps in variable groups --- or do better job upstream ##########  !!!!!!!!!!!!!!!!
772## - table; mip; uuid; priority
773##
774## variable group ids pulled through via mapping above .. very messy
775## still missing some OMIP matches .... OMIP revised tables are not explicitly requested anywhere.
776##
777            kk = ['var', 'table', 'mip', 'vid', 'priority']
778    ##self.rqvinfo = ('uuid','label','vid','gpid','priority','mip','table' )
779            vgid = self.prqv.rqv_vg[ll[0]]
780            ##kvg = 'CMIP5Rev__%s.%s' % ( ll[2],ll[1] )
781            ##kvg3 = 'rev__%s.%s' % ( ll[2],ll[1] )
782            ##if self.eern2.has_key(kvg):
783              ##vgid = self.eern2[kvg]
784            ##elif self.eern2.has_key(kvg3):
785              ##vgid = self.eern2[kvg3]
786            ##elif cmip5GrpLk[ll[1]].has_key(ll[0]):
787              ##g2 = cmip5GrpLk[ll[1]][ll[0]]
788              ##kvg2 = 'CMIP5Rev__%s.%s' % ( ll[2],g2 )
789              ##if self.eern2.has_key(kvg2):
790                ##vgid = self.eern2[kvg2]
791              ##else:
792                ##vgid = '__vg_not_found_1__'
793                ##self.err0010[kvg] += 1
794            ##else:
795              ##vgid = '__vg_not_found_2__'
796              ##self.err0010[kvg] += 1
797            thisuuid = str( uuid.uuid1() )
798            thisl = string.strip(str( ll[0] ) )
799            for j in range(len(kk)):
800              if j != 0:
801                item.setAttribute( kk[j], str( ll[j] ) )
802            item.setAttribute( 'title', thisl )
803            item.setAttribute( 'uuid', thisuuid )
804            item.setAttribute( 'vgid', vgid )
805            if self.insert.has_key(thisl):
806                thisold = item.getAttribute( 'vid' )
807                if thisold == '__new__':
808                  item.setAttribute( 'vid', self.insert[thisl] )
809
810##################################
811          elif k == 'requestlink':
812 ## - uuid; mip; tab; objective; grid; gridreq; comment
813            kk = ['uid', 'mip', 'tab', 'objective', 'grid', 'gridreq', 'comment', 'opt','opar','ref', 'refNote', 'refid']
814            emap = {'uid':'uuid'}
815            mip = string.strip(str( ll[1] ) )
816            obj = string.strip(str( ll[3] ) )
817            if mip == "GMMIP":
818              bits = [ mycc(x) for x in string.split( obj, ' ' ) ]
819            else:
820              bits = [ mycc(x) for x in string.split( obj, ',' ) ]
821            for b in bits:
822              self.objectiveLinks[mip].a[b].append( str( ll[0] ) )
823       
824            thisl = string.strip(str( ll[2] ) )
825            for j in range(len(kk)):
826                thiskk = emap.get(  kk[j],  kk[j] )
827                try:
828                  item.setAttribute( thiskk, str( ll[j] ) )
829                except:
830                  print 'ERROR.099.0001: Failed to set attribute: %s [%s]' % (str(ll),j)
831                  item.setAttribute( thiskk, '__error_99_1__' )
832
833            item.setAttribute( 'title', thisl )
834##################################
835          elif k == 'requestitem':
836 ## - mip; tab; expt; rlid; ny
837            kk = ['mip', 'tab', 'expt', 'rlid', 'ny']
838            thisl = mycc( '%s %s' % (ll[0],ll[1]) )
839            for j in range(len(kk)):
840                if kk[j] == 'ny':
841                  if ll[j] == '':
842                    thisv = 0
843                  else:
844                    try:
845                      thisv = str( int(ll[j]) )
846                    except:
847                      print 'SEVERE: failed to set "ny": %s' % str(ll)
848                      thisv = 999
849                else:
850                  thisv = str( ll[j] )
851                item.setAttribute( kk[j], thisv )
852            item.setAttribute( 'title', '%s, %s, %s' % (ll[0],ll[1],ll[2]) )
853            item.setAttribute( 'uuid', str(i) )
854##################################
855          elif k in ['requestvargroup','tablesection']:
856            if k == 'requestvargroup':
857              kk = ['uuid', 'mip', 'label', 'title', 'ref', 'refNote']
858            else:
859              kk = ['uuid', 'gpid', 'mip', 'label', 'title', 'ref', 'refNote']
860            thisl = string.replace( str( ll[2] ), '.', '-' )
861            for j in range(len(kk)):
862                item.setAttribute( kk[j], str( ll[j] ) )
863####
864          if dothis:
865            if labmod:
866              if string.find( thisl, '_' ) != -1:
867              #print 'WARNING: underscore in label', ll
868                thisl = string.replace( thisl, '_', '-' )
869              if string.find( thisl, '*' ) != -1:
870                #print 'WARNING: star in label', ll
871                thisl = string.replace( thisl, '*', '-' )
872              if string.find( thisl, '!' ) != -1:
873              #print 'WARNING: exclamation in label', ll
874                thisl = string.replace( thisl, '!', '-' )
875              if string.find( thisl, ' ' ) != -1:
876              #print 'WARNING: space in label', ll
877                thisl = string.replace( thisl, ' ', '-' )
878              if string.find( thisl, ':' ) != -1:
879              #print 'WARNING: colon in label', ll
880                thisl = string.replace( thisl, ':', '-' )
881            item.setAttribute( 'label', thisl )
882            if k == 'var':
883              vare2[item.getAttribute('units')] =  item.getAttribute('label')
884            ff[k][0].appendChild( item )
885           
886  def write2(self):
887    """write sections for cmor variable, request variable, structure, spatial and temporal dimensions"""
888    for ksect in [ u'cmorvar',  u'spatialshape', u'temporalshape', u'structure', u'requestvar']:
889    ##for ksect in [ u'cmorvar',  u'spatialshape', u'temporalshape', u'structure']:
890        dil = self.ff[ksect][0].getElementsByTagName('item')
891        if ksect != 'requestvar':
892          for d in dil:
893            self.ff[ksect][0].removeChild(d)
894        if ksect == u'cmorvar':
895          for r in self.cmv:
896            stid = self.strdd[r[1]]
897            item = self.doc.createElement( 'item' )
898            for k in range(len(self.cmvinfo)):
899              n = self.cmvinfo[k]
900              if n == "stid":
901                item.setAttribute( n, stid )
902              elif n == "freq":
903                fr = freqmap.get( str(r[k]), str(r[k]) )
904                item.setAttribute( n, fr )
905              else:
906                item.setAttribute( n, str(r[k]) )
907
908            self.ff[ksect][0].appendChild( item )
909        elif ksect == u'structure':
910          flds = self.structList[0]._fields
911          for nt in self.structList:
912            item = self.doc.createElement( 'item' )
913            for f in flds:
914              item.setAttribute( f, str( nt.__dict__[f] ) )
915            self.ff[ksect][0].appendChild( item )
916        elif ksect == u'spatialshape':
917          for k in self.dimsSpace.keys():
918            rr = self.dimsSpace[k]
919            item = self.doc.createElement( 'item' )
920            for i in range(len(self.dimsSpaceInfo)):
921              item.setAttribute( self.dimsSpaceInfo[i], str( rr[i] ) )
922            self.ff[ksect][0].appendChild( item )
923        elif ksect == u'temporalshape':
924          for k in self.dimsTime.keys():
925            rr = self.dimsTime[k]
926            item = self.doc.createElement( 'item' )
927            for i in range(len(self.dimsTimeInfo)):
928              item.setAttribute( self.dimsTimeInfo[i], str( rr[i] ) )
929            self.ff[ksect][0].appendChild( item )
930        elif ksect == u'requestvar':
931          ##kk = ['var', 'table', 'mip', 'vid', 'priority']
932          kk = ['label', 'table', 'mip', 'vid', 'priority','vgid','title','uuid']
933          kktr = {'vgid':'gpid', 'title':'label'}
934    ##self.rqvinfo = ('uuid','label','vid','gpid','priority','mip','table' )
935          for t in self.rqv:
936            item = self.doc.createElement( 'item' )
937            ###assert len(t) == len(kk), 'BAD request variable line: %s' % str(t)
938            for i in range(len(kk)):
939              k = kktr.get( kk[i], kk[i] )
940              v = t[  self.rqvinfo.index(k) ]
941              if k == 'priority':
942                item.setAttribute( kk[i], str( int(v) ) )
943              else:
944                item.setAttribute( kk[i], str( v ) )
945            self.ff[ksect][0].appendChild( item )
946           
947    ##self.dimsTimeInfo = ['uuid','label','title','dimensions']
948    ##self.dimsSpaceInfo = ['uuid','label','title','dimensions','levelFlag','levels']
949
950  def finish(self):
951    ol = []
952    for m in self.objectives.keys():
953      not_used = []
954      used = []
955      not_found = []
956      found = []
957      allused = (m != 'GMMIP') and (self.objectiveLinks[m].a.has_key( 'All' ) or self.objectiveLinks[m].a.has_key( 'All?' ) )
958      for o in self.objectives[m].keys():
959        if allused or self.objectiveLinks[m].a.has_key(o):
960          used.append(o)
961          for u in self.objectiveLinks[m].a[o]:
962            ol.append( (m,self.objectives[m][o], u ) )
963        else:
964          not_used.append(o)
965      for o in self.objectiveLinks[m].a.keys():
966        if (o in {'All','All?'} and len(self.objectives[m].keys()) > 0 ) or self.objectives[m].has_key(o):
967          found.append(o)
968        else:
969          not_found.append(o)
970      print 'INFO: %s: OK %s: unused: %s: not found:%s' % (m,str(used),str(not_used),str(not_found))
971    this = self.doc.getElementsByTagName('objectiveLink')[0]
972    dil = this.getElementsByTagName('item')
973    for d in dil:
974          this.removeChild(d)
975    for t in ol:
976       item = self.doc.createElement( 'item' )
977       item.setAttribute( 'label', t[0] )
978       item.setAttribute( 'oid', t[1] )
979       item.setAttribute( 'rid', t[2] )
980       thisuuid = str( uuid.uuid1() )
981       item.setAttribute( 'uuid', thisuuid )
982       this.appendChild( item )
983
984    this = self.doc.getElementsByTagName('remarks')[0]
985    dil = this.getElementsByTagName('item')
986    for d in dil:
987          this.removeChild(d)
988
989    txt = self.doc.toprettyxml(indent='\t', newl='\n', encoding=None)
990    if self.schemaMode == 'dreq2':
991      ofn = 'trial2_20150831.xml'
992    else:
993      ofn = 'trial_20150831.xml'
994    oo = open( ofn, 'w' )
995    lines = string.split( txt, '\n' )
996    for line in lines:
997      l = utils_wb.uniCleanFunc( string.strip(line) )
998      if empty.match(l):
999        continue
1000      else: 
1001        oo.write(l + '\n')
1002    oo.close()
1003
1004  def importRepl(self,rfile='uuidreplace.csv'):
1005    for l in open(rfile).readlines():
1006      bits = string.split( string.strip(l), '\t' )
1007      assert len(bits) == 7, 'Could not parse item replacement file'
1008      self.repl[ bits[3] ].append( (bits[2],bits[0],bits[1] ) )
1009      self.replItems[bits[0]] = bits[1]
1010
1011  def importRemove(self,rfile='uuidremove.csv'):
1012    for l in open(rfile).readlines():
1013      self.remo[ string.strip(l) ] = 1
1014
1015  def importUpdate(self,rfile='uuidupdate.csv'):
1016    for l in open(rfile).readlines():
1017      bits = string.split( string.strip(l), '\t' )
1018      tgs = string.strip( bits[2] )
1019      if string.find( tgs, ' ' ) == -1:
1020        tags = [tgs,]
1021      else:
1022        tags = string.split( tgs )
1023      self.upda[ bits[0] ] =  {'comment':bits[1], 'tags':tags, 'label':bits[3], 'title':bits[4] }
1024
1025  def importInsert(self,rfile='uuidinsert.csv'):
1026    for l in open(rfile).readlines():
1027      bits = string.split( string.strip(l), '\t' )
1028      if bits[0] == 'unique':
1029         self.insert[bits[1]] = bits[3]
1030
1031mode = 'dreq2'
1032sampleXml = '../framework/out/%sSample.xml' % mode
1033from scansh import rq
1034
1035##cmip5GrpLk = collections.defaultdict( dict )
1036##for k in rq.cmip5Grps.keys():
1037  ##bits = string.split(k,'_')
1038  ##tab = bits[0]
1039  ##for v in rq.cmip5Grps[k]:
1040    ##cmip5GrpLk[tab][v] = k
1041
1042m = main(sampleXml, rq,run=True, schemaMode=mode)
1043
1044if len(m.err0010.keys()) > 0:
1045  ks = m.prqv.err0010.keys()
1046  ks.sort()
1047  for k in ks:
1048    print 'ERROR.001.0010: variable group not identified: %s [%s]' % (k,m.prqv.err0010[k])
1049  ks = m.prqv.err0020.keys()
1050  ks.sort()
1051  for k in ks:
1052    print 'ERROR.001.0020: variable group not identified: %s [%s]' % (k,m.prqv.err0020[k])
Note: See TracBrowser for help on using the repository browser.