source: CMIP6dreqbuild/trunk/src/workbook/importExtra.py @ 546

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/workbook/importExtra.py@546
Revision 546, 9.3 KB checked in by mjuckes, 5 years ago (diff)

updates

Line 
1
2import collections, string, uuid, os
3
4import importWbMods
5
6
7class strEd(object):
8  def __init__(self,f1='strComp.csv', f2='strCompxx.csv'):
9    for f in [f1,f2]:
10      assert os.path.isfile( 'inputs/%s' % f ),'File %s not found' % f
11    ### attributes as listed per row in the input files .....
12    self.atl = [ u'uid', u'label', u'procNote', u'odims', u'flag_meanings', u'prov', u'tmid', u'flag_values', u'cell_methods', u'cell_measures', u'spid', u'coords', u'description']
13
14    c1,ee1 = self._ingest( 'inputs/%s' % f1 )
15    c2,ee2 = self._ingest( 'inputs/%s' % f2 )
16    x = {k for k in c1 if k not in c2}
17    assert len(x) == 0, 'Input files not compatible (titles) ... %s' % str(x)
18    x = {k for k in ee1 if k not in ee2}
19    assert len(x) == 0, 'Input files not compatible (uids) ... %s' % str(x)
20    for k in ee1:
21      if ee1[k] != ee2[k]:
22        print 'CHange at %s' % k
23        print ' ..... ',ee1[k][0]
24        for i in range(len(ee1[k][1])):
25          if ee1[k][1][i] != ee2[k][1][i]:
26            print '  ............. %s  --> %s' % (ee1[k][1][i] ,ee2[k][1][i])
27
28  def _ingest(self,fp):
29    cc = collections.defaultdict( list )
30    ee = {}
31    for l in open( fp ).readlines():
32      bits = string.split( string.strip( l ), '\t' )
33      if bits[0] == 'START':
34        ttl = bits[1]
35      else:
36        ee[bits[0]] = (ttl,bits)
37        cc[ttl].append( bits )
38    return (cc,ee)
39
40class c1(object):
41  def __init__(self):
42    self.a = collections.defaultdict( list )
43
44class loadAerChem(object):
45  def __init__(self):
46    ii = open( 'inputs/AerChemMIP_consol.csv', 'r' )
47    self.cc2 = collections.defaultdict( c1 )
48    for l in ii.readlines():
49      r = [string.strip(x) for x in string.split( l, '\t') ]
50      fr = r[6]
51      subs = r[5]
52      ##var = string.replace(r[2], '_', '' )
53      ##r[2] = var
54      var = r[2]
55      if string.find( subs, '(T2)') == -1 and subs != 'Monthly-mean zonal mean 2d':
56        tab = 'CCMI1_%s' % fr
57        if var in self.cc2[tab].a:
58          print 'ERROR.001.00001: duplicate variable: %s' % string.strip(l)
59        self.cc2[tab].a[var].append( r )
60    ii.close()
61    ii = open( 'inputs/AerChemMip_inputMap.csv', 'r' )
62    eem = {}
63    for l in ii.readlines():
64      n,sn,o = string.split( string.strip(l), ',' )[:3]
65      eem[n] = (sn,o)
66    ii.close()
67    self.eem = eem
68
69class checkAerChem(object):
70  def __init__(self):
71    import scansh as ss
72    self.cc = collections.defaultdict( dict )
73    self.cs = collections.defaultdict( list )
74    self.vs = collections.defaultdict( list )
75    self.vv = collections.defaultdict( list )
76    WbMods = importWbMods.run()
77
78    for u in WbMods.vars.d1:
79      sn = WbMods.vars.d1[u][7]
80      v = WbMods.vars.d1[u][0]
81      self.vs[sn].append(u)
82      self.vv[v].append(u)
83
84    kk = ['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', 'gpid','rowIndex','ssect', 'priority']
85    id = kk.index('dimensions')
86    ivid = kk.index('vid')
87    thisnt = collections.namedtuple( 'ovar', kk )
88    for k in ss.rq.refti.keys():
89      if k[0] != '_':
90        tt = thisnt._make( ss.rq.refti[k] )
91        if tt.mipTable[:4] == 'CCMI':
92          assert tt.var not in self.cc[tt.mipTable], 'Duplicate name : %s   %s' % (tt.var,tt.mipTable)
93          self.cc[tt.mipTable][tt.var] = k
94          self.cs[ tt.sn ].append( k )
95#land_area_fraction     fraction of the grid  cell occupied by land     landf   1       Please express "X_area_fraction" as the fraction of horizontal area occupied by X.      Time-ind 2d     fixed   XY-na   mean
96
97    ii = open( 'inputs/AerChemMIP_consol.csv', 'r' )
98    self.cc2 = collections.defaultdict( c1 )
99    for l in ii.readlines():
100      r = [string.strip(x) for x in string.split( l, '\t') ]
101      fr = r[6]
102      subs = r[5]
103      var = r[2]
104      if string.find( subs, '(T2)') == -1 and subs != 'Monthly-mean zonal mean 2d':
105        tab = 'CCMI1_%s' % fr
106        if var in self.cc2[tab].a:
107          print 'ERROR.001.00001: duplicate variable: %s' % string.strip(l)
108        self.cc2[tab].a[var].append( r )
109    ii.close()
110    ii = open( 'inputs/AerChemMip_inputMap.csv', 'r' )
111    eem = {}
112    for l in ii.readlines():
113      print l
114      n,sn,o = string.split( string.strip(l), ',' )[:3]
115      eem[n] = (sn,o)
116    ii.close()
117
118    for k in self.cc2.keys():
119      ks = [kk for kk in self.cc2[k].a if len( self.cc2[k].a[kk] ) > 1]
120      print 'INFO: Duplicates: %s, %s' % (k,str(ks))
121
122#sn  title label units description subsect freq shape timesh
123#label  title   description     procComment     procnote        prov    provmip sn      units   uid     defaultp
124    nt__vach = collections.namedtuple( 'vach', ['sn', 'title', 'label', 'units', 'description', 'subsect', 'freq', 'shape', 'timesh'] )
125    nt__vnew = collections.namedtuple( 'vnew', ['label', 'title', 'description', 'procComment', 'procnote', 'prov', 'provmip', 'sn', 'units', 'uid', 'defaultp','tags'] )
126
127    ccmv = False
128    if ccmv:
129      oo = open( 'cand.csv', 'w' )
130      for k in self.cc2.keys():
131        s1 = set( self.cc2[k].a.keys() )
132        s2 = set( self.cc[k].keys() )
133        s2d = s2.difference( s1 )
134        s1d = s1.difference( s2 )
135        sx = []
136        for v in s1d:
137          sn = self.cc2[k].a[v][0]
138          if sn not in self.cs.keys():
139            sx.append( v )
140        print '%s: only in new: %s [%s]' % (k,str(s1d),len(sx))
141        for v in sx:
142          if v in self.vv:
143             print 'Var found: %s' % v
144             oo.write( '%s,%s,%s,\n' % (v,'__',v) )
145          else:
146            sn = self.cc2[k].a[v][0][0]
147            if sn in self.vs.keys() and sn != '':
148              if len( self.vs[sn] ) > 1:
149                print 'Multiple vars ..... %s' % sn
150              u = self.vs[sn][0]
151              v2 = WbMods.vars.d1[u][0]
152              print 'sn found: %s -- %s -- %s' % (v,sn,v2)
153              oo.write( '%s,%s,%s,\n' % (v,sn,v2) )
154            else:
155              print '%s,%s not found' % (v,sn)
156      oo.close()
157    else:
158      oo = open( 'newAerChem.csv', 'w' )
159      nok = 0
160      nm = 0
161      nn = 0
162      s1 = set()
163      s2 = set()
164      s3 = set()
165      s4 = set()
166      for k in self.cc2.keys():
167        for v in self.cc2[k].a.keys():
168          if v in self.vv:
169            nok +=1
170            s1.add(v)
171          elif v in eem:
172            print 'In eem:',k,v
173            nm += 1
174            s2.add(v)
175            s4.add(eem[v][1])
176          else:
177            s3.add(v)
178            print 'Not found:',k,v
179            nn += 1
180
181      print nok, nm, nn
182      cci = collections.defaultdict(list)
183      for k in self.cc2.keys():
184        for v in self.cc2[k].a.keys():
185          cci[v].append( k )
186
187      ccx = {}
188      for v in self.vv:
189        if (v not in s1) and (v not in s2) and (v not in s4):
190          u = str( self.vv[v][0] )
191          r1 =  WbMods.vars.d1[u]
192          if len(r1) == 11:
193            r1.append( '' )
194          ccx[v] = r1[:]
195      for v in s1.union(s2).union(s3):
196        if v in s2:
197          vp = eem[v][1]
198        else:
199          vp = v
200
201        if v not in s3:
202          assert len( self.vv[vp] ) == 1, 'Multi valued v: %s' % v
203          u = str( self.vv[vp][0] )
204          r1 =  WbMods.vars.d1[u]
205          if len(r1) == 11:
206            r1.append( '' )
207          t1=nt__vnew._make(r1)
208          uid = t1.uid
209          pty = t1.defaultp
210          ppp = (t1.procComment,t1.procnote,t1.prov,t1.provmip,t1.tags)
211        else:
212          t1 = None
213          uid = uuid.uuid1()
214          pty = 1
215          ppp = ('','','AerChemMIP endorsement (1)','','')
216
217        if len(cci[v]) > 0:
218          s0 = set()
219          for k in cci[v]:
220            t2 = nt__vach._make( self.cc2[k].a[v][0] )
221            s0.add( (t2.label,t2.title,t2.units,t2.sn,t2.description) )
222          if len( s0 ) > 1:
223            s0 = {i for i in s0 if i in disambig}
224            assert len(s0) == 1, 'Failed to diambiguate list ... %s  ... %s' % (k,str(s0))
225       
226    ##( 'vach', ['sn', 'title', 'label', 'units', 'description', 'subsect', 'freq', 'shape', 'timesh'] )
227    ##( 'vnew', ['label', 'title', 'description', 'procComment', 'procnote', 'prov', 'provmip', 'sn', 'units', 'uid', 'defaultp','tags'] )
228          i = list( s0) [0]
229          ccx[v] = [i[0],i[1],i[4],ppp[0],ppp[1],ppp[2],ppp[3], i[3], i[2], uid, pty, ppp[4],'']
230          if v in s2:
231            ccx[v][-1] = vp
232
233      ccq = collections.defaultdict( list )
234      oo = open( 'vars_20151201.csv','w')
235      for v in sorted( ccx.keys() ):
236        oo.write( string.join( [str(i) for i in ccx[v]], '\t' ) + '\n' )
237        ccq[ccx[v][9]].append( v )
238      oo.close()
239      for k in ccq.keys():
240        if len(ccq[k]) > 1:
241          print 'ERROR: duplicate uid: ',k,ccq[k]
242     
243         
244         
245disambig = [ ('pr', 'Precipitation', 'kg m-2 s-1', 'precipitation_flux', 'includes both liquid and solid phases'),
246('rsds', 'Surface Downwelling Shortwave Radiation', 'W m-2', 'surface_downwelling_shortwave_flux_in_air', 'surface solar irradiance for UV calculations'),
247('toz', 'Total Ozone Column', 'DU', 'equivalent_thickness_at_stp_of_atmosphere_ozone_content', 'total ozone column in DU'),
248('ps', 'Surface Air Pressure', 'Pa', 'surface_air_pressure', 'surface pressure (not mean sea-level pressure), 2-D field to calculate the 3-D pressure field from hybrid coordinates') ]
249
250if __name__ == '__main__':
251  #ca = checkAerChem()
252     
253  se = strEd()
Note: See TracBrowser for help on using the repository browser.