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

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

added importExtra

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 = r[2]
53      if string.find( subs, '(T2)') == -1 and subs != 'Monthly-mean zonal mean 2d':
54        tab = 'CCMI1_%s' % fr
55        if var in self.cc2[tab].a:
56          print 'ERROR.001.00001: duplicate variable: %s' % string.strip(l)
57        self.cc2[tab].a[var].append( r )
58    ii.close()
59    ii = open( 'inputs/AerChemMip_inputMap.csv', 'r' )
60    eem = {}
61    for l in ii.readlines():
62      n,sn,o = string.split( string.strip(l), ',' )[:3]
63      eem[n] = (sn,o)
64    ii.close()
65    self.eem = eem
66
67class checkAerChem(object):
68  def __init__(self):
69    import scansh as ss
70    self.cc = collections.defaultdict( dict )
71    self.cs = collections.defaultdict( list )
72    self.vs = collections.defaultdict( list )
73    self.vv = collections.defaultdict( list )
74    WbMods = importWbMods.run()
75
76    for u in WbMods.vars.d1:
77      sn = WbMods.vars.d1[u][7]
78      v = WbMods.vars.d1[u][0]
79      self.vs[sn].append(u)
80      self.vv[v].append(u)
81
82    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']
83    id = kk.index('dimensions')
84    ivid = kk.index('vid')
85    thisnt = collections.namedtuple( 'ovar', kk )
86    for k in ss.rq.refti.keys():
87      if k[0] != '_':
88        tt = thisnt._make( ss.rq.refti[k] )
89        if tt.mipTable[:4] == 'CCMI':
90          assert tt.var not in self.cc[tt.mipTable], 'Duplicate name : %s   %s' % (tt.var,tt.mipTable)
91          self.cc[tt.mipTable][tt.var] = k
92          self.cs[ tt.sn ].append( k )
93#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
94
95    ii = open( 'inputs/AerChemMIP_consol.csv', 'r' )
96    self.cc2 = collections.defaultdict( c1 )
97    for l in ii.readlines():
98      r = [string.strip(x) for x in string.split( l, '\t') ]
99      fr = r[6]
100      subs = r[5]
101      var = r[2]
102      if string.find( subs, '(T2)') == -1 and subs != 'Monthly-mean zonal mean 2d':
103        tab = 'CCMI1_%s' % fr
104        if var in self.cc2[tab].a:
105          print 'ERROR.001.00001: duplicate variable: %s' % string.strip(l)
106        self.cc2[tab].a[var].append( r )
107    ii.close()
108    ii = open( 'inputs/AerChemMip_inputMap.csv', 'r' )
109    eem = {}
110    for l in ii.readlines():
111      print l
112      n,sn,o = string.split( string.strip(l), ',' )[:3]
113      eem[n] = (sn,o)
114    ii.close()
115
116    for k in self.cc2.keys():
117      ks = [kk for kk in self.cc2[k].a if len( self.cc2[k].a[kk] ) > 1]
118      print 'INFO: Duplicates: %s, %s' % (k,str(ks))
119
120#sn  title label units description subsect freq shape timesh
121#label  title   description     procComment     procnote        prov    provmip sn      units   uid     defaultp
122    nt__vach = collections.namedtuple( 'vach', ['sn', 'title', 'label', 'units', 'description', 'subsect', 'freq', 'shape', 'timesh'] )
123    nt__vnew = collections.namedtuple( 'vnew', ['label', 'title', 'description', 'procComment', 'procnote', 'prov', 'provmip', 'sn', 'units', 'uid', 'defaultp','tags'] )
124
125    ccmv = False
126    if ccmv:
127      oo = open( 'cand.csv', 'w' )
128      for k in self.cc2.keys():
129        s1 = set( self.cc2[k].a.keys() )
130        s2 = set( self.cc[k].keys() )
131        s2d = s2.difference( s1 )
132        s1d = s1.difference( s2 )
133        sx = []
134        for v in s1d:
135          sn = self.cc2[k].a[v][0]
136          if sn not in self.cs.keys():
137            sx.append( v )
138        print '%s: only in new: %s [%s]' % (k,str(s1d),len(sx))
139        for v in sx:
140          if v in self.vv:
141             print 'Var found: %s' % v
142             oo.write( '%s,%s,%s,\n' % (v,'__',v) )
143          else:
144            sn = self.cc2[k].a[v][0][0]
145            if sn in self.vs.keys() and sn != '':
146              if len( self.vs[sn] ) > 1:
147                print 'Multiple vars ..... %s' % sn
148              u = self.vs[sn][0]
149              v2 = WbMods.vars.d1[u][0]
150              print 'sn found: %s -- %s -- %s' % (v,sn,v2)
151              oo.write( '%s,%s,%s,\n' % (v,sn,v2) )
152            else:
153              print '%s,%s not found' % (v,sn)
154      oo.close()
155    else:
156      oo = open( 'newAerChem.csv', 'w' )
157      nok = 0
158      nm = 0
159      nn = 0
160      s1 = set()
161      s2 = set()
162      s3 = set()
163      s4 = set()
164      for k in self.cc2.keys():
165        for v in self.cc2[k].a.keys():
166          if v in self.vv:
167            nok +=1
168            s1.add(v)
169          elif v in eem:
170            print 'In eem:',k,v
171            nm += 1
172            s2.add(v)
173            s4.add(eem[v][1])
174          else:
175            s3.add(v)
176            print 'Not found:',k,v
177            nn += 1
178
179      print nok, nm, nn
180      cci = collections.defaultdict(list)
181      for k in self.cc2.keys():
182        for v in self.cc2[k].a.keys():
183          cci[v].append( k )
184
185      ccx = {}
186      for v in self.vv:
187        if (v not in s1) and (v not in s2) and (v not in s4):
188          u = str( self.vv[v][0] )
189          r1 =  WbMods.vars.d1[u]
190          if len(r1) == 11:
191            r1.append( '' )
192          ccx[v] = r1[:]
193      for v in s1.union(s2).union(s3):
194        if v in s2:
195          vp = eem[v][1]
196        else:
197          vp = v
198
199        if v not in s3:
200          assert len( self.vv[vp] ) == 1, 'Multi valued v: %s' % v
201          u = str( self.vv[vp][0] )
202          r1 =  WbMods.vars.d1[u]
203          if len(r1) == 11:
204            r1.append( '' )
205          t1=nt__vnew._make(r1)
206          uid = t1.uid
207          pty = t1.defaultp
208          ppp = (t1.procComment,t1.procnote,t1.prov,t1.provmip,t1.tags)
209        else:
210          t1 = None
211          uid = uuid.uuid1()
212          pty = 1
213          ppp = ('','','AerChemMIP endorsement (1)','','')
214
215        if len(cci[v]) > 0:
216          s0 = set()
217          for k in cci[v]:
218            t2 = nt__vach._make( self.cc2[k].a[v][0] )
219            s0.add( (t2.label,t2.title,t2.units,t2.sn,t2.description) )
220          if len( s0 ) > 1:
221            s0 = {i for i in s0 if i in disambig}
222            assert len(s0) == 1, 'Failed to diambiguate list ... %s  ... %s' % (k,str(s0))
223       
224    ##( 'vach', ['sn', 'title', 'label', 'units', 'description', 'subsect', 'freq', 'shape', 'timesh'] )
225    ##( 'vnew', ['label', 'title', 'description', 'procComment', 'procnote', 'prov', 'provmip', 'sn', 'units', 'uid', 'defaultp','tags'] )
226          i = list( s0) [0]
227          ccx[v] = [i[0],i[1],i[4],ppp[0],ppp[1],ppp[2],ppp[3], i[3], i[2], uid, pty, ppp[4],'']
228          if v in s2:
229            ccx[v][-1] = vp
230
231      ccq = collections.defaultdict( list )
232      oo = open( 'vars_20151201.csv','w')
233      for v in sorted( ccx.keys() ):
234        oo.write( string.join( [str(i) for i in ccx[v]], '\t' ) + '\n' )
235        ccq[ccx[v][9]].append( v )
236      oo.close()
237      for k in ccq.keys():
238        if len(ccq[k]) > 1:
239          print 'ERROR: duplicate uid: ',k,ccq[k]
240     
241         
242         
243disambig = [ ('pr', 'Precipitation', 'kg m-2 s-1', 'precipitation_flux', 'includes both liquid and solid phases'),
244('rsds', 'Surface Downwelling Shortwave Radiation', 'W m-2', 'surface_downwelling_shortwave_flux_in_air', 'surface solar irradiance for UV calculations'),
245('toz', 'Total Ozone Column', 'DU', 'equivalent_thickness_at_stp_of_atmosphere_ozone_content', 'total ozone column in DU'),
246('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') ]
247
248if __name__ == '__main__':
249  #ca = checkAerChem()
250     
251  se = strEd()
Note: See TracBrowser for help on using the repository browser.