source: CMIP6dreqbuild/trunk/src/framework/ingest/util_varGroups.py @ 948

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

candidate

Line 
1
2from xceptions import baseException
3import shelve, glob, os, uuid, collections, string
4from utils_wb import workbook
5import mipTab
6
7##
8## want to match up with input/vars_... and  where is cmv uid fixed ????
9##
10##
11## need to migrate new vars into input/vars_ ... especially from LUMIP ...
12##
13## new variables which need to be added have been identified. No eheck for modifications (and no clear workflow here)...
14## ned to check .. a few appear spurious .. and then generate csv records ... for manual copy ...
15##
16##
17##
18## add AerChemMip and VIACS to stuff scanned and checked below .....
19
20class ref(object):
21  def __init__(self,sdir='inSh'):
22    dir1 = '/data/tmp/svn3/exarch/CMIP6dreqbuild/trunk/src/workbook'
23    wb = workbook( '%s/%s' % (dir1,'inputs/vars_20160721.xls') )
24
25    self.vars = {}
26    s1 = wb.book.sheet_by_name(u'var')
27    su = set()
28    for i in range( s1.nrows ):
29      r = s1.row(i)
30      assert r[0] not in self.vars, 'DUPLICATE VARIABLE: %s' % str(r)
31      ### lookup for uid, priority
32      self.vars[r[0].value] = (r[9].value,r[10].value,r[7].value)
33
34  def check(self):
35    fl = sorted( glob.glob( '%s/sh__newVar_*' % sdir ) )
36    for f in fl:
37      sh = shelve.open( f, 'r' )
38      ks = [k for k in sh.keys() if k[0] != '_']
39      for k in ks:
40        if k not in self.vars:
41          print 'MISSING NEW: %s, %s, %s' % (k,f,str(sh[k]))
42
43class refCmv(object):
44  def __init__(self):
45      self.byTab = collections.defaultdict( dict )
46      sh = shelve.open( 'inSh/refCmvId', 'r' )
47      for k in sh.keys():
48        tab, lab, ver = sh[k]
49        self.byTab[tab][lab] = k
50
51class cmvRef(object):
52  def __init__(self):
53    self.byUid = {}
54    self.byTab = collections.defaultdict( dict )
55    for l in open( 'ingest/cmvRef_01.beta.32.csv' ).readlines():
56      lab, tab, ttl, uid, defp = l.strip().split( '\t' )
57      assert uid not in self.byUid, 'DUPLICATE UID: %s' % uid
58      self.byUid[uid] = (lab,tab,ttl)
59      if lab in self.byTab[tab]:
60        print 'ERROR.cmvRef.001: duplicate variable name in cmv table: %s,%s' % (tab,lab)
61      self.byTab[tab][lab] = (uid,defp)
62
63class varGroupSs(object):
64  def __init__(self):
65    self.s1 = {'mmrdust,mmraerh2o,so2,mmrss':('aermonthly','aermonthly-subset-02'),
66               ##'conccmcn,concnmcn,conccn,ec550aer':('aermonthly','aero-subset-01'),
67               'reffclwc,reffclws':('emMon','emMon-subset-01'),
68               'pr,prc':('3hr','cf3hr-subset'),
69               ##'swtoaasso4, swtoaasaer, tntlw':('aermonthly','aermonthly-6hr'),
70               'ta, ua, va, wap, zg, hus':('Amon','Amon-subset-01'),
71               'tas, pr, psl':('Amon','Amon-subset-02'),
72               'tasmax,tasmin,pr,prc,uas,vas':('day','day-subset-01'),
73               'tasmax,tasmin, pr,hfls,hfss':('day','LEday-subset'),
74               'tas, pr, psl, uas, vas':('day','day-subset-02'),
75               'ps':('cfDay','cfDay-subset-01'),
76               'difvmo,difvho,difvso':('Oclim','Oclim-subset-01'),
77               'rsdsdiff,cldnci,sconcso4,cldncl,rsdscsdiff,cldnvi,sconcss,sconcdust,loadso4,loadss':('emMon','aero-subset-02'),
78               'dryso4,wetso2,od550lt1aer,reffclwtop,dryss,wetso4,abs550aer,wetss,wetdust,dryso2,drydust,od550aer,emidust,emiss,emiso4,emiso2':('aermonthly','aermonthly-subset-01'),
79               'hfcorr, wfcorr, masso, pbo, pso, volo, zos, zostoga, masscello, thkcello, thetao, thetaoga, bigthetao, bigthetaoga, tos, tob, tosga, so, soga, sos, sob, msftbarot, uo, vo, wmo, msftmyz, msftmrho, msftyyz, msftyrho, msftmzmpa, msftmrhompa, msftyzmpa, msftyrhompa, msftmzsmpa, msftyzsmpa, hfbasin, hfbasinpmadv, hfbasinpmdiff, hfbasinpsmadv, hfbasinpadv, fsitherm, wfo, wfonocorr, sfdsi, sfriver, hfsifrazil, hfsifrazil, hfds, zfullo, zhalfo':('Omon','Omon-subset-01'),
80               ##'thkcello,wmo,uo,hfnorth,tos,sos,soga,masscello,hfy,msftmrho,masso,pso,mlotst,zos,zostoga,rhopoto,hfydiff,hfbasin,ficeberg2d,thetao,so,zossga,dpco2,msftmyz,tauvo,sfdsi,msftyrho,spco2,fddtalk,hfxdiff,omlmax,htovovrt,sltovovrt,vmo,tauuo,volo,zsatarag,fgco2,zosga,wfo,vo,msftyyz,mfo,ficeberg,friver,msftbarot,umo,intpcalcite,intparag,fddtdic,hfx,agessc,hfbasindiff':('Omon','Omon-subset-02')
81                }
82    self.s2 = {}
83
84##
85## self.us1 is used to collect the uids associated with above groups
86    self.us1 = {}
87    self.checkMaps()
88
89  def checkMaps(self):
90    mipt = mipTab.mipt()
91    cmv = cmvRef()
92    cmv2 = refCmv()
93    for k in self.s1:
94      vl = [x.strip() for x in k.split(',')]
95      tab,glab = self.s1[k]
96      this = {}
97      if tab not in cmv.byTab:
98        print 'WARNING: table not recognised (group??): %s' % tab
99     
100      nf = []
101      for v in vl:
102          if v in cmv2.byTab[tab]:
103            thist = tab
104          elif tab in mipt.map and mipt.map[tab] in cmv2.byTab and v in cmv2.byTab[mipt.map[tab]]:
105            thist = mipt.map[tab]
106          else:
107            thist = None
108
109          if thist == None:
110            this[v] = None
111            nf.append(v)
112          else:
113            uid = cmv2.byTab[thist][v]
114            if v in cmv.byTab[tab]:
115              x,p = cmv.byTab[tab][v]
116            else:
117              p = '108'
118            this[v] = (uid,p)
119
120      if len(nf) == 0:
121          print 'INFO.chkmap.00001: Success: all found: ',k
122      else:
123          print 'SEVERE.chkmap.00002: Not found (%s/%s) in %s:: %s' % (len(nf),len(vl),tab,str(nf))
124
125      this['_meta'] = (k,tab,glab,nf)
126      self.s2[glab] = this
127
128  def recChk(self,rec,mip,sdir='inSh'):
129      l1 = str(rec[1]).strip()
130      l2 = str(rec[2]).strip()
131
132      if l1 not in ['','all','priority','list']:
133        if l1 not in self.s1:
134          print 'ENTRY [1] not recognised: ',mip,rec[0],l1,l2
135        else:
136          return (True,1,self.s1[l1] )
137
138      elif l2 != '' and str(l2)[0] != '#' and l1 not in  ['priority','all']:
139        if l2 not in self.s1:
140          print 'ENTRY [2] not recognised: ',mip,rec[0],l1,l2
141        else:
142          return (True,2,self.s1[l2] )
143      return (False,None, None)
144       
145  def run(self,sdir='inSh'):
146    sh = shelve.open( '%s/sh__requestScoping' % sdir )
147    ks = [k for k in sh.keys() if k[0] != '_' and k[-3:] == '__0']
148    print 'Request link records: ',len(ks)
149    cc = collections.defaultdict( set )
150    for k in ks:
151      mip, rec = sh[k]
152      l1 = str(rec[1]).strip()
153      l2 = str(rec[2]).strip()
154
155      if l1 not in ['','all','priority','list']:
156        if l1 not in self.s1:
157          print 'ENTRY [1] not recognised: ',mip,rec[0],l1
158        else:
159          ##print 'ENTRY [3] recognised: ',mip,rec[0],l1
160          cc[l1].add(mip)
161          sh[k[:-1] + '2'] = self.s1[l1]
162
163      elif l2 != '' and str(l2)[0] != '#' and l1 not in  ['priority','all']:
164        if l2 not in self.s1:
165          print 'ENTRY [2] not recognised: ',mip,rec[0],l1,l2
166        else:
167          ##print 'ENTRY [4] recognised: ',mip,rec[0],l1,l2
168          cc[l2].add(mip)
169          sh[k[:-1] + '2'] = self.s1[l2]
170       
171    for s in self.s1:
172      if s not in cc:
173        print 'option not used: ',s
174    for k in sorted( cc.keys() ):
175      print 'USED: in %s: %s ' % (str(cc[k]),k)
176
177  def setUid(self):
178    s0 = set()
179    for k in self.s1:
180       mtab, g = self.s1[k]
181       assert g not in s0,'Duplicated group declaration: %s' % g
182       s0.add(g)
183       if not self.matchGroup( g,'--nomip--' ):
184          print 'SEVERE: Failed to match group: ',mtab,g
185       else:
186          t = self.groupMatchRes
187          print 'SETTING uid: ',g,t[1]
188          self.us1[g] = t[1]
189         
190  def mapGroupName(self,gn,mip):
191    k = gn
192    k = k.replace( '.', '-' )
193    k = k.replace( '_', '-' )
194    if k[:8] == 'CFMIP-cf':
195      k = k[8:]
196    elif k[:8] == 'CMIP5-cf':
197      k = k[8:]
198    elif k[:7] == 'CMIP5-O':
199      k = k[7:]
200    elif k[:6] == 'OMIP-O':
201      k = k[6:]
202    elif k[:4] == 'DYVR':
203      k = 'DynVar' + k[4:]
204    elif k[:2] == 'C-':
205      k = k[2:]
206
207    if k in self.kmap:
208      k = self.kmap[k]
209    print 'INFO.kmap.00001: ',gn,k
210    return k
211
212  def loadGroups(self):
213    wb = workbook( 'ingest/sortedVarGroups.xls' ) 
214    sh = wb.book.sheet_by_name( 'Sheet1' )
215    self.groupset = {}
216    self.vg = {}
217    self.uidByLabel = {}
218    self.kmap = {}
219    for i in range( sh.nrows ):
220      rr = [x.value.strip() for x in sh.row(i)]
221      if rr[4] == u'':
222        self.groupset[rr[0]] = ( rr[7], rr[8], rr[1], rr[2], rr[6] )
223      else:
224        self.groupset[rr[0]] = ( rr[7], rr[8], rr[1], rr[2], rr[4], rr[6] )
225      if rr[2] != '':
226        if rr[2].find(' ') != -1:
227          for x in rr[2].split( ):
228            self.kmap[x] = rr[0]
229        else:
230          self.kmap[rr[2]] = rr[0]
231      uid, label, title, mip, ref, refNote = [rr[x] for x in [7,0,5,1,8,6] ]
232      assert uid not in self.vg, 'DUPLICATE variable group id: %s\n%s\n%s\n' % (uid,str(self.vg[uid]),str([uid, label, title, mip, ref, refNote]) )
233      ##self.vg[uid] = nt__varGroup._make( [uid, label, title, mip, ref, refNote] )
234      assert label not in self.uidByLabel, 'DUPLICATE variable group label: %s' % label
235      self.uidByLabel[label] = uid
236
237  def matchGroup(self,k,mip):
238    """Match group based in id and mip .... scanned groups from reference spreadsheet"""
239    td = dict()
240    td2 = dict()
241    mext = {'C4MIP':'LUMIP'}
242    self.groupMatchRes = None
243    for x in self.groupset:
244       if self.groupset[x][2] == mip or mip in mext and self.groupset[x][2] == mext[mip]:
245          for y in self.groupset[x][4:]:
246             assert y not in td, 'Duplicated lookup for %s (%s,%s)' % (y,td[y],str(self.groupset[x]))
247             td[y] = (self.groupset[x][0],self.groupset[x][1])
248       if self.groupset[x][3] != u'':
249         assert self.groupset[x][3] not in td2, 'Duplicated lookup for %s (%s,%s)' % (self.groupset[x][3],td2[self.groupset[x][3]],self.groupset[x][0])
250         td2[self.groupset[x][3]] = (self.groupset[x][0],self.groupset[x][1])
251
252    k = k.replace( '.', '-' )
253    k = k.replace( '_', '-' )
254    k = self.mapGroupName(k,mip)
255
256    if mip != 'CMIP5':
257      if '%s.%s' % (mip,k) in td:
258         self.groupMatch = 1
259         k1 = '%s.%s' % (mip,k)
260         self.groupMatchRes = (k1,td[k1][0],td[k1][1]) 
261         self.groupName = k1
262         return True
263
264    kb = '%s-%s' % (mip,k)
265    if kb in self.groupset:
266       self.groupMatch = 2
267       self.groupMatchRes = (kb,self.groupset[kb][0],self.groupset[kb][1])
268       self.groupName = kb
269       return True
270
271    if k in self.groupset:
272      self.groupMatch = 0
273      self.groupMatchRes = (k,self.groupset[k][0],self.groupset[k][1])
274      self.groupName = k
275      return True
276
277    if k in td2:
278      self.groupMatch = 3
279      self.groupMatchRes = (k,td2[k][0],td2[k][1])
280      self.groupName = k
281      return True
282
283    return False
284
285if __name__ == '__main__':
286   vg = varGroupSs()
287   vg.checkMaps()
288   vg.loadGroups()
289   vg.setUid()
Note: See TracBrowser for help on using the repository browser.