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

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

candidate

Line 
1
2import collections
3import xlrd
4
5class tableInfo(object):
6
7  tab2freq = {u'CMIP5_cfOff':'subhr', u'CORDEX_mon':'mon', u'SPECS_day':'day', u'CMIP5_day':'day', \
8                  u'PMIP3_OImon':'mon', u'CORDEX_day':'day', u'CMIP5_LImon':'mon', u'CMIP5_OImon':'mon', \
9                  u'CMIP5_Lmon':'mon', u'CMIP5_3hr':'3hr', u'CMIP5_Omon':'mon', u'PMIP3_OIclim':'monClim', \
10                  u'PMIP3_fx':'fx', u'CORDEX_fx':'fx', u'PMIP3_LImon':'mon', u'CMIP5_6hrPlev':'6hr', u'PMIP3_Lmon':'mon', \
11                  u'PMIP3_Amon':'mon', u'SPECS_Omon':'mon', u'CCMI1_fixed':'fx', u'PMIP3_Aclim':'monClim', u'CMIP5_6hrLev':'6hr', \
12                  u'CMIP5_Oclim':'monClim', u'PMIP3_LIclim':'monClim', u'CCMI1_monthly':'mon', u'CMIP5_fx':'fx', \
13                  u'CMIP5_cfDay':'day', u'CORDEX_6h':'6hr', u'PMIP3_day':'day', u'SPECS_OImon':'mon', u'CMIP5_cfMon':'mon', \
14                  u'CORDEX_sem':'monClim', u'SPECS_6hr':'6hr', u'CMIP5_cfSites':'subhr', u'CCMI1_hourly':'hr', u'CMIP5_aero':'mon', \
15                  u'CMIP5_Amon':'mon', u'PMIP3_Omon':'mon', u'CCMI1_daily':'day', u'SPECS_fx':'fx', u'PMIP3_Lclim':'monClim', \
16                  u'DCPP-day':'day',  \
17                  u'PMIP3_Oclim':'monClim', u'SPECS_Amon':'mon', u'SPECS_Lmon':'mon', u'CMIP5_cf3hr':'3hr', u'CORDEX_3h':'3hr', \
18                  'OImon':'mon', 'Omon_oth':'mon', 'Omon':'mon',  'Oyr':'yr', 'Omon_3d':'mon', \
19                  u'CCMI1_annual':'yr', u'CMIP5_Oyr':'yr', \
20                  'cf':'mon', \
21                  u'cf3hr':'3hr', u'Amon':'mon', u'aero':'mon', u'aero_3d':'mon', u'6hrPlev':'6hr', u'aero_oth':'mon', \
22                  u'cf3hr_grid':'3hr', u'LImon':'mon', u'cfSites':'subhr', u'day_oth':'day', u'cfDay_2d':'day', u'day':'day' }
23
24  tabChildren = {'Amon':('Amon_2d',), 'Omon':('Omon_3d', 'Omon_oth'), 'Oyr':('Oyr_3dtr',), 'aero':('aero_3d', 'aero_oth'), 'cf3hr':('cf3hr_grid', 'cf3hr_sim'), 'cfDay':('cfDay_2d', 'cfDay_3d'), 'cfMon':('cfMon_2dmod', 'cfMon_3dmod', 'cfMon_3dstd', 'cfMon_sim'), 'day':('day_oth', 'day_ss')}
25
26  oh = ['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', 'processing', 'gpid','rowIndex','ssect', 'priority']
27  ih = ['priority', 'long name', 'units', 'comment', 'questions & notes', 'output variable name', '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']
28  mp = {'processing':'questions & notes', 'ok_max_mean_abs':'mean absolute max',  'title':'long name', 'var':'CMOR variable name', 'dimensions':'CMOR dimensions', 'valid_min':'valid min', 'modeling_realm':'realm', 'ok_min_mean_abs':'mean absolute min', 'out_name':'output variable name',  'sn':'standard name', 'valid_max':'valid max'}
29
30  def __init__(self):
31    self.mpi = {self.mp[k]:k for k in self.mp}
32    self.oix = {}
33    self.iix = {}
34    for x in self.oh:
35      if x in self.ih:
36        self.iix[x] = self.ih.index(x)
37    for x in self.oh:
38      if x in self.mp:
39        self.oix[x] = self.ih.index( self.mp[x] )
40
41def sect(  mip, var, sn, ix, dims, r1, isBgc=False ):
42            if sn == 'Oyr' and isBgc and ix < 60:
43              thissect = 'Oyr_3dtr'
44            elif sn == 'Amon':
45              if dims.find( 'lev' ) == -1 and dims.find( 'longitude latitude') != -1:
46                thissect = 'Amon_2d'
47              else:
48                thissect = 'Amon_oth'
49            elif sn == 'Omon':
50              if dims.find( 'longitude latitude olevel' ) != -1:
51                thissect = 'Omon_3d'
52              else:
53                thissect = 'Omon_oth'
54            elif sn == 'cfMon':
55              if r1[:5] in ['ISCCP','PARAS','CALIP']:
56                thissect = 'cfMon_sim'
57              elif var[-3:] == 'co2':
58                if dims.find( 'longitude latitude alev' ) != -1:
59                  thissect = 'cfMon_3dmod'
60                else:
61                  thissect = 'cfMon_2dmod'
62              else:
63                thissect = 'cfMon_3dstd'
64            elif sn == 'cfDay':
65              bits = dims.split( )
66
67              if dims.find( 'longitude latitude' ) != -1 and bits[2] in ['alev','alevel','alevhalf','alt40','plev7','alt40','plev7c']:
68                  thissect = 'cfDay_3d'
69              else:
70                  thissect = 'cfDay_2d'
71            elif sn == 'cf3hr':
72              if dims.find( 'longitude latitude' ) != -1:
73                  thissect = 'cf3hr_grid'
74              else:
75                  thissect = 'cf3hr_sim'
76            elif sn == 'aero':
77              if dims.find( 'longitude latitude alevel' ) != -1:
78                  thissect = 'aero_3d'
79              else:
80                  thissect = 'aero_oth'
81            elif sn == 'day':
82              if ix < 28:
83                  thissect = 'day_oth'
84              else:
85                  thissect = 'day_ss'
86            else:
87              return (False, 'Sheet not recognised')
88            return (True,thissect)
89
90
91class c1(object):
92  def __init__(self):
93    self.a = collections.defaultdict( list )
94
95class loadAerChem(object):
96  def __init__(self):
97    ii = open( 'ingest/AerChemMIP_consol.csv', 'r' )
98    self.cc2 = collections.defaultdict( c1 )
99    for l in ii.readlines():
100      r = [x.strip() for x in l.split( '\t') ]
101      fr = r[6]
102      subs = r[5]
103      ##var = string.replace(r[2], '_', '' )
104      ##r[2] = var
105      var = r[2]
106      ##if subs.find( '(T2)') == -1 and subs != 'Monthly-mean zonal mean 2d':
107      tab = 'aer%s' % fr
108      if subs.lower().find( 'zonal' ) != -1:
109          tab = 'emMonZ'
110      if var in self.cc2[tab].a:
111          print 'ERROR.001.00001: duplicate variable: %s:: %s' %  (str(r), str(self.cc2[tab].a[var]))
112      self.cc2[tab].a[var].append( r )
113    ii.close()
114    ii = open( '../workbook/inputs/AerChemMip_inputMap.csv', 'r' )
115    eem = {}
116    for l in ii.readlines():
117      n,sn,o = l.strip().split( ',' )[:3]
118      eem[n] = (sn,o)
119    ii.close()
120    self.eem = eem
121
122class loadSpatial(object):
123  """direct copy of code in ../workbook. only moification is path to xls file; also
124     replaced utils_wb with direct import of xlrd, and removed dependency on string module"""
125  def __init__(self,ifile='../workbook/inputs/spatialShape_ref.xls'):
126    wb_book = xlrd.open_workbook(ifile,formatting_info=True)
127    s1 = wb_book.sheet_by_name(u'ss_ref')
128    self.ss = {}
129    self.ssu = {}
130    self.labByUid = {}
131    self.uidByLab = {}
132    uu = set()
133    for i in range(s1.nrows):
134      rr = [x.value for x in s1.row(i)]
135      if rr[0] != 'label' and rr[0][0] != '#':
136        assert rr[2] not in self.ss, 'Duplicate dimension set in spatial shape sheet: %s' % rr[2]
137        a,b,k,lf = tuple( [x.strip() for x in rr[:4] ] )
138        li = str( int( rr[4] ) )
139        u = str( rr[6] )
140        assert u not in uu, 'Duplicate uid in spatialShape_ref.xls: %s' % u
141        self.labByUid[u] = rr[0]
142        self.uidByLab[rr[0]] = u
143        self.ss[ k ] = (a,b,lf,li,u)
144        self.ssu[ u ] = (a,b,k,lf,li,u)
145
146  def addTime(self):
147    tshp = { 'time':['time-mean','Temporal mean'], 'time1':['time-point','Instantaneous value (i.e. synoptic or time-step value)'], \
148             'time2':['climatoglogy','Climatological mean'], \
149             'time3':['diurnal-cycle','Mean Diurnal Cycle'], \
150             '':['None','No temporal dimensions ... fixed field'] }
151    tuid = ['7a96eb30-8042-11e6-97ee-ac72891c3257', '7a972f78-8042-11e6-97ee-ac72891c3257', '7a976ce0-8042-11e6-97ee-ac72891c3257', '7a97ae58-8042-11e6-97ee-ac72891c3257','cf34c974-80be-11e6-97ee-ac72891c3257']
152    self.etd = {}
153    self.tsu = {}
154    self.tByLab = {}
155
156    k = 0
157    for s in tshp:
158       label, description = tshp[s]
159       u = tuid[k]
160       self.etd[s] = (u,label,description,s)
161       self.tsu[u] = (label,description,s)
162       self.tByLab[label] = (u,description,s)
163       k+=1
Note: See TracBrowser for help on using the repository browser.