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

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

draft code to edit tables

Line 
1
2import string, xlrd, collections, os
3import 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     else:
114       tsh = 'mean'
115     this = wb.book.sheet_by_name( s )
116     o1.write( '%s:: %s :: %s\n' % (s, this.row(0)[0].value, this.row(1)[0].value ) )
117     rrx = None
118     print 'starting ',s
119     for j in range(3,this.nrows):
120      rr = [uniCleanFunc(x.value) for x in this.row(j)]
121      if j == 2:
122         print s,'skipping :: ',rr
123      elif rr[0] == "CF standard name":
124         print s,'skipping :: ',rr
125      else:
126       if rr[0] == '' and rr[1] == '':
127         if rrx != None:
128           rrx[4] += ' ' + string.strip( rr[4] )
129         else:
130           print 'EMPTY ROW: ',rr
131       else:
132         if rrx != None:
133           oox.write( string.join( rrx, '\t' ) + '\n' )
134           ccx[s].a[rrx[2]].append(rrx)
135         try:
136           rrx = [str(x) for x in rr + [s,fr,ssh,tsh]]
137         except:
138           print 'ERROR.aerchem.0001: FAILED to convert to string ... ',s,j,rr
139           raise
140       if (string.strip(rr[0]) or string.strip(rr[4])) != '' and rr[0][:3] != 'CF ':
141         sn = string.strip( rr[0] )
142         if sn == '':
143           nt = string.strip(rr[4])
144           if nt[:15] == 'proposed name: ':
145             sn = string.strip( string.split( nt[15:], '.' )[0] )
146             print 'ERROR.sn.0002: no standard name: ', sn
147             ooc.write( '%s\t%s\t%s\n' % (sn, string.strip(rr[4]), rr[3] ) )
148           else:
149             if string.strip( rr[2] ) != '':
150               oob.write( '%s\t\t%s\t%s\n' % (rr[2], string.strip(rr[4]), rr[3] ) )
151         elif sn in cfsn.names:
152           snu = cfsn.names[sn][1]
153         elif sn in cfsn.alias:
154           snu = cfsn.names[ cfsn.alias[ sn ] ][1]
155         else:
156           print 'ERROE.sn.0003: no standard name: ', sn
157           ooc.write( '%s\t%s\t%s\n' % (sn,string.strip(rr[4]), rr[3] ) )
158           snu = None
159         t = (snu,str(rr[3]) )
160         if t in epairs:
161           dd[t].add( (s,rr[0],rr[2]) )
162         cc[snu].add( string.strip( str(rr[3]) ) )
163     oox.write( string.join( rrx, '\t' ) + '\n' )
164     ccx[s].a[rrx[2]].append(rrx)
165
166oox.close()
167ccf = collections.defaultdict( list )
168#[u'notes', u'Coordinates',
169
170ok = True
171for s in wb.sns:
172  assert s in itab2freq, 'Sheet %s not found' % s
173  if s not in itab2str:
174    print 'ERROR.aerchem.0002:  itab2str ...: u"%s":' % s
175    ok = False
176
177assert ok, 'Sheets not found in itab2str (above)'
178
179for s in ccx:
180  if s not in [u'Monthly-mean zonal mean 2d (T2)']:
181    for k in ccx[s].a:
182      assert len(ccx[s].a[k]) <= 1, 'Duplicate var names in sheet: %s' % str(ccx[s].a[k])
183
184for s in ['Daily 2d (T2)', 'Monthly-mean 3d (T2)','Monthly-mean 2d (T2)']:
185  s0 = s[:-4]
186  nn = 0
187  for v in ccx[s].a:
188    if v not in ccx[s0].a:
189      print '%s in T2 and not in T1' % v
190      nn+= 1
191  if nn == 0:
192    print '%s is subset of %s' % (s,s0)
193
194
195oob.close()
196ooc.close()
197for k in sorted( cc.keys() ):
198  a = cf.units.Units( k )
199  for k2 in cc[k]:
200    try:
201      b = cf.units.Units( k2 )
202    except:
203      b = None
204      print 'WARN.001.0003: unit invalid : %s .... %s' % (k,k2)
205    if b != None and not a.equivalent(b):
206      print 'WARN.001.0002: unit mismatch: %s .... %s' % (k,k2)
207
208print '################################'
209for k in sorted( dd.keys() ):
210  for k2 in dd[k]:
211    print k, k2
212
213o1.close()
214     
215print ss
Note: See TracBrowser for help on using the repository browser.