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

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

fix on cmv duplication bug

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