source: CMIP6dreqbuild/trunk/src/framework/ing02/updOmip.py @ 1081

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

add missing file

Line 
1import shelve, collections
2import loadcf
3
4class upd(object):
5  oh = ['uid', 'comment', 'deflate_level', 'shuffle', 'ok_max_mean_abs', 'flag_meanings', 'type', 'ok_min_mean_abs', 'sn', 'deflate', 'title', 'valid_min', 'cell_methods', 'flag_values', 'cell_measures', 'out_name', 'modeling_realm', 'units', 'cell_methods_xx', 'valid_max', 'positive', 'var', 'mipTable', 'dimensions', 'vid', 'processing', 'gpid','rowIndex','ssect', 'priority']
6  ih = [u'label', u'mipTable', u'description', u'frequency', u'defaultPriority', u'deflate', u'deflate_level', u'mipTableSection', u'modeling_realm', u'mtid', u'positive', u'processing', u'prov', u'provNote', u'rowIndex', u'shuffle', u'stid', u'subGroup', u'title', u'type', u'uid', u'vid']
7  nt__refso = collections.namedtuple( 'refso', oh )
8  nt__l1sh = collections.namedtuple( 'l1sh', ih )
9  ixoh = nt__refso._make( range(len(oh)) ) 
10  ixih = nt__l1sh._make( range(len(ih)) )
11
12  cf = loadcf.cf()
13  def __init__(self):
14    self.sh = shelve.open( '../inSh/sh__refso_OMIP', 'r' )
15
16  def close(self):
17    self.sh.close()
18
19
20  def update(self,go=False):
21    """Update:
22          (1) Standard names in var;
23          (2) Structures in CMORvar;
24          (3) Priorities in requestVar;
25       Remove:
26          (1) Redundant variables (defined as Oyr or Omon-2d at the same priority as Omon-3d)
27    """
28    redundant = [u'dissic', u'ph', u'po4', u'talk'] + [u'arag', u'calc', u'co3', u'co3abio', u'co3nat', u'co3satarag', u'co3satcalc', u'detoc', u'dissoc', u'nh4', u'zooc'] + [u'bacc', u'phycalc', u'phydiat', u'phydiaz', u'phymisc', u'phypico', u'zmeso', u'zmicro', u'zmisc']
29
30##[u'longitude latitude olevel time', u'longitude latitude time', u'longitude latitude time depth0m', u'longitude latitude time depth100m', u'longitude latitude time olayer100m']
31    strids = {'longitude latitude time depth0m':('f9495c2e-80ba-11e6-ab6e-5404a60d96b5','str-a061'),
32              'longitude latitude olevel time':('f7e4000e-562c-11e6-a2a4-ac72891c3257','str-157'),
33              'longitude latitude time depth100m':('f948813c-80ba-11e6-ab6e-5404a60d96b5', 'str-a015'),
34              'longitude latitude time':('e9f9f6ca-c1ce-11e6-8067-ac72891c3257','str-a098'),
35              ('longitude latitude time','area: mean where sea depth: sum where sea time: mean'):('63c064e0-15f2-11e7-87e0-5404a60d96b5','str-d02'),
36              'longitude latitude time olayer100m':('63c0988e-15f2-11e7-87e0-5404a60d96b5','str-d06')
37             }
38##[u'str-157', u'str-a015', u'str-a061', u'str-a098', u'str-d02', u'str-d06']
39    shi = shelve.open( 'exports/l1sh/CMORvar' )
40    shv = shelve.open( 'exports/l1sh/var' )
41    shst = shelve.open( 'exports/l1sh/structure', 'r' )
42    shsp = shelve.open( 'exports/l1sh/spatialShape', 'r' )
43    shrqv = shelve.open( 'exports/l1sh/requestVar' )
44    ns = 0
45
46    cmvix = dict()
47    tables = ['Omon','Oyr','Oday']
48    for k in shi.keys():
49      if k[0] != '_':
50        if shi[k][self.ixih.mipTable] in tables:
51          cmvix[ ( shi[k][self.ixih.mipTable] , shi[k][self.ixih.label] ) ] = k
52    irecix = collections.defaultdict( dict)
53    for k in self.sh.keys():
54      if k[0] != '_':
55        if self.sh[k][self.ixoh.mipTable] in tables:
56          irecix[ self.sh[k][self.ixoh.mipTable] ][ self.sh[k][self.ixoh.var] ] = k
57
58    ## Omon, Omon-3d, Omon-oth
59    rqvgs = ['ef12e542-5629-11e6-9079-ac72891c3257','efc154f6-5629-11e6-9079-ac72891c3257','efc143a8-5629-11e6-9079-ac72891c3257']
60    remove_cmv = set()
61    remove_rqv = set()
62    for v in redundant:
63      if ('Oyr',v) in cmvix:
64        remove_cmv.add( cmvix[ ('Oyr',v) ] )
65        if ('Omon','%sos' % v) in cmvix:
66          remove_cmv.add( cmvix[ ('Omon','%sos' % v) ] )
67        else:
68          print 'SEVERE: failed to identify variable to be removed: %s' % v
69          ns += 1
70      else:
71        print 'PROBLEM?: redundant variable not found: %s' % v
72
73    updates = dict()
74    for t in irecix:
75      for v in irecix[t]:
76        if (t,v) not in cmvix:
77           print 'SEVERE: failed to find variable: %s,%s' % (t,v)
78           ns += 1
79        else:
80           cmv = cmvix[(t,v)]
81           if cmv not in remove_cmv:
82             k = irecix[t][v]
83             r = self.sh[k]
84             p = str( int( float( r[self.ixoh.priority] ) ) )
85             dims = r[self.ixoh.dimensions]
86             sn = r[self.ixoh.sn]
87             cm = r[self.ixoh.cell_methods]
88             sect = r[self.ixoh.ssect]
89             if t == 'Omon' and sect.find( 'bgc' ) != -1:
90               if (dims,cm) in strids:
91                 stru,strl = strids[(dims,cm)]
92               else:
93                 stru,strl = strids[dims]
94             else:
95               stru = strl = None
96             updates[cmv] = (t,v,p,sn,cm,dims,stru,strl)
97
98    iv = shrqv['__cols__'].index( 'vid' )
99    isn = shv['__cols__'].index( 'sn' )
100    ig = shrqv['__cols__'].index( 'vgid' )
101    ip = shrqv['__cols__'].index( 'priority' )
102    pchange = dict()
103    strchange = dict()
104    snchange = dict()
105    for k in shrqv:
106      if k[0] != '_':
107        if shrqv[k][iv] in remove_cmv:
108           remove_rqv.add( k )
109        elif shrqv[k][iv] in updates and shrqv[k][ig] in rqvgs:
110           if str( shrqv[k][ip] ) != updates[shrqv[k][iv]][2]:
111              pchange[ k ] = updates[shrqv[k][iv]][2]
112           
113             ## updates[cmv] = (t,v,p,sn,cm,dims,stru,strl)
114    for cmv,tt in updates.items():
115             v = str( shi[cmv][self.ixih.vid] )
116             sn0 = shv[v][isn]
117             s = shi[cmv][self.ixih.stid]
118             if sn0 != tt[3] and tt[3] in self.cf.names:
119               if sn0 in self.cf.names:
120                  vlab = shv[v][ shv['__cols__'].index( 'label' ) ]
121                  print 'SEVERE: changing valid cf standard name: %s, %s: %s --> %s' % (v,vlab,sn0,tt[3])
122                  ns += 1
123               snchange[v] = tt[3]
124             if s != tt[6] and tt[6] != None:
125               strchange[cmv] = tt[6]
126
127    print 'UPDATE EVAL DONE', len( remove_cmv ), len( remove_rqv ), len( pchange.keys() ), len( snchange.keys() ), len( strchange.keys() )
128    assert ns == 0, 'SEVERE ERRORS ENCOUNTERED: %s' % ns
129    if go:
130      for cmv in strchange:
131        r = shi[cmv]
132        r[self.ixih.stid] = strchange[cmv]
133        shi[cmv] = r[:]
134      for u in pchange:
135        r = shrqv[u]
136        r[ip] = pchange[u]
137        shrqv[u] = r[:]
138      for v in snchange:
139        r = shv[v]
140        r[isn] = snchange[v]
141        shv[v] = r[:]
142      for cmv in remove_cmv:
143        del shi[cmv]
144      for rqv in remove_rqv:
145        del shrqv[rqv]
146    shi.close()
147    shv.close()
148    shst.close()
149    shsp.close()
150    shrqv.close()
151
152  def eval(self):
153    shi = shelve.open( 'exports/l1sh/CMORvar', 'r' )
154    shst = shelve.open( 'exports/l1sh/structure', 'r' )
155    shsp = shelve.open( 'exports/l1sh/spatialShape', 'r' )
156    shst_spid = shst['__cols__'].index( 'spid' )
157    shsp_label= shsp['__cols__'].index( 'label' )
158    ccx1 = collections.defaultdict( set )
159    ccx1b = collections.defaultdict( set )
160    ccx2 = collections.defaultdict( set )
161
162    for table in ['Omon','Oyr','Oday']:
163      print '############# %s #############' % table
164      s1k = set( [k for k,x in shi.items() if k[0] != '_' and x[self.ixih.mipTable] == table ] )
165      ##s1k = set( [k for k,x in shi.items() if k[0] != '_' and x[self.ixih.mipTable] == table and x[self.ixih.modeling_realm] == 'ocnBgChem'] )
166      s1 = set( [shi[k][self.ixih.label] for k in s1k] )
167      ##s0k = set( [k for k,x in self.sh.items() if k[0] != '_' and x[self.ixoh.mipTable] == table and x[self.ixoh.ssect].find( 'bgc' ) != -1] )
168      s0k = set( [k for k,x in self.sh.items() if k[0] != '_' and x[self.ixoh.mipTable] == table ] )
169      s0 = set( [self.sh[k][self.ixoh.var] for k in s0k] )
170
171      sstr = set()
172      for k in s1k:
173         r = self.nt__l1sh._make( shi[k] )
174         stru = shst[str(r.stid)]
175         sp = shsp[str(stru[shst_spid])]
176         ccx1b[r.label].add( (r.label,table,sp[shsp_label]) )
177         sstr.add( stru[shst['__cols__'].index( 'label' )] )
178      sdim = set()
179      for k in s0k:
180         r = self.nt__refso._make( self.sh[k] )
181         ccx1[r.out_name].add( (r.out_name,r.priority,table,r.dimensions) )
182         sdim.add( r.dimensions )
183
184      print 'NEW: ',len( s0 ), s0.difference( s1 ), sorted( list(sdim) )
185      print 'CURRENT: ',len( s1 ), s1.difference( s0 ), sorted( list( sstr ) )
186      s0xx = set( [k for k in s0k if self.sh[k][self.ixoh.sn] not in self.cf.names] )
187      s0xxa = set( [k for k in s0xx if self.sh[k][self.ixoh.sn][8:] in self.cf.names] )
188      print 'BAD NAMES: ',len(s0xx),len(s0xxa)
189      print sorted( [(self.sh[k][self.ixoh.sn],self.sh[k][self.ixoh.var]) for k in s0xx] )
190    for k in ccx1:
191      if k[-2:] == 'os' and k[:-2] in ccx1:
192        ko = k[:-2]
193      else:
194        ko = k
195      for t in  ccx1[k]:
196        ccx2[ko].add( t )
197    k3 = sorted([k for k in ccx2 if len( ccx2[k] ) > 2] )
198    npp = 0
199    ccy = collections.defaultdict( set )
200    for k in k3:
201      ee = {}
202      for x in ccx2[k]:
203        if x[2] == 'Omon':
204          if x[3].find( 'olevel' ) != -1:
205            ee['Omon-3d'] = x[1]
206          else:
207            ee['Omon-oth'] = x[1]
208        else:
209          ee['Oyr'] = x[1]
210      t = tuple( [ee[i] for i in ['Omon-3d','Oyr','Omon-oth']] )
211      ccy[t].add( k )
212      xx = set( [x[1] for x in ccx2[k]] )
213      if len( xx ) > 1:
214        print k, ccx2[k]
215      else:
216        npp += 1
217    print len(k3), npp
218    for k in sorted( ccy.keys() ):
219      print k,sorted(ccy[k])
220    shi.close()
221    shst.close()
222    shsp.close()
223 
224
225if __name__ == '__main__':
226  u = upd()
227  u.eval()
228  u.update(go=True)
229  u.close()
Note: See TracBrowser for help on using the repository browser.