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

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

sync

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