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

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/ing02/updOmip.py@1206
Revision 1180, 9.5 KB checked in by mjuckes, 19 months ago (diff)

01.00.22 test

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          if self.sh[k][self.ixoh.var] not in ['pdi', 'dpocdtcalc', 'dpocdtpico', 'dpocdtdiaz', 'dms','prlq','zhalf']:
57            irecix[ self.sh[k][self.ixoh.mipTable] ][ self.sh[k][self.ixoh.var] ] = k
58
59    ## Omon, Omon-3d, Omon-oth
60    rqvgs = ['ef12e542-5629-11e6-9079-ac72891c3257','efc154f6-5629-11e6-9079-ac72891c3257','efc143a8-5629-11e6-9079-ac72891c3257']
61    remove_cmv = set()
62    remove_rqv = set()
63    for v in redundant:
64      if ('Oyr',v) in cmvix:
65        remove_cmv.add( cmvix[ ('Oyr',v) ] )
66        if ('Omon','%sos' % v) in cmvix:
67          remove_cmv.add( cmvix[ ('Omon','%sos' % v) ] )
68        else:
69          print 'SEVERE: failed to identify variable to be removed: %s' % v
70          ns += 1
71      else:
72        print 'PROBLEM?: redundant variable not found: %s' % v
73
74    updates = dict()
75    for t in irecix:
76      for v in irecix[t]:
77        if (t,v) not in cmvix:
78           print 'SEVERE: failed to find variable: %s,%s' % (t,v)
79           ns += 1
80        else:
81           cmv = cmvix[(t,v)]
82           if cmv not in remove_cmv:
83             k = irecix[t][v]
84             r = self.sh[k]
85             p = str( int( float( r[self.ixoh.priority] ) ) )
86             dims = r[self.ixoh.dimensions]
87             sn = r[self.ixoh.sn]
88             cm = r[self.ixoh.cell_methods]
89             sect = r[self.ixoh.ssect]
90             if t == 'Omon' and sect.find( 'bgc' ) != -1:
91               if (dims,cm) in strids:
92                 stru,strl = strids[(dims,cm)]
93               else:
94                 stru,strl = strids[dims]
95             else:
96               stru = strl = None
97             updates[cmv] = (t,v,p,sn,cm,dims,stru,strl)
98
99    iv = shrqv['__cols__'].index( 'vid' )
100    isn = shv['__cols__'].index( 'sn' )
101    ig = shrqv['__cols__'].index( 'vgid' )
102    ip = shrqv['__cols__'].index( 'priority' )
103    pchange = dict()
104    strchange = dict()
105    snchange = dict()
106    for k in shrqv:
107      if k[0] != '_':
108        if shrqv[k][iv] in remove_cmv:
109           remove_rqv.add( k )
110        elif shrqv[k][iv] in updates and shrqv[k][ig] in rqvgs:
111           if str( shrqv[k][ip] ) != updates[shrqv[k][iv]][2]:
112              pchange[ k ] = updates[shrqv[k][iv]][2]
113           
114             ## updates[cmv] = (t,v,p,sn,cm,dims,stru,strl)
115    for cmv,tt in updates.items():
116             v = str( shi[cmv][self.ixih.vid] )
117             sn0 = shv[v][isn]
118             s = shi[cmv][self.ixih.stid]
119             if sn0 != tt[3] and tt[3] in self.cf.names:
120               if sn0 in self.cf.names:
121                  vlab = shv[v][ shv['__cols__'].index( 'label' ) ]
122                  print 'SEVERE: changing valid cf standard name: %s, %s: %s --> %s' % (v,vlab,sn0,tt[3])
123                  ns += 1
124               snchange[v] = tt[3]
125             if s != tt[6] and tt[6] != None:
126               strchange[cmv] = tt[6]
127
128    print 'UPDATE EVAL DONE', len( remove_cmv ), len( remove_rqv ), len( pchange.keys() ), len( snchange.keys() ), len( strchange.keys() )
129    assert ns == 0, 'SEVERE ERRORS ENCOUNTERED: %s' % ns
130    if go:
131      for cmv in strchange:
132        r = shi[cmv]
133        r[self.ixih.stid] = strchange[cmv]
134        shi[cmv] = r[:]
135      for u in pchange:
136        r = shrqv[u]
137        r[ip] = pchange[u]
138        shrqv[u] = r[:]
139      for v in snchange:
140        r = shv[v]
141        r[isn] = snchange[v]
142        shv[v] = r[:]
143      for cmv in remove_cmv:
144        del shi[cmv]
145      for rqv in remove_rqv:
146        del shrqv[rqv]
147    shi.close()
148    shv.close()
149    shst.close()
150    shsp.close()
151    shrqv.close()
152
153  def eval(self):
154    shi = shelve.open( 'exports/l1sh/CMORvar', 'r' )
155    shst = shelve.open( 'exports/l1sh/structure', 'r' )
156    shsp = shelve.open( 'exports/l1sh/spatialShape', 'r' )
157    shst_spid = shst['__cols__'].index( 'spid' )
158    shsp_label= shsp['__cols__'].index( 'label' )
159    ccx1 = collections.defaultdict( set )
160    ccx1b = collections.defaultdict( set )
161    ccx2 = collections.defaultdict( set )
162
163    for table in ['Omon','Oyr','Oday']:
164      print '############# %s #############' % table
165      s1k = set( [k for k,x in shi.items() if k[0] != '_' and x[self.ixih.mipTable] == table ] )
166      ##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'] )
167      s1 = set( [shi[k][self.ixih.label] for k in s1k] )
168      ##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] )
169      s0k = set( [k for k,x in self.sh.items() if k[0] != '_' and x[self.ixoh.mipTable] == table ] )
170      s0 = set( [self.sh[k][self.ixoh.var] for k in s0k] )
171
172      sstr = set()
173      for k in s1k:
174         r = self.nt__l1sh._make( shi[k] )
175         stru = shst[str(r.stid)]
176         sp = shsp[str(stru[shst_spid])]
177         ccx1b[r.label].add( (r.label,table,sp[shsp_label]) )
178         sstr.add( stru[shst['__cols__'].index( 'label' )] )
179      sdim = set()
180      for k in s0k:
181         r = self.nt__refso._make( self.sh[k] )
182         ccx1[r.out_name].add( (r.out_name,r.priority,table,r.dimensions) )
183         sdim.add( r.dimensions )
184
185      print 'NEW: ',len( s0 ), s0.difference( s1 ), sorted( list(sdim) )
186      print 'CURRENT: ',len( s1 ), s1.difference( s0 ), sorted( list( sstr ) )
187      s0xx = set( [k for k in s0k if self.sh[k][self.ixoh.sn] not in self.cf.names] )
188      s0xxa = set( [k for k in s0xx if self.sh[k][self.ixoh.sn][8:] in self.cf.names] )
189      print 'BAD NAMES: ',len(s0xx),len(s0xxa)
190      print sorted( [(self.sh[k][self.ixoh.sn],self.sh[k][self.ixoh.var]) for k in s0xx] )
191    for k in ccx1:
192      if k[-2:] == 'os' and k[:-2] in ccx1:
193        ko = k[:-2]
194      else:
195        ko = k
196      for t in  ccx1[k]:
197        ccx2[ko].add( t )
198    k3 = sorted([k for k in ccx2 if len( ccx2[k] ) > 2] )
199    npp = 0
200    ccy = collections.defaultdict( set )
201    for k in k3:
202      ee = {}
203      for x in ccx2[k]:
204        if x[2] == 'Omon':
205          if x[3].find( 'olevel' ) != -1:
206            ee['Omon-3d'] = x[1]
207          else:
208            ee['Omon-oth'] = x[1]
209        else:
210          ee['Oyr'] = x[1]
211      t = tuple( [ee[i] for i in ['Omon-3d','Oyr','Omon-oth']] )
212      ccy[t].add( k )
213      xx = set( [x[1] for x in ccx2[k]] )
214      if len( xx ) > 1:
215        print k, ccx2[k]
216      else:
217        npp += 1
218    print len(k3), npp
219    for k in sorted( ccy.keys() ):
220      print k,sorted(ccy[k])
221    shi.close()
222    shst.close()
223    shsp.close()
224 
225
226if __name__ == '__main__':
227  u = upd()
228  u.eval()
229  u.update(go=True)
230  u.close()
Note: See TracBrowser for help on using the repository browser.