source: CMIP6dreqbuild/trunk/src/workbook/ivg.py @ 623

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/workbook/ivg.py@623
Revision 623, 8.9 KB checked in by mjuckes, 4 years ago (diff)

partial updates for AerChemMIP, SIMIP

Line 
1from scansh import rq
2import string, collections, uuid
3
4cmip5GrpLk = collections.defaultdict( dict )
5
6class cellMethodCheck(object):
7  def __init__(self):
8    pass
9  def check(self,cm):
10      if string.find( cm, "area: where" ) != -1:
11        return  ( string.replace( cm, "area: where", "area: mean where" ), 1)
12      elif string.find( cm, "time:mean" ) != -1:
13        return  ( string.replace( cm, "time:mean", "time: mean" ), 1)
14      elif string.find( cm, "weighted b " ) != -1:
15        return  ( string.replace( cm, "weighted b ", "weighted by " ), 1)
16      else:
17        return (cm,0)
18
19class tableUtils(object):
20  def __init__(self):
21    self.subGroup = None
22    self.sgset = set()
23    self.dset001 = set()
24    self.vdict = {}
25    self.sgsetExpected = {'Amon_2d', 'Omon_3d', 'Omon_oth', 'Oyr_3dtr', 'aero_3d', 'aero_oth', 'cf3hr_grid', 'cf3hr_sim', 'cfDay_2d', 'cfDay_3d', 'cfMon_2dmod', 'cfMon_3dmod', 'cfMon_3dstd', 'cfMon_sim', 'day_oth', 'day_ss'}
26
27  def subGroupCheck(self):
28    d1 = list( self.sgsetExpected.difference( self.sgset ) )
29    d2 = list( self.sgset.difference( self.sgsetExpected ) )
30    ok = True
31    if len(d1) > 0:
32      print 'ERROR.sg01.00001: not all expected subgroups found ',sorted(d1)
33      ok = False
34    if len(d2) > 0:
35      print 'ERROR.sg01.00002: not all found subgroups expected ',sorted(d2)
36      ok = False
37    return ok
38   
39  def getSubGroup(self,dims,tab0,var,ixs,ttl,uid, priority):
40    '''Used to identify subgroups of variables in CMIP5 tables and revised versions of these tables'''
41    self.subGroup = None
42    sg = None
43    if tab0[:5] == 'CMIP5':
44      tab = tab0[6:]
45    elif tab0[:4] == 'OMIP':
46      tab = tab0[5:]
47    else:
48      tab = tab0
49    ix = int( ixs )
50   
51##
52## this is probably unreliable .... also not used ..... (March 2016)
53##
54    if tab == 'Oyr' and ix < 60:
55          sg = 'Oyr_3dtr'
56    elif tab == 'Amon':
57          if string.find( dims, 'lev' ) == -1 and string.find( dims, 'longitude|latitude') != -1:
58            sg = 'Amon_2d'
59    elif tab == 'Omon':
60          if string.find( dims, 'longitude|latitude|olevel' ) != -1:
61            sg = 'Omon_3d'
62          else:
63            sg = 'Omon_oth'
64    elif tab == 'cfMon':
65          if ttl[:5] in ['ISCCP','PARAS','CALIP']:
66            sg = 'cfMon_sim'
67          elif var[-3:] == 'co2':
68            if string.find( dims, 'longitude|latitude|alev' ) != -1:
69              sg = 'cfMon_3dmod'
70            else:
71              sg = 'cfMon_2dmod'
72          else:
73            sg = 'cfMon_3dstd'
74    elif tab == 'cfDay':
75        try:
76          bits = string.split( dims, '|' )
77          if string.find( dims, 'longitude|latitude' ) != -1 and len(bits) > 2 and bits[2] in ['alev','alevel','alevhalf','alt40','plev7','alt40']:
78              sg = 'cfDay_3d'
79          else:
80              sg = 'cfDay_2d'
81        except:
82          print 'Failed to parse: ',dims
83    elif tab == 'cf3hr':
84          if string.find( dims, 'longitude|latitude' ) != -1:
85              sg = 'cf3hr_grid'
86          else:
87              sg = 'cf3hr_sim'
88    elif tab == 'aero':
89          if string.find( dims, 'longitude|latitude|alevel' ) != -1:
90              sg = 'aero_3d'
91          else:
92              sg = 'aero_oth'
93    elif tab == 'day':
94          if ix < 28:
95              sg = 'day_ss'
96          else:
97              sg = 'day_oth'
98    if sg != None:
99      self.subGroup = sg
100      self.sgset.add(sg)
101      self.vdict[uid] = (var,ttl,'CMIP6',tab,sg, priority)
102      return True
103    else:
104      if tab0 not in self.dset001:
105        print 'No SUBGROUP: ', tab0
106        self.dset001.add(tab0)
107      return False
108
109class structureList(object):
110  def __init__(self):
111    self.ll = []
112    self.nt_dims = collections.namedtuple( 'dims', ['uid','label','spid','tmid','odims','coords','cell_methods','cell_measures','flag_values','flag_meanings','description','procNote','prov'] )
113    self.ee3 = {}
114    self.cmch = cellMethodCheck()
115
116  def add(self,cand):
117
118    cm, fl = self.cmch.check( cand[6] )
119    if fl == 1:
120      cand[6] = cm
121    nt =  self.nt_dims._make( cand )
122    tt = tuple( [nt.__dict__[k] for k in ['spid','tmid','odims','coords','cell_methods','cell_measures','flag_values','flag_meanings','procNote','prov']] )
123    if self.ee3.has_key( tt ):
124      u = self.ee3[tt]
125    else:
126      u = nt.uid
127      self.ee3[tt] = nt.uid
128      self.ll.append( nt )
129    return u
130
131freqmap = {'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'  }
132
133class c1(object):
134  def __init__(self):
135    self.a = collections.defaultdict( list )
136
137for k in rq.cmip5Grps.keys():
138  bits = string.split(k,'_')
139  tab = bits[0]
140  for v in rq.cmip5Grps[k]:
141    cmip5GrpLk[tab][v] = k
142
143class prepRequestVar(object):
144  def __init__(self, addex):
145    self.eern = collections.defaultdict( list )
146    self.eern2 = {}
147    self.err0010 = collections.defaultdict( int )
148    self.err0020 = collections.defaultdict( int )
149
150    self.exrqvg = {}
151    if addex:
152      ###
153      extravg = [
154              ['OMIP', u'OMIP-Oyr', u'OMIP: OMIP-Oyr', 'CMIP5Rev', u'OMIP.Oyr'],
155##               ['OMIP', u'OMIP-Omon', u'OMIP: OMIP-Omon', 'CMIP5Rev', u'OMIP.Omon'],
156               ['OMIP', u'OMIP-day', u'OMIP: OMIP-day', 'CMIP5Rev', u'OMIP.day'],
157               ##['OMIP', u'OMIP-fx', u'OMIP: OMIP-fx', 'CMIP5Rev', u'OMIP.fx'],
158                     ]
159      for r in extravg:
160        thisuuid = str( uuid.uuid1() )
161        self.exrqvg[thisuuid] = [thisuuid ,] + r[:]
162
163    ixrn = 5
164    dups = []
165    for i,k in [ (rq.rqvg[k],k) for k in  rq.rqvg.keys() if k[0] != '_']:
166        kk = ['uid', 'mip', 'tab', 'objective', 'grid', 'gridreq', 'comment', 'ref', 'refNote', 'refid']
167        kk = ['uuid', 'mip', 'label', 'title', 'ref', 'refNote']
168
169        self.eern[i[ixrn]].append( i[0] )
170        k2 = '%s__%s' % (i[ixrn-1],i[ixrn])
171        if self.eern2.has_key( k2 ):
172           dups.append( (k2,k,self.eern2[k2]) )
173        self.eern2[k2] = i[0]
174        assert i[0] == k, 'Bad key/uuid'
175
176    assert len( dups ) == 0, 'Duplicate refs: %s' % str(dups)
177
178##
179## add var groups if missing
180##
181    self.addExrqvg = []
182    for i,k in [(self.exrqvg[k],k) for k in self.exrqvg.keys()]:
183        kk = ['uid', 'mip', 'tab', 'objective', 'grid', 'gridreq', 'comment', 'ref', 'refNote', 'refid']
184        kk = ['uuid', 'mip', 'label', 'title', 'ref', 'refNote']
185
186        self.eern[i[ixrn]].append( i[0] )
187        k2 = '%s__%s' % (i[ixrn-1],i[ixrn])
188        if not self.eern2.has_key( k2 ):
189          self.addExrqvg.append( k )
190          self.eern2[k2] = i[0]
191          assert i[0] == k, 'Bad key/uuid'
192
193  def getvgid( self, ll ):
194            kvg = 'CMIP5Rev__%s.%s' % ( ll[2],ll[1] )
195            kvg2 = '%s__%s' % ( ll[2],ll[1] )
196            kvg3 = 'rev__%s.%s' % ( ll[2],ll[1] )
197            if self.eern2.has_key(kvg):
198              vgid = self.eern2[kvg]
199            elif self.eern2.has_key(kvg3):
200              vgid = self.eern2[kvg3]
201            elif self.eern2.has_key(kvg2):
202              vgid = self.eern2[kvg2]
203            elif ll[0] != None and cmip5GrpLk[ll[1]].has_key(ll[0]):
204              g2 = cmip5GrpLk[ll[1]][ll[0]]
205              kvg2 = 'CMIP5Rev__%s.%s' % ( ll[2],g2 )
206              if self.eern2.has_key(kvg2):
207                vgid = self.eern2[kvg2]
208              else:
209                vgid = '__vg_not_found_1__'
210                self.err0010[(ll[2],ll[1] )] += 1
211            else:
212              vgid = '__vg_not_found_2__'
213              self.err0020[(ll[2],ll[1] )] += 1
214            return vgid
215
216  def run(self):
217    self.rqv_vg = {}
218    for k in rq.revti.keys():
219      if k[0] != '_':
220            ll = rq.revti[k]
221            vgid = self.getvgid( ll )
222            self.rqv_vg['%s.%s.%s' % (ll[2],ll[1],ll[0])] = vgid
223
224class checkCmv(object):
225  def __init__(self,tlist):
226#
227# sort by cmor name and frequency
228#
229    cc = collections.defaultdict( list )
230    for tt in tlist:
231                fr = freqmap.get( tt.freq, tt.freq )
232                prov = '%s [%s]' % (tt.mip,tt.group)
233                cc[ '%s.%s' % (fr,tt.cmorv)].append( (tt.uid, prov, tt.var ) )
234
235    nm = 0
236    cc2 = collections.defaultdict( list )
237    cc3 = collections.defaultdict( dict )
238    ee = {}
239    for k in cc.keys():
240              if len( cc[k] ) > 1:
241                nm += 1
242                plist = tuple( sorted( [i[1] for i in cc[k]] ) )
243##
244## sort by provenance groupings
245##
246                cc2[plist].append( k )
247##
248## indexed by provenance (NB there could be duplication of "prov" values leading to over-writing
249##
250                for i in cc[k]:
251                  cc3[k][i[1]]  = i
252 
253    print 'INFO.001.22222: number of duplicate cmor table entries in annex =',nm
254##
255## pick out the C4MIP, PMIP pairs
256##
257    self.uidReplace = {}
258    for k in sorted( cc2.keys() ):
259               if len(k) == 2 and k[0][:5] == 'C4MIP' and k[1][:4] == 'PMIP':
260                 for k2 in cc2[k]:
261                   print 'Pref: %s; depricated : %s ' % (cc3[k2][k[0]], cc3[k2][k[1]] )
262                   self.uidReplace[cc3[k2][k[1]][0]] = cc3[k2][k[0]][0]
263               print 'INFO.001.22222: ',k, len( cc2[k] )
Note: See TracBrowser for help on using the repository browser.