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

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

check

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