source: CMIP6dreqbuild/trunk/src/workbook/isd3b.py @ 904

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/workbook/isd3b.py@904
Revision 904, 126.3 KB checked in by mjuckes, 4 years ago (diff)

clearing old aerchemmip code

Line 
1"""Import data request from shelves and pu 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"""
9
10### Experiment group dictionary added, and experiment set of named tuples -- making it possible to identify experiments in each mip and group.
11### Should be able to use this in review to make reference groups ...
12
13###
14### Appear to be getting core variables into a clean format
15### Some filtering to avoit duplicates arising from two approaches to OMIP, flagged as ERROR.090 in standard output.
16### Corrected by omitting 2nd reference
17###
18
19import xlrd, xml, os, sys, string, shelve
20import utils_wb, uuid
21import xml.dom, xml.dom.minidom
22import collections, string, re
23import choiceCfg
24import importWbMods
25import dreq_utils
26from utils_wb import uniCleanFunc
27import ivg
28
29#up:
30varPositive = {'rlus':'up', 'rlut':'up', 'rlutcs':'up', 'hfls':'up', 'hfss':'up', 'mcu':'up', 'rsus':'up', 'rsut':'up', 'rsutcs':'up', 'rlds':'down', 'rsds':'down' }
31
32refMips =  ['AerChemMIP', 'C4MIP', 'CFMIP', 'DAMIP', 'DCPP', 'FAFMIP', 'GeoMIP', 'GMMIP', 'HighResMIP', 'ISMIP6', 'LS3MIP', 'LUMIP', 'OMIP', 'PMIP', 'RFMIP', 'ScenarioMIP', 'VolMIP', 'CORDEX', 'DynVar', 'SIMIP', 'VIACSAB']
33##
34## refCmv.refUid[tab][lab] = k
35##
36refCmv = ivg.refCmv()
37extRefCmvMode = 'r'
38extRefCmv = shelve.open( 'sh/extRefCmv', 'r' )
39extRefCmvInv = {}
40nd = 0
41sd = set()
42sd2 = set()
43for k in extRefCmv:
44  k1 = extRefCmv[k]
45  if k1 in extRefCmvInv:
46    print 'FATAL: Duplicate key in extRefCmv: %s [%s] %s' % (k,k1,extRefCmvInv[k1])
47    sd.add(k)
48    sd2.add(extRefCmvInv[k1])
49    nd += 1
50  extRefCmvInv[k1] = k
51assert nd == 0, 'FATAL ERRORS FOUND ... see standard output: %s, %s'  % (str( sd ), str( sd2 ) )
52
53def chkRefCmv( ntab, lab, u0, msg ):
54              if ntab in refCmv.refUid[ntab] and lab in refCmv.refUid[ntab]:
55                     uid = refCmv.refUid[ntab][lab]
56                     print 'INFO.uid0.%s: uid  found in extRefCmv: %s, %s (%s) {%s}' % (msg,ntab,lab,uid,u0)
57              else:
58                     kk = str( '%s.%s' % (ntab,lab) )
59                     if kk in extRefCmv:
60                       uid = extRefCmv[kk]
61                       print 'INFO.uid.%s: uid found in extRefCmv: %s, %s (%s) {%s}' % (msg,ntab,lab,uid,u0)
62                     else:
63                       if extRefCmvMode != 'r':
64                         extRefCmv[kk] = u0
65                       print 'WARN.uid.%s: uid not found: %s, %s (%s)' % (msg,ntab,lab,u0)
66                       uid = u0
67              return uid
68
69
70siSurfFluxes = ['sidmasstranx', 'sidmasstrany', 'siforcecoriolx', 'siforcecorioly', 'siforcetiltx', 'siforcetilty', 'siforceintstrx', 'siforceintstry', 'sistrxdtop', 'sistrydtop', 'sistrxdbot', 'sistrydbot', 'siu', 'siv']
71oceanVars = ['fg13co2','fg14co2']
72realmTab = {'landice':['LImongre','LImonant','LIyrgre','LIyrant','LIfxgre','LIfxant'], 'atmos':['6hrLev','6hrPlev','6hrPevpt','em1hrclimmon','em3hr','em1hr','em3hrpt','emDayZ','emDaypt','emMonZ']}
73## emYr, emMon, emFy, emMonZ .... need checking
74knownRealmA = [ 'LS3MIP [LWday]', 'LS3MIP [LEday]', 'CFMIP [cf1hrClimMon]', 'HighResMIP [3hr_cloud]', 'CFMIP [cf3hr_sim_new]', 'C4MIP [L_3hr]', 'DAMIP [DAMIP_day]', 'DAMIP [DAMIP_3hr_p2]', 'DynVar [DYVR_daily_c]', 'PMIP [PMIP-6hr]', 'HighResMIP [1hrLev]']
75knownRealmO = [ 'DAMIP [DAMIP_Omon_p2]', 'FAFMIP [fafOyr]']
76varRealmMaps = {'land':['areacellg','orog'],
77                'landIce land':['snc'],
78               'landIce':['icem', 'sftflf', 'sftgrf','acabf','snicefreez', 'snicem', 'hfgeoubed', 'lithk', 'topg','areacelli','lialb', 'libmassbffl', 'libmassbfgr', 'licalvf', 'lifmassbf', 'litempbotfl', 'litempbotgr', 'litemptop', 'mrroIs','strbasemag', 'topg', 'xvelbase', 'xvelmean', 'xvelsurf', 'yvelbase', 'yvelmean', 'yvelsurf', 'zvelbase', 'zvelsurf','snmIs','sncIs','tsnIs','sbl'],
79               'atmos':['prra','prsn','prrc','sbl','tas','prCrop', 'tasmaxCrop', 'tasminCrop','hfls', 'hfss','rlds', 'rlus', 'rsds', 'rsus'] }
80varRealmMapsInv = {}
81for k in varRealmMaps:
82  for v in varRealmMaps[k]:
83    varRealmMapsInv[ v ] = k
84
85class replaceItems(object):
86  def __init__(self):
87    self.v = collections.defaultdict( list )
88    self.items = {}
89
90WbMods = importWbMods.run()
91tableUtils = ivg.tableUtils()
92
93nt__trace = collections.namedtuple( 'trace', ['GROUPITEM_ta','SPATIALSHAPE_01'] )
94trace = nt__trace( False, False )
95
96tab2freq = {u'CMIP5_cfOff':'subhr', u'CORDEX_mon':'mon', u'SPECS_day':'day', u'CMIP5_day':'day', \
97                  u'PMIP3_OImon':'mon', u'CORDEX_day':'day', u'CMIP5_LImon':'mon', u'CMIP5_OImon':'mon', \
98                  u'CMIP5_Lmon':'mon', u'CMIP5_3hr':'3hr', u'CMIP5_Omon':'mon', u'PMIP3_OIclim':'monClim', \
99                  u'PMIP3_fx':'fx', u'CORDEX_fx':'fx', u'PMIP3_LImon':'mon', u'CMIP5_6hrPlev':'6hr', u'PMIP3_Lmon':'mon', \
100                  u'PMIP3_Amon':'mon', u'SPECS_Omon':'mon', u'CCMI1_fixed':'fx', u'PMIP3_Aclim':'monClim', u'CMIP5_6hrLev':'6hr', \
101                  u'CMIP5_Oclim':'monClim', u'PMIP3_LIclim':'monClim', u'CCMI1_monthly':'mon', u'CMIP5_fx':'fx', \
102                  u'CMIP5_cfDay':'day', u'CORDEX_6h':'6hr', u'PMIP3_day':'day', u'SPECS_OImon':'mon', u'CMIP5_cfMon':'mon', \
103                  u'CORDEX_sem':'monClim', u'SPECS_6hr':'6hr', u'CMIP5_cfSites':'subhr', u'CCMI1_hourly':'hr', u'CMIP5_aero':'mon', \
104                  u'CMIP5_Amon':'mon', u'PMIP3_Omon':'mon', u'CCMI1_daily':'day', u'SPECS_fx':'fx', u'PMIP3_Lclim':'monClim', \
105                  u'aermonthly':'mon', u'aermonthlyz':'mon', u'aerhourly':'hr', 'aerfixed':'fx', 'aerdaily':'day',
106                  u'DCPP-day':'day',  \
107                  u'Odec':'dec', \
108                  u'PMIP3_Oclim':'monClim', u'SPECS_Amon':'mon', u'SPECS_Lmon':'mon', u'CMIP5_cf3hr':'3hr', u'CORDEX_3h':'3hr', \
109                  'OImon':'mon', 'Omon_oth':'mon', 'Omon':'mon',  'Oyr':'yr', 'Omon_3d':'mon', \
110                  u'CCMI1_annual':'yr', u'CMIP5_Oyr':'yr', \
111                   'Oclim':'monClim', \
112                   'cfMon':'mon', 'emMonZ':'mon', \
113                   '3hr':'3hr', 'cfOff':'subhr', 'OMIP-Omon':'mon', '6hrLev':'6hr', 'fx':'fx', 'OMIP-Oyr':'yr', 'cfDay':'day', 'Lmon':'day', \
114                  u'cf3hr':'3hr', u'Amon':'mon', u'aero':'mon', u'aero_3d':'mon', u'6hrPlev':'6hr', u'aero_oth':'mon', \
115                  u'cf3hr_grid':'3hr', u'LImon':'mon', u'cfSites':'subhr', u'day_oth':'day', u'cfDay_2d':'day', u'day':'day' }
116
117freq2tab = collections.defaultdict( list )
118for k in tab2freq:
119  freq2tab[tab2freq[k]].append( k )
120
121tableNameMap = {'CMIP5_3hr':'3hr', 'CMIP5_6hrLev':'6hrLev', 'CMIP5_6hrPlev':'6hrPlev', 'CMIP5_Amon':'Amon', 'CMIP5_LImon':'LImon', 'CMIP5_Lmon':'Lmon', 'CMIP5_OImon':'CMIP5_OImon', 'CMIP5_Oclim':'Oclim', 'CMIP5_Omon':'CMIP5_Omon', 'CMIP5_aero':'aero', 'CMIP5_cf3hr':'cf3hr', 'CMIP5_cfDay':'cfDay', 'CMIP5_cfMon':'cfMon', 'CMIP5_cfOff':'cfOff', 'CMIP5_cfSites':'cfsites', 'CMIP5_day':'day', 'CMIP5_fx':'fx', 'OMIP.Omon':'Omon', 'OMIP.Oyr':'Oyr', 'OMIP.day':'Oday', 'OMIP.fx':'Ofx' }
122
123reportedRedundantTables = set()
124redundantTables = ['aero','CMIP5_Oyr','CMIP5_Omon','CMIP5_OImon','CORDEX_3h', 'CORDEX_6h', 'CORDEX_fx', 'CORDEX_mon', 'CORDEX_sem', 'PMIP3_Aclim', 'PMIP3_Amon', 'PMIP3_LIclim', 'PMIP3_LImon', 'PMIP3_Lclim', 'PMIP3_Lmon', 'PMIP3_OIclim', 'PMIP3_OImon', 'PMIP3_Oclim', 'PMIP3_Omon', 'PMIP3_day', 'PMIP3_fx',
125 'SPECS_Lmon', 'SPECS_Amon', 'SPECS_6hr', 'SPECS_day', 'SPECS_fx', 'SPECS_Omon', 'SPECS_OImon',
126 'CORDEX_day', 
127 'CCMI1_annual','CCMI1_daily','CCMI1_fixed','CCMI1_hourly','CCMI1_monthly']
128
129## mapping of variable groups representing tables ....
130mappedTables =  {'Omon':'OMIP-Omon', 'OMIP-Oyr':'Oyr', 'OImon':'SIMIP-seaicemon' }
131mappedTables =  {'Omon':'OMIP-Omon', 'CMIP5-Oyr':'OMIP-Oyr', 'OImon':'SIMIP-seaicemon', 'CMIP5-Omon':'OMIP-Omon' }
132## mappedTables =  { 'OImon':'SIMIP-seaicemon' }
133                 ## 'aeromonthly':'aermonthly' }
134
135freqmap = {'daily':'day', 'Annual':'yr', 'Timestep':'subhr',  '1day':'day', '1mon':'mon', 'month':'mon', 'year':'yr', 'monthly':'mon', 'Day':'day', '6h':'6hr', '3 hourly':'3hr', '3 Hourly':'3hr'  }
136
137nt_expt = collections.namedtuple( 'expt', ['uid', 'label', 'mip', 'egid' ] )
138realmdef = { '__all__':['CFMIP [cfMonExtra]', 'PMIP [PMIP-Omon]', 'LS3MIP [LCmon]', 'C4MIP [C_Ocean_T2]', 'C4MIP [C_Ocean_T1]', 'LUMIP [Lyr_Lut]', 'PMIP [PMIP-LIclim]', 'HighResMIP [1hr_strat]', 'SIMIP [seaiceday]', 'C4MIP [C_LandT1]', 'CFMIP [cfDay_2d_new]', 'HighResMIP [6hrPlev_intense]', 'HighResMIP [Amon_diag]', 'DCPP [DCPP-mon]', 'HighResMIP [Amon_conv]', 'SIMIP [seaicemon]', 'DAMIP [new_monthly]', 'FAFMIP [fafOyrB]', 'HighResMIP [Amon_ext]', 'DynVar [DYVR_daily]', 'PMIP [PMIP-Aclim]', 'HighResMIP [3hr_extr]', 'C4MIP [C_Basic]', 'DCPP [DCPP-day]', 'CFMIP [cfMon_3dstd_new]', 'FAFMIP [fafOmon]', 'ISMIP6 [new_fx]', 'LS3MIP [LEday]', 'PMIP [PMIP-aeroclim]', 'PMIP [PMIP-aero]', 'DCPP [DCPP-6hr]', 'DynVar [DYVR_monthly]', 'ISMIP6 [icesheetmon]', 'CFMIP [aeroDay_2d]', 'ISMIP6 [new_LImon]', 'ISMIP6 [new_Omon]', 'CFMIP [cfDayExtra]', 'LS3MIP [LWday]', 'PMIP [PMIP-Oclim]', 'ISMIP6 [icesheetyear]', 'LUMIP [Lmon_Lut]', 'HighResMIP [1ts]', 'PMIP [PMIP-OIclim]', 'HighResMIP [6hrPlev_extr_dr]', 'VolMIP [VIRF]', 'C4MIP [C_LandT2]', 'C4MIP [C_Hist]', 'FAFMIP [fafOmonB]', 'RFMIP [aero_irf]', 'PMIP [PMIP-Lmon]', 'C4MIP [L_day]', 'PMIP [PMIP-Lclim]', 'PMIP [PMIP-Amon]', 'GeoMIP [aeroGeo]', 'HighResMIP [6hrPlev_extr]', 'PMIP [PMIP-day]', 'HighResMIP [Amon_sparc]', 'CFMIP [cfSites_new]', 'CFMIP [cf3hr_sim]'], 
139        'atmos':['CFMIP [cfMonExtra]', 'HighResMIP [1hr_strat]', 'CFMIP [cfDay_2d_new]', 'HighResMIP [6hrPlev_intense]', 'HighResMIP [Amon_diag]', 'DCPP [DCPP-mon]', 'HighResMIP [Amon_conv]', 'DAMIP [new_monthly]', 'HighResMIP [Amon_ext]', 'DynVar [DYVR_daily]', 'PMIP [PMIP-Aclim]', 'HighResMIP [3hr_extr]', 'DCPP [DCPP-day]', 'CFMIP [cfMon_3dstd_new]', 'PMIP [PMIP-aeroclim]', 'PMIP [PMIP-aero]', 'DCPP [DCPP-6hr]', 'DynVar [DYVR_monthly]', 'CFMIP [aeroDay_2d]', 'CFMIP [cfDayExtra]', 'HighResMIP [1ts]', 'HighResMIP [6hrPlev_extr_dr]', 'VolMIP [VIRF]', 'RFMIP [aero_irf]', 'PMIP [PMIP-Amon]', 'GeoMIP [aeroGeo]', 'HighResMIP [6hrPlev_extr]', 'PMIP [PMIP-day]', 'HighResMIP [Amon_sparc]', 'CFMIP [cfSites_new]', 'CFMIP [cf3hr_sim]'],
140        'ocean':['PMIP [PMIP-Omon]', 'C4MIP [C_Ocean_T1]', 'C4MIP [C_Ocean_T2]', 'FAFMIP [fafOyrB]', 'FAFMIP [fafOmon]', 'ISMIP6 [new_Omon]', 'PMIP [PMIP-OIclim]', 'FAFMIP [fafOmonB]', 'PMIP [PMIP-Oclim]'],
141        'land':['LS3MIP [LCmon]', 'C4MIP [C_Hist]', 'C4MIP [L_day]', 'PMIP [PMIP-Lclim]', 'C4MIP [C_Basic]', 'LUMIP [Lmon_Lut]', 'LUMIP [Lyr_Lut]', 'C4MIP [C_LandT1]', 'PMIP [PMIP-Lmon]', 'C4MIP [C_LandT2]'],
142        'seaIce':['SIMIP [seaicemon]', 'SIMIP [seaiceday]' ],
143        'landIce':['ISMIP6 [new_LImon]', 'PMIP [PMIP-LIclim]', 'ISMIP6 [icesheetyear]', 'ISMIP6 [new_fx]', 'ISMIP6 [icesheetmon]'],
144        '__unset__':['LS3MIP [LWday]', 'LS3MIP [LEday]'] }
145
146realmdefix = {}
147for k in realmdef.keys():
148  if k != '__all__':
149    for s in realmdef[k]:
150      assert not realmdefix.has_key(s), 'Duplicate targ value in realmdef: %s [%s]' % (s,k)
151      realmdefix[s] = k
152
153for k in realmdef['__all__']:
154  assert realmdefix.has_key(k), 'Key %s not found in realmdefix' % k
155
156class cls_s1(object):
157  def __init__(self):
158    self.a = collections.defaultdict( list )
159
160def mycc(s):
161      s = string.replace( s, '&', '' )
162      s = string.replace( s, '.', '-' )
163      if len(s) > 0 and s[-1] == '+':
164        s = s[:-1] + 'ETC'
165## camelcase the input string
166      s1 = string.lower( string.replace(string.strip(str( s) ), '-', ' ') )
167      return string.replace( string.capwords( s1 ), ' ', '' )
168
169empty=re.compile('^$')
170
171def test( x,m):
172  if not x:
173    print m
174  return x
175
176class lcm(object):
177  def __init__(self,a,b):
178    self.a = {}
179    self.b = {}
180    for i in a:
181      self.a[string.lower(i)] = i
182    for i in b:
183      self.b[string.lower(i)] = i
184
185class main(object):
186
187  def __init__(self,src,rq,doRepl=False,run=False,schemaMode='dreq'):
188    self.schemaMode = schemaMode
189    self.requestlinkuid = set()
190    self.src=src
191    self.vgcheck = {}
192    self.rqlPreset = {}
193    fok = [test(os.path.isfile(src),'%s not found' % src), ]
194    assert all( fok), 'Required input file(s) missing'
195    self.fix = WbMods.fix
196    self.spsh = WbMods.ls
197    self.spsh.addTime()
198    self.cmDims = WbMods.cm
199    self.cmvMap002 = dict()
200    self.importWbMods = WbMods
201    self.rq = rq
202    self.deferredLabMap = {}
203    self.struidmapextra = {}
204
205## groupItems:grps
206    for sh in [rq.expt,rq.exgp,rq.objec,rq.refti, rq.revti, rq.vars, rq.grps, rq.rqli, rq.rqit, rq.rqsect]:
207       print sh['__info__']
208
209    self.repl = collections.defaultdict( list )
210    self.replItems = {}
211    self.rep = {'cmv':replaceItems()}
212    ##self.deferredRequestLinkClone = collections.defaultdict( set )
213
214    self.err0010 = collections.defaultdict( int )
215    self.defaultP = {}
216    self.remo = {}
217    self.upda = {}
218    self.insert = {}
219    self.rqLnks = collections.OrderedDict()
220    self.exptSet = set()
221    self.exptGrpDict = {}
222
223    self.objectives = collections.defaultdict( dict )
224    self.objectiveLinks = collections.defaultdict( cls_s1 )
225    self.experiments = {}
226    self.experimentGrp = {}
227    self.exptPntUid = {}
228    self.exptPnt = collections.defaultdict( list )
229    self.mips = set()
230    self.dsortdd = {}
231
232    if doRepl:
233      self.importRepl()
234      self.importRepl(rfile='CMVreplace.csv',mode='cmv')
235      self.importRemove()
236      self.importUpdate()
237      self.importInsert()
238
239    self.e15_10 = 0
240    self.doc = xml.dom.minidom.parse( self.src  )
241    self.vocabs = xml.dom.minidom.parse( 'vocabs.xml' )
242    self.skey = {'experiment':rq.expt, 'exptgroup':rq.exgp, \
243         'objective':rq.objec, 'var':rq.vars,'ovar':rq.refti, 'groupitem':rq.grps, \
244         'revisedtabitem_xxx':rq.revti, 'requestlink':rq.rqli, 'requestitem':rq.rqit, \
245         'requestvargroup':rq.rqvg, 'tablesection':rq.rqsect, 'requestvar':rq.revti}
246
247    self.newImport = False
248    self.prepVar()
249    self.writeTimeSlice()
250    self.writeMip()
251    self.writeSn()
252    self.writeMcfg()
253    self.writeProcNotes()
254    self.writeCmDim()
255    self.writeRvg()
256    self.prep(rq)
257    self.cmvAudit(0)
258    self.prepRequestItem()
259    self.reviewExpt()
260    if run:
261      self.run(rq)
262      self.writeRelations()
263      self.writeRvx()
264      if self.schemaMode == 'dreq2':
265        self.write2()
266        self.writeMipTables()
267        self.writeCellMethods()
268      self.writeVar()
269      self.finish()
270      self.finish2()
271    extRefCmv.close()
272
273  def prepRequestItem(self):
274      thissh = self.skey['requestitem']
275## 'mip', 'tab', 'expt','rlid','ny', 'nexmax', 'nenmax', 'nymax','treset','info'
276      s1 = collections.defaultdict( set )
277      for k in thissh:
278        if k[0] != '_':
279          ll = thissh[k][:]
280          ku = str(ll[2])
281          s1[ll[0]].add(ll[9])
282          if len( ku) == 1:
283            print 'SEVERE.rqi.00088: ',ll
284##
285          self.exptPnt[ku].append( str(k) )
286
287      thissh = self.skey['experiment']
288      for k in thissh:
289        if k[0] != '_':
290          ll = thissh[k][:]
291          thisl = str( ll[2] )
292          if ll[4] in ['SolarMIP']:
293            print 'ERROR: %s experiment: %s' % (ll[4],str(ll))
294          else:
295            self.mips.add( str( ll[4] ) )
296            self.experiments[thisl] = str( ll[0] )
297            self.exptSet.add( nt_expt._make( [str( ll[0] ), thisl, str( ll[4] ), str( ll[1] ) ] ) )
298
299      thissh = self.skey['exptgroup']
300      for k in thissh:
301        if k[0] != '_':
302          ll = thissh[k][:]
303          thisl = str( ll[1] )
304          self.exptGrpDict[thisl] = str( ll[1] )
305          self.experimentGrp[thisl] = str( ll[0] )
306
307      mm = []
308      for m in self.mips:
309        if m not in self.mipUids:
310          mm.append(m)
311      assert len(mm) == 0, 'Not all mips found: %s: %s' % (str(mm),str(self.mipUids))
312
313  def writeProcNotes(self):
314    xx = self.vocabs.getElementsByTagName( 'processingOptions' )
315    assert len(xx) == 1, 'Expecting one element named "processingOptions", found %s' % len(xx)
316    iDoc = xx[0]
317## <item id="tmpid.0003" label="C4MIP" status="" title="Coupled Climate Carbon Cycle Model Intercomparison Project" url="http://c4mip.lsce.ipsl.fr/"/>
318    thiss = self.doc.getElementsByTagName( 'tags' )[0]
319    dil = thiss.getElementsByTagName('item')
320    for d in dil:
321      thiss.removeChild(d)
322    for i in iDoc.getElementsByTagName('item'):
323      item = self.doc.createElement( 'item' )
324      thisl = i.getAttribute( 'label' )
325      for k in ['title','description','label']:
326        item.setAttribute( k, i.getAttribute( k ) )
327      uid =  'TAG:%s' % thisl
328      item.setAttribute( 'uid', uid )
329      thiss.appendChild( item )
330
331  def writeRelations(self):
332    thiss = self.doc.getElementsByTagName( 'varRelations' )[0]
333    dil = thiss.getElementsByTagName('item')
334    for d in dil:
335      thiss.removeChild(d)
336    for i in self.fix.relations:
337      item = self.doc.createElement( 'item' )
338      for j in range( len( self.fix.relationinfo ) ):
339        item.setAttribute( self.fix.relationinfo[j], i[j] )
340      thiss.appendChild( item )
341
342    thiss = self.doc.getElementsByTagName( 'varRelLnk' )[0]
343    dil = thiss.getElementsByTagName('item')
344    for d in dil:
345      thiss.removeChild(d)
346    cc = collections.defaultdict(int)
347    for i in self.fix.relationlinks:
348      item = self.doc.createElement( 'item' )
349      tvp = i[1]
350      ix = cc[tvp]
351      cc[tvp] += 1
352      for j in range( len( self.fix.relationlinkinfo ) ):
353        item.setAttribute( self.fix.relationlinkinfo[j], i[0][j] )
354
355      if tvp in self.cmvUidByTVP:
356        vid = self.cmvUidByTVP[ tvp ][ix]
357        item.setAttribute( 'rid', vid )
358        print 'INFO.093.00011: found: %s' % str(tvp)
359      else:
360        t,v,p = tvp
361        if ('CMIP5_%s' % t,v,p) in self.cmvUidByTVP:
362          if ix >= len(self.cmvUidByTVP[ ('CMIP5_%s' % t,v,p) ] ):
363            print 'WARN.093.00011b: not found: %s, %s' % (str(tvp),ix)
364          else:
365            vid = self.cmvUidByTVP[ ('CMIP5_%s' % t,v,p) ][ix]
366            item.setAttribute( 'rid', vid )
367            print 'INFO.093.00011a: found: %s' % str(tvp)
368        elif t[-2:] in ['pt','zm'] and ( t[:-2],v,p) in self.cmvUidByTVP:
369          vid = self.cmvUidByTVP[ ( t[:-2],v,p) ][ix]
370          item.setAttribute( 'rid', vid )
371          print 'INFO.093.00011a: found: %s' % str(tvp)
372        else:
373          print 'WARN.093.00011: not found: %s' % str(tvp)
374      thiss.appendChild( item )
375
376  def writeCellMethods(self):
377    thiss = self.doc.getElementsByTagName( 'cellMethods' )[0]
378    dil = thiss.getElementsByTagName('item')
379    for d in dil:
380      thiss.removeChild(d)
381    ss = set()
382    for k in WbMods.cellm.cminfo.keys():
383      t,l,u,d = WbMods.cellm.cminfo[k]
384      item = self.doc.createElement( 'item' )
385      item.setAttribute( 'label', l )
386      item.setAttribute( 'title', t )
387      item.setAttribute( 'cell_methods', k )
388      item.setAttribute( 'uid', u )
389      if d != None:
390        item.setAttribute( 'description', d )
391      thiss.appendChild( item )
392
393  def writeMipTables(self):
394    self.cfgUids = set()
395    xx = self.vocabs.getElementsByTagName( 'table' )
396    assert len(xx) == 1, 'Expecting one element named "table", found %s' % len(xx)
397    iDoc = xx[0]
398## <item id="tmpid.0003" label="C4MIP" status="" title="Coupled Climate Carbon Cycle Model Intercomparison Project" url="http://c4mip.lsce.ipsl.fr/"/>
399    thiss = self.doc.getElementsByTagName( 'miptable' )[0]
400    dil = thiss.getElementsByTagName('item')
401    for d in dil:
402      thiss.removeChild(d)
403    ss = set()
404    for i in iDoc.getElementsByTagName('item'):
405      thisl = i.getAttribute( 'label' )
406      thisll = string.replace( thisl, '_', '-' )
407      if thisl in self.tables:
408        item = self.doc.createElement( 'item' )
409        ss.add(thisl)
410        item.setAttribute( 'label', thisll )
411        item.setAttribute( 'uid', 'MIPtable::%s' % thisl )
412        for k in ['title','description','frequency']:
413          item.setAttribute( k, i.getAttribute( k ) )
414        thiss.appendChild( item )
415      else:
416          print 'WARN.mtid.002: ignoring mip table record for %s' % thisl
417    for lab in self.tables:
418        if lab not in ss:
419          thisll = string.replace( lab, '_', '-' )
420          print 'WARN.mtid.001: creating dummy mip table record for %s' % lab
421          item = self.doc.createElement( 'item' )
422          item.setAttribute( 'label', thisll )
423          item.setAttribute( 'title', lab )
424          item.setAttribute( 'frequency', '???' )
425          item.setAttribute( 'uid', 'MIPtable::%s' % lab )
426          thiss.appendChild( item )
427
428##################################################################
429
430  def writeMcfg(self):
431    self.cfgUids = set()
432    xx = self.vocabs.getElementsByTagName( 'modelConfig' )
433    assert len(xx) == 1, 'Expecting one element named "modelConfig", found %s' % len(xx)
434    iDoc = xx[0]
435## <item id="tmpid.0003" label="C4MIP" status="" title="Coupled Climate Carbon Cycle Model Intercomparison Project" url="http://c4mip.lsce.ipsl.fr/"/>
436    thiss = self.doc.getElementsByTagName( 'modelConfig' )[0]
437    dil = thiss.getElementsByTagName('item')
438    for d in dil:
439      thiss.removeChild(d)
440    for i in iDoc.getElementsByTagName('item'):
441      item = self.doc.createElement( 'item' )
442      thisl = i.getAttribute( 'label' )
443      for k in ['title','MIPs','usage','range','type']:
444        item.setAttribute( k, i.getAttribute( k ) )
445      uid = str( thisl )
446      item.setAttribute( 'uid', uid )
447      item.setAttribute( 'label', uid )
448      self.cfgUids.add( uid )
449      thiss.appendChild( item )
450
451  def writeCmDim(self):
452    thiss = self.doc.getElementsByTagName( 'grids' )[0]
453    dil = thiss.getElementsByTagName('item')
454    for d in dil:
455      thiss.removeChild(d)
456    kk =  ['tables','label','altLabel','description','standardName','title','axis','units','isIndex','coords','bounds','direction','valid_min','valid_max','type','positive','value','boundsValues','requested','boundsRequested','tolRequested','isGrid' ]
457    for j in self.cmDims.ss.keys():
458      item = self.doc.createElement( 'item' )
459      for i in range(len(kk)):
460        if kk[i] in ['valid_min','valid_max']:
461          if str( self.cmDims.ss[j][i] ) != '':
462            item.setAttribute( kk[i], str( self.cmDims.ss[j][i] ) )
463        else:
464          item.setAttribute( kk[i], str( self.cmDims.ss[j][i] ) )
465      uid = 'dim:%s' % str( self.cmDims.ss[j][1] )
466      item.setAttribute( 'uid', uid )
467      thiss.appendChild( item )
468
469  def writeVar(self):
470    thiss = self.doc.getElementsByTagName( 'var' )[0]
471    dil = thiss.getElementsByTagName('item')
472    for d in dil:
473      thiss.removeChild(d)
474#<item description="dummyAt" id="001.001.001" label="example-01" procComment="dummyAt" procnote="dummyAt" prov="dummyAt" provmip="dummyAt" sn="dummyAt" title="dummy title string" uid="fa349c44-9ccb-11e5-8176-5404a60d96b5" units="dummyAt"/>
475    kk= ['label', 'title', 'description', 'procComment', 'procnote', 'prov', 'provmip', 'sn', 'units', 'uid','defaultp','replaced_by']
476    for uid in self.importWbMods.vars.d1:
477      item = self.doc.createElement( 'item' )
478      thisr = self.importWbMods.vars.d1[uid]
479      sn = thisr[7]
480      if sn.find( ' ' ) != -1:
481        print 'WARN.sn.00001: space in sn: ',sn
482        thisr[7] = sn.replace( ' ', '_' )
483      if sn.find( '?' ) != -1:
484        print 'WARN.sn.00002: question in sn: ',sn
485        thisr[7] = sn.replace( '?', '' )
486
487      for i in range( len(kk) -2 ):
488           item.setAttribute( kk[i], thisr[i] )
489      if len( self.importWbMods.vars.c1[ thisr[0] ] ) == 1:
490         id = thisr[0]
491      else:
492         id = '%s.%s' % (thisr[0],self.importWbMods.vars.c1[ thisr[0] ].index( uid ) )
493         print 'INFO.090.00050: setting id for non-unique variable name: %s' % id
494      item.setAttribute( 'id', id )
495      thiss.appendChild( item )
496
497  def writeRvg(self):
498    thiss = self.doc.getElementsByTagName( 'requestVarGroup' )[0]
499    dil = thiss.getElementsByTagName('item')
500    for d in dil:
501      thiss.removeChild(d)
502#<item description="dummyAt" id="001.001.001" label="example-01" procComment="dummyAt" procnote="dummyAt" prov="dummyAt" provmip="dummyAt" sn="dummyAt" title="dummy title string" uid="fa349c44-9ccb-11e5-8176-5404a60d96b5" units="dummyAt"/>
503    kk= ['label', 'title', 'description', 'procComment', 'procnote', 'prov', 'provmip', 'sn', 'units', 'uid','defaultp','replaced_by']
504    kk= ['uid', 'label', 'title', 'mip', 'ref', 'refNote']
505    for uid in self.importWbMods.vg.vg:
506      item = self.doc.createElement( 'item' )
507      thisr = self.importWbMods.vg.vg[uid]
508      for i in range( len(kk)):
509           item.setAttribute( kk[i], thisr[i] )
510      ##item.setAttribute( 'id', id )
511      thiss.appendChild( item )
512
513  def writeRvx(self):
514    thiss = self.doc.getElementsByTagName( 'requestVar' )[0]
515
516    ## 'vid', 'title', 'label', 'priority', 'vgid', 'mip'
517    cols = self.rq.rqvarx['__cols__']
518    nn = 0
519    for k in self.rq.rqvarx.keys():
520      if k[0] != '_':
521        rec = self.rq.rqvarx[k]
522        print 'INFO.writeRvx.01001: ',k,rec
523        item = self.doc.createElement( 'item' )
524        item.setAttribute( 'uid', k  )
525        for i in range(6):
526          item.setAttribute( cols[i], rec[i]  )
527        vid = item.getAttribute( 'vid' )
528        if vid in self.cmvMap002:
529           vid = self.cmvMap002[vid]
530           item.setAttribute( 'vid', vid )
531        if vid not in self.cmvByUid:
532           print 'ERROR.fixcmv.0005: attempt to use invalid vid (writeRvx): ',vid,k,rec
533        thiss.appendChild( item )
534        nn += 1
535    print 'INFO.writeRvx.00001: %s records written' % nn
536
537  def writeSn(self):
538    import loadcf
539    cf = loadcf.cf()
540    thiss = self.doc.getElementsByTagName( 'standardname' )[0]
541    dil = thiss.getElementsByTagName('item')
542    for d in dil:
543      thiss.removeChild(d)
544
545    for i in sorted( cf.names.keys() ):
546      item = self.doc.createElement( 'item' )
547      d,u = cf.names[i]
548      uid = str(i)
549      if uid.find( ' ' ) != -1:
550         print 'SEVERE.sn.00001: BAD SN: %s' % uid
551      uid = uid.replace( ' ', '' )
552      title = string.capwords( string.replace( uid, '_', ' ' ) )
553      label = string.replace( title, ' ', '' )
554      for w in ['Of','In','On','By']:
555        ww = ' %s ' % w
556        title = title.replace( ww, string.lower( ww ) )
557      item.setAttribute( 'uid', uid  )
558      item.setAttribute( 'label', label  )
559      item.setAttribute( 'title', title  )
560      item.setAttribute( 'units', str(u) )
561      item.setAttribute( 'description', uniCleanFunc( d ) )
562      thiss.appendChild( item )
563
564  def writeTimeSlice(self):
565    xx = self.vocabs.getElementsByTagName( 'timeSlice' )
566    assert len(xx) == 1, 'Expecting one element named "activity", found %s' % len(xx)
567    iDoc = xx[0]
568    thiss = self.doc.getElementsByTagName( 'timeSlice' )[0]
569    dil = thiss.getElementsByTagName('item')
570    for d in dil:
571      thiss.removeChild(d)
572
573    for i in iDoc.getElementsByTagName('item'):
574      item = self.doc.createElement( 'item' )
575      label = i.getAttribute( 'label' )
576      for k in ['label','title','type']:
577        item.setAttribute( k, i.getAttribute( k ) )
578      for k in ['child']:
579        if i.getAttribute( k ) != '':
580          item.setAttribute( k, i.getAttribute( k ) )
581      for k in ['start', 'end', 'step', 'sliceLen', 'nyears']:
582        if i.getAttribute( k ) != '':
583          v = str( int( float( i.getAttribute( k ) ) ) )
584          item.setAttribute( k, v )
585      item.setAttribute( 'uid', '_slice_%s' % label )
586      thiss.appendChild( item )
587
588  def writeMip(self):
589    self.mipUids = set()
590    xx = self.vocabs.getElementsByTagName( 'activity' )
591    assert len(xx) == 1, 'Expecting one element named "activity", found %s' % len(xx)
592    mipDoc = xx[0]
593## <item id="tmpid.0003" label="C4MIP" status="" title="Coupled Climate Carbon Cycle Model Intercomparison Project" url="http://c4mip.lsce.ipsl.fr/"/>
594    thiss = self.doc.getElementsByTagName( 'mip' )[0]
595    dil = thiss.getElementsByTagName('item')
596    for d in dil:
597      thiss.removeChild(d)
598    for i in mipDoc.getElementsByTagName('item'):
599      item = self.doc.createElement( 'item' )
600      mip = i.getAttribute( 'label' )
601      for k in ['title','url']:
602        item.setAttribute( k, i.getAttribute( k ) )
603      uid = string.replace( mip, ' ', '' )
604      item.setAttribute( 'uid', uid )
605      item.setAttribute( 'label', uid )
606      self.mipUids.add( uid )
607      thiss.appendChild( item )
608
609    if "DECK" not in self.mipUids:
610      item = self.doc.createElement( 'item' )
611      item.setAttribute( 'uid', 'DECK' )
612      item.setAttribute( 'url', '' )
613      item.setAttribute( 'label', 'DECK' )
614      item.setAttribute( 'title', 'DECK - set of standard CMIP runs' )
615      self.mipUids.add( "DECK" )
616      thiss.appendChild( item )
617
618
619  def prepVar(self):
620      thissh = self.skey['var']
621      self.varsxx = None
622      if self.newImport:
623#['label', 'title', 'sn', 'units', 'description', 'procnote', 'procComment', 'prov', 'priority0', 'rlm0']
624        self.vars = collections.defaultdict( list )
625        self.vars1 = collections.defaultdict( list )
626        for k in thissh:
627          if k[0] != '_':
628            ll = thissh[k][:]
629            thisl = str( ll[2] )
630            self.vars[thisl].append( k )
631            self.vars1[str( ll[0] )].append( k )
632      else:
633        self.varsxx = collections.defaultdict( list )
634        for k in thissh:
635          if k[0] != '_':
636            ll = thissh[k][:]
637            thisl = str( ll[2] )
638            self.varsxx[str( ll[0] )].append( k )
639
640
641  def prep(self,rq):
642## keys here match section element names in schema
643    #for k in [ 'var','ovar','groupitem', 'revisedtabitem']:
644## lists for 3 new sections
645### uuid, spid, tmid, cell_methods, cell_measures, description, procNote, prov
646    structure = [] 
647    self.structInfo = {}
648### uuid, label, dimensions, shape, levels, levelFlag
649    spatialshp = []
650### uuid, label, dimension, tstyle
651    temporalshp = []
652### cmor variables
653    self.cmv = []
654    self.rqvList = []
655    self.rqvgList = []
656    self.cmvUidByFL = collections.defaultdict( cls_s1 )
657    self.cmvUidByTab = collections.defaultdict( cls_s1 )
658    self.cmvUidByTVP = collections.defaultdict( list )
659    self.cmvByLab = collections.defaultdict( dict )
660    self.cmvs = set()
661    self.cmvinfo = ('uid','stid','label','title','description','vid', \
662                    'deflate_level', 'shuffle', 'ok_max_mean_abs', 'flag_meanings', 'type', 'ok_min_mean_abs',  \
663                    'deflate', 'valid_min', 'flag_values', 'modeling_realm', 'valid_max', 'positive', 'mipTable', \
664                    'prov', 'provNote', 'frequency', 'rowIndex', 'coordinates','defaultPriority','mipTableSection','processing')
665    self.cmvinfo2 = ('uid','stid','label','title','description','vid', \
666                    'deflate_level', 'shuffle', 'type',  \
667                    'deflate', 'modeling_realm', 'positive', 'mipTable', 'mipTableSection',  \
668                    'prov', 'provNote', 'frequency', 'rowIndex', 'defaultPriority','processing')
669    self.rqvinfo = ('uid','label','vid','gpid','priority','mip','table' )
670
671
672    thissh = self.skey['var']
673    self.varUidByName = self.importWbMods.vars.c1
674    ##self.varUidByName = collections.defaultdict( list )
675    if self.newImport:
676      oo = open('refDefaultP.txt', 'w' )
677      for k in thissh:
678         if k[0] != '_':
679##['label', 'title', 'sn', 'units', 'description', 'procnote', 'procComment', 'prov', 'priority0']
680            thisuuid = str(k)
681            self.defaultP[thisuuid] = thissh[k][-1]
682            oo.write( '%s\t%s\t%s\t%s\n' % (k, thissh[k][0], thissh[k][2], thissh[k][-1] ) )
683            ##self.varUidByName[thissh[k][0]].append( thisuuid )
684      oo.close()
685    else:
686      ## ['label', 'title', 'description', 'procComment', 'procnote', 'prov', 'provmip', 'sn', 'units', 'uid','defaultp']
687      self.vars = collections.defaultdict( list )
688      self.vars1 = collections.defaultdict( list )
689      for uid in self.importWbMods.vars.d1:
690        self.defaultP[uid] = self.importWbMods.vars.d1[uid][-1]
691## collection indexed by short_name
692        self.vars1[self.importWbMods.vars.d1[uid][0]].append( uid )
693## collection indexed by standard_name
694        self.vars[self.importWbMods.vars.d1[uid][7]].append( uid )
695
696### request variables
697    self.rqv = []
698    self.realmByVar = collections.defaultdict( list )
699    for ksect in [ 'ovar','groupitem']:
700      thissh = self.skey[ksect]
701      if ksect == 'ovar':
702            setu1 = set()
703            kk = ['uid', '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', 'processing', 'gpid','rowIndex','ssect', 'priority']
704            id = kk.index('dimensions')
705            ivid = kk.index('vid')
706            thisnt = collections.namedtuple( 'ovar', kk )
707            ov = []
708            dset = set()
709            ds2 = set()
710            ovuu = collections.defaultdict( set )
711            ovll = collections.defaultdict( list )
712            for k in thissh:
713              if k[0] != '_':
714                rr = thissh[k][:]
715                rr[-3] = int( rr[-3] )
716                if rr[id] == 's|c|a|l|a|r':
717                  print 'ERROR.060.0001: bad dimension string detected and corrected: %s' % rr[id]
718                  rr[id] = ''
719                if string.find( rr[23], 'plevs' ) != -1:
720                   print 'INFO.qqqq01: ',rr[21:24]
721                rr[23] = string.replace(rr[23], 'plevs', 'plev19')
722                thisdim = rr[id]
723                if thisdim.find( ' ' ) != -1:
724                  thisdim = '|'.join( [x.strip() for x in thisdim.split() ] )
725                  rr[id] = thisdim
726               
727                tt = thisnt._make( rr ) 
728                if tt.uid in setu1:
729                  print 'ERROR.099.0002: duplicate uuid: %s: %s' % (uuid,str(rr))
730                if str(tt.vid) == '__var_not_found_012__':
731                  print 'ERROR.099.00102: bad vid string: %s [%s]' % (tt.vid,tt.out_name)
732
733                if tt.out_name == 'clisccp':
734                   print 'INFO.clisccp.00002: ',rr,k
735                if tt.out_name == 'intppcalc':
736                   print 'INFO.intppcalc.00002: ',rr,k
737                if tt.out_name == 'ch4':
738                   print 'INFO.ch4.00002: ',rr,k
739                       
740                if str(tt.vid) not in self.importWbMods.vars.d1:
741                  if tt.out_name in self.importWbMods.vars.c1:
742                    if len( self.importWbMods.vars.c1[ tt.out_name ] ) == 1:
743                      rr[ivid] = self.importWbMods.vars.c1[ tt.out_name ][0]
744                      tt = thisnt._make( rr ) 
745                      print 'INFO.099.00103: bad vid string replaced: %s [%s]' % (tt.vid,tt.out_name)
746                    else:
747                      print 'ERROR.099.00104: ambiguous bad vid string: %s [%s]' % (tt.vid,tt.out_name)
748                  else:
749                    print 'ERROR.099.00105: bad vid string: %s [%s]' % (tt.vid,tt.out_name)
750                setu1.add(tt.uid)
751                ov.append( tt )
752
753                dset.add( thisdim )
754                if tt.out_name in ['al','albs']:
755                   print 'INFO.albs.00001: ',thisdim, rr
756                if tt.dimensions == 'location|time1':
757                   print 'INFO.dimensions.00001',rr
758                if tt.out_name == 'msftmyz':
759                       print 'INFO.msftmyz.00002: ',self.cmv[-1]
760                 
761                ds2.add( (tt.dimensions,tt.cell_methods,tt.cell_measures,tt.flag_values, tt.flag_meanings) )
762                ovuu[tt.vid].add( tt.modeling_realm )
763                ovll[tt.vid].append( tt )
764                if rr[22][-3:] in ['mon','day','3hr']:
765                  fr = rr[22][-3:]
766                elif rr[22][-2:] in [ 'yr','fx']:
767                  fr = rr[22][-2:]
768                else:
769                  fr = tab2freq[rr[22]]
770   
771                prov = '%s ((isd.003))' % tt.mipTable
772                if tt.mipTable[:4] == 'OMIP':
773                  prov = 'CMIP6 [OMIP] ((isd.001))'
774                elif string.find( tt.mipTable, '_' ) != -1:
775                  prov = '%s [%s] ((isd.002))' % tuple( string.split( tt.mipTable, '_' ) )
776
777                if tt.var[:5] == 'xx..ccmi_':
778                  pass
779                  assert False, 'blind pass disabled .....'
780                else:
781                  lab = tt.var
782                  if lab in {'*','include Oyr 3D tracers'}:
783                    lab = '-copy-'
784                    print 'ERROR.copy.00090: ',tt
785##
786## insert conditional on redundant tables here ...
787##
788                  if tt.mipTable in redundantTables:
789                    if tt.mipTable not in reportedRedundantTables:
790                      print 'INFO.000.11111: redundant table spotted: ',tt.mipTable
791                      reportedRedundantTables.add( tt.mipTable )
792                  else:
793                    if lab != '-copy-' and string.find( lab, '-' ) != -1:
794                      print 'ERROR.207.00010: bad character in label: %s' % lab
795                      lab = string.replace( lab, '-', '' )
796                    if tt.ssect != '':
797                       ssect,sectid = tt.ssect
798                    else:
799                       ssect = ''
800                       sectid = None
801                     
802                    uid = chkRefCmv( tt.mipTable, lab, tt.uid, 'cmv.01009' )
803                    if uid in self.cmvs:
804                       print 'ERROR.090.09010: duplicate cmv uid %s : %s' % (uid, str(tt.__dict__) )
805                    self.cmvs.add( uid )
806                    self.cmv.append( (uid, (tt.dimensions,tt.cell_methods,tt.cell_measures,tt.flag_values,tt.flag_meanings), lab, tt.title, tt.comment, tt.vid, \
807                      tt.deflate_level, tt.shuffle, tt.ok_max_mean_abs, tt.flag_meanings, tt.type, tt.ok_min_mean_abs, \
808                      tt.deflate, tt.valid_min, tt.flag_values, tt.modeling_realm, tt.valid_max, tt.positive, tt.mipTable, \
809                      prov, ssect, fr, tt.rowIndex, '',int(tt.priority), ssect, tt.processing) )
810                    if tt.ok_max_mean_abs != '':
811                       try:
812                         xx = float( tt.ok_max_mean_abs )
813                       except:
814                         print 'FAILED to take float of ok_max_mean_abs -.....'
815                         print tt.__dict__
816                         raise
817                    if tt.out_name == 'intppcalc':
818                       print 'INFO.intppcalc.00003: ',self.cmv[-1]
819                    if tt.out_name == 'msftmyz':
820                       print 'INFO.msftmyz.00003: ',self.cmv[-1]
821                    if tt.processing != '':
822                       print 'INFO.processing.0001: ',lab,tt.title,tt.processing
823
824                    self.realmByVar[ lab ].append( tt.modeling_realm )
825                    vgid = tt.gpid
826                    self.rqv.append( (str( uuid.uuid1() ),lab, uid, vgid, tt.priority,'CMIP5',tt.mipTable) )
827                    if sectid not in (None, '_na_'):
828                      self.rqv.append( (str( uuid.uuid1() ),lab, uid, sectid, tt.priority,'CMIP5',tt.mipTable) )
829                    if lab == 'somint':
830                      print 'INFO.somint.0002:', self.rqv[-1]
831                    if lab == 'sisnconc':
832                      print 'INFO.sisnconc.0002:', self.rqv[-1]
833                    thisd = {}
834                    for k9 in range(len(self.rqvinfo)):
835                      thisd[self.rqvinfo[k9]] = self.rqv[-1][k9]
836                    self.rqvList.append( (thisd, 'prep:thisd' ) )
837
838            self.dsort( dset )
839            print self.dsortdd[ksect][0].keys()
840
841      elif ksect == 'groupitem':
842            kk = ['group', 'var', 'table', 'freq', 'descriptionEx', 'shape', 'levels', 'tstyle', 'mask', 'priority', 'mip', 'uid', 'oldv', 'rowIndex', 'cmorv', 'new', 'gpid', 'vkey', 'vid']
843            thisnt = collections.namedtuple( 'groupitem', kk )
844            il = kk.index( 'levels' )
845            iu = kk.index( 'uid' )
846            idx = kk.index( 'descriptionEx' )
847            ixvid = kk.index( 'vid' )
848            ixvar = kk.index( 'var' )
849            ixcmv = kk.index( 'cmorv' )
850            ixp = kk.index( 'priority' )
851            dset = set()
852            dsgpi = set()
853            gi = []
854            s1 = set()
855            sm = set()
856##
857            nov = 0
858            setu = set()
859            for k in thissh.keys():
860              if k[0] != '_':
861                rr = thissh[k][:]
862                if trace.GROUPITEM_ta and rr[ixvar] == 'ta':
863                  print 'INFO.045.00004: groupitem: ',rr
864
865                if rr[ixvar] == 'snc':
866                  print 'INFO.snc.0010:',rr
867##
868## convert floats back to integer
869##
870                if type(rr[ixp]) == type(1.):
871                  rr[ixp] = int(rr[ixp])
872##
873                if rr[ixcmv] == '':
874                    rr[ixcmv] = rr[1]
875                tt = thisnt._make( rr )
876                 
877                if tt.var == 'hus':
878                  print 'INFO.hus.0001: ',tt.__dict__
879                if str(tt.mip) != 'OMIP':
880                  gi.append( tt )
881                  sm.add( tt.mask )
882
883            smdd = {}
884            dsn = {'floating ice shelf':u'floating ice sheet', u'ocean':u'sea', 'yes':'seaIce' }
885            d1 = {u'where land over land':(False,'area: mean where land over land'), \
886                  u'land':(False,'area: mean where land'), \
887                  u'grounded ice sheet':(True,'area: mean where grounded_ice_sheet'), \
888                  u'ice sheet':(True,'area: mean where ice_sheet'), \
889                  u'floating ice sheet':(True,'area: mean where floating_ice_shelf'), \
890                  u'floating land ice':(True,'area: mean where floating_ice_shelf'), \
891                  u'where snow on sea ice':(True,'area: mean where snow over sea_ice'), \
892                  u'where melt ponds':(True,'area: mean where melt_pond over sea_ice'), \
893                  u'where ridge':(True,'area: mean where sea_ice_ridge over sea_ice'), \
894                  u'where sea ice':(True,'area: mean where sea_ice'), \
895                  u'floating ice shelf':(True,'area: mean where floating_ice_sheet'), \
896                  u'seaIce':(True,'area: mean where sea_ice over sea'), \
897                  u'where sea ice over sea':(True,'area: mean where sea_ice over sea'), \
898                  u'sea':(False,'area: mean where sea') }
899
900            for s in sm:
901              if s in  ['', 'no', u'none',u'Southern hemisphere', u'Northern hemisphere']:
902                smdd[s] = (False,'')
903              else:
904                s1 = string.strip(s)
905                try:
906                  smdd[s] = d1[ dsn.get( s1,s1 ) ]
907                except:
908                  print s, dsn.get( s1,s )
909                  raise
910
911            eeu = dict()
912
913            ccchk = ivg.checkCmv(gi)
914            nrep = 0
915
916            for tt in gi:
917                tabsect = ''
918                gr = 'a'
919                if tt.mip == 'OMIP' \
920                    or any( [string.find(tt.table,i) != -1 for i in ['Omon','Oyr','Oclim','OImon','Ocean'] ] ) \
921                    or any( [string.find(tt.group,i) != -1 for i in ['Omon','Oyr','Oclim','OImon','Ocean'] ] ) \
922                    or tt.cmorv in oceanVars:
923                  gr = 'o'
924                elif tt.cmorv in siSurfFluxes:
925                  gr = "M"
926                  print 'INFO.simip.00010: ', tt.cmorv
927                if self.varsxx != None:
928                  if tt.cmorv in self.varsxx:
929                    sss = set()
930                    for k in self.varsxx[tt.cmorv]:
931                      sss.add(self.skey['var'][k][-1] )
932                    sss = list(sss)
933                    if len(sss) == 1:
934                      if sss[0] == 'ocean':
935                        gr = 'o'
936                      elif sss[0] == 'atmos':
937                        gr = 'a'
938                    print 'INFO:lllw:', tt.cmorv, sss, gr
939                if tt.cmorv in ['talknat', 'sltbasin','clisccp','fCLandToOcean']:
940                   print 'INFO.llll: ',tt,gr
941##
942## adding label for mip here messes up referencing later ...
943##
944                if tt.mip in [ 'SIMIP','LUMIP']:
945                  grprov = tt.mip
946                else:
947                  grprov = ""
948
949                if tt.cmorv[-3:] in ['500','700','200','300','850','000']:
950                  print 'INFO.022.0002: Setting p... coordinate for ',tt
951                  if tt.cmorv[-5:] in [ 't2000']:
952                    thisc = 'depth2000m'
953                  elif tt.cmorv[-4:] in [ 't300', 't700']:
954                    thisc = 'depth%sm' % tt.cmorv[-3:]
955                  elif tt.cmorv[-3:] == '000':
956                    assert tt.cmorv[-4:] == '1000',str(tt)
957                    thisc = 'p%s' % tt.cmorv[-4:]
958                  else:
959                    thisc = 'p%s' % tt.cmorv[-3:]
960                  thissh  = '%s|%s' % (tt.shape, thisc)
961                else:
962                  thissh = tt.shape
963               
964                if thissh.find( ':' ) != -1:
965                   thissh, realmsuggest = thissh.split( ':' )
966                elif tt.cmorv in varRealmMapsInv:
967                   realmsuggest = varRealmMapsInv[tt.cmorv]
968                else:
969                   realmsuggest = None
970
971### need to check where variables are, perhaps, refering to "ovar"
972            ##kk = ['group', 'var', 'table', 'freq', 'descriptionEx', 'shape', 'levels', 'tstyle', 'mask', 'misc', 'mip', 'uid', 'rowIndex', 'new', 'gpid', 'vkey', 'vid']
973                prov = '%s [%s]' % (tt.mip,tt.group)
974                provNote = ''
975                lab = tt.cmorv
976                if lab in {'*','include Oyr 3D tracers'}:
977                  lab = '-copy-'
978                elif lab == 'wap (omega)':
979                  lab = 'wap'
980                  provNote = 'wap (omega)'
981                lab = string.replace( string.strip(lab), '_', '-' )
982                fr = freqmap.get( tt.freq, tt.freq )
983                assert tt.group not in ['icesheetmon', 'icesheetyear','icesheetfx'], 'Unexpected tt.group: %s' % str(tt)
984                if tt.group in ['LImonant','LImongre','LIyrant','LIyrgre','LIfxant','LIfxgre']:
985                  gr = 'g'
986                  ntab = tt.group
987                elif tt.group in ['icesheetmonant','icesheetmongre','icesheetfxant','icesheetfxgre']:
988                  gr = 'g'
989                  ntab = 'LI' + tt.group[8:]
990                elif tt.group in ['icesheetyearant','icesheetyeargre']:
991                  gr = 'g'
992                  ntab = 'LIyr' + tt.group[-3:]
993                else:
994                  ntab = 'em%s' % string.capwords( fr )
995                if fr == '6hr' and tt.levels in ['7h',4.0, '4']:
996                  ntab = '6hrPlev'
997                  print 'INFO.033.00001: adding to 6hrPlev ....',lab, tt.__dict__
998##                elif tt.gpid in self.rq.rqvg and self.rq.rqvg[tt.gpid][2] == 'ISMIP6-LImon-01':
999                elif tt.gpid in self.importWbMods.vg.vg and self.importWbMods.vg.vg[tt.gpid][1] == 'ISMIP6-LImon-01':
1000    ##kk= ['uid', 'label', 'title', 'mip', 'ref', 'refNote']
1001
1002                  ntab = 'LImon'
1003                  tabsect = 'new'
1004                  ##if tt.mask == 'ice sheet' and lab[-2:] != 'Li':
1005                    ##self.deferredLabMap[tt.uid] = (lab,lab + 'Li')
1006                  print 'INFO.limon.0001: Adding %s to LImon/new' % lab
1007                if thissh == 'YZT' and ntab[-1] != 'Z':
1008                  ntab += 'Z'
1009
1010                dset.add( (thissh, tt.levels,tt.tstyle,gr) )
1011                if 'area: mean where ice_sheet' == smdd[tt.mask][1] and gr == 'o':
1012                   print 'SEVERE.structure.30001: ',tt.__dict__,gr
1013                dsgpi.add( (thissh,tt.levels,tt.tstyle,gr,smdd[tt.mask], 'None', 'None', grprov) )
1014#
1015# picking out re-purposed CMIP5 variables
1016#
1017                if ovuu.has_key(tt.vid) and len( ovuu[tt.vid] ) == 1:
1018                  print 'INFO.ovuu.00001: lookup started %s, %s' % (tt.cmorv,tt.group)
1019                  if len( ovuu[tt.vid] ) > 1:
1020                    print 'WARN.ovuu.00002: multiple realms: %s, %s: %s' % (tt.cmorv,tt.group, str( ovuu[tt.vid] ) )
1021                  tt1 = ovll[tt.vid][0]
1022                  thisrealm =  tt1.modeling_realm
1023                  ttl = ovll[tt.vid][0].title
1024                  p1 = ovll[tt.vid][0].priority
1025                  #tt1 = ovuu[tt.vid]
1026                  if thisrealm == 'seaIce':
1027                    ntab = 'OImon'
1028                  if tt.priority in [1,2,3]:
1029                    p = tt.priority
1030                  else:
1031                    p = int(p1)
1032
1033                  if gr == 'o' and thisrealm == 'atmos':
1034                    thisrealm = 'ocean'
1035
1036                  if string.find( tt.descriptionEx, '//' ) != -1:
1037                        ttl += ' ' + string.split( tt.descriptionEx, '/' )[0]
1038
1039                  uid = chkRefCmv( ntab, lab, tt.uid, 'cmv.01001' )
1040                  if uid != tt.uid:
1041                    self.cmvMap002[tt.uid] = uid
1042
1043                  thiscmv = (uid, (thissh,tt.levels,tt.tstyle,gr,smdd[tt.mask],tt1.flag_values,tt1.flag_meanings), lab, ttl, tt.descriptionEx, tt1.vid, \
1044                    tt1.deflate_level, tt1.shuffle, tt1.ok_max_mean_abs, tt1.flag_meanings, tt1.type, tt1.ok_min_mean_abs, \
1045                    tt1.deflate, tt1.valid_min, tt1.flag_values, thisrealm, tt1.valid_max, tt1.positive, ntab, \
1046                    prov, provNote, tt.freq, tt.rowIndex, '', int(p),tabsect, '') 
1047
1048                  if type(tt1.valid_max) == type(1.) and tt1.valid_max <= tt1.valid_min:
1049                    print 'ERROR.valmx.00001: valid_max below/equal valid_min: ',tt1
1050                  self.realmByVar[ lab ].append( thisrealm )
1051                  thisrqv = [str( uuid.uuid1() ),lab, uid, tt.gpid, p, tt.mip, tt.group]
1052                  if lab in [ 'sisnconc','mrro','snc']:
1053                    print 'INFO.%s.0001a:' % lab, thisrqv
1054                  nov += 1
1055                else:
1056                  print 'INFO.ovuu.00003: lookup started %s, %s' % (tt.cmorv,tt.group)
1057                  thisrealm = ''
1058                  if realmsuggest != None:
1059                    thisrealm = realmsuggest
1060                  elif realmdefix.has_key( prov ):
1061                    thisrealm = realmdefix[prov]
1062                  else:
1063                    print 'WARN:070.00001: realm not found for %s,%s' % (lab,prov)
1064                  if gr == 'o' and thisrealm == 'atmos':
1065                    thisrealm = 'ocean'
1066
1067                  if thisrealm == 'seaIce':
1068                    if fr == 'mon':
1069                      ntab = 'OImon'
1070                    elif fr == 'day':
1071                      ntab = 'SIday'
1072                    else:
1073                      raise
1074
1075                  if tt.priority in [1,2,3]:
1076                    p = tt.priority
1077                    ptr = 1
1078                  elif  self.defaultP.get( tt.vid, 102) in [1,2,3]:
1079                    p = self.defaultP.get( tt.vid, 102)
1080                    ptr = 2
1081                  else:
1082                    p = 1
1083                    print 'WARN:070.00002: priority defaulting to 1 for %s,%s' % (lab,prov)
1084                    ptr = 3
1085
1086                  if lab != '-copy-' and string.find( lab, '-' ) != -1:
1087                      print 'ERROR.207.00020: bad character in label: %s' % lab
1088                      lab = string.replace( lab, '-', '' )
1089                  ttl = '__from %s' % tt.table
1090                  if lab != '-copy-':
1091                    if tt.vid in self.importWbMods.vars.d1:
1092                      ttl = self.importWbMods.vars.d1[tt.vid][1]
1093                      if string.find( tt.descriptionEx, '//' ) != -1:
1094                        ttl += ' ' + string.split( tt.descriptionEx, '/' )[0]
1095
1096                  if ntab in refCmv.refUid[ntab] and lab in refCmv.refUid[ntab]:
1097                     uid = refCmv.refUid[ntab][lab]
1098                  else:
1099                     kk = str( '%s.%s' % (ntab,lab) )
1100                     if kk in extRefCmv:
1101                       uid = extRefCmv[kk]
1102                       print 'INFO.cmv.01003: uid  found in extRedCmv: %s, %s (%s)' % (ntab,lab,uid)
1103                     else:
1104                       if tt.uid in extRefCmvInv:
1105                         print 'SEVERE.cmv.09909: uid issue %s [%s] %s' % (kk,tt.uid,extRefCmvInv[tt.uid])
1106                       if extRefCmvMode != 'r':
1107                         extRefCmv[kk] = tt.uid
1108                       print 'ERROR.cmv.01003: uid not found: %s, %s (%s)' % (ntab,lab,tt.uid)
1109                       uid = tt.uid
1110
1111                  if tt.levels in ['7h',]:
1112                    if lab.find( tt.levels) == -1:
1113                      print 'WARN.cmv.00880: extending label %s --> %s (%s)' % (lab,lab+tt.levels, str( tt.__dict__))
1114                      lab += tt.levels
1115                  uid = chkRefCmv( ntab, lab, tt.uid, 'cmv.01011' )
1116                  if uid in eeu:
1117                     print 'WARN.cmv.90001: duplicate cmv uid: ',uid,tt.__dict__,eeu[uid]
1118                  thiscmv = (uid, (thissh,tt.levels,tt.tstyle,gr,smdd[tt.mask], 'None', 'None'), lab, ttl, tt.descriptionEx, tt.vid, \
1119                    0, 0, None, 0, '', None, \
1120                    0,None,0, thisrealm, None, '', ntab, \
1121                    prov, provNote, tt.freq, tt.rowIndex, '', str(p), tabsect, '') 
1122                  self.realmByVar[ lab ].append( thisrealm )
1123
1124                  thisrqv = [str( uuid.uuid1() ),lab, uid, tt.gpid, p, tt.mip, tt.group] 
1125                  if lab in ['mrro', 'sisnconc','snc']:
1126                    print 'INFO.%s.0001b:' % lab, thisrqv, ptr, thiscmv
1127                if trace.GROUPITEM_ta and lab  == 'ta':
1128                    print 'INFO.045.00005: groupitem: ',thisrqv
1129
1130                if ccchk.uidReplace.has_key(thiscmv[0]):
1131                  nrep += 1
1132                  print 'ERROR.cmv.09005: duplicate cmv uuid: %s: %s' % (uid, str(tt.__dict__) )
1133                  thisrqv[2] = ccchk.uidReplace[thiscmv[0]]
1134                else:
1135                  if uid in setu1:
1136                     print 'ERROR.cmv.09001: duplicate cmv uuid: %s: %s ' % (uid,str(tt.__dict__))
1137                  elif uid not in eeu:
1138                    eeu[uid] = tt.__dict__
1139                    assert len(thiscmv) == len( self.cmvinfo ), 'BAD CMV specification length: %s' % str(cmv)
1140                    self.cmv.append( thiscmv )
1141                    print 'INFO.cmv.x0001: append cmv: ',tt.__dict__
1142                self.rqv.append( thisrqv )
1143                if thisrqv[1] == 'somint':
1144                  print 'INFO.somint.0003',thisrqv
1145## Variables marked with shape '?' from PMIP are actually defined by OMIP ....
1146                if tt.shape == '?':
1147                  print 'ERROR.801.00001: shape not set: %s, %s, %s' % ( tt.shape,tt.mip,tt.var)
1148
1149            ##['', 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']
1150            self.dsort( dset,mode=ksect )
1151            print 'INFO.088.00001: nrep=%s' % nrep
1152            print 'INFO.088.00002: nov=%s [%s]' % (nov,len(gi))
1153
1154    nrep = []
1155    for c in self.cmv:
1156      u,v,f,t,p,pn = (c[0],c[2],c[21],c[18],c[19],c[20])
1157      self.cmvUidByFL[f].a[v].append( u ) 
1158      self.cmvUidByTab[t].a[v].append( u ) 
1159      if v[0] != '-':
1160        if (t,v,p) in self.cmvUidByTVP:
1161          nrep.append( (t,v,p)  )
1162      self.cmvUidByTVP[ (t,v,p) ].append( u )
1163      self.cmvByLab[v][ u ]  = (f,t)
1164    if len( nrep) > 0:
1165       print 'WARN.108.00088: unresolved .... %s' % len(nrep)
1166       for n in nrep:
1167         print n
1168
1169#######################################################################################
1170#################
1171    std = set()
1172    ssd = set()
1173    esd = {}
1174
1175    for ksect in [ 'ovar','groupitem']:
1176#### create structure list for spatial and temporal dimensions
1177      for t in self.dsortdd[ksect][0].keys():
1178        tdim, tt = self.dsort_u1( self.dsortdd[ksect][0][t], self.dsortdd[ksect][1] )
1179
1180        std.add( tdim )
1181        ssd.add( tt )
1182
1183    etd = self.spsh.etd
1184    for s in std:
1185      assert s in etd, 'Temporal dimension record not found for %s (see importWbMods.loadSpatial)' % s
1186
1187    kk = 0
1188    self.spidInfo = {}
1189    for s in ssd:
1190       d,lfl,nl = s
1191       if d == 'longitude|latitude|plev7':
1192         print 'INFO.plev7.0002: resetting plev7 to plev7c'
1193         d = 'longitude|latitude|plev7c'
1194       if d == 'longitude|latitude|':
1195         print 'INFO.plev7.0003: removing trailing |'
1196         d = 'longitude|latitude'
1197       if d not in WbMods.ls.ss:
1198         print 'SEVERE.spatial.0001: dimensions not found in WbMods.ls: %s' % d
1199         assert False, 'Spatial shapes must be specified in spatialShape_ref.xls: %s' % d
1200         u = str( uuid.uuid1() )
1201         lab = 'ssd-%3.3i' % kk
1202         description = 'ssd.%3.3i' % kk
1203       else:
1204         u = WbMods.ls.ss[d][4]
1205         lab = WbMods.ls.ss[d][0]
1206         description = WbMods.ls.ss[d][1]
1207         print 'INFO.spatial.0002: setting spatial shape uid: ',u,lab,description
1208
1209       kk+=1
1210       esd[s] = (u,lab,description,d,lfl,nl)
1211       self.spidInfo[u] = (u,lab,description,d,lfl,nl)
1212
1213## clumsy here .. uid copied from spatialShape_ref.xls
1214    esd['Y-na'] = ('6dc25718-a24a-11e5-a29d-5404a60d96b5','extra','extra','latitude','false',1)
1215    self.dimsTime = etd
1216    self.dimsTimeInfo = ['uid','label','title','dimensions']
1217    self.dimsSpace = esd
1218    self.dimsSpaceInfo = ['uid','label','title','dimensions','levelFlag','levels', 'dimids']
1219       
1220    sshp = set()
1221    eshp = set()
1222    self.lls = ivg.structureList()
1223    nt_dims = collections.namedtuple( 'dims', ['uid','label','spid','tmid','odims','coords','cell_methods','cell_measures','flag_values','flag_meanings','description','procNote','prov'] )
1224    kk = 0
1225    strdd = {}
1226    ee3 = {}
1227    for dims,cmet,cmea,flgv, flgm in ds2:
1228        tdim, tt = self.dsort_u1( self.dsortdd['ovar'][0][dims], self.dsortdd['ovar'][1] )
1229        d1,odim,d2,crd = self.dsortdd['ovar'][0][dims]
1230        sdim,lfl,nl = tt
1231        u = str( uuid.uuid1() )
1232        spid = esd[tt][0]
1233        splab = esd[tt][1]
1234        tmid = etd[tdim][0]
1235        tlab = etd[tdim][1]
1236        kk += 1
1237        label = 'str-a%3.3i' % kk
1238        proc = ''
1239        prov = 'CMIP5/OMIP'
1240        desc = ''
1241        ##print 'INFO.zzz01: ',dims, crd
1242        t0 = (dims,cmet,cmea,flgv,flgm)
1243        if cmet in ['None',None]:
1244          if tlab == 'time-mean':
1245            cmet = 'time: mean'
1246          elif tlab == 'time-point':
1247            cmet = 'time: point'
1248          else:
1249            cmet = ''
1250        if cmea in ['None',None]:
1251            cmea = ''
1252         
1253        if flgv in ['None',None,u'None']:
1254          flgv = ''
1255        if flgm in ['None',None,u'None']:
1256          flgm = ''
1257        t1 = (dims,cmet,cmea,flgv,flgm)
1258        ##errc,u,label = self.lls.add( [u,label,spid,tlab, odim, crd, cmet, cmea, flgv, flgm, desc, proc, prov] )
1259        errc,u,label = self.lls.add2( [u,label,splab,tlab, odim, crd, cmet, cmea, flgv, flgm, desc, proc, prov] )
1260        print 'INFO.structure.00011:',t0,t1,u,label,spid,splab
1261        self.structInfo[u] = (label,cmet,spid,tmid)
1262        strdd[t0] = u
1263        strdd[t1] = u
1264
1265         
1266    ttt = [ {u'Instantaneous (end of year)', 'instantaneous', 'point', 'Synoptic', u'synoptic', u'time: point'},
1267        {'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(), {''}, 'Daily max', 'Daily min']
1268    cmetl = ['time: point', 'time: mean', 'time: mean within years time: mean over years ', '', 'time: maximum', 'time: minimum']
1269    ##cmetlsi = ['time: point', ('time: mean area: mean where sea_ice over sea','time: mean where sea_ice area: mean where sea_ice'), 'time: mean within years time: mean over years ', '']
1270    ee1 = {}
1271    for shp,lvls,sty,gr,tmsk, flgv, flgm, prov in dsgpi:
1272        t = (shp,lvls,sty,gr)
1273        ttx = (shp,lvls,sty,gr,tmsk, flgv, flgm, prov)
1274        if "t2000" in shp:
1275           print 'CCCC',shp,lvls,sty,gr,tmsk, flgv, flgm, prov
1276        tdim, tt = self.dsort_u1( self.dsortdd['groupitem'][0][t], self.dsortdd['groupitem'][1] )
1277        d1,odim,d2,crd = self.dsortdd['groupitem'][0][t]
1278        tflm, msk = tmsk
1279        sdim,lfl,nl = tt
1280        u = str( uuid.uuid1() )
1281        spid = esd[tt][0]
1282        splab = WbMods.ls.labByUid[ spid ]
1283        tmid = etd[tdim][0]
1284        tlab = etd[tdim][1]
1285        print 'INFO.spatial.6666: %s, %s, %s' % (splab,spid,str(tt))
1286
1287        if "XY" in splab:
1288          if gr == "M":
1289            cmea = "--MODEL"
1290          else:
1291            cmea = 'area: areacell%s' % gr
1292        else:
1293          cmea = ''
1294
1295        cmet = ''
1296        for i in range(4):
1297          if sty in ttt[i]:
1298            if i == 1 and prov == 'SIMIP':
1299              if sty == u'weighted time mean':
1300                 cmet = 'area: time: mean where sea_ice'
1301              elif sty == u'partial mean over sea':
1302                 cmet = 'area: mean where sea_ice over sea time: mean'
1303              else:
1304                 cmet = 'area: time: mean'
1305            elif prov == 'LUMIP' and shp == 'XYLT':
1306               print 'INFO.lumip.00505: ',shp,lvls,sty,gr,tmsk, flgv, flgm, prov
1307               if sty == 'Time mean':
1308                  cmet = 'area: time: mean where landuse'
1309               elif sty == 'Cumulative annual fraction':
1310                  cmet = 'area: mean time: sum'
1311               elif sty == 'Instantaneous (end of year)':
1312                  cmet = 'area: mean where landUse time: point'
1313            else:
1314              cmet = cmetl[i]
1315        if cmet == '':
1316          cmet = msk
1317        elif msk != '':
1318          cmet = msk + ' ' + cmet
1319        kk += 1
1320        label = 'str-b%3.3i' % kk
1321        proc = ''
1322        if prov == '':
1323          prov = 'CMIP5, endorsed MIPs'
1324        desc = ''
1325        dims = tt[0]
1326        if tdim != '':
1327          dims += '|' + tdim
1328        if odim == 'spectband':
1329          print 'INFO.spectband.00002: ',tt, tdim, cmet, cmea, label, u
1330
1331        if strdd.has_key( (dims,cmet,cmea,'','') ) and crd == '' and odim == '':
1332          u = strdd[ (dims,cmet,cmea,'','') ]
1333          ##print 'INFO.zzzy03: ',tt, tdim, cmet, cmea, label, u
1334        elif ee1.has_key( (tmid, spid, odim, cmet, cmea, crd) ):
1335          u = ee1[(tmid, spid, odim, cmet, cmea, crd)]
1336          ##print 'INFO.zzzy04: ', tt, tdim, cmet, label, u
1337        else:
1338          errc,u,label = self.lls.add2( [u,label,splab,tlab, odim, crd, cmet, cmea, '', '', desc, proc, prov]  )
1339          print 'INFO.zzzy02: ',tt, tdim, cmet, label, u, ttx
1340           
1341          ee1[(tmid, spid, odim, cmet, cmea, crd)] = u
1342
1343        if sty == u'Synoptic':
1344          print 'yyyy: ',(shp,lvls,sty,gr,tmsk,flgv,flgm)
1345        strdd[(shp,lvls,sty,gr,tmsk,flgv,flgm)] = u
1346        if flgv == 'None' and flgm == 'None':
1347          strdd[(shp,lvls,sty,gr,tmsk,'','')] = u
1348        self.structInfo[u] = (label,cmet,spid,tmid)
1349
1350    ##nt_dims = collections.namedtuple( 'dims', ['uid','label','spid','tmid','odims','coords','cell_methods','cell_measures','flag_values','flag_meanings','description','procNote','prov'] )
1351    ##self.lls.close()
1352    self.strdd = strdd
1353     
1354  def cmvAudit(self,nn):
1355    nrep = []
1356    self.cmvByUid = {}
1357    for c in self.cmv:
1358      u,v,f,t,p,pn = (c[0],c[2],c[21],c[18],c[19],c[20])
1359      self.cmvUidByFL[f].a[v].append( u ) 
1360      self.cmvUidByTab[t].a[v].append( u ) 
1361      if v[0] != '-':
1362        if (t,v,p) in self.cmvUidByTVP:
1363          nrep.append( (t,v,p)  )
1364      self.cmvUidByTVP[ (t,v,p) ].append( u )
1365      self.cmvByLab[v][ u ]  = (f,t)
1366      self.cmvByUid[u] = c
1367    if len( nrep) > 0:
1368       print 'WARN.108.00088: unresolved .... %s' % len(nrep)
1369       for n in nrep:
1370         print n
1371    topop = []
1372    cc1 = collections.defaultdict( int )
1373    cc2 = collections.defaultdict( int )
1374    for k in  self.fix.fixcmv:
1375       vid = str( self.fix.fixcmv[k][4] )
1376       fn = str( self.fix.fixcmv[k][6] )
1377       cc1[fn] += 1
1378       if vid not in self.cmvByUid:
1379          print 'WARN.fixcmv.0001: invalid vid %s [%s]' % ( vid, str( self.fix.fixcmv[k] ) )
1380          topop.append( k )
1381          cc2[fn] += 1
1382    if len(topop) > 0:
1383      print 'WARN.fixcmv.0009: %s invalid vid value popped from fixcmv [%s]' % ( len( topop ), len( self.fix.fixcmv ) )
1384    for k in topop:
1385          self.fix.fixcmv.pop( k )
1386    for f in sorted( cc2.keys() ):
1387      print 'WARN.fixcmv.0010: %s invalid vid value popped from fixcmv:%s [%s]' % (cc2[f],f,cc1[f])
1388
1389  def dsort_u1(self,eed,sde):
1390        tdim = eed[2]
1391        sdim = eed[0]
1392        nl = sde[sdim]
1393        lfl = 'true'
1394        if nl == -1:
1395          lfl = 'false'
1396          nl = 0
1397        elif nl == -2:
1398          nl = 1
1399          pass
1400        return (tdim, (sdim,lfl,nl) )
1401
1402
1403  def dsort( self, dset, mode='ovar' ):
1404      """Sort the dimensions string into spatial, temporal and other sections,
1405       returns a dictionary of tuples: spatial dimensions, other, temporal, coords and a 2nd, keyyed on spatial dimensions with a level count indicator.  """
1406      vdims = {'plev7':7, 'plev':4, 'plevs':19, 'plev3':3,'plev8':8,'alt40':40,'alev1':1, 'alevhalf':-1,'olevel':-1,'rho':-1,'sdepth':-1,'alevel':-1}
1407      odims = {'sza5','vegtype','scatratio','dbze','typepdec','vgidx','tau','effectRad'}
1408      dl = sorted( list(dset) )
1409      if mode == 'ovar':
1410        eed = {}
1411        sss = [set(),set(),set(),set()]
1412        for s in dl:
1413          if s[:4] == 'time':
1414            bits = ['',s[4:]]
1415          else:
1416            bits = string.split(s, '|time', maxsplit=1 )
1417          if len(bits) == 1:
1418            ts = ''
1419          else:
1420            ts = 'time'
1421
1422          b0 = bits[0]
1423          b1 = ''
1424          bb = string.split(bits[0],'|')
1425          if bb[-1] in odims:
1426            if bb[-1] == 'tauxxx':
1427                b0 = bits[0][:-4]
1428                ts = 'tau|time'
1429            else:
1430              b0 = string.join( bb[:-1], '|' )
1431              b1 = bb[-1]
1432           
1433          if len(bits) == 1:
1434              tup = (b0,b1,'','')
1435          elif len(bits) == 2:
1436              b2 = string.split( bits[1], '|', maxsplit=1 )
1437              if len(b2) == 2:
1438                  tup = (b0,b1, ts + b2[0], b2[1])
1439              else:
1440                  tup = (b0,b1, ts + bits[1], '')
1441          eed[s] = tup
1442          for k in range(4):
1443            sss[k].add(tup[k])
1444
1445        lcount = {}
1446        for s in sss[0]:
1447          bits = string.split( s, '|' )
1448          nl = -2
1449          thisb = None
1450          for b in bits:
1451            if vdims.has_key(b):
1452              assert nl == -2, 'Duplicate vertical level count in %s' % s
1453              nl = vdims[b]
1454              thisb = b
1455          lcount[s] = nl
1456          if nl == -1 and s == 'latitude|basin':
1457            print 'SEVERE: error in level deduction'
1458            print s, bits, nl, thisb
1459            raise
1460      else:
1461        ## input is a set of tuples,  shape, levels, tstyle, o/a
1462        ## aim is to extract spatial, other, temporal dimensions + coords.
1463        sss = [set(),set(),set()]
1464        ttt = [ ('time1', u'Instantaneous (end of year)', 'instantaneous', 'point', 'Synoptic', u'synoptic', u'time: point'),
1465        ('Daily max', 'Daily min', 'time', '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','partial mean over sea'),
1466        (),
1467        ('diurnal','time3'), ('',)]
1468        ttdd = {}
1469        kkk = ['time1','time','time2','time3','']
1470        for i in range(5):
1471          for k in ttt[i]:
1472            ttdd[k] = kkk[i]
1473
1474        ##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',] }
1475        dds = {'2D':'XYT', 'XY':'XYT', '':'?', '2D ':'XYT', 'XYZ':'XYZT', } 
1476## 'K'?? 'XYK'
1477##
1478##
1479##   spatial dimensions, other, time, coordinates, wild card in spatial dimensions.
1480##
1481        dd = {'XKT':('latitude|basin','','time','',False), \
1482             'XYZKT':('longitude|latitude|%s','tau','time','',True), \
1483             'XYZKmT':('longitude|latitude|%s','misrBands','time','',True), \
1484             'XYZKKT':('longitude|latitude|%s','effectRadXX|tau','time','',True), \
1485             'XYZKKlT':('longitude|latitude|%s','effectRadLi|tau','time','',True), \
1486             'XYZKKiT':('longitude|latitude|%s','effectRadIc|tau','time','',True), \
1487             'XYZKdbT':('longitude|latitude|%s','dbze','time','',True), \
1488             'XYZKscT':('longitude|latitude|%s','scatratio','time','',True), \
1489             'XYZT':('longitude|latitude|%s','','time','',True), \
1490             'XYST':('longitude|latitude|sdepth','','time','',False), \
1491             'XYSnT':('longitude|latitude|snowdepth','','time','',False), \
1492             'XYS1T':('longitude|latitude','sdepth1','time','',False), \
1493             'XYH1T':('longitude|latitude','height100','time','',False), \
1494             'XYZT*':('longitude|latitude|%s','','time','',True), \
1495              'KZT':('alevel','spectband','time','',False), \
1496              'Ksp':('','spectband','','',False), \
1497              'XYKspT':('longitude|latitude','spectband','time','',False), \
1498              'XYZKspT':('longitude|latitude|%s','spectband','time','',True), \
1499              'XYT':('longitude|latitude','','time','',False), \
1500              '2DV':('longitude|latitude','','time','',False), \
1501              'XYKT':('longitude|latitude','sza5','time','',False), \
1502              'XYLT':('longitude|latitude','landUse','time','',False), \
1503              'XYant':('xant|yant','','time','',False), \
1504              'XYgre':('xgre|ygre','','time','',False), \
1505              'XYKszT':('longitude|latitude','sza5','time','',False), \
1506              'YZT':('latitude|%s','','time','',True), \
1507## snowband was an error ... all the variables should have been on ice bands ... easier to correct here.
1508              'XYKsn':('longitude|latitude','iceband','time','',False), \
1509              'XYKic':('longitude|latitude','iceband','time','',False), \
1510              'K4':('siline','','time','',False), \
1511              'scalar':('','','time','',False), \
1512              '':('','','time','',False), \
1513              'sheet':('icesheet','','time','',False), \
1514              'ZST1':('alevel','site','time','',False), \
1515              'BasinYT':('latitude|basin','','time','',False), \
1516              '?':( '?', '?','?','?',False)
1517             }
1518             
1519        for d in dl:
1520          for k in range(3):
1521            sss[k].add( d[k] )
1522
1523        ls0 = set()
1524        ls1 = set()
1525##
1526## sort shapes
1527##
1528        for s0 in sss[0]:
1529          if string.find( s0, '|' ) != -1:
1530            s,crd0 = string.split( s0, '|' )
1531          else:
1532            s,crd0 = s0,None
1533
1534          if not dd.has_key( dds.get(s,s) ):
1535            print 'ERROR.shape.0001: NO SOLUTION FOUND FOR SHAPE: "%s"' % s
1536          else:
1537            tt = dd[dds.get(s,s)]
1538            print 'INFO.structure.00077: mapping %s to %s' % (s,str(tt))
1539            if tt[-1]:
1540                ls0.add( s0 )
1541##
1542## look at shapes which require additional information about vertical coord
1543##
1544        for d in dl:
1545          if d[0] in ls0:
1546             ls1.add( d[1] )
1547
1548        lset = {'soil levels':'sdepth', 'all model levels above 400hPa':'alevel'} 
1549        lsdd = {}
1550        print 'ls1....',ls1
1551        for l in ls1:
1552          ii = 0
1553          if l in ['all','all*','all model levels']:
1554            ii = -1
1555            this = '%slevel' 
1556          elif lset.has_key(l):
1557            ii = -1
1558            this = lset[l]
1559          elif l == '':
1560            ii = -2
1561            this = l
1562          elif l == '7h':
1563            ii = 7
1564            this = 'plev7h'
1565          elif l == '3h':
1566            ii = 3
1567            this = 'plev3h'
1568          else:
1569            ii = int( float(l) )
1570            if ii in [40,16]:
1571              this = 'alt%s' % ii
1572            elif ii > 1.5:
1573              if ii > 35:
1574                ii = 39
1575##
1576## merge 14 and 17 level specifications to a 19 level coordinate
1577##
1578              if ii in [14,17]:
1579                ii = 19
1580             
1581              this = 'plev%s' % ii
1582              if ii == 7:
1583                this += 'c'
1584
1585            else:
1586              this = ''
1587          lsdd[l] = (ii,this)
1588##['', 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]
1589             
1590        lcount = {}
1591        eed = {}
1592        for d in dl:
1593          s0 = d[0]
1594          if string.find( s0, '|' ) != -1:
1595            s,crd0 = string.split( s0, '|' )
1596          else:
1597            s,crd0 = s0,None
1598          if not dd.has_key( dds.get(s,s) ):
1599            print 'NO SOLUTION FOUND FOR SHAPE: "%s"' % s
1600          else:
1601            tt = dd[dds.get(s,s)]
1602            if tt[-1]:
1603              n,zz = lsdd[d[1]]
1604              if len(zz) > 0 and zz[0] == '%':
1605                zz = zz % d[3]
1606              sc = tt[0] % zz
1607              if sc[-1] == "|":
1608                print 'WARN.080.05000: Bad dimension found %s [%s] %s %s' % (sc,str(tt), str((n,zz)), str(d)  )
1609            else:
1610              sc = tt[0]
1611              if (string.find( sc, 'alevel' ) != -1) or (string.find( sc, 'olevel' ) != -1):
1612                n = -1
1613              else:
1614                n = -2
1615
1616          lcount[sc] = n
1617          if n == -1 and sc == 'latitude|basin':
1618            print 'SEVERE [2]: error in level deduction'
1619            print sc, tt[0], tt[-1], n
1620            raise
1621          if crd0 != None:
1622            tt3 = tt[3] + crd0
1623          else:
1624            tt3 = tt[3]
1625         
1626          if d[2] == '' and tt[2] not in ['','?']:
1627            d2 = tt[2]
1628          else:
1629            d2 = d[2]
1630          print 'INFO:qqq05: ',d, sc, tt, ttdd.get( d2, '**%s**' % d2), tt3
1631          if d2 not in ttdd:
1632            print 'ERROR.time.00800: ',d2,ttdd.keys()
1633          eed[d] = (sc,tt[1],ttdd.get( d2, '**%s**' % d2),tt3)
1634          print 'INFO.ddddd.00002:',d,eed[d]
1635      self.dsortdd[mode] = (eed,lcount)
1636
1637  def run(self,rq):
1638
1639    xx = self.doc.getElementsByTagName( 'main' )
1640    assert len(xx) == 1, 'Expecting one element named "main", found %s' % len(xx)
1641    main = xx[0]
1642    ## main = self.doc.childNodes[0]
1643    xsn = []
1644    ff = {}
1645    for c in main.childNodes:
1646      tag = c.nodeName
1647      if tag != '#text':
1648        xsn.append(tag)
1649        il = []
1650        for i in c.childNodes:
1651          if i.nodeName == 'item':
1652            il.append(i)
1653        xx = dict( il[0].attributes.items() )
1654        ff[string.lower(tag)] = (c,xx)
1655   
1656    print xsn
1657    print ff.keys()
1658    self.ff = ff
1659       
1660## keys here match section element names in schema
1661    ## dec 2015 -- removing 'var' from this list
1662    assert self.schemaMode == 'dreq2', 'Old schema mode not supported here'
1663    sectlist = [ 'experiment','exptgroup','objective','requestlink', 'requestitem','requestvargroup','tablesection','requestvar' ]
1664    sectlist = [ 'experiment','exptgroup','objective','requestlink', 'requestitem','tablesection','requestvar' ]
1665
1666    for k in sectlist:
1667      thissh = self.skey[k]
1668## set labmod False for section in which label coercion is not wanted
1669      labmod = True
1670      lll = []
1671      for i in thissh.keys():
1672        if i[0] != '_':
1673          lll.append(i)
1674      idk = 0
1675      if len(lll) > 0:
1676##
1677## remove example items, xcept where this has been done in previous function
1678##
1679        if k not in ['xxxx']:
1680          dil = ff[k][0].getElementsByTagName('item')
1681          for d in dil:
1682            ff[k][0].removeChild(d)
1683
1684        vare = {}
1685        nfr = set()
1686        for i in lll:
1687          ll = map( uniCleanFunc, thissh[i] )
1688          assert len(ll) == len( thissh[i] ), 'Lost list elements after uniClean'
1689          idk += 1
1690#################################################################
1691######### NEED TO CLEAN THIS IF ITEMS FROM OTHER SECTIONS ARE FILTERED
1692#######################################################################
1693          dothis = True
1694          if k not in ['var','experiment']:
1695            item = self.doc.createElement( 'item' )
1696
1697          if k == 'objective':
1698 ## - mip; tab; expt; rlid; ny
1699            labmod = False
1700            kk = ['mip', 'label', 'title', 'description']
1701            ##thisl = string.replace(string.strip(str( ll[1] ) ), '-', ' ')
1702## camelcase this label.
1703            ##thisl = string.replace( string.capwords( thisl ), ' ', '' )
1704            thisl = mycc( ll[1] )
1705            mip = str( ll[0] )
1706            self.objectives[mip][thisl] = i
1707            for j in range(len(kk)):
1708                thisv = str( ll[j] )
1709                item.setAttribute( kk[j], thisv )
1710            item.setAttribute( 'uid', str(i) )
1711          elif k == 'experiment':
1712            labmod = False
1713            kk = ['uid','egid','label','description','mip','mcfg','tier','nstart','starty','endy','yps','ensz','ntot','comment']
1714            thisl = str( ll[2] )
1715            ## self.mips.add( str( ll[4] ) )
1716            if ll[4] in ['SolarMIP']:
1717              dothis = False
1718            else:
1719              item = self.doc.createElement( 'item' )
1720              for j in range(len(kk)):
1721                if kk[j] in ['tier','ensz']:
1722                  if type(ll[j]) == type( 1 ):
1723                    thisv = str( ll[j] )
1724                  else:
1725                    thisv = string.join( [str(x) for x in ll[j]] )
1726                else:
1727                  thisv = str( uniCleanFunc(ll[j]) )
1728                item.setAttribute( kk[j], thisv )
1729                if kk[j] == 'yps':
1730                  if type(ll[j]) == type([]):
1731                    print 'ERROR.yps.00001: ', ll
1732                    item.setAttribute( 'yps', '25' )
1733##################################################################################################
1734          elif k == 'exptgroup':
1735            labmod = False
1736            kk = ['uid','label','tierMin','ntot']
1737            thisl = str( ll[1] )
1738            for j in range(len(kk)):
1739                thisv = str( ll[j] )
1740                item.setAttribute( kk[j], thisv )
1741
1742##################################################################################################
1743          elif k == 'groupitem':
1744            kk = ['group', 'var', 'table', 'freq', 'descriptionEx', 'shape', 'levels', 'tstyle', 'mask', 'misc', 'mip', 'uid', 'new', 'gpid', 'vkey', 'vid']
1745            assert len(kk) == len(ll), 'length mismatch, %s  %s' % (len(kk),len(ll))
1746# - group;  table; freq; descriptionEx; shape; levels; tstyle; mask; mip; mip2; uuid; new; vid
1747            ix_gpid = kk.index( 'gpid' )
1748            thisl = string.strip(str( ll[1] ) )
1749            for j in range(len(kk)):
1750              if j != 1:
1751                ##item.setAttribute( kk[j], str( ll[j] ) )
1752                if kk[j] == 'misc':
1753                  item.setAttribute( 'priority', str( ll[j] ) )
1754                else:
1755                  item.setAttribute( kk[j], str( ll[j] ) )
1756            item.setAttribute( 'title', thisl )
1757            if string.find(thisl, ' ') != -1:
1758              thisl = string.split(thisl)[0]
1759            thisuuid = ll[11]
1760
1761            gpid = str(ll[ix_gpid])
1762            if not self.importWbMods.vg.vg.has_key(gpid):
1763              print 'ERROR.015.0010: gpid not found %s' % str(ll)
1764              self.e15_10 += 1
1765            if self.repl.has_key( thisuuid ):
1766              for tag,old,new in self.repl[thisuuid]:
1767                thisold = item.getAttribute( tag )
1768                assert thisold == old, 'Attempt to replace value which is not present'
1769                item.setAttribute( tag, new )
1770
1771#################################### from revised CMIP5 tables ### request variables referencing core tables
1772          elif k in ['requestvar']:
1773#### need to fill gaps in variable groups --- or do better job upstream ##########  !!!!!!!!!!!!!!!!
1774## - table; mip; uuid; priority
1775##
1776## variable group ids pulled through via mapping above .. very messy
1777## still missing some OMIP matches .... OMIP revised tables are not explicitly requested anywhere.
1778##
1779            kk = ['var', 'table', 'mip', 'vid', 'priority','vgid']
1780            ##vgmaps = {'Oyr':'OMIP-Oyr','OImon':'SIMIP-seaicemon'}
1781
1782            vgid = str( ll[5] )
1783            doThis = True
1784            if vgid == '__unset__01__':
1785              dothis = False
1786            else:
1787              thisl = string.strip(str( ll[0] ) )
1788              if len( thisl ) > 6 and thisl[-6:] == 'Adjust':
1789                dothis = False
1790
1791            if dothis:
1792              thisuuid = str( uuid.uuid1() )
1793              thisd = {}
1794
1795              if ll[2] not in refMips:
1796                print 'SEVERE.mip.000001: bad mip label in request item: %s --- %s' % (ll[2],str(ll))
1797
1798              for j in range(len(kk)):
1799                if j != 0 and kk[j] != 'table':
1800                  item.setAttribute( kk[j], str( ll[j] ) )
1801                  thisd[kk[j]] = str( ll[j] )
1802              vid = str( ll[3] )
1803 
1804              print 'INFO.isd005.0001: ',thisl, uid, vgid
1805              item.setAttribute( 'title', thisl + ' ((isd.005))' )
1806              item.setAttribute( 'uid', thisuuid )
1807              item.setAttribute( 'vgid', vgid )
1808              item.setAttribute( 'vid', vid )
1809
1810              thisd['title'] = thisl + ' ((isd.005))'
1811              thisd['uid'] = thisuuid
1812              if vid in self.cmvMap002:
1813                print 'INFO.vid.00001: resetting requestvar vid: %s ---> %s' % (vid,self.cmvMap002[vid])
1814                vid = self.cmvMap002[vid]
1815              thisd['vid'] = vid
1816              thisd['vgid'] = vgid
1817
1818##################################
1819          elif k == 'requestlink':
1820 ## - uuid; mip; tab; objective; grid; gridreq; comment
1821            kk = ['uid', 'mip', 'tab', 'objective', 'grid', 'gridreq', 'comment', 'opt', 'opar', 'preset', 'ref', 'refNote', 'refid']
1822           
1823            uid = str( ll[0] )
1824            mip = string.strip(str( ll[1] ) )
1825            obj = string.strip(str( ll[3] ) )
1826            if mip == "GMMIP":
1827              bits = [ mycc(x) for x in string.split( obj, ' ' ) ]
1828            else:
1829              bits = [ mycc(x) for x in string.split( obj, ',' ) ]
1830
1831##
1832## look for objectives specified in experiment column ....
1833##
1834               
1835            for b in bits:
1836              self.objectiveLinks[mip].a[b].append( str( ll[0] ) )
1837            self.requestlinkuid.add( str(ll[0] ) )
1838            self.rqlPreset[str(ll[0])] = ll[9]
1839            ttl = string.strip(str( ll[2] ) )
1840            self.rqLnks[str(ll[0])] = ll[:]
1841            dothis = False
1842       
1843##################################
1844          elif k == 'requestitem':
1845 ## - mip; tab; expt; rlid; ny
1846## defer so that cross-check of "expt" can be done .. or scan this earlier ....
1847              kk = ['mip', 'tab', 'expt', 'rlid', 'ny', 'nexmax', 'nenmax', 'nymax','treset','info']
1848              finishedClones = False
1849              ku = str(ll[2])
1850              if self.exptPntUid[ku][1] == 'list' and len( self.exptPntUid[ku][2] ) > 0:
1851                  cloning = True
1852                  clones = set( self.exptPntUid[ku][2] )
1853                  kcl = 0
1854              else:
1855                  cloning = False
1856
1857              while not finishedClones:
1858                thisl = mycc( '%s %s' % (ll[0],ll[1]) )
1859                if str( ll[3] ) not in self.rqlPreset:
1860                   print 'ERROR.090.02000: requestlink not found .. ',ll
1861                   preset = '-99'
1862                else:
1863                   preset = str( self.rqlPreset[ str( ll[3] ) ] )
1864                if str( ll[3] ) not in self.requestlinkuid:
1865                  print 'SEVERE.005.00005: rlid not found: %s' % str(ll)
1866                for j in range(len(kk)-1):
1867                  if kk[j] == 'ny':
1868                    if ll[j] == '':
1869                      thisv = 0
1870                    else:
1871                      try:
1872                        thisv = str( int(ll[j]) )
1873                      except:
1874                        print 'SEVERE: failed to set "ny": %s' % str(ll)
1875                        thisv = 999
1876                  else:
1877                    thisv = str( ll[j] )
1878                  if not (kk[j] == 'treset' and thisv in ['None','']):
1879                    item.setAttribute( kk[j], thisv )
1880                item.setAttribute( 'title', '%s, %s, %s' % (ll[0],ll[1],ll[2]) )
1881                item.setAttribute( 'uid', str(i) )
1882                item.setAttribute( 'preset', preset )
1883                if cloning:
1884                  ku = clones.pop()
1885                  if kcl != 0:
1886                    item.setAttribute( 'uid', str(uuid.uuid1()) )
1887                  kcl += 1
1888                  ##print 'INFO.clone.00001: ',ku, kcl
1889                if ku in self.experiments:
1890                  esid = self.experiments[ku]
1891                  esidmsg = 'Experiment %s' % ku
1892                elif ku in self.exptPntUid:
1893                  esid = self.exptPntUid[ku][0]
1894                  esidmsg = str(self.exptPntUid[ku])
1895                else:
1896                  print 'ERROR.esid.00001:', ku, ' Not Found'
1897                  esidmsg = 'ERROR: Experiment %s Not Found' % ku
1898                  esid = str(uuid.uuid1())
1899
1900                item.setAttribute( 'esid', esid )
1901                item.setAttribute( 'esidComment', esidmsg )
1902                if type(ll[9]) in [type(''), type(u'')]:
1903                    kkk = ll[9].strip( )
1904                    if kkk[:3] == '_sl':
1905                      item.setAttribute( 'tslice', kkk )
1906                    elif kkk not in ['','all']:
1907                      print 'ERROR.tslice.0007: unrecognised slice: %s' % kkk
1908               
1909                finishedClones = (not cloning) or ( len( clones) == 0 )
1910                if not finishedClones:
1911                  ff[k][0].appendChild( item )
1912                  item = self.doc.createElement( 'item' )
1913##################################
1914          elif k in ['requestvargroup','tablesection']:
1915            if k == 'requestvargroup':
1916              kk = ['uid', 'mip', 'label', 'title', 'ref', 'refNote']
1917            else:
1918              kk = ['uid', 'gpid', 'mip', 'label', 'title', 'ref', 'refNote']
1919            thisl = string.replace( str( ll[2] ), '.', '-' )
1920            omitrvg = {'C4MIP-Omon','C4MIP-Oclim','HighResMIP-OImon','HighResMIP-Oclim'}
1921            if thisl in omitrvg:
1922              dothis = False
1923            else:
1924              thisd = {}
1925              for j in range(len(kk)):
1926                item.setAttribute( kk[j], str( ll[j] ) )
1927                thisd[kk[j]] = str( ll[j] )
1928####
1929          if dothis:
1930            if labmod:
1931              if string.find( thisl, '_' ) != -1:
1932                thisl = string.replace( thisl, '_', '-' )
1933              if string.find( thisl, '*' ) != -1:
1934                thisl = string.replace( thisl, '*', '-' )
1935              if string.find( thisl, '!' ) != -1:
1936                thisl = string.replace( thisl, '!', '-' )
1937              if string.find( thisl, ' ' ) != -1:
1938                thisl = string.replace( thisl, ' ', '-' )
1939              if string.find( thisl, ':' ) != -1:
1940                thisl = string.replace( thisl, ':', '-' )
1941            item.setAttribute( 'label', thisl )
1942            ff[k][0].appendChild( item )
1943            if k in ['requestvargroup','tablesection']:
1944              thisd['label'] = thisl
1945              self.rqvgList.append( thisd )
1946        if len(nfr) > 0:
1947              print 'ERROR:nfr: ',nfr
1948             
1949  def fixfixcmv(self):
1950    """deal with changing cmv ids relative to fixcmv"""
1951    ##self.cmvinfo = ('uid','stid','label','title','description','vid', \
1952                    ##'deflate_level', 'shuffle', 'ok_max_mean_abs', 'flag_meanings', 'type', 'ok_min_mean_abs',  \
1953                    ##'deflate', 'valid_min', 'flag_values', 'modeling_realm', 'valid_max', 'positive', 'mipTable', \
1954                    ##'prov', 'provNote', 'frequency', 'rowIndex', 'coordinates','defaultPriority','mipTableSection')
1955    ff = {}
1956    for v in self.cmv:
1957      kkk = '%s.%s.%s' % (v[2],v[18],v[19])
1958      if kkk in self.fix.fixcmvx:
1959        for k in self.fix.fixcmvx[kkk]:
1960          if k  != v[0]:
1961            print 'WARN.cmv.00040: changed uid:', k, v
1962            ff[k] = v[0]
1963## ['label','uid','table','mode','uid2','prov']
1964
1965    for vid in self.fix.fixcmv.keys():
1966      r = self.fix.fixcmv[vid]
1967      if r[1] in ff or r[4] in ff:
1968        if r[1] in ff:
1969          r[1] = ff[r[1]]
1970        if r[4] in ff:
1971          r[4] = ff[r[4]]
1972        self.fix.fixcmv[r[1]] = r
1973
1974   
1975  def write2(self):
1976    """write sections for cmor variable, request variable, structure, spatial and temporal dimensions"""
1977    spsResets = collections.defaultdict(list)
1978    doneStructures = set()
1979    doneMessages = set()
1980    self.fixfixcmv()
1981    self.spLab2Uid = {}
1982    self.tmLab2Uid = {}
1983    self.tmUid2Lab = {}
1984    self.tmsp2str = {}
1985    self.tables = set()
1986    for ksect in [ u'spatialshape', u'temporalshape', u'structure', u'cmorvar', u'requestvar', u'requestlink']:
1987    ##for ksect in [ u'cmorvar',  u'spatialshape', u'temporalshape', u'structure']:
1988        dil = self.ff[ksect][0].getElementsByTagName('item')
1989        if ksect == 'requestvar':
1990          for item in dil:
1991            vid = item.getAttribute( 'vid' )
1992            if vid in self.fix.fixcmv:
1993               if self.fix.fixcmv[vid][3] == u'replace':
1994                 vid1 = str( self.fix.fixcmv[vid][4] )
1995                 if vid1 not in self.cmvByUid:
1996                   print 'ERROR.fixcmv.0002: attempt to use invalid vid: ',item.getAttribute( 'label' ),vid1,vid in self.cmvByUid
1997                 else:
1998                   item.setAttribute( 'vid', vid1 )
1999                   print 'INFO.fixcmv.00020: replacing link in requestVar  %s: %s' % (item.getAttribute( 'uid' ),vid1)
2000        else:
2001          for d in dil:
2002            self.ff[ksect][0].removeChild(d)
2003
2004        if ksect == u'cmorvar':
2005          ktable = self.cmvinfo.index('mipTable')
2006          kfreq  = self.cmvinfo.index('frequency')
2007          klabel  = self.cmvinfo.index('label')
2008
2009          s1 = dict()
2010          stab = set()
2011          tmidpt = self.tmLab2Uid['time-point']
2012          self._cmvLabByUid = {}
2013          for r in self.cmv:
2014           if r[0] in self.rep['cmv'].items:
2015             print 'INFO.090.09099: detected cmv replace request: ',r
2016           elif r[0] in s1:
2017              print 'ERROR.090.09005: duplicate key at ',r,s1[r[0]]
2018           else:
2019            s1[ r[0] ] = (r[ktable],r[kfreq],r[klabel])
2020            stab.add( r[ktable] )
2021            u0 = r[0]
2022            l0 = r[2]
2023#
2024# identify structures for AerChemMIP tables
2025#
2026            if len( r[1] ) == 2:
2027              spid = self.spLab2Uid[r[1][0]]
2028              if r[1][1] == 'mean':
2029                tmid = self.tmLab2Uid['time-mean']
2030                tmode = 'mean'
2031              else:
2032                tmid = self.tmLab2Uid['time-point']
2033                tmode = 'point'
2034
2035              if (tmid,spid,tmode) in self.lls.tmsp2str:
2036                stid = self.lls.tmsp2str[ (tmid,spid,tmode) ]
2037              else:
2038                print 'SEVERE.stid.0001: no structure record for ',tmid,spid,tmode,r[1][0]
2039                stid = '__stid_not_found__'
2040              print 'INFO.klklkl: AerChemMIP structure .... ',r[1], spid
2041            else:
2042              if r[1] in self.strdd:
2043                stid = self.strdd[r[1]]
2044              else:
2045                for k in self.strdd.keys():
2046                  if k[0] == r[1][0]:
2047                    print '*** ',k
2048                  else:
2049                    print '+++ ',k
2050                print 'SEVERE.999.00099: strdd key not found: %s' % str(r[1])
2051                print r
2052                stid = '__struct_not_found_001__'
2053
2054            stinfo = self.structInfo.get( stid, ['','','',''] )
2055            spinfo = self.spidInfo.get( stinfo[2]  , ['','','','',''] )
2056            tmid =  stinfo[3]
2057            if "plev7h" in spinfo[3]:
2058              lsfx = '7h'
2059            elif "plev7c" in spinfo[3]:
2060              lsfx = ''
2061            elif "plev4" in spinfo[3]:
2062              lsfx = '4'
2063            elif "plev23" in spinfo[3] and r[2] == 'tntlw' :
2064              ##print 'plev7h found',r,spinfo
2065              lsfx = '23'
2066            else:
2067              lsfx = ''
2068
2069            if r[2] == 'clisccp':
2070              print 'INFO.clisccp.00001:',r
2071
2072            if r[0] in self.fix.fixcmv:
2073             ## print 'INFO.fixcmv.00010: omitting record %s, %s, %s' % (str( self.fix.fixcmv[r[0]] ), r[0],r[2] )
2074              pass
2075            else:
2076              item = self.doc.createElement( 'item' )
2077              for k in range(len(self.cmvinfo)):
2078                n = self.cmvinfo[k]
2079                if n in self.cmvinfo2:
2080                  if n == 'mipTable' and str(r[k]) == 'CMIP5_Oyr':
2081                    print 'ERROR.047.0002: ',r
2082                  if n == "vid":
2083                    if str(r[k]) == '__var_not_found_012__':
2084                      print 'ERROR.099.00202: bad vid string: %s [%s]' % (r[k],str(r[:3]))
2085                    vid = str(r[k])
2086                    if vid in self.importWbMods.vars.vmap:
2087                      ov = vid
2088                      vid = self.importWbMods.vars.vmap[vid]
2089                      print 'INFO.040.04444: mapping',ov,vid
2090
2091                  if n == "rowIndex":
2092                    ix = str(r[k])
2093                  elif n == "defaultPriority":
2094                    priority = str(r[k])
2095                  elif n == "title":
2096                    title = str(r[k])
2097
2098                  if n == "uid":
2099                    if r[k].find( 'ea313ee8-a0de-11e6-bc63-ac72891c3257' ) != -1:
2100                      print 'INFO.uid.9999: ',r
2101                    item.setAttribute( n, r[k].strip() )
2102                  elif n == "stid":
2103                    item.setAttribute( n, stid )
2104                  elif n in ["mipTableSection","processing"]:
2105                    if str(r[k]) != '':
2106                      item.setAttribute( n, str(r[k]) )
2107                  elif n == "label":
2108                    thisl = string.replace( r[k], '_', '' )
2109                    if len(lsfx) > 0:
2110                      if thisl[ - len( lsfx): ] != lsfx:
2111                        thisl += lsfx
2112                    item.setAttribute( n, thisl )
2113                  elif n in ["valid_min","valid_max","ok_max_mean_abs","ok_min_mean_abs"]:
2114                    if str(r[k]) != "" and r[k] not in [None, 'None']:
2115                      item.setAttribute( n, str(r[k]) )
2116                  elif n == "frequency":
2117                    fr = freqmap.get( str(r[k]), str(r[k]) )
2118                    item.setAttribute( n, fr )
2119                  elif n == "mipTable":
2120                    tn = tableNameMap.get( str(r[k]), str(r[k]) )
2121                    if tn == 'em6hr':
2122                      if 'alev' in spinfo[3]:
2123                        tn = '6hrLev'
2124                      else:
2125                        if tmid == tmidpt:
2126                           tn = '6hrPlevpt'
2127                        else:
2128                           tn = '6hrPlev'
2129                        print 'INFO.6hrPlev.0001:', tmid, tmidpt, tmid == tmidpt, r,tn, self.tmUid2Lab[tmid]
2130                    item.setAttribute( n, tn )
2131                  else:
2132                    item.setAttribute( n, str(r[k]) )
2133
2134### reset table name for OImon ... correcting for frequency as well
2135###
2136              omitThis = False
2137              mtable = item.getAttribute( 'mipTable' )
2138              prov = item.getAttribute( 'prov' )
2139              realm = item.getAttribute( 'modeling_realm' )
2140              if realm in ['','__unset__']:
2141                if prov in knownRealmA:
2142                   item.setAttribute( 'modeling_realm', 'atmos' )
2143                elif prov in knownRealmO:
2144                   item.setAttribute( 'modeling_realm', 'ocean' )
2145               
2146              mtable0 = mtable
2147              if mtable0 == 'OImon':
2148                if r[kfreq] == 'mon':
2149                    mtable = 'SImon'
2150                else:
2151                    mtable = 'SIday'
2152              elif mtable0 in ['em6hr','em3hr','emDay','emMon']:
2153                if stid in self.structInfo:
2154                  if string.find( self.structInfo[stid][1], 'time: point' ) != -1 or tmid == tmidpt:
2155                    mtable += 'pt'
2156                  if string.find( self.spatialDims[ self.structInfo[stid][2] ], 'longitude' ) == -1 and mtable[-1] != 'Z':
2157                    mtable += 'Z'
2158                else:
2159                    print 'WARN.090.09999: structure uid not found',stid, r
2160              elif mtable0 == 'Amon' and thisl[-6:] == 'Adjust':
2161                print 'INFO.adjust.0001: %s moved to AmonAdj .. and omitted' % thisl
2162                mtable = 'AmonAdj'
2163                omitThis = True
2164              if mtable != r[ktable]:
2165                item.setAttribute( 'mipTable', mtable )
2166              item.setAttribute( 'mtid', 'MIPtable::%s' % mtable )
2167              self.tables.add( mtable )
2168
2169              thisuid = r[0]
2170              if tableUtils.getSubGroup(spinfo[3],mtable,thisl,ix,title,thisuid,priority):
2171                item.setAttribute( 'subGroup', tableUtils.subGroup )
2172
2173              if str(vid) not in self.importWbMods.vars.d1:
2174 
2175                  if thisl in self.importWbMods.vars.c1 or (thisl[-2:] in ['17','19','23','27','7c','7h'] and thisl[:-2] in self.importWbMods.vars.c1):
2176                    if thisl in self.importWbMods.vars.c1:
2177                      thisn = thisl
2178                    else:
2179                      thisn = thisl[:-2]
2180
2181                    if len( self.importWbMods.vars.c1[ thisn ] ) == 1:
2182                      newvid = self.importWbMods.vars.c1[ thisn ][0]
2183                      item.setAttribute( 'vid', newvid )
2184                      print 'INFO.099.00110: bad vid string replaced: %s [%s]' % (newvid,thisl)
2185                    else:
2186                      print 'ERROR.099.00111: ambiguous bad vid string: %s [%s]' % (vid,thisl)
2187                  else:
2188                    print 'ERROR.099.00112: bad vid string: %s [%s]' % (vid,thisl)
2189              elif thisl == 'H2p':
2190                print 'WARN.h2p.00001: H2p vid recording as OK here .... %s' % vid
2191              if self.repl.has_key( thisuid ):
2192                for tag,old,new in self.repl[thisuid]:
2193                  thisold = item.getAttribute( tag )
2194                  if thisold != old:
2195                     ##print 'WARN.yyy: Attempt to replace value which is not present'
2196                    print 'WARN.050.00051: Failed attempt to replace values in cmv: %s old:%s new:%s' % (tag,old,new)
2197                  else:
2198                    if tag == 'vid' and new not in self.importWbMods.vars.d1:
2199                        print 'ERROR.050.00052: Attempt to replave values in cmv with invalid vid: %s old:%s new:%s' % (tag,old,new)
2200                    else:
2201                      item.setAttribute( tag, new )
2202                      print 'INFO.050.00050: replacing values in cmv: %s old:%s new:%s' % (tag,old,new)
2203
2204              if thisuid in self.deferredLabMap:
2205                lab0,lab1 = self.deferredLabMap[thisuid]
2206                labold = item.getAttribute( 'label' )
2207                if labold != lab0:
2208                  print 'ERROR.labmap.0001: attempt to change wrong label: ',lab0,lab1,labold
2209                else:
2210                  item.setAttribute( 'label', lab1 )
2211                  print 'INFO.labmap.0001: attempt to change label: ',lab0,lab1
2212
2213### final check on structure  .. but won't work if tuple not found ... but why is structure not there??
2214              stid = item.getAttribute( 'stid' )
2215              if stid in self.struidmapextra:
2216                mid = ('INFO.structure2',stid)
2217                if mid not in doneMessages:
2218                  print 'INFO.structure: mapping [2]: %s to %s' % (stid,self.struidmapextra[stid])
2219                  doneMessages.add(mid)
2220                item.setAttribute( 'stid', self.struidmapextra[stid] )
2221                stid = self.struidmapextra[stid]
2222              if stid in WbMods.str.uidMap:
2223                mid = ('INFO.structure',stid)
2224                if mid not in doneMessages:
2225                  print 'INFO.structure: mapping: %s to %s' % (stid,WbMods.str.uidMap[stid])
2226                  doneMessages.add(mid)
2227                if stid in self.struidmapextra:
2228                   assert self.struidmapextra[stid] == WbMods.str.uidMap[stid], 'CONFLICT in stid mappings: %s, %s, %s' % (stid,self.struidmapextra[stid], WbMods.str.uidMap[stid])
2229                item.setAttribute( 'stid', WbMods.str.uidMap[stid] )
2230             
2231## append CMORvar record
2232              u1 = item.getAttribute('uid')
2233              l1 = item.getAttribute( 'label')
2234#up: rlus rlut rlutcs hfls hfss mcu rsus rsut rsutcs   down:rlds rsds
2235              if l1 in varPositive:
2236                item.setAttribute( 'positive', varPositive[l1] )
2237                print 'INFO.positive.00001: setting positive [%s]: %s' % (l1,varPositive[l1])
2238              if l1 != l0:
2239                print 'WARN.cmvlab.00030: changed cmv label: %s %s %s %s' % (l0,l1,u0,u1)
2240              self._cmvLabByUid[item.getAttribute('uid')] = item.getAttribute( 'label')
2241              if not omitThis:
2242                self.ff[ksect][0].appendChild( item )
2243          print 'INFO.tables.0001: ',stab
2244
2245        elif ksect == u'structure':
2246          ers = {}
2247          for kk in spsResets:
2248            if len( spsResets[kk] ) > 0:
2249              utarg = spsResets[kk][0][0]
2250              for r in spsResets[kk][1:]:
2251                ers[r[0]] = utarg
2252          ##flds = self.structList[0][1]._fields
2253          flds = self.lls.structAttr
2254          for u,nt in self.lls.ll:
2255            smode = 'new'
2256            if smode == 'new':
2257             d1 = self.lls.asDict( u )
2258             tlab = d1['time label']
2259             ##print 'INFO.stid.00072: %s, %s' % (u,str( d1 ))
2260            else:
2261             ##print 'INFO.stid.00071: %s, %s' % (u,str( nt.__dict__ ))
2262             d1 = {}
2263             for f in flds:
2264              if f == 'spid' and nt.__dict__[f] in ers:
2265                d1[f] = ers[ nt.__dict__[f] ]
2266                print 'INFO.801.00011: updating target spid .... ', d1[f]
2267              elif f == 'coords' and 't2000' in nt.__dict__[f]:
2268                d1[f] = str( nt.__dict__[f] )
2269              elif f == 'coords' and nt.__dict__[f][:4] in ['plev']:
2270                cnew = 'p' + nt.__dict__[f][4:]
2271                d1[f] =  str( cnew )
2272
2273                print 'INFO.801.00013: updating target coords .... %s --> %s  ' % ( nt.__dict__[f], cnew )
2274              elif f == 'uid':
2275                d1[f] = u
2276              elif f == 'tlab':
2277                tlab = nt.tlab
2278                tmid = self.tmLab2Uid[tlab]
2279                d1['tmid'] = tmid
2280               
2281              else:
2282                d1[f] = str( nt.__dict__[f] )
2283            if d1.get( 'cell_measures', '' ) == '@OPT':
2284              print 'WARN.structure.00077: changing cell_measures @OPT to --OPT',str(d1 )
2285              d1['cell_measures'] = '--OPT'
2286           
2287            if d1['spid'] in WbMods.ls.labByUid:
2288              slab = WbMods.ls.labByUid[ d1['spid'] ]
2289              print 'INFO.801.00061: spid found in structure record ... %s\n%s' % (d1['spid'],slab)
2290            else:
2291              slab = '?'
2292              print 'SEVERE.801.00060: bad spid found in structure record ... %s\n%s' % (d1['spid'],str(d1))
2293            cm = d1['cell_methods']
2294            if cm == 'null':
2295              if tlab == 'time-point':
2296                cm = 'time: point'
2297                d1['cell_methods'] = cm
2298              elif tlab == 'time-mean':
2299                cm = 'time: mean'
2300                d1['cell_methods'] = cm
2301            elif cm in WbMods.cellm.cmmap:
2302              cm0 = cm
2303              cm =  WbMods.cellm.cmmap[cm]
2304              print 'INFO.cmmap.00001: ',cm0,cm
2305              d1['cell_methods'] = cm
2306
2307            cc = d1['coords']
2308            oo = d1['odims']
2309            if cc not in ['','?']:
2310              print 'INFO.coords.00001: >%s<' % cc
2311              d1['cids'] = 'dim:%s' % cc
2312            if oo not in ['','?']:
2313              ooc = string.join( ['dim:%s' % x for x in oo.split( '|' )] )
2314              print 'INFO.odims.00001: >%s<' % ooc
2315              d1['cids'] = ooc
2316            t = (tlab,slab,d1['odims'],d1['coords'],d1['cell_methods'],d1['cell_measures'],d1['flag_meanings'])
2317
2318            dothis = True
2319            if t not in WbMods.str.lookup:
2320              print 'WARN.structure.0040: tuple not in lookup: ',t,d1['uid'],d1['spid'],d1
2321            else:
2322              print 'WARN.structure.0041: tuple in lookup ignored: ',t,d1['uid'],d1['spid'],d1
2323              lab = d1['label']
2324              if lab in WbMods.str.labMap:
2325                print 'INFO.structure.0050: omitting structure record ....',t,lab, d1['uid']
2326                lab2 = WbMods.str.labMap[lab]
2327                dothis = False
2328                self.struidmapextra[d1['uid']] = WbMods.str.uidByLab[lab2]
2329                print 'INFO.structure.0062: setting stid mapping ....',t,d1['uid'],WbMods.str.uidByLab[lab2], d1['label'], lab2
2330
2331            lab = d1['label']
2332            if lab in WbMods.str.mods:
2333                  for k in WbMods.str.mods[lab]:
2334                     print 'INFO.structure.0055: modifying attributes: %s: %s: %s' % (lab,k,WbMods.str.mods[lab][k])
2335                     d1[k] = WbMods.str.mods[lab][k]
2336
2337            if dothis and d1['uid'] in doneStructures:
2338               print 'WARN.structure.05021: repeat uid in structure definitions ....%s' % d1['uid']
2339            if dothis and d1['uid'] not in doneStructures and d1['uid'] not in WbMods.str.uidMap:
2340              if cm not in WbMods.cellm.cminfo:
2341                print 'WARN.cellm.0001: Cell methods not found: ',cm, d1['uid']
2342              else:
2343                d1['cmid'] = WbMods.cellm.cminfo[cm][2]
2344             
2345              doneStructures.add( d1['uid'] )
2346              item = self.doc.createElement( 'item' )
2347              for k in d1:
2348                if k not in ['time_label','spatial_label', 'time label','spatial label']:
2349                  item.setAttribute( k.replace( ' ','_'), d1[k] )
2350              self.ff[ksect][0].appendChild( item )
2351            else:
2352              if not dothis:
2353                 print 'INFO.structure.09001: omitting %s' % d1['label']
2354              elif d1['uid'] in doneStructures:
2355                 print 'INFO.structure.09002: omitting %s' % d1['label']
2356              elif d1['uid'] in WbMods.str.uidMap:
2357                 print 'INFO.structure.09003: omitting %s' % d1['label']
2358###
2359        elif ksect == u'spatialshape':
2360
2361     ##    self.dimsSpaceInfo = ['uid','label','title','dimensions','levelFlag','levels']
2362          self.spatialDims = {}
2363          for k in self.dimsSpace.keys():
2364            rr = list( self.dimsSpace[k] ) 
2365            kk = rr[3]
2366            if kk == 'scalar':
2367              kk = ''
2368              rr = list(rr)
2369              rr[3] = ''
2370            elif kk == 'longitude|latitude|plev':
2371              kk = 'longitude|latitude|plev4'
2372              rr = list(rr)
2373              rr[3] = kk
2374            elif kk == 'longitude|latitude|plev7':
2375              kk = 'longitude|latitude|plev7c'
2376              print 'INFO.plev7.00001: plev7 --> plev7c'
2377              rr = list(rr)
2378              rr[3] = kk
2379            self.spatialDims[rr[0]] = rr[3]
2380            bits = [x for x in rr[3].split( '|' ) if x not in ['','?']]
2381            rr.append( string.join( ['dim:%s' % x for x in bits] ) )
2382            if kk not in spsResets:
2383              item = self.doc.createElement( 'item' )
2384              for i in range(len(self.dimsSpaceInfo)):
2385                item.setAttribute( self.dimsSpaceInfo[i], str( rr[i] ) )
2386              ##assert rr[3] in self.spsh.ss, 'FATAL:  spatial shape record not recognised: %s' % str(rr)
2387              if rr[3] in self.spsh.ss:
2388                lab,ttl,lf,li,u = self.spsh.ss[rr[3]]
2389                if trace.SPATIALSHAPE_01:
2390                  print 'INFO.035.0001: new spatial shape label: %s, %s' % (lab, ttl)
2391                if ttl[:4] != 'ssd.':
2392                  item.setAttribute( 'title', ttl )
2393                if len(lab) < 4 or lab[:4] != 'ssd-':
2394                  item.setAttribute( 'label', lab )
2395                item.setAttribute( 'levels', li )
2396                item.setAttribute( 'uid', u )
2397                item.setAttribute( 'levelFlag', string.lower(lf) )
2398              else:
2399                print 'ERROR.055.00001: spatial shape record not recognised: %s' % str(rr)
2400              print 'INFO.801.00120: new shape for %s' % str(rr)
2401              thisl = item.getAttribute( 'label' )
2402              assert thisl not in self.spLab2Uid.keys(), 'Duplicate spatial shape label: %s' % thisl
2403              self.spLab2Uid[thisl] = item.getAttribute( 'uid' )
2404              self.ff[ksect][0].appendChild( item )
2405            else:
2406              print 'INFO.801.00121: duplicate shape for %s' % str(rr)
2407            spsResets[kk].append( rr )
2408
2409        elif ksect == u'temporalshape':
2410          for k in self.dimsTime.keys():
2411            rr = self.dimsTime[k]
2412            item = self.doc.createElement( 'item' )
2413            for i in range(len(self.dimsTimeInfo)):
2414              item.setAttribute( self.dimsTimeInfo[i], str( rr[i] ) )
2415              if self.dimsTimeInfo[i] == 'dimensions':
2416                item.setAttribute( 'dimid', 'dim:%s' % rr[i] )
2417            self.ff[ksect][0].appendChild( item )
2418            self.tmLab2Uid[ item.getAttribute( 'label' ) ] = item.getAttribute( 'uid' )
2419            self.tmUid2Lab[ item.getAttribute( 'uid' ) ] = item.getAttribute( 'label' )
2420        elif ksect == u'requestvar':
2421          ##kk = ['var', 'table', 'mip', 'vid', 'priority']
2422          kk = ['label', 'table', 'mip', 'vid', 'priority','vgid','title','uid']
2423          kktr = {'vgid':'gpid', 'title':'label'}
2424          kkf = 0
2425          for t in self.rqv:
2426           if t[5][:6] == 'SPECS_':
2427               print 'SEVERE.specs.00001: mis-assigned mip: ',t
2428           if t[1][-6:] == 'Adjust':
2429             doThis = False
2430           else:
2431            item = self.doc.createElement( 'item' )
2432
2433            for i in range(len(kk)):
2434              k = kktr.get( kk[i], kk[i] )
2435              v = t[  self.rqvinfo.index(k) ]
2436              if k == 'priority':
2437                item.setAttribute( kk[i], str( int(v) ) )
2438              elif kk[i] == 'label':
2439                thisl = string.replace( v, '_', '' )
2440                item.setAttribute( kk[i], thisl )
2441              elif kk[i] == 'title':
2442                item.setAttribute( kk[i], str( v ) + ' ((isd.006))' )
2443              elif kk[i] == 'table':
2444                pass
2445              else:
2446                item.setAttribute( kk[i], str( v ) )
2447
2448            vid = item.getAttribute( 'vid' )
2449            if vid in self.fix.fixcmv:
2450               if self.fix.fixcmv[vid][3] == u'replace':
2451                 vidn =  str( self.fix.fixcmv[vid][4] )
2452                 if vidn not in self._cmvLabByUid:
2453                   print 'SEVERE.fixcmv.00040: attempt to redirect request to non-existant variable: %s,%s,%s::%s' % (vid,vidn,thisl,str(self.fix.fixcmv[vid]) )
2454                 else:
2455                   labn =  self.cmvByUid[vidn][2]
2456                   if vid in self.cmvByUid:
2457                      lab =  self.cmvByUid[vid][2]
2458                      if lab != labn:
2459                        print 'WARN.fixcmv.00001: label change: %s -- %s (%s --> %s)' % (lab,labn,vid,vidn)
2460                   elif labn != thisl:
2461                      print 'WARN.fixcmv.00002: label change [2]: %s -- %s (%s --> %s)' % (thisl,labn,vid,vidn)
2462                   item.setAttribute( 'vid', vidn )
2463                   vid = vidn
2464                   print 'INFO.fixcmv.00050: replacing link in requestVar  %s  %s %s' % (str(t),vidn,labn)
2465
2466            newd = None
2467            if vid in self.importWbMods.mmsi.ss:
2468              print 'INFO.046.0002: mip map found: ', self.importWbMods.mmsi.ss[vid]
2469              mm = self.importWbMods.mmsi.ss[vid]
2470              ##newd = self._editRequestVar01( item, mm, t, {} )
2471
2472            vid = item.getAttribute( 'vid' )
2473            if vid in self.cmvMap002:
2474              vid = self.cmvMap002[vid]
2475              item.setAttribute( 'vid', vid )
2476            if vid not in self.cmvByUid:
2477               print 'ERROR.reqvar.000001: vid not found: %s' % str(t)
2478            else:
2479               lab0 =  self.cmvByUid[vid][2]
2480               if vid not in self._cmvLabByUid:
2481                  print 'WARN.cmvlab.00020: no _cmv.. record ... %s   %s: %s' % (vid,lab0,str( self.cmvByUid[vid] ) )
2482               else:
2483                  lab = self._cmvLabByUid[vid]
2484                  if lab != lab0:
2485                     print 'WARN.cmvlab.00010: difference in records ... %s   %s: %s' % (vid,lab,str( self.cmvByUid[vid] ) )
2486                  if lab != thisl:
2487                  ##print 'INFO.reqvar.00001: inconsistent requestvar label: %s --> %s (%s)' % (thisl, lab, vid)
2488                     print 'INFO.reqvar.00001: changing requestvar label: %s --> %s' % (thisl, lab)
2489                     item.setAttribute( 'label', lab )
2490
2491            tm = item.getAttribute( 'mip' )
2492             
2493            did = '%s__%s' % (t[2],t[3])
2494            if self.vgcheck.has_key(did):
2495              print 'ERROR.090.09002: Duplicate request ....: ',t,self.vgcheck[did]
2496            else:
2497              self.vgcheck[did] = t
2498              self.ff[ksect][0].appendChild( item )
2499##
2500######################################################################################
2501##
2502        elif ksect == u'requestlink':
2503 ## - uuid; mip; tab; objective; grid; gridreq; comment
2504            kk = ['uid', 'mip', 'tab', 'objective', 'grid', 'gridreq', 'comment', 'opt', 'opar', 'preset', 'ref', 'refNote', 'refid']
2505            kk = ['uid', 'mip', 'tab', 'objective', 'grid', 'gridreq', 'comment', 'opt', 'opar', 'preset', 'refid']
2506            ##kk = ['uid', 'mip', 'tab', 'objective', 'grid', 'gridreq', 'comment', 'opt','opar','ref', 'refNote', 'refid']
2507       
2508            for k,ll in self.rqLnks.items():
2509              if k[0] != '_':
2510                assert len(ll) == len(kk), 'Bad record length in requestLink'
2511                thisl = string.strip(str( ll[2] ) )
2512                uid = str( ll[0] ).strip()
2513                item = self.doc.createElement( 'item' )
2514                for j in range(len(kk)):
2515                  thiskk = kk[j]
2516## preset moved to request item .... so it can also be used on a per-experiment basis
2517                  if thiskk != 'preset':
2518                    if kk[j] == 'comment':
2519                      v = utils_wb.uniCleanFunc( ll[j] )
2520                    else:
2521                        v = str( ll[j] )
2522
2523### redirect to new variable group if specified in mappings
2524##
2525                    item.setAttribute( thiskk, v )
2526
2527                item.setAttribute( 'label', thisl.replace( '.', '-' ) )
2528                item.setAttribute( 'title', thisl )
2529                self.ff[ksect][0].appendChild( item )
2530##################################
2531
2532  def _editRequestVar01( self, item, mm, t, thisd, vid=None ):
2533              if vid == None:
2534                vid = mm[0].vid2
2535              item.setAttribute( 'vid', vid )
2536              item.setAttribute( 'label', mm[0].lab2 )
2537              thisd['vid'] = vid
2538              thisd['label'] = mm[0].lab2
2539              print 'INFO.fffff.00001:', mm[0].lab2, mm[0].vid2
2540              othd = None
2541              if len( mm ) > 1:
2542                othd = thisd.copy()
2543                assert len( mm ) < 3, 'Unable to deal with triple clone'
2544                cln = item.cloneNode(True)
2545                uid = str( uuid.uuid1() )
2546                cln.setAttribute( 'uid', uid )
2547                cln.setAttribute( 'label', mm[1].lab2 )
2548                othd['uid'] = uid
2549                othd['label'] = mm[1].lab2
2550                self.ff['requestvar'][0].appendChild( cln )
2551
2552                print 'INFO.046.0003: request variable split:', t[1]
2553
2554  def finishExptGrp(self):
2555    """finish exptGroup section and create exptgrouplink section"""
2556    this = self.doc.getElementsByTagName('exptGroup')[0]
2557            ### kk = ['uid','label','tierMin','ntot']
2558    for k in self.exptPntUid.keys():
2559      u,typ = self.exptPntUid[k]
2560##      if not isg:
2561        ##item = self.doc.createElement( 'item' )
2562        ##item.setAttribute( uid, u )
2563    ##this = self.doc.getElementsByTagName('exptGroupLink')[0]
2564    ##dil = this.getElementsByTagName('item')
2565    ##for d in dil:
2566          ##this.removeChild(d)
2567    ##this.appendChild( item )
2568
2569  def reviewExpt(self):
2570    """Prepare cross-linking information to populate requestitem, exptgroup and exptgrouplink"""
2571    sh = shelve.open( '../framework/sh_links/exptMappings', 'r' )
2572    extraMappings={ 'LS3MIP-1, LS3MIP-2':['LmipH', 'LmipF'], \
2573                    'LULCC_hist, CPL_1pctDF, LND_DF, ATM_DF, CPL_DF, CPL_noLULCC_hist_conc (LUMIP)':['LULCC_hist', 'CPL_1pctDF', 'LND_DF', 'ATM_DF', 'CPL_DF', 'CPL_noLULCC_hist_conc'] \
2574                 }
2575
2576##
2577## extra fix for HighResMIP .... after encoding in template made consistent with other MIPs
2578##
2579    shm = {}
2580    for k in sh.keys():
2581      if string.find( k, ' ' ) != -1 and k[:4] == 'High':
2582        k1 = string.split( k)[0]
2583        assert k1 not in shm, 'Duplicate abbreviated key: %s [%s and %s]' % (k1,k,shm[k1])
2584        shm[k1] = k
2585    ks = sorted( self.exptPnt.keys() )
2586    self.exptPntMap = collections.defaultdict( list )
2587    self.exptPntUid = {}
2588    ner = 0
2589    ngr = 0
2590    nmr = 0
2591    nuns = 0
2592    nls = 0
2593    for k0 in ks:
2594      k = string.replace( string.replace( k0, '\n', ' ' ), '  ', ' ')
2595      thisl = None
2596      if sh.has_key(k):
2597        thisl = sh[k]
2598      elif shm.has_key(k):
2599        thisl = sh[shm[k]]
2600      elif extraMappings.has_key(k):
2601        thisl = extraMappings[k]
2602      elif self.experiments.has_key(k):
2603        thisl = [k,]
2604      else:
2605        thisl = [k,]
2606        print 'WARN.080.00010: no mapping founds for experiment %s' % k
2607     
2608
2609      if thisl != None:
2610        thisu = None
2611        thisls = set( thisl )
2612        linkType = None
2613        for k2 in thisls:
2614          ok = True
2615          if self.experiments.has_key(k2):
2616            ner += 1
2617            linkType = 'expt'
2618            thisu = self.experiments[k2]
2619          elif self.experimentGrp.has_key(k2):
2620            ngr += 1
2621            thisu = self.experimentGrp[k2]
2622            linkType = 'grp'
2623          elif k2 in self.mips:
2624            nmr += 1
2625            thisu = k2
2626            linkType = 'mip'
2627          else:
2628            k2c = dreq_utils.labcoerce(k2)
2629            if self.experimentGrp.has_key(k2c):
2630              ngr += 1
2631              thisu = self.experimentGrp[k2c]
2632              linkType = 'grp'
2633            else:
2634              ok = False
2635              print 'ERROR.080.00999: target experiment not found: %s [%s]' % (k2,k)
2636          if not ok:
2637            self.exptPntMap[k].append( k2 )
2638##
2639## store uid of expt group to be pointed at.
2640##
2641        if len(thisls) == 1 and thisu != None:
2642          self.exptPntUid[k0] = (thisu, linkType, thisls)
2643        else:
2644          self.exptPntUid[k0] = (str( uuid.uuid1() ), 'list', tuple(thisls) )
2645          print 'INFO.expt.00001: ',k0, thisl, thisls, self.exptPntUid[k0]
2646          nls += 1
2647      else:
2648          nuns += 1
2649          self.exptPntUid[k0] = (None,None)
2650     
2651    sh.close()
2652    print 'INFO.080.00010: Expt refs: %s, Expt group refs: %s, MIP expt set refs: %s, unset: %s, lists: %s' % (ner,ngr,nmr, nuns, nls)
2653
2654  def reviewObj(self):
2655## review objectives
2656##
2657    ol = []
2658    fnd1 = set()
2659    for m in self.objectives.keys():
2660      not_used = []
2661      used = set()
2662      not_found = []
2663      found = []
2664      alist = ['All','All?','all']
2665      aaa = [self.objectiveLinks[m].a.has_key(x) for x in ['All','All?','all'] ]
2666      us1 = set()
2667      for k in self.objectiveLinks[m].a:
2668        x = None
2669        if k == 'AllExceptPaleorcms':
2670          x = self.objectives[m].keys()
2671          x.pop( x.index( 'Paleorcms' ) )
2672        elif k == 'AllExceptNaturalVariability':
2673          x = self.objectives[m].keys()
2674          x.pop( x.index( 'NaturalVariability' ) )
2675
2676        if x != None:
2677          fnd1.add(k)
2678          for i in x:
2679            used.add(i)
2680            us1.add(i)
2681            for u in self.objectiveLinks[m].a[k]:
2682              ol.append( (m,self.objectives[m][i], u ) )
2683         
2684      allused = (m != 'GMMIP') and any( aaa )
2685      for o in self.objectives[m].keys():
2686        if allused or self.objectiveLinks[m].a.has_key(o):
2687          used.add(o)
2688          for u in self.objectiveLinks[m].a[o]:
2689            ol.append( (m,self.objectives[m][o], u ) )
2690          for k in alist:
2691            if self.objectiveLinks[m].a.has_key(k):
2692              for u in self.objectiveLinks[m].a[k]:
2693                ol.append( (m,self.objectives[m][o], u ) )
2694        elif o not in us1:
2695          not_used.append(o)
2696
2697      for o in self.objectiveLinks[m].a.keys():
2698        if (o in {'All','All?'} and len(self.objectives[m].keys()) > 0 ) or self.objectives[m].has_key(o) or o in fnd1:
2699          found.append(o)
2700        else:
2701          not_found.append(o)
2702      if len(not_used) > 0 or len(not_found) > 0:
2703        print 'WARN.080.00002: %s: OK %s: unused: %s: not found:%s' % (m,str(used),str(not_used),str(not_found))
2704      else:
2705        print 'INFO.080.00002: %s: all objectives matched' % m
2706    self.objList = ol
2707
2708
2709  def finish(self):
2710## varChoice section
2711    self.choices()
2712##
2713    self.reviewObj()
2714##
2715    return
2716    #d1 = {}
2717    #for i in self.rqvgList:
2718      #d1[i['uid']] = i
2719    #this = self.doc.getElementsByTagName('requestVarGroup')[0]
2720    #dil = this.getElementsByTagName('item')
2721    kkk = 0
2722    kk0 = []
2723    ss = {}
2724    #for item in dil:
2725      #uid = item.getAttribute( 'uid' )
2726      #refn = item.getAttribute( 'refNote' )
2727      #bits = string.split( refn, '_' )
2728      #if len(bits) == 2:
2729        #if string.find(bits[0], '.' ) != -1:
2730          #bits[0] = string.split( bits[0], '.')[-1]
2731        #ss[ tuple( bits ) ] = uid
2732      #if uid not in d1:
2733        #kk0.append( 'Record for uid %s not found' % uid )
2734      #else:
2735        #lab = item.getAttribute( 'label' )
2736        #if d1[uid]['label'] == lab:
2737          #kkk += 1
2738        #else:
2739          #kk0.append( 'Mismatch in label for %s' % uid )
2740    #print 'INFO.rvg.00001: %s records checked OK; %s failed' % (kkk,len(kk0))
2741    notNeeded = ( ('Oyr','3dtr'), ('Amon','2d'), ('cf3hr','grid'))
2742    ##nnf = 0
2743    dt1 = {}
2744    for s in tableUtils.sgset:
2745      a,b = string.split( s, '_' )
2746      if (a,b) not in notNeeded:
2747        if (a,b) in ss:
2748##
2749## create lookup --- dt1[<sub-group id>] = <requestVarGroup uid>
2750##
2751          dt1[s] = ss[(a,b)]
2752        else:
2753          print 'WARN.rvg.00002: %s %s not found' % (a,b)
2754          nnf += 1
2755
2756    assert nnf == 0, 'Not all sub-groups found'
2757###
2758### read through request vars ... and look to see how many refer to subgroups identified in dt1:
2759### how many of these are identified in tableUtils, how many in tableUtils are missing?
2760###
2761    dt1vs =  {}
2762    for s in dt1:
2763      dt1vs[ dt1[s] ] = s
2764
2765    ##print 'INFO.rvg.00009: dt1vs: %s' % str(dt1vs)
2766    this = self.doc.getElementsByTagName('requestVar')[0]
2767    dil = this.getElementsByTagName('item')
2768    nf0 = 0
2769    nf1 = 0
2770    nf2 = 0
2771    ss0 = set()
2772    sn0 = collections.defaultdict( int )
2773    sn1 = collections.defaultdict( int )
2774    sn2 = collections.defaultdict( int )
2775    for item in dil:
2776      vgid = item.getAttribute( 'vgid' )
2777      if vgid in dt1vs:
2778        s = dt1vs[vgid]
2779        nf0 += 1
2780        sn0[s] += 1
2781        vid = item.getAttribute( 'vid' )
2782        ss0.add( vid )
2783        if vid in tableUtils.vdict:
2784          nf1 += 1
2785          sn1[s] += 1
2786        else:
2787          this.removeChild(item)
2788
2789    for vid in tableUtils.vdict:
2790      if vid not in ss0:
2791        var,ttl,mip,tab,sg,priority = tableUtils.vdict[vid]
2792        a,b = string.split( sg, '_' )
2793        if (a,b) not in notNeeded:
2794          nf2 += 1
2795          sn2[ tableUtils.vdict[vid][4] ] += 1
2796          assert sg in dt1, 'Cannot locate requestVarGroupd for %s: %s' % (sg,str(dt1.keys()))
2797          vgid = dt1[sg]
2798          item = self.doc.createElement( 'item' )
2799          item.setAttribute( 'uid', str(uuid.uuid1()) )
2800          item.setAttribute( 'vid', vid )
2801          item.setAttribute( 'vgid', vgid )
2802          item.setAttribute( 'title', '%s ((isd.009))' % var )
2803          item.setAttribute( 'label', var )
2804          item.setAttribute( 'mip', mip )
2805          item.setAttribute( 'priority', priority )
2806          this.appendChild( item )
2807
2808    print 'INFO.rvg.00010: variables found in sg rvgs: %s' % nf0
2809    print 'INFO.rvg.00011: of these, number in tableUtils: %s' % nf1
2810    print 'INFO.rvg.00012: variables in tableUtils not in sg rvgs: %s [from %s]' % (nf2,len(tableUtils.vdict.keys()))
2811    for k in sorted( sn0.keys() ):
2812      print 'INFO.rvg.00020: # in tableUtils [%s] %s [from %s]' % (k,sn0[k],sn1[k])
2813    for k in sorted( sn2.keys() ):
2814      print 'INFO.rvg.00021: # in tableUtils [%s] not found %s' % (k,sn2[k])
2815
2816
2817  def finish2(self):
2818##
2819##  objectiveLink
2820##
2821    this = self.doc.getElementsByTagName('objectiveLink')[0]
2822    dil = this.getElementsByTagName('item')
2823    for d in dil:
2824          this.removeChild(d)
2825    for t in self.objList:
2826       item = self.doc.createElement( 'item' )
2827       item.setAttribute( 'label', t[0] )
2828       item.setAttribute( 'oid', t[1] )
2829       item.setAttribute( 'rid', t[2] )
2830       thisuuid = str( uuid.uuid1() )
2831       item.setAttribute( 'uid', thisuuid )
2832       this.appendChild( item )
2833##
2834## remarks
2835##
2836    this = self.doc.getElementsByTagName('remarks')[0]
2837    dil = this.getElementsByTagName('item')
2838    for d in dil:
2839          this.removeChild(d)
2840
2841    ##mn = self.doc.getElementsByTagName('main')[0]
2842    for item in self.doc.getElementsByTagName('item'):
2843      for k,v in item.attributes.items():
2844        if type(v) not in ( type( u'x' ), type( 'x' ) ):
2845          print 'TYPE ERROR %s, %s: %s' % (item.parentNode.tagName, k,v)
2846    txt = self.doc.toprettyxml(indent='\t', newl='\n', encoding=None)
2847    if self.schemaMode == 'dreq2':
2848      ofn = 'trial2_20150831.xml'
2849    else:
2850      ofn = 'trial_20150831.xml'
2851    oo = open( ofn, 'w' )
2852    lines = string.split( txt, '\n' )
2853    for line in lines:
2854      l = utils_wb.uniCleanFunc( string.strip(line) )
2855      if empty.match(l):
2856        continue
2857      else: 
2858        oo.write(l + '\n')
2859    oo.close()
2860
2861  def choices(self):
2862    """Populate the 'varChoice' section, using the information in the 'choices' dictionary in 'choicecfg'"""
2863
2864    ccfg = choiceCfg.choices( self )
2865    self.ccfg = ccfg
2866##
2867##  choices
2868##
2869    this = self.doc.getElementsByTagName('varChoice')[0]
2870    dil = this.getElementsByTagName('item')
2871    for d in dil:
2872          this.removeChild(d)
2873    for k in ccfg.choices.keys():
2874       item = self.doc.createElement( 'item' )
2875       cc = ccfg.choices[k]
2876       for kk in cc.keys():
2877         item.setAttribute( kk, cc[kk] )
2878       this.appendChild( item )
2879       ##print 'INFO.zzz.00008: Appending ',cc[kk]
2880
2881    this = self.doc.getElementsByTagName('varChoiceLinkR')[0]
2882    dil = this.getElementsByTagName('item')
2883    for d in dil:
2884          this.removeChild(d)
2885    for cc in ccfg.varChoiceLnk:
2886       item = self.doc.createElement( 'item' )
2887       ##print 'INFO.zzz', cc
2888       for i in range( len( ccfg.varChoiceLnkInfo ) ):
2889         item.setAttribute( ccfg.varChoiceLnkInfo[i], cc[i] )
2890       this.appendChild( item )
2891
2892    this = self.doc.getElementsByTagName('varChoiceLinkC')[0]
2893    dil = this.getElementsByTagName('item')
2894    for d in dil:
2895          this.removeChild(d)
2896    for cc in ccfg.varChoiceLnkCfg:
2897       item = self.doc.createElement( 'item' )
2898       for i in range( len( ccfg.varChoiceLnkCfgInfo ) ):
2899         item.setAttribute( ccfg.varChoiceLnkCfgInfo[i], cc[i] )
2900       this.appendChild( item )
2901
2902    ##self.varChoiceLnkCfgInfo = [ 'uid', 'label', 'title', 'vid', 'cid', 'cfgid', 'cfg'
2903
2904  def importRepl(self,rfile='uuidreplace.csv',mode='var'):
2905    for l in open(rfile).readlines():
2906      bits = string.split( string.strip(l), '\t' )
2907      assert len(bits) == 7, 'Could not parse item replacement file'
2908      if mode == 'var':
2909        self.repl[ bits[3] ].append( (bits[2],bits[0],bits[1] ) )
2910        self.replItems[bits[0]] = bits[1]
2911      elif mode == 'cmv':
2912        self.rep['cmv'].v[ bits[3] ].append( (bits[2],bits[0],bits[1] ) )
2913        self.rep['cmv'].items[bits[0]] = bits[1]
2914     
2915
2916  def importRemove(self,rfile='uuidremove.csv'):
2917    for l in open(rfile).readlines():
2918      self.remo[ string.strip(l) ] = 1
2919
2920  def importUpdate(self,rfile='uuidupdate.csv'):
2921    for l in open(rfile).readlines():
2922      bits = string.split( string.strip(l), '\t' )
2923      tgs = string.strip( bits[2] )
2924      if string.find( tgs, ' ' ) == -1:
2925        tags = [tgs,]
2926      else:
2927        tags = string.split( tgs )
2928      self.upda[ bits[0] ] =  {'comment':bits[1], 'tags':tags, 'label':bits[3], 'title':bits[4] }
2929
2930  def importInsert(self,rfile='uuidinsert.csv'):
2931    for l in open(rfile).readlines():
2932      bits = string.split( string.strip(l), '\t' )
2933      if bits[0] == 'unique':
2934         self.insert[bits[1]] = bits[3]
2935
2936mode = 'dreq2'
2937sampleXml = '../framework/out/%sSample.xml' % mode
2938from scansh02 import rq
2939
2940m = main(sampleXml, rq,run=True, schemaMode=mode, doRepl=False)
2941
Note: See TracBrowser for help on using the repository browser.