import utils_wb import collections, re import shelve re_vstat = re.compile( '[str]{4}' ) nt_range = collections.namedtuple('range', ['mn', 'mx', 'amn', 'amx', 'smn', 'smx', 'samn', 'samx', 'comment', 'prov', 'url', 'label', 'title'] ) status = {'r':'robust','t':'tentative', 's':'suggested'} def parseVarNote0( r ): var,tab0 = [x.strip() for x in r.split(':')] if tab0.find( ',' ) == -1: return [(var,tab0),] else: return [(var, x.strip() ) for x in tab0.split( ',' )] class scan(object): def __init__(self): self.wb = utils_wb.workbook( '../workbook/CMIP6_issues_and_fixes.xls' ) print( self.wb.sns ) self.cc = collections.defaultdict( dict ) self.cm5 = collections.defaultdict( dict ) self.ccc = collections.defaultdict( dict ) for l in open( 'ingest/cmip5_flat.csv' ).readlines(): r = l.strip().split( '\t' ) self.cm5[r[0][6:]][r[1]] = r[2:] def _pval(self,x,tol): if type( x ) == type(u''): if x == u'=': return x ix = x.find( 'tol' ) if ix != -1: x = x.replace( 'tol', '%s' % tol ) s = eval(x) return s else: return x def run(self): sht = self.wb.book.sheet_by_name( 'varNotes' ) print( sht.nrows ) tol = 1.e-3 for i in range(1,sht.nrows): rr = [x.value for x in sht.row(i)] + ['','',''] if rr[0] != '' and rr[8] != 'xxxx': print( rr[0],[self._pval(x,tol) for x in rr[3:7]] ) vals = [self._pval(x,tol) for x in rr[3:7]] vstat = rr[8] if not re_vstat.match( vstat ): print( 'ERROR.vstat.00001: unrecognised status (%s) overwritten:' % vstat, rr ) vstat = 'tttt' vinfo = [rr[1],rr[7],rr[9],rr[10]] for var,tab in parseVarNote0( rr[0] ): self.cc[tab][var] = (vals, vstat, vinfo ) for t in self.cc: for v in self.cc[t]: mn, mx, amn, amx = self.cc[t][v][0] smn, smx, samn, samx = [status[x] for x in self.cc[t][v][1] ] vinfo = self.cc[t][v][2] comment = vinfo[0] prov = vinfo[2] url = vinfo[3] if len(url) > 0 and url[0] == '$': url = 'http://w3id.org/cmip6dr/ranges' + url[1:] else: url = None label = '%s-%s' % ( t,v) title = 'Guide ranges for %s (table %s)' % (v,t) tt = nt_range( mn, mx, amn, amx, smn, smx, samn, samx, comment, prov, url, label, title ) self.ccc[t][v] = tt sh = shelve.open( 'misc/varRanges3' ) sh['__info__'] = {'source':'scanLims.py', 'description':'varible limits for CMIP variables'} sh['__cols__'] = ['table','var','vals:l,h,al,ah; vstat [string]; info:desc,how,prov'] for t in sorted( self.cc.keys() ): for v in sorted( self.cc[t].keys() ): print( t,v, self.cc[t][v] ) sh['%s.%s' % (str(t),str(v))] = (t,v,self.cc[t][v][:] ) sh.close() s = scan() s.run()