source: CMIP6dreqbuild/trunk/src/framework/ingest/cmip5so.py @ 941

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

candidate

Line 
1import collections, string
2from utils_wb import workbook, uniCleanFunc
3import util_gen
4import utils
5from dreq_cfg import rqcfg
6import shelve, uuid
7targTabs = ['CMIP5_cfOff', 'CMIP5_cfMon', 'CMIP5_6hrPlev', 'CMIP5_day', 'OMIP.Oyr', 'CMIP5_cfSites', 'OMIP.Omon', 'CMIP5_aero', 'CMIP5_LImon', 'CMIP5_Amon', 'CMIP5_Oclim', 'CMIP5_6hrLev', 'CMIP5_Lmon', 'CMIP5_3hr', 'CMIP5_fx', 'CMIP5_cfDay', 'CMIP5_cf3hr', 'OMIP.fx', 'OMIP.day']
8
9class s1(object):
10  def __init__(self):
11    self.a = collections.defaultdict( )
12
13def rval(x):
14  if x.ctype == 1:
15    return string.strip( x.value )
16  else:
17    return x.value
18
19class omip(object):
20  rq = rqcfg()
21  def __init__(self):
22    mips = ['OMIP','CFMIP']
23    taboi = {'OMIP':['fx','Oyr','Omon','Oday','day'], 'CFMIP':['cfMon','cfOff', 'cfDay', 'cf3hr', 'cfSites'] }
24    sh = shelve.open( '../inSh/omip', 'n' )
25    for mip in mips:
26     for fn in self.rq.ff[mip]:
27
28## look for names of subsections, for OMIP.
29      if fn in self.rq.fff:
30        sss = self.rq.fff[fn]
31      else:
32        sss = mip
33
34      sh['__info__'] = {'prov': 'OMIP standard_output', 'label': 'omip', 'title': 'OMIP tables'}
35      cols = ['priority', 'long name', 'units', 'comment', 'questions & notes', 'output variable name', 'CF Standard name', 'unconfirmed or proposed standard name', 'unformatted units', 'cell_methods', 'valid min', 'valid max', 'mean absolute min', 'mean absolute max', 'positive', 'type', 'CMOR dimensions', 'CMOR variable name', 'realm', 'frequency', 'cell_measures', 'flag_values', 'flag_meanings','table','section','row']
36      sh['__cols__'] = cols
37
38      wb = workbook( '%s%s/%s' % (self.rq.dir0,mip,fn) )
39      print mip, fn, wb.sns
40      for sn in wb.sns:
41        if sn in taboi[mip]:
42          snn = {'day':'Oday', 'fx':'Ofx'}.get( sn, sn )
43          sht = wb.book.sheet_by_name( sn )
44          kl = []
45          for k in range(min(40,sht.nrows)):
46            if sht.row(k)[0].value == u'priority':
47              kl.append(k)
48          assert len(kl) == 1, 'No start found in %s %s' % (fn,sn)
49          vl = []
50          s1 = set()
51          for k in range(kl[0]+1,sht.nrows):
52            ok = True
53            rr  = sht.row(k)
54            rrr = [string.strip( str(x.value) ) for x in rr]
55            for i in range( len(cols) - len( rr) ):
56              rrr.append( '' )
57            v1 = rrr[5]
58            v2 = rrr[17]
59            f1 = v1 in ['','0.0']
60            f2 = v2 in ['','0.0']
61            if f1 and f2:
62              log.error( 'ERROR: no variable found: %s' % str(rrr)) 
63              ok = False
64            elif f1:
65              rrr[5] = v2
66            v1 = rrr[2]
67            v2 = rrr[8]
68            f1 = v1 in ['','0.0']
69            f2 = v2 in ['','0.0']
70            if f1 and f2:
71              log.error( 'ERROR: no units found: %s' % str(rrr))
72              ok = False
73            elif f1:
74              rrr[2] = v2
75
76            if ok:
77              rrr += [snn,sss,str(k) ]
78              sh[ str( uuid.uuid1() ) ] = rrr[:]
79              vl.append( rr[0].value )
80              if rr[0].ctype == 2 and int(rr[0].value) in [1,2,3]:
81                r = map( rval, rr )
82#
83# r[5] = output name
84#
85                if rr[17].ctype == 1:
86                  vr = r[17]
87                else:
88                  vr = r[5]
89
90                if vr != '':
91                 if vr in soo[snn].a:
92                   log.error( 'ERROR: duplicate variable: %s %s%s' % (fn, sn,vr) )
93                   log.error( str( r ) )
94                   log.error( str( soo[snn].a[vr] ) )
95                 soo[snn].a[vr] = r + [k,0,sss,]
96                 if sn == 'Oyr' and k < 65:
97                   soop['Oyr_3dtr'].append( vr )
98                 elif sn == 'Omon':
99                   dims = r[16]
100                   if string.find( dims, 'longitude latitude olevel' ) != -1:
101                     soop['Omon_3d'].append( vr )
102                   else:
103                     soop['Omon_oth'].append( vr )
104                 elif sn == 'cfMon':
105                   dims = r[16]
106                   if r[1][:5] in ['ISCCP','PARAS','CALIP']:
107                     soop['cfMon_sim'].append( vr )
108                   elif vr[-3:] == 'co2':
109                     if string.find( dims, 'longitude latitude alev' ) != -1:
110                       soop['cfMon_3dmod'].append( vr )
111                     else:
112                       soop['cfMon_2dmod'].append( vr )
113                   else:
114                     soop['cfMon_3dstd'].append( vr )
115                 elif sn == 'cfDay':
116                   dims = r[16]
117                   bits = string.split( dims )
118           
119                   if string.find( dims, 'longitude latitude' ) != -1 and bits[2] in ['alev','alevel','alevhalf','alt40','plev7','alt40']:
120                       soop['cfDay_3d'].append( vr )
121                   else:
122                       soop['cfDay_2d'].append( vr )
123                 elif sn == 'cf3hr':
124                   dims = r[16]
125                   if string.find( dims, 'longitude latitude' ) != -1:
126                       soop['cf3hr_grid'].append( vr )
127                   else:
128                       soop['cf3hr_sim'].append( vr )
129
130    sh.close()
131
132
133class cmip5(object):
134  wswallow = {'cfSites':'include Amon 2D', 'cf3hr':'include Amon 2D', 'Omon':'include Oyr 3D tracers', 'Amon':'' }
135  def __init__(self,fn='ingest/CMIP5_standard_output.xls'):
136    wb = workbook( fn )
137    self.sop = collections.defaultdict( list )
138    self.so = collections.defaultdict( s1 )
139    omit = [u'general', u'dims', u'other output', u'CFMIP output']
140    sns = filter( lambda x: x not in omit, wb.sns )
141    for s in sns:
142      sh = wb.book.sheet_by_name( s )
143      for i in range(3,sh.nrows):
144        rr = sh.row(i)
145        if rr[0].ctype == 2 and int(rr[0].value) in [1,2,3]:
146          r = map( rval, sh.row(i) )
147          if rr[17].ctype == 1:
148            vr = r[17]
149          else:
150            vr = r[5]
151          if vr == '':
152            if not self.wswallow.get(s,'___') == vr:
153              log.warn( 'WARN.0001: empty variable name %s%s' % (s,str(r)) )
154          elif string.find(vr,' ') != -1:
155            if not self.wswallow.get(s,'___') == vr:
156              log.warn( 'WARN.0002: spaces in variable name %s%s' % (s,str(r)) )
157          else:
158            assert not self.so[s].a.has_key( vr ), 'ERROR: duplicate variable: %s%s' % (s,vr)
159            self.so[s].a[vr] = r + [i,0,]
160   
161            dims = r[16]
162            flg, sect = util_gen.sect( 'CMIP5', vr, s, i, dims, r[1] )
163            if flg:
164              self.sop[sect].append( vr )
165
166  def sect( self, mip, var, sn, ix, dims, r1 ):
167            if sn == 'Oyr' and ix < 60:
168              self.thissect = 'Oyr_3dtr'
169            elif sn == 'Amon':
170              if dims.find( 'lev' ) == -1 and dims.find( 'longitude latitude') != -1:
171                self.thissect = 'Amon_2d'
172            elif sn == 'Omon':
173              if dims.find( 'longitude latitude olevel' ) != -1:
174                self.thissect = 'Omon_3d'
175              else:
176                self.thissect = 'Omon_oth'
177            elif sn == 'cfMon':
178              if r1[:5] in ['ISCCP','PARAS','CALIP']:
179                self.thissect = 'cfMon_sim'
180              elif var[-3:] == 'co2':
181                if dims.find( 'longitude latitude alev' ) != -1:
182                  self.thissect = 'cfMon_3dmod'
183                else:
184                  self.thissect = 'cfMon_2dmod'
185              else:
186                self.thissect = 'cfMon_3dstd'
187            elif sn == 'cfDay':
188              bits = string.split( dims )
189               
190              if dims.find( 'longitude latitude' ) != -1 and bits[2] in ['alev','alevel','alevhalf','alt40','plev7','alt40']:
191                  self.thissect = 'cfDay_3d'
192              else:
193                  self.thissect = 'cfDay_2d'
194            elif sn == 'cf3hr':
195              if dims.find( 'longitude latitude' ) != -1:
196                  self.thissect = 'cf3hr_grid'
197              else:
198                  self.thissect = 'cf3hr_sim'
199            elif sn == 'aero':
200              if dims.find( 'longitude latitude alevel' ) != -1:
201                  self.thissect = 'aero_3d'
202              else:
203                  self.thissect = 'aero_oth'
204            elif sn == 'day':
205              if ix < 28:
206                  self.thissect = 'day_oth'
207              else:
208                  self.thissect = 'day_ss'
209
210class run(object):
211 def __init__(self):
212  logFarm = utils.dreqLog('logs')
213  log = logFarm.getLog( 'cmip5so' )
214
215  self.sx = collections.defaultdict( s1 )
216  self.sxp = collections.defaultdict( list )
217
218  self.soo = collections.defaultdict( s1 )
219  self.soop = collections.defaultdict( list )
220  self.om = omip()
221
222  self.cm5 = cmip5()
223  sop = cm5.sop
224  so = cm5.so
225  omipInsert = True
226  if omipInsert:
227    for k in soo.keys():
228      self.sx[k].a = so[k].a.copy()
229      so[k] = soo[k]
230    for k in soop.keys():
231      self.sxp[k] = sop[k][:]
232      sop[k] = soop[k]
233 
234  for v0 in sop['Oyr_3dtr']:
235    r = so['Oyr'].a[v0][:]
236    r[16] = string.replace( r[16], ' olevel', '' )
237    v = v0 + 's'
238    r[5] = v
239    r[12] = v
240    r[-1] = 1
241    so['Omon'].a[v] = r
242  ##
243## add tp "Omon_oth" group
244    sop['Omon_oth'].append( v )
245## set priority to 2
246    so['Omon'].a[v][0] = 2
247
248  for v in sop['Amon_2d']:
249    if v not in ['tasmin','tasmax'] and v[-6:] != 'Adjust':
250      so['cfSites'].a[v] = so['Amon'].a[v][:]
251      so['cfSites'].a[v][9] = u'time: point'
252      so['cfSites'].a[v][16] = u'site time1'
253      so['cf3hr'].a[v] = so['Amon'].a[v][:]
254      so['cf3hr'].a[v][9] = u'time: point'
255      so['cf3hr'].a[v][16] = u'longitude latitude time1'
256      sop['cf3hr_grid'].append( v )
Note: See TracBrowser for help on using the repository browser.