source: CMIP6dreqbuild/trunk/srcMisc/dreq_utils.py @ 600

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/srcMisc/dreq_utils.py@600
Revision 600, 10.2 KB checked in by mjuckes, 5 years ago (diff)

final adjustments

Line 
1
2import string, collections, shelve, uuid
3from sets import Set
4
5
6class prconsolexpt(object):
7  def __init__(self):
8    self.records = []
9    self.info =['label','group','mip','description','modelClass','tier','nstart','starty','endy','yps','ensz','ntot','comment'] 
10  def parse(self,sh):
11    for j in range(2,sh.nrows):
12        r = map( lambda x: x.value, sh.row(j) )
13        n = string.strip( r[0] )
14        g = string.strip( r[1] )
15        mip = string.strip( r[3] )
16        desc = string.strip( r[7] )
17        mcfg = string.strip( r[8] )
18        comment = ''
19        try:
20          if type(r[5]) == type(1.):
21            tier = int( r[5] )
22          else:
23            tier = [int( x) for x in string.split( r[5] )]
24        except:
25          print 'ERROR.001.0001: tier not integer: %s, %s' % (mip,r[5])
26          if r[5][:3] == 'Sub':
27            tier = 1
28            comment += 'Tiering of sub-components .....'
29          else:
30            raise
31        ll = []
32        for j in [6,11,12,13]:
33          try:
34            if type(r[j]) == type(1.):
35              v = int( r[j] )
36            else:
37              v = [int( x) for x in string.split( r[j] )]
38            ll.append( v )
39          except:
40            k = {6:'nstart', 11:'years per sim', 12:'ensemble size', 13:'total number of years'}[j]
41            try:
42              if string.find( r[j], '-' ) != -1:
43                ll.append( int( string.split( r[j], '-' )[0] ) )
44              else:
45                try:
46                  ll.append( int( string.split( r[j] )[0] ) )
47                except:
48                  print 'Failed to convert to integer ',r[j]
49                  print r
50                  raise
51              comment += ': %s abbreviated: %s' % (k,r[j])
52              print 'ERROR.001.0002: %s not integer: %s, %s' % (k,mip,r[j])
53            except:
54              raise
55        starty =  r[9] 
56        endy =  r[10] 
57        nstart, yps, ensz, ntot = ll
58        ##yps = int( r[11] )
59        ##ensz = int( r[12] )
60        ##ntot = int( r[13] )
61        self.records.append( [n,g,mip,desc,mcfg,tier,nstart,starty,endy,yps,ensz,ntot,comment] )
62
63class probj(object):
64  def __init__(self):
65    self.records = []
66
67  def parse(self,mip,sh):
68    st = False
69    r = None
70    for j in range(sh.nrows):
71      r = map( lambda x: x.value, sh.row(j) )
72      if st:
73        rr = [string.strip(x) for x in r]
74        if all( [rx == '' for rx in rr[:3]] ):
75          pass
76          ## omit of all blank
77        elif any( [rx == '' for rx in rr[:3]] ):
78          print 'Record with blank(s): %s: %s' % (mip,str(rr) )
79          self.records.append( (mip,rr[0],rr[1],rr[2]) )
80        else:
81          self.records.append( (mip,rr[0],rr[1],rr[2]) )
82      elif r[0] == 'Short name':
83        st = True
84
85class prcexr(object):
86  """Parse a row of the consolidated experiment sheet"""
87
88  def __init__(self,dd=None):
89    self.nt = collections.namedtuple( 'r4info', ['label','group','ix','mip','altLabel','tier','nstart','description','config','start','end','lsim','ensSize','ntot','startNote','tierNote'] )
90    if dd != None:
91      ks = sorted( dd.keys() )
92      for k in ks:
93        self.parse( k, dd[k] )
94
95  def parse(self,rv):
96    rr = rv[:14]
97    startNote = ''
98    tierNote = ''
99    try:
100     for j in [2,5,6,11,12,13]:
101       if j == 5 and type(rr[j]) == type(u'x') and rr[j][:4] == 'Sub-':
102         tierNote = rr[j]
103         rr[j] = -1
104       elif type(rr[j]) == type(u'x') and (string.find(rr[j], 'to') != -1 or string.find(rr[j], 'or') != -1):
105         rr[j] = int( string.split( rr[j] )[-1] )
106       elif type(rr[j]) == type(u'x') and (string.find(rr[j], '-') != -1):
107         rr[j] = int( string.split( rr[j], '-' )[-1] )
108       elif  j == 2 and rr[j] == '':
109         rr[j] = -1
110       else:
111         rr[j] = int( rr[j] )
112     for j in [9,10]:
113       if rr[j] == '':
114         rr[j] = 0
115       else:
116         try:
117           rr[j] = int( rr[j] )
118         except:
119           if j == 9:
120             startNote = rr[j]
121           else:
122             print startNote, rr
123             startNote += ( ' -- %s' % rr[j] )
124           rr[j] = -1
125    except:
126      print rr
127      raise
128    rr.append( startNote )
129    rr.append( tierNote )
130    self.row = self.nt._make( rr  )
131
132class pr4(object):
133  """Parse row 4 of the request scoping sheet"""
134
135  def __init__(self,dd=None):
136    self.nt = collections.namedtuple( 'r4info', ['ixcntl','ixh','ix0','ixm','ownix','ownhr','othix','othhr','mode','treset'] )
137
138    if dd != None:
139      ks = sorted( dd.keys() )
140      for k in ks:
141        self.parse( k, dd[k] )
142
143  def parse3(self,mip,r3):
144        if r3[6] == 'objectives served':
145          mode = 6
146        elif r3[7] == 'objectives served':
147          mode = 7
148        else:
149          raise 'Unable to parse heading'
150          mode = 999
151        self.r3info = mode
152       
153  def parse(self,mip,r4):
154    if r4[6][:17] == 'objectives served':
155          mode = 6
156    elif r4[7][:17] == 'objectives served':
157          mode = 7
158    else:
159          print 'Unable to parse heading %s' % str(r4)
160          print mip
161          print r4
162          raise
163          mode = 999
164    self.ixh = 0
165    self.ixh = 0
166    self.ix0 = 0
167    hhref = [u'control', u'AMIP', u'abrupt4xCO2', u'1pctCO2', u'CMIP6 historical']
168
169    try:
170      self.ixh = r4.index( u'CMIP6 historical' )
171      self.ixm = r4.index( u'MIP name:' )
172      self.ix0 = self.ixh + 2
173      if r4[self.ixh-8] == u'control':
174        self.iccntl = self.ixh-8
175        hh = []
176        for j in range(5):
177          hh.append( r4[self.iccntl + j*2] )
178          if hh[j] != hhref[j]:
179            print 'ERROR.001.002: mismatch in heading %s' %j, r4
180      else:
181        print 'ERROR.001.001: control expt. column not found', r4
182    except:
183      if mip == 'DCPP':
184        self.ix0 = r4.index( u'DCPP-A' )
185        self.ixm = self.ix0+8
186        self.ixh = -1
187        self.iccntl = self.ix0
188        hh = []
189        for j in range(5):
190          hh.append( r4[self.iccntl + j*2] )
191      else:
192        print 'Failed to parse Row 4'
193        raise
194
195    self.ownex = []
196    self.othex = []
197    self.othetrst = []
198    for j in range(self.ix0,self.ixm,2):
199      if string.strip(r4[j]) != '':
200        self.ownex.append(j)
201    for j in range(self.ixm,len(r4)-1,3):
202      if string.strip(r4[j+1]) != '':
203        self.othex.append(j)
204        if r4[j+2] != '':
205          self.othetrst.append(int(r4[j+2]))
206        else:
207          self.othetrst.append('')
208   
209    print mip, self.ixh, self.iccntl, self.ix0, self.ixm , self.ownex, self.othex
210    ownhr =  map(lambda x: r4[x], self.ownex)
211    othhr =  map(lambda x: r4[x+1], self.othex)
212    print ownhr, othhr
213    self.r4info = self.nt( self.iccntl, self.ixh, self.ix0, self.ixm, self.ownex, ownhr, self.othex, othhr,mode,self.othetrst )
214    ##( 'r4info', ['ixcntl','ixh','ix0','ixm','ownix','ownhr','othix','othhr','mode'] )
215
216   
217
218class parseShb(object):
219  def __init__(self,vdate,sx,cmip5gplk):
220    """Parse **'dreq_consol_tables_reviewed_b_v%s' % vdate** from dreq_consol_tables.py"""
221    shb = shelve.open( 'dreq_consol_tables_reviewed_b_v%s' % vdate, 'r' )
222    revTabIds = Set( shb.keys()[:] )
223    revisedTabKeys = shb.keys()
224    revisedTabKeys.sort()
225    revisedTabKeysff = []
226    revisedTabKeysNM = {}
227    tabsects = collections.defaultdict( Set )
228    tabsectbyvar = collections.defaultdict( dict )
229    tabsectuuid = collections.defaultdict( dict )
230    tabuuid = {}
231    tabuuidrefs = collections.defaultdict( int )
232    sn = set()
233    for r in revisedTabKeys:
234      if not tabuuid.has_key( r ):
235        tabuuid[r] = str( uuid.uuid1() )
236##
237## need to get this information from requestLink_tmp -----
238##
239      preset = -3
240      if string.find( r, '.' ) != -1:
241        mip,tab = string.split(r, '.' )
242        assert sx.cmip5so.so.has_key(tab), 'FATAL.001.0001: revised table not found in original: %s' % tab
243        lnf = []
244        lpe = []
245        lmod = []
246        s1 = set()
247        for v in shb[r].keys():
248          v1 = string.strip(v)
249          s1.add(v1)
250          if not sx.cmip5so.so[tab].a.has_key(v1):
251            if mip != 'OMIP':
252              lnf.append(v)
253          else:
254            if shb[r][v][1] == sx.cmip5so.so[tab].a[v1][0]:
255              lpe.append(v)
256            else:
257              lmod.append(v)
258##
259## index sections of tables (for OMIP)
260##
261          tup = shb[r][v]
262      ### tup=(ix,p,sect,rowix)
263          if tup[2] != None:
264            tabsects[mip].add( (tab,tup[2]) )
265            tabsectbyvar[mip]['%s.%s' % (tab,v)] = tup
266            sk = '%s.%s' % (tab,tup[2])
267            if not tabsectuuid[mip].has_key( sk ):
268              tabsectuuid[mip][sk] = str( uuid.uuid1() )
269##
270## want to copy to Omon ... but involves change of frequency ... and dimensionality ....
271## so can only, here, reserve a uid for the tbd new cmor variable, a link of where it is coming from
272## and extend the OMIP.Omon table in tabsectbyvar
273##
274          if r == 'OMIP.Oyr':
275            if tup[2] == 'bgc' and tup[3] <= 65:
276              ##print 'INFO.ssss.00001: %s, %s' % (v,str(tup) )
277              ##tabsectbyvar[mip]['Omon.%s' % v] = (tup[0], 2, 'bgc.Oyr', tup[-1] )
278              pass
279              ##sn.add( tup[3] )
280
281        lnu = 0
282        for v in sx.cmip5so.so[tab].a.keys():
283          if (v not in s1) and (v not in shb[r]):
284            if tab == 'Omon' and v in sx.cmip5so.sop['Oyr_3dtr']:
285              pass
286            else:
287              lnu += 1 
288        if len(lnf) > 0:
289          print 'ERROR.008.0001: Revised variables not in original: %s %s' % (r,str(lnf) )
290        if len(lmod) == 0 and lnu == 0 and preset < 0:
291          print 'INFO.008.0001: No modfications in %s' % r
292#### save uuid of table ... for use in requestLinks
293          revisedTabKeysNM[r] = cmip5gplk[tab]
294        else:
295          print 'INFO.008.0002: modifications in %s: mods %s, unused %s, preset %s' % (r,len(lmod),lnu,preset)
296          revisedTabKeysff.append( r )
297
298    self.revGpIds = Set()
299    for t in revTabIds:
300      if t[-4:] == 'Omon':
301        self.revGpIds.add( t + '_oth' )
302        self.revGpIds.add( t + '_3d' )
303      elif t[-5:] == 'cfMon':
304        self.revGpIds.add( t + '_3dstd' )
305        self.revGpIds.add( t + '_3dmod' )
306        self.revGpIds.add( t + '_2dmod' )
307        self.revGpIds.add( t + '_sim' )
308
309    shb.close()
310    self.tabsectuuid = tabsectuuid
311    self.tabsectbyvar = tabsectbyvar
312    self.revisedTabKeysff = revisedTabKeysff
313    self.revisedTabKeysNM = revisedTabKeysNM
314    self.revisedTabKeys = revisedTabKeys
315    self.tabuuid = tabuuid
Note: See TracBrowser for help on using the repository browser.