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

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

misc updates

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