source: CMIP6dreqbuild/trunk/src/framework/ingest/util_anal.py @ 760

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/ingest/util_anal.py@760
Revision 760, 23.0 KB checked in by mjuckes, 4 years ago (diff)

release cand

Line 
1
2from xceptions import baseException
3import shelve, glob, os, uuid, collections, string
4from utils_wb import workbook
5import util_varGroups
6import util_gen
7
8
9tab2freq = {u'CMIP5_cfOff':'subhr', u'CORDEX_mon':'mon', u'SPECS_day':'day', u'CMIP5_day':'day', \
10                  u'PMIP3_OImon':'mon', u'CORDEX_day':'day', u'CMIP5_LImon':'mon', u'CMIP5_OImon':'mon', \
11                  u'CMIP5_Lmon':'mon', u'CMIP5_3hr':'3hr', u'CMIP5_Omon':'mon', u'PMIP3_OIclim':'monClim', \
12                  u'PMIP3_fx':'fx', u'CORDEX_fx':'fx', u'PMIP3_LImon':'mon', u'CMIP5_6hrPlev':'6hr', u'PMIP3_Lmon':'mon', \
13                  u'PMIP3_Amon':'mon', u'SPECS_Omon':'mon', u'CCMI1_fixed':'fx', u'PMIP3_Aclim':'monClim', u'CMIP5_6hrLev':'6hr', \
14                  u'CMIP5_Oclim':'monClim', u'PMIP3_LIclim':'monClim', u'CCMI1_monthly':'mon', u'CMIP5_fx':'fx', \
15                  u'CMIP5_cfDay':'day', u'CORDEX_6h':'6hr', u'PMIP3_day':'day', u'SPECS_OImon':'mon', u'CMIP5_cfMon':'mon', \
16                  u'CORDEX_sem':'monClim', u'SPECS_6hr':'6hr', u'CMIP5_cfSites':'subhr', u'CCMI1_hourly':'hr', u'CMIP5_aero':'mon', \
17                  u'CMIP5_Amon':'mon', u'PMIP3_Omon':'mon', u'CCMI1_daily':'day', u'SPECS_fx':'fx', u'PMIP3_Lclim':'monClim', \
18                  u'DCPP-day':'day',  \
19                  u'PMIP3_Oclim':'monClim', u'SPECS_Amon':'mon', u'SPECS_Lmon':'mon', u'CMIP5_cf3hr':'3hr', u'CORDEX_3h':'3hr', \
20                  'OImon':'mon', 'Omon_oth':'mon', 'Omon':'mon',  'Oyr':'yr', 'Omon_3d':'mon', \
21                  u'CCMI1_annual':'yr', u'CMIP5_Oyr':'yr', \
22                   'Oclim':'monClim', \
23                   'cfMon':'mon', \
24                  u'cf3hr':'3hr', u'Amon':'mon', u'aero':'mon', u'aero_3d':'mon', u'6hrPlev':'6hr', u'aero_oth':'mon', \
25                  u'cf3hr_grid':'3hr', u'LImon':'mon', u'cfSites':'subhr', u'day_oth':'day', u'cfDay_2d':'day', u'day':'day' }
26
27##
28## want to match up with input/vars_... and  where is cmv uid fixed ????
29##
30##
31## need to migrate new vars into input/vars_ ... especially from LUMIP ...
32##
33## new variables which need to be added have been identified. No check for modifications (and no clear workflow here)...
34## ned to check .. a few appear spurious .. and then generate csv records ... for manual copy ...
35##
36##
37##
38## add AerChemMip and VIACS to stuff scanned and checked below .....
39
40def getSubGroup(s, var,dims,ttl,ix):
41        sg = None
42        if s == 'Oyr' and ix < 60:
43          sg = 'Oyr_3dtr'
44        elif s == 'Amon':
45          if string.find( dims, 'lev' ) == -1 and string.find( dims, 'longitude latitude') != -1:
46            sg = 'Amon_2d'
47          else:
48            sg  = 'Amon_oth'
49        elif s == 'Omon':
50          if string.find( dims, 'longitude latitude olevel' ) != -1:
51            sg = 'Omon_3d'
52          else:
53            sg = 'Omon_oth'
54        elif s == 'cfMon':
55          if ttl[:5] in ['ISCCP','PARAS','CALIP']:
56            sg = 'cfMon_sim'
57          elif var[-3:] == 'co2':
58            if string.find( dims, 'longitude latitude alev' ) != -1:
59              sg = 'cfMon_3dmod'
60            else:
61              sg = 'cfMon_2dmod'
62          else:
63            sg = 'cfMon_3dstd'
64        elif s == 'cfDay':
65          bits = '|'.split( dims )
66
67          if string.find( dims, 'longitude|latitude' ) != -1 and len(bits) > 2 and bits[2] in ['alev','alevel','alevhalf','alt40','plev7','alt40']:
68              sg = 'cfDay_3d'
69          else:
70              sg = 'cfDay_2d'
71        elif s == 'cf3hr':
72          if  dims.find( 'longitude|latitude' ) != -1:
73              sg = 'cf3hr_grid'
74          else:
75              sg = 'cf3hr_sim'
76        elif s == 'aero':
77          if dims.find( 'longitude|latitude|alevel' ) != -1:
78              sg = 'aero_3d'
79          else:
80              sg = 'aero_oth'
81        elif s == 'day':
82          if ix < 28:
83              sg = 'day_ss'
84          else:
85              sg = 'day_oth'
86        return sg
87def getSubGroupO(sn, var,dims,ttl,ix):
88                 sg = None
89                 if sn == 'Oyr' and ix < 65:
90                   sg = 'Oyr_3dtr'
91                 elif sn == 'Omon':
92                   if string.find( dims, 'longitude latitude olevel' ) != -1:
93                     sg = 'Omon_3d'
94                   else:
95                     sg = 'Omon_oth'
96                 elif sn == 'cfMon':
97                   if ttl[:5] in ['ISCCP','PARAS','CALIP']:
98                     sg = 'cfMon_sim'
99                   elif var[-3:] == 'co2':
100                     if string.find( dims, 'longitude latitude alev' ) != -1:
101                       sg = 'cfMon_3dmod'
102                     else:
103                       sg = 'cfMon_2dmod'
104                   else:
105                     sg = 'cfMon_3dstd'
106                 elif sn == 'cfDay':
107                   bits = ' '.split( dims )
108                   if string.find( dims, 'longitude latitude' ) != -1 and len(bits) > 2 and bits[2] in ['alev','alevel','alevhalf','alt40','plev7','alt40']:
109                       sg = 'cfDay_3d'
110                   else:
111                       sg = 'cfDay_2d'
112                 elif sn == 'cf3hr':
113                   if dims.find( 'longitude latitude' ) != -1:
114                       sg = 'cf3hr_grid'
115                   else:
116                       sg = 'cf3hr_sim'
117                 return sg
118
119class ref(object):
120  def __init__(self,sdir='inSh'):
121    dir1 = '/data/tmp/svn3/exarch/CMIP6dreqbuild/trunk/src/workbook'
122    wb = workbook( '%s/%s' % (dir1,'inputs/vars_20160721.xls') )
123    self.vars = {}
124    s1 = wb.book.sheet_by_name(u'var')
125    su = set()
126    for i in range( s1.nrows ):
127      r = s1.row(i)
128      assert r[0] not in self.vars, 'DUPLICATE VARIABLE: %s' % str(r)
129      self.vars[r[0].value] = (r[9].value,r[10].value)
130    fl = sorted( glob.glob( '%s/sh__newVar_*' % sdir ) )
131    for f in fl:
132      sh = shelve.open( f, 'r' )
133      ks = [k for k in sh.keys() if k[0] != '_']
134      for k in ks:
135        if k not in self.vars:
136          print 'MISSING NEW: %s, %s, %s' % (k,f,str(sh[k]))
137
138class cmvRef(object):
139  def __init__(self):
140    self.byUid = {}
141    self.byTab = collections.defaultdict( dict )
142    for l in open( 'ingest/cmvRef_01.beta.32.csv' ).readlines():
143      lab, tab, ttl, uid = l.strip().split( '\t' )
144      assert uid not in self.byUid, 'DUPLICATE UID: %s' % uid
145      self.byUid[uid] = (lab,tab,ttl)
146      if lab in self.byTab[tab]:
147        print 'ERROR.cmvRef.001: duplicate variable name in cmv table: %s,%s' % (tab,lab)
148      self.byTab[tab][lab] = uid
149
150class revTabChk(object):
151
152  def __init__(self,sdir='inSh'):
153    """Review and consolidate revised tables, as ingested into shelves, and annotate records"""
154    assert os.path.isdir( sdir ), 'Input directory not found: %s' % inSH
155    self.ref = refTabChk()
156    fl = sorted( glob.glob( '%s/sh__so_*' % sdir ) )
157    tref = util_varGroups.varGroupSs()
158    tref.loadGroups()
159    tprobs = set()
160    self.sh = shelve.open( '%s/sh__consol01_revTabs' % sdir, 'n' )
161    self.sh['__cols__'] = ['var', 'table', 'mip', 'vid', 'priority','vgid']
162    self.sh['__info__'] = {'label':'revTable', 'title':'Revised variable table records generated by ingest.util_anal.revTabChk'}
163    cc = collections.defaultdict( int )
164    vgmaps = {'Oyr':'OMIP-Oyr','OImon':'SIMIP-seaicemon'}
165    kkk = 0
166    for f in fl:
167#
168#  CMIP5 and OMIP tables go in as reference tables, and so should not be duplicated here.
169#
170      ss = set()
171      sso = set()
172      if f.find( 'CMIP5' ) == -1 and  f.find( 'OMIP' ) == -1:
173        sh = shelve.open( f, 'r' )
174        for k in sh.keys():
175          if k[0] != '_':
176            assert k not in self.sh, 'Duplicate key in revised table items: %s' % k
177
178            vgl = sh[k][1].replace( '_', '-' )
179            ss.add(vgl)
180            if vgl in ['cf3hr-grid', 'cfMon-3dmod', 'cfMon-2dmod']:
181              if vgl not in sso:
182                print 'Warning: skipping ',sh[k]
183                sso.add( vgl )
184              vgid = '__unset__01__'
185            else:
186              vgl1 = vgmaps.get( vgl, vgl )
187              if vgl1 not in tref.uidByLabel:
188                if 'CMIP5-%s' % vgl1 in tref.uidByLabel:
189                   vgl1 = 'CMIP5-%s' % vgl1
190
191              if vgl1 not in tref.uidByLabel:
192                print 'SEVERE.requestvar.00001: group not found: %s' % vgl
193                vgid = '__vgid_not_found__'
194              else:
195                vgid = tref.uidByLabel[vgl1]
196                cc[vgl1] += 1
197            vid = sh[k][3]
198            self.sh[k]  = sh[k][:] + [vgid,]
199            if vid in self.ref.cmv:
200              sg = self.ref.cmv[vid][-1]
201              if sg not in [ '',None]:
202                sgs = sg.split('_')[-1]
203                vgl2 = '%s-%s' % (vgl1,sgs)
204                if vgl2 in tref.uidByLabel:
205                  vg2 = tref.uidByLabel[vgl2]
206                  rr = sh[k][:] + [vg2,]
207                  rr[2] = rr[2] + '_' + sgs
208                  k2 = str( uuid.uuid1() )
209                  self.sh[k2] = rr
210                else:
211                  print 'INFO.sg.00050: not found; ',vgl2, sg, sh[k]
212              else:
213                  print 'INFO.sg.00060: no subgroup; ',vgl, sg, sh[k]
214            else:
215                  print 'INFO.sg.00070: no cmv; ',sh[k]
216            kkk += 1
217        sh.close()
218        print f, ss
219    self.sh.close()
220    for k in sorted( tref.uidByLabel.keys() ):
221      print k, cc[k]
222    for k in cc:
223      if k not in tref.uidByLabel:
224         print 'ERROR: ',k, cc[k]
225    print 'TOTAL VARS REQUESTED HERE: ',kkk
226
227class refTabChk(object):
228
229  def __init__(self,sdir='inSh'):
230    """Review reference tables, as ingested into shelves, and annotate records"""
231    assert os.path.isdir( sdir ), 'Input directory not found: %s' % inSH
232    fl = sorted( glob.glob( '%s/sh__refso_*' % sdir ) )
233    tprobs = set()
234    self.sh = shelve.open( '%s/sh__consol01_refTabs' % sdir, 'n' )
235    self.cmv = dict()
236    self.cmvtv = dict()
237    self.tabInfo = util_gen.tableInfo()
238    self.sh['__cols__'] = self.tabInfo.oh
239    self.sh['__info__'] = {'label':'refTable', 'title':'Reference variable table records generated by ingest.util_anal.refTabChk'}
240    itab = self.tabInfo.oh.index( 'mipTable' )
241    icmv = self.tabInfo.oh.index( 'var' )
242    iix = self.tabInfo.oh.index( 'rowIndex' )
243    iv = self.tabInfo.oh.index( 'out_name' )
244    ivid = self.tabInfo.oh.index( 'vid' )
245    idim = self.tabInfo.oh.index( 'dimensions' )
246    iln = self.tabInfo.oh.index( 'title' )
247    iss = self.tabInfo.oh.index( 'ssect' )
248    igpid = self.tabInfo.oh.index( 'gpid' )
249    vref = util_varGroups.ref()
250    tref = util_varGroups.varGroupSs()
251    tref.loadGroups()
252     
253    gtm = set()
254    sss = set()
255    for f in fl:
256      self.actions = collections.defaultdict(int)
257      self.file = f
258      sh = shelve.open( f, 'r' )
259      ks = [k for k in sh if k[0] != '_']
260      for k in ks:
261       rr = sh[k][:]
262       uid = rr[0]
263       try:
264        tab = rr[itab]
265        tab = tref.mapGroupName(tab,'')
266        var = rr[iv]
267        if var not in vref.vars:
268           print 'SEVERE: var not found: %s',var
269           vid = '-'
270        else:
271           vid = vref.vars[var][0]
272
273        if tab not in tref.groupset:
274           print 'SEVERE: tab not found: %s',tab
275           gpid = '-'
276        else:
277           gpid = tref.groupset[tab][0]
278           gtm.add( (tab,tref.groupset[tab]) )
279       except:
280         print k, sh[k]
281         print itab,iv
282         raise
283       if tab not in tab2freq:
284         tprobs.add(tab)
285       rr[igpid] = gpid
286       rr[ivid] = vid
287       rr[-1] = int( float(rr[-1]) )
288       sg = ''
289       ## check to see if this table has sections, and identify which section this variable is in if appropriate
290       print 'INFO.sg.01001: ',tab,tab in self.tabInfo.tabChildren
291       if tab in self.tabInfo.tabChildren:
292         if tab in ['Omon','Oyr']:
293           sg = getSubGroupO(tab, var,rr[idim],rr[iln],rr[iix])
294         else:
295           sg = getSubGroup(tab, var,rr[idim],rr[iln],rr[iix])
296         print 'INFO.sg.00001: ',tab,var,rr[idim],rr[iix], sg
297         if sg != None:
298           sg1 = sg.replace( '_', '-' )
299           if sg1 in ['Amon-oth']:
300             sgid = '_na_'
301           else:
302             assert sg1 in tref.groupset, 'Subgroup not found in groupset: %s, %s' % (tab,sg)
303             sgid = tref.groupset[sg1][0]
304           rr[iss] = (sg,sgid)
305           if (sg,sgid) not in sss:
306             sss.add( (sg,sgid) )
307             print 'INFO.sg.00002: ',sg,sgid
308         else:
309           assert rr[iss] == '', 'Corrupted subgroup element: %s,%s,%s' % (iss,rr[iss],str(rr))
310
311           
312         
313       self.cmv[uid] = (tab, var, rr[idim], rr[iix], rr[iln],sg)
314       self.cmvtv[(tab,var)] = uid
315       if var == 'intppcalc':
316          print rr
317       if var in {'*','include Oyr 3D tracers'}:
318         print 'ERROR.copy.00890: ',f,rr
319       self.sh[k] = rr[:]
320    print gtm
321    self.sh['__source__'] = fl
322    self.sh.close()
323    print 'UNMAPPED tabs (to freq): ',tprobs
324
325class dynGrps(object):
326  def __init__(self,rftc):
327    sdir = 'inSh'
328    sh = shelve.open( '%s/sh__requestScoping' % sdir )
329    sh0 = shelve.open( '%s/sh__requestScoping_0' % sdir, 'r' )
330    for k in sh0:
331      mip, rec = sh0[k]
332      print mip,rec
333
334class varGroupChk(object):
335  cmip5Tables = [u'3hr', u'6hrLev', u'6hrPlev', u'Amon', u'LImon', u'Lmon', u'OImon', u'Oclim', u'Omon', u'Oyr', u'aero', u'cf3hr', u'cfDay', u'cfMon', u'cfOff', u'cfSites', u'day', u'fx']
336  def __init__(self,sdir='inSh'):
337    """Review var groups, as ingested into shelves, and annotate records"""
338    assert os.path.isdir( sdir ), 'Input directory not found: %s' % inSH
339    fl = sorted( glob.glob( '%s/sh__grp_*' % sdir ) )
340    self.ref = ref()
341    self.shl = {}
342    self.group2uid = {}
343    self.vgss = util_varGroups.varGroupSs()
344    self.vgss.loadGroups()
345    self.vgss.setUid()
346    self.vgss.checkMaps()
347    self.varsetoo = None
348    self.grps = set()
349    self.tbls = set()
350    self.frqs = set()
351    self.nnew = 0
352    self.nc5 = 0
353    self.noth = 0
354    self.ots = set()
355    isFirst = True
356    #self.sh = shelve.open( '%s/sh__consol01_grp' % sdir, 'n' )
357    self.sh = shelve.open( '%s/sh__consol01_groupItems' % sdir, 'n' )
358    self.shdvg = shelve.open( '%s/sh__consol01_dynVarGroup_requestVars' % sdir, 'n' )
359
360    self.shdvg['__info__'] = {'label':'dynVarGroup_requestVars', 'title':'Request variable records for dynamically generated variable groups (through variable names listed in request scoping). Generated by ingest.util_anal.varGroupChk'}
361    self.shdvg['__cols__'] = ['vid', 'title', 'label', 'priority', 'vgid', 'mip']
362
363    self.sh['__info__'] = {'label':'GroupItemsBeta', 'title':'Group Item records generated by ingest.util_anal.varGroupChk'}
364    self.sh['__cols__'] = ['group', 'var', 'table', 'freq', 'descriptionEx', 'shape', 'levels', 'tstyle', 'mask', 'misc', 'mip', 'uid', 'oldv', 'rowIndex', 'var2', 'new', 'gpid', 'vkey', 'vid']
365    self.mg = dict()
366    self.checkRequestedGroups()
367    for f in fl:
368      self.scanFile(f,isFirst)
369      isFirst = False
370
371    self.sh.close()
372    self.shdvg.close()
373    if self.varsetoo != None:
374      self.varsetoo.close()
375
376    sh = shelve.open( '%s/sh__requestScoping_1' % sdir,'n' )
377    for k in self.group2uid:
378       mip, uid, new = self.group2uid[k]
379       sh['%s__1' % str(k)] = (mip, uid )
380    sh.close()
381
382    for kkk in sorted(self.mg.keys()):
383      print 'WARNING: possible problem identifying group: ',self.mg[kkk]
384    print 'groups: ',self.grps
385    print 'tables: ',self.tbls
386    print 'frequencies: ',self.frqs
387    print 'nrefs to new: %s, cmip5: %s, other: %s' % (self.nnew, self.nc5, self.noth)
388    print 'other tables: ',self.ots
389    for k in self.shl:
390      self.shl[k].close()
391
392  def scanFile(self,f,isFirst):
393      self.actions = collections.defaultdict(int)
394      self.file = f
395      self.shl[f] = shelve.open( f, 'r' )
396      self.mip = self.shl[f]['__info__']['label']
397      if isFirst:
398        print self.shl[f]['__cols__']
399      ks = [k for k in self.shl[f].keys() if k[0] != '_']
400
401      for k in ks:
402        r = self.shl[f][k]
403        self.grps.add(r[0])
404        self.tbls.add(r[2])
405        self.frqs.add(r[3])
406        var = r[1].strip()
407        if var != r[1]:
408          print 'WARNING.blanks.0001: *%s* and *%s (%s,%s)' % (var,r[1],r[0],f)
409        extra = {}
410        if r[2] == 'new' or r[2][:2] == 'em':
411          extra['mode'] = 'new'
412          self.nnew +=1
413          if var not in self.ref.vars:
414            if var.find('_') != -1:
415              v2 = var.replace('_','')
416              if v2 in self.ref.vars:
417                print 'WARN: %s should be replaced with %s' % (var,v2)
418            print 'ERROR.missing.0001: variable not found: ',var,r[0],f
419          else:
420            if r[9] == '':
421              p1 = -1
422            else:
423              p1 = int( r[9] )
424            p2 = int( self.ref.vars[var][1] )
425            if p1 not in [1,2,3]:
426              if p2 in [1,2,3]:
427                extra['priority'] = p2
428              else:
429                print 'ERROR.priority.0001: %s (%s::%s), ref: %s, templ: %s' % (var,r[0],f,p2,p1)
430
431        elif r[2] in self.cmip5Tables or r[2][:5] == 'CMIP5' and r[2][6:] in self.cmip5Tables:
432          extra['mode'] = 'CMIP5'
433          self.nc5 += 1
434          if var not in self.ref.vars:
435            print 'ERROR.missing.0003: variable not found: ',var,r[0],f
436        else:
437          extra['mode'] = 'OTHER MIP'
438          self.noth += 1
439          self.ots.add( r[2] )
440          if var not in self.ref.vars:
441            print 'ERROR.missing.0002: variable not found: ',var,r[0],f
442##
443## but this is the MIP variable id ...... need the CMOR variable ID ?? ...
444##
445        vid = self.ref.vars.get(var,[None,])[0]
446        self.consol(k,r,vid,extra)
447      for k in sorted( self.actions.keys() ):
448           print 'ACTIONS: %s: %s -- %s' % (f,k,self.actions[k])
449
450
451  def varsets(self, thisuid, i1, refuid, i2, title ):
452    if self.varsetoo == None:
453      self.varsetoo = open('varsets.txt','w' )
454    self.varsetoo.write( '\t'.join(  [thisuid, str(i1), refuid, str(i2), title] ) + '\n' )
455 
456  def consol(self,rk,rr,vid,extra):
457##['Short name of group', 'Variable short name', 'Table', 'Frequency', 'Description extension (optional)', 'Shape', 'Levels', 'Time mean, point or climatology', 'Mask (optional)', 'Priority', 'MIP','uid','rowIndex', 'Prev. Var Name']
458##
459## following is provided by sx2.py:
460##['group', 'var', 'table', 'freq', 'descriptionEx', 'shape', 'levels', 'tstyle', 'mask', 'misc', 'mip', 'uid', 'rowIndex', 'new', 'gpid', 'vkey', 'vid']
461## need to add vid (info found above), vgid, "new" flag, (also above), and "vkey".
462
463    rset = []
464    r = list(rr)
465    if 'priority' in extra:
466       r[9] = extra['priority']
467    elif r[9] == '':
468       r[9] = -1
469    else:
470       r[9] = int( r[9] )
471
472    if not self.vgss.matchGroup(r[0],self.mip):
473        self.mg[r[0]] = (self.mip,r)
474        gpid = '__noGroupFound__'
475        new = 0
476    else:
477        if r[0] in self.group2uid:
478          assert self.vgss.groupMatchRes == self.group2uid[r[0]], 'Mismatch in group lookup ..%s [%s,%s]' % (r[0], str(self.vgss.groupMatchRes), str(self.group2uid[r[0]]) )
479        else:
480          self.group2uid[r[0]] = self.vgss.groupMatchRes
481        gpid = str(self.vgss.groupMatchRes[1] )
482        isnew = self.vgss.groupMatchRes[2] == 'new'
483        if isnew:
484          new = 1
485        else:
486          new = -1
487
488    il = 6
489    idx = 4
490    ixp = 9
491    iu = 11
492    assert r[iu] == rk, 'CONFUSED ABOUT UIDs? %s, %s' % (rk,r[iu])
493    var2 = r[1]
494    if r[il] in  {u'17 (or 23 )', u'17 (or 23)', u'17 (or23)', u'10/17/23'}:
495       self.actions['Create 17/23 level pair'] += 1
496       if r[il] == u'10/17/23':
497                lev0 = 10
498                levsp = [19,23]
499       else:
500                lev0 = 19
501                levsp = [23,]
502       r[ixp] = 1
503       r[il] = lev0
504       var2 = var2 + str( lev0 )
505       p = 1
506       for lp in levsp:
507                 p += 1
508                 rr0 = r + [r[1] + str(lp),]
509                 rr0[ixp] = p
510                 rr0[il] = lp
511                 rr0[iu] = str( uuid.uuid1() )
512                 rr = rr0 + [new, gpid, 0, vid]
513                 if r[1] == 'hus':
514                    print 'INFO.hus.00202: ',rr
515                 rset.append( rr )
516                 self.varsets(rr0[iu], 2, rr[iu], 1, 'variables at multiple vertical resolutions' )
517
518    elif r[il] in [u'Model levels or plev_27', u'Model levels or 27Plevs',u'27',27.]:
519               self.actions['27 level variant of variable name created' ] += 1
520               var2 += '27'
521               r[il] = 27
522    elif r[idx].find( '850 hPa' ) != -1:
523               if r[1][-3:] != '850':
524                  self.actions['850mb variant of variable generated'] += 1
525                  var2 += '850'
526    elif type( r[il] ) == type(1.) and r[il] == 7. and r[10] == 'HighResMIP' and r[5] != 'XYZKT':
527                  self.actions['Shape modified to XYZKT*'] += 1
528                  r[5] = r[5] + '*'
529                  r[il] = '7h'
530    r += [var2,new, gpid, 0, vid]
531    rset.append( r )
532    if r[10] != 'OMIP':
533      for ri in rset:
534        self.consol_sub01( ri, extra )
535    else:
536      self.actions['OMIP records skipped'] += 1
537
538  def consol_sub01( self, r, extra ):
539    iu = 11
540    assert r[iu] not  in self.sh
541    assert len(r) == len( self.sh['__cols__'] ), 'Bad record length .. %s'  % str(r)
542    self.sh[r[iu]] = r[:]
543
544  def checkRequestedGroups(self,sdir='inSh'):
545    sh = shelve.open( '%s/sh__requestScoping' % sdir, 'r' )
546    sh0 = shelve.open( '%s/sh__requestScoping_0' % sdir, 'n' )
547    cc = collections.defaultdict( int )
548    ff = set()
549    for mip in sorted( sh['__records__'].keys() ):
550      reqg = sh['__records__'][mip]
551      reqgd = dict()
552      self.mip = mip
553      for rec in reqg:
554        g = rec[0]
555        if g[:5] == 'CMIP5':
556         g = g[6:]
557        g0 = g
558        t = self.vgss.recChk(rec,mip)
559        dyngrp = t[0]
560        if dyngrp:
561          mtab, g = t[2]
562        if not self.vgss.matchGroup(g,self.mip) and not dyngrp:
563          print 'FAILED to match request group: ',self.mip,rec
564          ff.add( (self.mip,g) )
565        else:
566          assert self.vgss.groupMatchRes != None,  'Should have results from matchGroup here!!'
567          reqgd[g] = self.vgss.groupMatchRes
568          uid = str(self.vgss.groupMatchRes[1] )
569          rec[0] = self.vgss.groupName
570          kkk = '%s__%2.2i__%s' % (uid,cc[uid],0)
571          cc[uid] += 1
572          assert kkk not in sh0, 'Duplicate key for request link record: %s' % kkk
573          sh0[kkk] = [self.mip, rec ]
574          print 'INFO.vgrp.00001: ',kkk,self.mip,rec
575          if dyngrp:
576            self.saveDynGrp(g,mtab,uid)
577##
578## need to generate request variables for dynamic groups here (those detected via vgss )
579## would be nice to stage things ... create variable database and then add requests ....
580## "all at once" risks mis-alignments ...
581##
582## need to fill in details on dynamic groups after completion of scan of new groups.   
583##
584##
585    sh.close()
586    sh0.close()
587    if len(ff) > 0:
588      oo = open( 'varGroupSuggestions.csv', 'w' )
589      for t in sorted( list( ff ) ):
590        oo.write( '%s\t%s' % t )
591        oo.write( '\t%s\n' % str( uuid.uuid1() ) )
592      oo.close()
593
594  def saveDynGrp(self,glab,tab,rgid):
595    this = self.vgss.s2[glab]
596    print 'INFO.dyngrp.00001: ',rgid,this, glab
597    for k in this:
598      if k[0] != '_':
599        if this[k] == None:
600          print 'WARN.dyngrp.00002: variable not found: ',rgid,k, glab
601        else:
602          vid, priority = this[k]
603          rec = [vid, '%s: %s' % (glab,k), k, priority, rgid, self.mip] 
604          uid = str(uuid.uuid1() )
605          self.shdvg[uid] = rec
606
Note: See TracBrowser for help on using the repository browser.