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

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

adding util_gen

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)
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 cmvRef(object):
43  def __init__(self):
44    self.byUid = {}
45    self.byTab = collections.defaultdict( dict )
46    for l in open( 'ingest/cmvRef_01.beta.32.csv' ).readlines():
47      lab, tab, ttl, uid, defp = l.strip().split( '\t' )
48      assert uid not in self.byUid, 'DUPLICATE UID: %s' % uid
49      self.byUid[uid] = (lab,tab,ttl)
50      if lab in self.byTab[tab]:
51        print 'ERROR.cmvRef.001: duplicate variable name in cmv table: %s,%s' % (tab,lab)
52      self.byTab[tab][lab] = (uid,defp)
53
54class varGroupSs(object):
55  def __init__(self):
56    self.s1 = {'mmrdust,mmraerh2o,so2,mmrss':('aermonthly','aermonthly-subset-02'),
57               ##'conccmcn,concnmcn,conccn,ec550aer':('aermonthly','aero-subset-01'),
58               'reffclwc,reffclws':('emMon','emMon-subset-01'),
59               'pr,prc':('cf3hr','cf3hr-subset'),
60               'swtoaasso4, swtoaasaer, tntlw':('aermonthly','aermonthly-6hr'),
61               'ta, ua, va, wap, zg, hus':('Amon','Amon-subset-01'),
62               'tas, pr, psl':('Amon','Amon-subset-02'),
63               'tasmax,tasmin,pr,prc,uas,vas':('day','day-subset-01'),
64               'tasmax,tasmin, pr,hfls,hfss':('day','LEday-subset'),
65               'tas, pr, psl, uas':('day','day-subset-02'),
66               'ps':('cfDay','cfDay-subset-01'),
67               'difvmo,difvho,difvso':('Oclim','Oclim-subset-01'),
68               'rsdsdiff,cldnci,sconcso4,cldncl,rsdscsdiff,cldnvi,sconcss,sconcdust,loadso4,loadss':('aermonthly','aero-subset-02'),
69               'dryso4,wetso2,od550lt1aer,reffclwtop,dryss,wetso4,abs550aer,wetss,wetdust,dryso2,drydust,od550aer,emidust,emiss,emiso4,emiso2':('aermonthly','aermonthly-subset-01'),
70               'hfcorr, wfcorr, masso, pbo, pso, volo, zos, zostoga, masscello, thkcello, thetao, thetaoga, bigthetao, bigthetaoga, tos, tob, tomint, tosga, so, soga, sos, sob, somint, 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, hfsithermds, hfsithermds, hfds, zfull, zhalf':('Omon','Omon-subset-01'),
71               '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') }
72    self.s2 = {}
73
74##
75## self.us1 is used to collect the uids associated with above groups
76    self.us1 = {}
77    self.checkMaps()
78
79  def checkMaps(self):
80    cmv = cmvRef()
81    for k in self.s1:
82      vl = [x.strip() for x in k.split(',')]
83      tab,glab = self.s1[k]
84      this = {}
85      if tab not in cmv.byTab:
86        print 'WARNING: table not recognised (group??): %s' % tab
87     
88      nf = []
89      for v in vl:
90          if v not in cmv.byTab[tab]:
91            this[v] = None
92            nf.append(v)
93          else:
94            this[v] = cmv.byTab[tab][v]
95      if len(nf) == 0:
96          print 'INFO.chkmap.00001: Success: all found: ',k
97      else:
98          print 'SEVERE.chkmap.00002: Not found (%s/%s) in %s:: %s' % (len(nf),len(vl),tab,str(nf))
99      this['_meta'] = (k,tab,glab,nf)
100      self.s2[glab] = this
101
102  def recChk(self,rec,mip,sdir='inSh'):
103      l1 = str(rec[1]).strip()
104      l2 = str(rec[2]).strip()
105
106      if l1 not in ['','all','priority','list']:
107        if l1 not in self.s1:
108          print 'ENTRY [1] not recognised: ',mip,rec[0],l1,l2
109        else:
110          return (True,1,self.s1[l1] )
111
112      elif l2 != '' and str(l2)[0] != '#' and l1 not in  ['priority','all']:
113        if l2 not in self.s1:
114          print 'ENTRY [2] not recognised: ',mip,rec[0],l1,l2
115        else:
116          return (True,2,self.s1[l2] )
117      return (False,None, None)
118       
119  def run(self,sdir='inSh'):
120    sh = shelve.open( '%s/sh__requestScoping' % sdir )
121    ks = [k for k in sh.keys() if k[0] != '_' and k[-3:] == '__0']
122    print 'Request link records: ',len(ks)
123    cc = collections.defaultdict( set )
124    for k in ks:
125      mip, rec = sh[k]
126      l1 = str(rec[1]).strip()
127      l2 = str(rec[2]).strip()
128
129      if l1 not in ['','all','priority','list']:
130        if l1 not in self.s1:
131          print 'ENTRY [1] not recognised: ',mip,rec[0],l1
132        else:
133          ##print 'ENTRY [3] recognised: ',mip,rec[0],l1
134          cc[l1].add(mip)
135          sh[k[:-1] + '2'] = self.s1[l1]
136
137      elif l2 != '' and str(l2)[0] != '#' and l1 not in  ['priority','all']:
138        if l2 not in self.s1:
139          print 'ENTRY [2] not recognised: ',mip,rec[0],l1,l2
140        else:
141          ##print 'ENTRY [4] recognised: ',mip,rec[0],l1,l2
142          cc[l2].add(mip)
143          sh[k[:-1] + '2'] = self.s1[l2]
144       
145    for s in self.s1:
146      if s not in cc:
147        print 'option not used: ',s
148    for k in sorted( cc.keys() ):
149      print 'USED: in %s: %s ' % (str(cc[k]),k)
150
151  def setUid(self):
152    s0 = set()
153    for k in self.s1:
154       mtab, g = self.s1[k]
155       assert g not in s0,'Duplicated group declaration: %s' % g
156       s0.add(g)
157       if not self.matchGroup( g,'--nomip--' ):
158          print 'SEVERE: Failed to match group: ',mtab,g
159       else:
160          t = self.groupMatchRes
161          print 'SETTING uid: ',g,t[1]
162          self.us1[g] = t[1]
163         
164  def mapGroupName(self,gn,mip):
165    k = gn
166    k = k.replace( '.', '-' )
167    k = k.replace( '_', '-' )
168    if k[:8] == 'CFMIP-cf':
169      k = k[8:]
170    elif k[:8] == 'CMIP5-cf':
171      k = k[8:]
172    elif k[:7] == 'CMIP5-O':
173      k = k[7:]
174    elif k[:6] == 'OMIP-O':
175      k = k[6:]
176    elif k[:4] == 'DYVR':
177      k = 'DynVar' + k[4:]
178    elif k[:2] == 'C-':
179      k = k[2:]
180
181    if k in self.kmap:
182      k = self.kmap[k]
183    print 'INFO.kmap.00001: ',gn,k
184    return k
185
186  def loadGroups(self):
187    wb = workbook( 'ingest/sortedVarGroups.xls' ) 
188    sh = wb.book.sheet_by_name( 'Sheet1' )
189    self.groupset = {}
190    self.vg = {}
191    self.uidByLabel = {}
192    self.kmap = {}
193    for i in range( sh.nrows ):
194      rr = [x.value.strip() for x in sh.row(i)]
195      if rr[4] == u'':
196        self.groupset[rr[0]] = ( rr[7], rr[8], rr[1], rr[2], rr[6] )
197      else:
198        self.groupset[rr[0]] = ( rr[7], rr[8], rr[1], rr[2], rr[4], rr[6] )
199      if rr[2] != '':
200        if rr[2].find(' ') != -1:
201          for x in rr[2].split( ):
202            self.kmap[x] = rr[0]
203        else:
204          self.kmap[rr[2]] = rr[0]
205      uid, label, title, mip, ref, refNote = [rr[x] for x in [7,0,5,1,8,6] ]
206      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]) )
207      ##self.vg[uid] = nt__varGroup._make( [uid, label, title, mip, ref, refNote] )
208      assert label not in self.uidByLabel, 'DUPLICATE variable group label: %s' % label
209      self.uidByLabel[label] = uid
210
211  def matchGroup(self,k,mip):
212    """Match group based in id and mip .... scanned groups from reference spreadsheet"""
213    td = dict()
214    td2 = dict()
215    mext = {'C4MIP':'LUMIP'}
216    self.groupMatchRes = None
217    for x in self.groupset:
218       if self.groupset[x][2] == mip or mip in mext and self.groupset[x][2] == mext[mip]:
219          for y in self.groupset[x][4:]:
220             assert y not in td, 'Duplicated lookup for %s (%s,%s)' % (y,td[y],str(self.groupset[x]))
221             td[y] = (self.groupset[x][0],self.groupset[x][1])
222       if self.groupset[x][3] != u'':
223         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])
224         td2[self.groupset[x][3]] = (self.groupset[x][0],self.groupset[x][1])
225
226    k = k.replace( '.', '-' )
227    k = k.replace( '_', '-' )
228    k = self.mapGroupName(k,mip)
229
230    if mip != 'CMIP5':
231      if '%s.%s' % (mip,k) in td:
232         self.groupMatch = 1
233         k1 = '%s.%s' % (mip,k)
234         self.groupMatchRes = (k1,td[k1][0],td[k1][1]) 
235         self.groupName = k1
236         return True
237
238    kb = '%s-%s' % (mip,k)
239    if kb in self.groupset:
240       self.groupMatch = 2
241       self.groupMatchRes = (kb,self.groupset[kb][0],self.groupset[kb][1])
242       self.groupName = kb
243       return True
244
245    if k in self.groupset:
246      self.groupMatch = 0
247      self.groupMatchRes = (k,self.groupset[k][0],self.groupset[k][1])
248      self.groupName = k
249      return True
250
251    if k in td2:
252      self.groupMatch = 3
253      self.groupMatchRes = (k,td2[k][0],td2[k][1])
254      self.groupName = k
255      return True
256
257    return False
258
259if __name__ == '__main__':
260   vg = varGroupSs()
261   vg.checkMaps()
262   vg.loadGroups()
263   vg.setUid()
Note: See TracBrowser for help on using the repository browser.