source: CMIP6dreqbuild/trunk/src/framework/aerchemp.py @ 954

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

cand

Line 
1
2import string, xlrd, collections, os
3from ingest import loadcf
4import cf
5
6class c1(object):
7  def __init__(self):
8    self.a = collections.defaultdict( list )
9
10def uniCleanFunc(ss,jsFilt=False):
11      if type(ss) in [type('x'),type(u'x')]:
12          ss = string.replace( ss, u'\u2013', '-' )
13          ss = string.replace( ss, u'\u2014', '-' )
14          ss = string.replace( ss, u'\u201c', '"' )
15          ss = string.replace( ss, u'\u201d', '"' )
16          ss = string.replace( ss, u'\u2018', "'" )
17          ss = string.replace( ss, u'\u2019', "'" )
18          ss = string.replace( ss, u'\u2026', '...' )
19          ss = string.replace( ss, u'\u25e6', 'o' )
20          ss = string.replace( ss, u'\xb2', '2' )
21          ss = string.replace( ss, u'\xa1', 'o' )
22          ss = string.replace( ss, u'\xb0', 'o' )
23          ss = string.replace( ss, u'\xb3', '3' )
24          ss = string.replace( ss, u'\xd0', "-" )
25          ss = string.replace( ss, u'\xd2', "'" )
26          ss = string.replace( ss, u'\xd3', "'" )
27          if jsFilt:
28            ss = string.replace( ss, '"', "'" )
29            ss = string.replace( ss, '\n', ";;" )
30          return ss
31      else:
32          return ss
33
34cfsn = loadcf.cf()
35
36epairs = [ ('Pa', 'mole mole-1' ), ('kg m-2 s-1', 'kg (N) m-2 s-1' ), ('kg m-2 s-1', 'kg (C) m-2 s-1' ), ('m', 'DU' ),
37('m s-1', 'mole mole-1' ), ('m s-2', 'mole mole-1' ), ('m3 s-2', 'mole mole-1' ) ] 
38
39class workbook(object):
40  def __init__(self,file,idir='/home/martin/2014/wip/dreq/input/AerChemMIP'):
41    ipath = '%s/%s' % (idir,file)
42    assert os.path.isfile(ipath), 'File %s not found' % ipath
43    try:
44      self.book = xlrd.open_workbook( ipath )
45    except:
46      print 'Unable to read %s' % ipath
47      raise
48    self.sns = self.book.sheet_names()
49
50ifile = 'AerChemMIP_CMIP6_tables.xls'
51ifile = 'AerChemMIP_CMIP6_tables-23March2016-excludingproblems.xls'
52ifile = 'AerChemMIP_CMIP6_tables-10April2016.xls'
53ifile = 'AerChemMIP_CMIP6_tables-25May2016.xls'
54ifile = 'AerChemMIP_CMIP6_tables-14Dec2016.xls'
55o1 = open( 'header.txt', 'w' )
56wb = workbook( ifile )
57ss = set()
58cc = collections.defaultdict( set )
59dd = collections.defaultdict( set )
60oob = open( 'noStandardName.csv', 'w' )
61ooc = open( 'exStandardName.csv', 'w' )
62freq2itab= {'__none__':[u'notes', u'Coordinates',u'log',u'problems'],
63            'fixed':[u'Time-ind 2d',u'fx','aerfixed'],
64            'monthly':[u'aermonthly-3d','aermonthly-2d','AerChemMIP-Zonal2d',u'AerChemMIP-Zonal',u'AerChemMIP-Mon2d', u'AerChemMIP-Mon3d',u'Monthly-mean 3d', u'Monthly-mean 2d', u'Monthly-mean 1d', u'Monthly-mean zonal mean 2d',u'Monthly-mean 3d (T2)', u'Monthly-mean 2d (T2)', u'Monthly-mean zonal mean 2d (T2)','aerzonal','aerzonal-vert'], 
65            'daily':[u'Daily 2d',u'Daily 2d (T2)',u'AerChemMIP-Day2d','aerdaily'],
66            'hourly':[u'Hourly 2d',u'AerChemMIP-hr','aerhourly'], 'annual':[u'Annual-mean 0d',],'6hr':['aer6hr'] }
67
68itab2freq = {}
69for k in freq2itab:
70  for t in freq2itab[k]:
71    itab2freq[t] = k
72
73#
74itab2str = { 'Monthly-mean 3d':'XY-A', 'Monthly-mean 3d (T2)':'XY-A', 'Monthly-mean 2d':'XY-na', 'Daily 2d':'XY-na', 'Daily 2d (T2)':'XY-na',
75'Hourly 2d':'XY-na', 
76'Hourly-mean 2d':'XY-na', 'Time-ind 2d':'XY-na', 'Monthly-mean 2d (T2)':'XY-na', 'Monthly-mean 1d':'Y-na' , 'Monthly-mean zonal mean 2d':'Y-P39',
77'Monthly-mean zonal mean 2d (T2)':'Y-P39', 'Annual-mean 0d':'na-na',
78u"fx":'XY-na',
79u"AerChemMIP-Mon3d":'XY-A',
80u"AerChemMIP-Mon2d":'XY-na',
81u"AerChemMIP-Day2d":'XY-na',
82u"AerChemMIP-hr":'XY-na',
83u"AerChemMIP-Zonal2d":'Y-P39',
84u"AerChemMIP-Zonal":'Y-na',
85u"aerfixed":'XY-na',
86u"aermonthly-3d":'XY-A',
87u"aermonthly-2d":'XY-na',
88u"aerdaily":'XY-na',
89u"aerhourly":'XY-na',
90u"aer6hr":'XY-A',
91u"aerzonal-vert":'Y-P39',
92u"aerzonal":'Y-na'
93}
94
95itab2cellm = {u"AerChemMIP-Zonal2d":'longitude: mean',
96              u"AerChemMIP-Zonal":'longitude: mean'}
97itab2coords = {u"AerChemMIP-Zonal":'p100'}
98
99for t in freq2itab['__none__']:
100    itab2str[t] = None
101#  all time mean
102# .. Tier 2 (should be priority 2)
103
104
105oox = open( 'ingest/AerChemMIP_consol.csv','w' )
106ccx = collections.defaultdict( c1 )
107for s in wb.sns:
108  if s not in freq2itab['__none__']:
109     fr = itab2freq[s]
110     ssh = itab2str.get(s,'__unset__' )
111     if s == 'Hourly 2d':
112       tsh = 'point'
113     elif s.find( 'fixed' ) != -1:
114       tsh = 'fixed'
115     else:
116       tsh = 'mean'
117     this = wb.book.sheet_by_name( s )
118     o1.write( '%s:: %s :: %s\n' % (s, this.row(0)[0].value, this.row(1)[0].value ) )
119     rrx = None
120     print 'starting ',s
121     for j in range(3,this.nrows):
122      rr = [uniCleanFunc(x.value) for x in this.row(j)]
123      if j == 2:
124         print s,'skipping :: ',rr
125      elif rr[0] == "CF standard name":
126         print s,'skipping :: ',rr
127      else:
128       if rr[0] == '' and rr[1] == '':
129         if rrx != None:
130           rrx[4] += ' ' + string.strip( rr[4] )
131         else:
132           print 'EMPTY ROW: ',rr
133       else:
134         if rrx != None:
135           oox.write( string.join( rrx, '\t' ) + '\n' )
136           ccx[s].a[rrx[2]].append(rrx)
137         try:
138           rrx = [str(x) for x in rr + [s,fr,ssh,tsh]]
139           var = rrx[2].strip()
140           if s == 'aer6hr' and var[-3:] in ['850','500']:
141             ssh = 'XY-na'
142             rrx[-2] = ssh
143             print 'INFO.plev : changing structure: ',rrx
144           ##if var in ['areacella','orog']:
145              ##rrx[-1] = 'point'
146         except:
147           print 'ERROR.aerchem.0001: FAILED to convert to string ... ',s,j,rr
148           raise
149       if (string.strip(rr[0]) or string.strip(rr[4])) != '' and rr[0][:3] != 'CF ':
150         sn = string.strip( rr[0] )
151         if sn == '':
152           nt = string.strip(rr[4])
153           if nt[:15] == 'proposed name: ':
154             sn = string.strip( string.split( nt[15:], '.' )[0] )
155             print 'ERROR.sn.0002: no standard name: ', sn
156             ooc.write( '%s\t%s\t%s\n' % (sn, string.strip(rr[4]), rr[3] ) )
157           else:
158             if string.strip( rr[2] ) != '':
159               oob.write( '%s\t\t%s\t%s\n' % (rr[2], string.strip(rr[4]), rr[3] ) )
160         elif sn in cfsn.names:
161           snu = cfsn.names[sn][1]
162         elif sn in cfsn.alias:
163           snu = cfsn.names[ cfsn.alias[ sn ] ][1]
164         else:
165           print 'ERROE.sn.0003: no standard name: ', sn
166           ooc.write( '%s\t%s\t%s\n' % (sn,string.strip(rr[4]), rr[3] ) )
167           snu = None
168         t = (snu,str(rr[3]) )
169         if t in epairs:
170           dd[t].add( (s,rr[0],rr[2]) )
171         cc[snu].add( string.strip( str(rr[3]) ) )
172     oox.write( string.join( rrx, '\t' ) + '\n' )
173     ccx[s].a[rrx[2]].append(rrx)
174
175oox.close()
176ccf = collections.defaultdict( list )
177#[u'notes', u'Coordinates',
178
179ok = True
180for s in wb.sns:
181  assert s in itab2freq, 'Sheet %s not found' % s
182  if s not in itab2str:
183    print 'ERROR.aerchem.0002:  itab2str ...: u"%s":' % s
184    ok = False
185
186assert ok, 'Sheets not found in itab2str (above)'
187
188for s in ccx:
189  if s not in [u'Monthly-mean zonal mean 2d (T2)']:
190    for k in ccx[s].a:
191      assert len(ccx[s].a[k]) <= 1, 'Duplicate var names in sheet: %s' % str(ccx[s].a[k])
192
193for s in ['Daily 2d (T2)', 'Monthly-mean 3d (T2)','Monthly-mean 2d (T2)']:
194  s0 = s[:-4]
195  nn = 0
196  for v in ccx[s].a:
197    if v not in ccx[s0].a:
198      print '%s in T2 and not in T1' % v
199      nn+= 1
200  if nn == 0:
201    print '%s is subset of %s' % (s,s0)
202
203
204oob.close()
205ooc.close()
206for k in sorted( cc.keys() ):
207  a = cf.units.Units( k )
208  for k2 in cc[k]:
209    try:
210      b = cf.units.Units( k2 )
211    except:
212      b = None
213      print 'WARN.001.0003: unit invalid : %s .... %s' % (k,k2)
214    if b != None and not a.equivalent(b):
215      print 'WARN.001.0002: unit mismatch: %s .... %s' % (k,k2)
216
217print '################################'
218for k in sorted( dd.keys() ):
219  for k2 in dd[k]:
220    print k, k2
221
222o1.close()
223     
224print ss
Note: See TracBrowser for help on using the repository browser.