Ignore:
Timestamp:
31/10/16 09:18:59 (4 years ago)
Author:
mjuckes
Message:

fix on cmv duplication bug

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CMIP6dreqbuild/trunk/src/workbook/ivg.py

    r770 r799  
    22import string, collections, uuid, shelve 
    33import importWbRef 
     4import xlrd 
    45from importWbRef import cellMethodCheck 
    5  
     6import importWbMods 
    67cmip5GrpLk = collections.defaultdict( dict ) 
    78 
     
    6869              sg = 'cfDay_2d' 
    6970        except: 
    70           print 'Failed to parse: ',dims 
     71          print 'SEVERE: Failed to parse: ',dims 
    7172    elif tab == 'cf3hr': 
    7273          if string.find( dims, 'longitude|latitude' ) != -1: 
     
    9192    else: 
    9293      if tab0 not in self.dset001: 
    93         print 'No SUBGROUP: ', tab0 
     94        print 'ERROR.ivg002.0001: No SUBGROUP: ', tab0 
    9495        self.dset001.add(tab0) 
    9596      return False 
    9697 
    9798class structureList(object): 
     99  ## table headings for structure list spreadsheet 
     100  sats = [ u'label', u'title', u'description', u'procNote', u'prov', 
     101u'odims', u'coords', u'cell_methods', u'cell_measures', u'flag_meanings', u'flag_values', 
     102u'spid', u'tmid', u'cmid', u'cids', u'dids', u'uid' ] 
     103##hd = sats[:-6] + ['spatial label','time label'] + sats[-6:] 
     104  hd = ['spatial label','time label'] + sats 
     105 
    98106  def __init__(self): 
    99107    self.force = ['str-a02',] 
     
    101109    self.spsh.addTime() 
    102110    self.cellm = importWbRef.loadCellm() 
    103     self.ll = [] 
     111    self.ll = set() 
    104112    self.lldict = dict() 
     113    self.structAttr = ['spid','tmid'] + self.sats 
     114    self.tmsp2str = {} 
     115    self.importRef02() 
     116    self.strRepMap = {} 
     117    self.impStructRep() 
     118    self.modStr = importWbMods.loadStr() 
     119 
    105120    self.nt_dims = collections.namedtuple( 'dims', ['uid','label','spid','tlab','odims','coords','cell_methods','cell_measures','flag_values','flag_meanings','description','procNote','prov'] ) 
     121    self.nt2_dims = collections.namedtuple( 'dims', ['uid','label','splab','tlab','odims','coords','cell_methods','cell_measures','flag_values','flag_meanings','description','procNote','prov'] ) 
    106122    self.ee3 = {} 
    107123    #self.cmch = cellMethodCheck() 
     
    139155      self.uidByLab[r[1]] = r[0]  
    140156       
    141  
     157  def asDict(self,uid): 
     158      assert uid in self.ref2ByUid, 'uid not found: %s' % uid 
     159      d1 = {} 
     160      for i in range(len(self.hd)): 
     161        d1[self.hd[i]] = self.ref2ByUid[uid][i] 
     162      return d1 
     163 
     164  def impStructRep(self): 
     165      wb = xlrd.open_workbook( 'inputs/structureRepeats.xls', 'r' ) 
     166      sht = wb.sheet_by_name( 'Sheet1' ) 
     167      for i in range(sht.nrows): 
     168        r = [x.value for x in sht.row(i)] 
     169        if len(r[0]) > 3 and r[0][:4] == 'str-': 
     170          assert r[0].strip() in self.ref2ByLab, 'Attempt to map to undefined label: %s' % r[0].strip() 
     171          self.strRepMap[ r[2].strip() ] = r[0].strip() 
     172          print 'INFO.strmap.00001: %s --- > %s' % (r[2].strip(),  r[0].strip()) 
     173 
     174  def importRef02(self): 
     175      wb = xlrd.open_workbook( 'inputs/refStructure.xlsx', 'r' ) 
     176      sht = wb.sheet_by_name( 's1' ) 
     177      r1 = [x.value for x in sht.row(0)] 
     178      assert r1 == self.hd, 'Headings of refStructure.xlsx do not match expected values' 
     179      print 'IMPORT REF 02: PASSED FIRST CHECK' 
     180      inx = [self.hd.index(x) for x in ['time label', 'spatial label', 'odims', 'coords', 'cell_methods', u'cell_measures', 'flag_meanings'] ]  
     181      self.ref2ByUid = {} 
     182      self.ref2ByLab = {} 
     183      self.ref2NewLabs = set() 
     184      self.ref2Byt2 = {} 
     185      self.ref2Maps = collections.defaultdict(set) 
     186      cc = collections.defaultdict( list ) 
     187      for i in range(1,sht.nrows): 
     188        r = [x.value for x in sht.row(i)] 
     189        for x in range(6): 
     190          if r[-x] in ["("('',)",)",'("(\'\',)",)']: 
     191            r[-x] = '' 
     192        uid = r[-1] 
     193        lab = r[2] 
     194        mapping = False 
     195        mode = None 
     196        if lab.find( ' ' ) != -1: 
     197          l1,mode,l2 = lab.split(' ') 
     198          assert mode in ['o','a'], 'Unrecognised mode in structure table (Label column): %s' % lab 
     199          self.ref2Maps[l2].add(l1) 
     200          mapping = True 
     201         
     202        cm = r[9] 
     203        cmid0 = r[15] 
     204        cm,rv =  importWbRef.cellMethodCheck(cm) 
     205        if cm != '': 
     206          if cm in self.cellm.cminfo: 
     207            cmid = self.cellm.cminfo[cm][2] 
     208          elif cm in self.cellm.cmmap: 
     209            cm2 = self.cellm.cmmap[cm] 
     210            cmid = self.cellm.cminfo[cm2][2] 
     211            cm = cm2 
     212          else: 
     213            print 'ERROR.cm.00001: cell methods not found: %s' % cm 
     214            cmid = '__cm_not_found__' 
     215            raise 
     216        else: 
     217          cmid = 'CellMethods::fixed' 
     218        if cm in self.cellm.cmmap: 
     219          cm = self.cellm.cmmap[cm] 
     220          cmid = self.cellm.cminfo[cm][2] 
     221        r[9] = cm 
     222        r[15] = cmid 
     223        t2 = tuple( [r[x] for x in inx] ) 
     224        assert uid not in self.ref2ByUid, 'Duplicate uid in refStructure.xlsx: %s' % uid 
     225        if lab in self.ref2ByLab: 
     226          print 'SEVERE: Duplicate lab in refStructure.xlsx: %s' % lab 
     227        ##assert lab not in self.ref2ByLab, 'Duplicate lab in refStructure.xlsx: %s' % lab 
     228        self.ref2ByUid[uid] = r[:] 
     229        self.ref2ByLab[lab] = uid 
     230 
     231        if not mode == 'o': 
     232          cc[t2].append( uid ) 
     233          ##assert t2 not in self.ref2Byt2, 'Duplicate t2 in refStructure.xlsx: %s, %s' % (str(t2), uid) 
     234        if t2 not in self.ref2Byt2: 
     235          self.ref2Byt2[t2] = uid 
     236 
     237      tt = [t for t in cc if len(cc[t]) > 1] 
     238      if len(tt) > 0: 
     239        print 'SEVERE: Duplicate dimensions encountered' 
     240        oo = open( 'duplicateStructure.csv', 'w' ) 
     241        for t in tt: 
     242          oo.write( '#\t\n' ) 
     243          for u in cc[t]: 
     244            oo.write( '\t'.join( self.ref2ByUid[u] ) + '\n' ) 
     245        oo.close() 
     246        raise 
     247             
     248      print 'IMPORT REF 02: PASSED SECOND CHECK' 
     249      for x in self.ref2Maps: 
     250        for l in self.ref2Maps[x]: 
     251          assert x in self.ref2ByLab, 'Attempt to map to undefined structure: %s, %s' (x,l) 
     252 
     253      for t in self.ref2Byt2: 
     254### 
     255### define lookup table for AerChemMIP 
     256### 
     257### 
     258        cc = t[3] 
     259        oo = t[2] 
     260        if cc == '' and oo == '' and t[6] == '': 
     261           cm = t[4] 
     262           if cm in ['time: mean','time: point']: 
     263              if cm == 'time: mean': 
     264                    tmode = 'mean' 
     265              elif cm == 'time: point': 
     266                    tmode = 'point' 
     267              else: 
     268                    tmode = '' 
     269              cme = t[5] 
     270              if cme in ['', 'area: areacella']: 
     271                    self.tmsp2str[ (t[0],t[1],tmode) ] = self.ref2Byt2[t] 
     272       
    142273  def importExRef(self): 
    143274      sh = shelve.open( 'sh/extraStructureRecordsRef', 'r' ) 
     
    185316      sh.close() 
    186317      
     318  def add2(self,cand): 
     319    ## cand = [u,label,splab,tlab, odim, crd, cmet, cmea, flgv, flgm, desc, proc, prov] 
     320    ## look-up structure based on time label, spatial id, other dimensions, coordinates, cell methods, cell measures, flag meanings 
     321    err = False 
     322    nt =  self.nt2_dims._make( cand ) 
     323    cm = nt.cell_methods 
     324    if nt.cell_methods != '': 
     325          cm,rv =  importWbRef.cellMethodCheck(cm) 
     326          if cm in self.cellm.cminfo: 
     327            cmid = self.cellm.cminfo[cm][2] 
     328          elif cm in self.cellm.cmmap: 
     329            cm2 = self.cellm.cmmap[cm] 
     330            cmid = self.cellm.cminfo[cm2][2] 
     331            cm = cm2 
     332          else: 
     333            print 'ERROR.cm.00001: cell methods not found: %s' % nt.cell_methods 
     334            cmid = '__cm_not_found__' 
     335    else: 
     336          cmid = '' 
     337    if cm in self.cellm.cmmap: 
     338      cm = self.cellm.cmmap[cm] 
     339      if cm != '': 
     340        cmid = self.cellm.cminfo[cm][2] 
     341      else: 
     342        cmid = 'CellMethods::fixed' 
     343    t2 = ( nt.tlab, nt.splab, nt.odims, nt.coords, cm, nt.cell_measures, nt.flag_meanings ) 
     344       
     345    done = 0 
     346    if t2 in self.ref2Byt2: 
     347      u = self.ref2Byt2[t2] 
     348      rc = 0 
     349      label = self.ref2ByUid[u][2] 
     350      done = 1 
     351    else: 
     352      u = cand[0] 
     353      spid = self.spsh.uidByLab[ nt.splab ] 
     354      tmid = self.spsh.tByLab[nt.tlab][0] 
     355     #### tlab, splab, odims, coords, cell_met, cell_mea, flag mean 
     356      t1 = ( tmid, spid, nt.odims, nt.coords, cm, nt.cell_measures, nt.flag_meanings ) 
     357      if t2 in self.modStr.lookup: 
     358        l2 = self.modStr.lookup[t2] 
     359        if l2 not in self.ref2ByLab: 
     360           print 'ERROR.structure.01020: tuple lookup maps to unlnown label: ',t2,l2 
     361        else: 
     362          u = self.ref2ByLab[l2] 
     363          label = self.ref2ByUid[u][2] 
     364          done = 2 
     365          rc = 0 
     366 
     367    if done == 0: 
     368        print 'ERROR.structure.01010: tuple lookup not found: ',cand,t2 
     369        label = None 
     370        while label == None or label in self.ref2ByLab or label in self.newStrLabels: 
     371           self.kr += 1 
     372           label = 'str-d%2.2i' % self.kr 
     373           assert self.kr < 100, 'Too many additional structure records required' 
     374        self.newStrLabels.add( label ) 
     375        tmid = self.spsh.tByLab[nt.tlab][0] 
     376        cids = '' 
     377        dids = '' 
     378        ats = [nt.splab, nt.tlab, nt.label,nt.label, nt.description, '','ivg.add2',nt.odims,nt.coords, cm,nt.cell_measures,nt.flag_meanings,'',spid,tmid,cmid,cids,dids,u]  
     379        self.ref2Byt2[t2] = u 
     380        self.ref2ByUid[u] = ats 
     381        rc = 1 
     382 
     383    if label in self.strRepMap: 
     384      print 'INFO.strmap.00002: mapping %s' % label 
     385      label = self.strRepMap[label] 
     386      u = self.ref2ByLab[label] 
     387 
     388    self.ll.add( (u,'') ) 
     389    return (rc,u,label) 
     390 
    187391  def add(self,cand,t1=None): 
    188392    ## cand = [u,label,spid,tlab, odim, crd, cmet, cmea, flgv, flgm, desc, proc, prov] 
     
    392596            self.rqv_vg['%s.%s.%s' % (ll[2],ll[1],ll[0])] = vgid 
    393597 
     598class refCmv(object): 
     599  def __init__(self): 
     600      self.refUid = collections.defaultdict( dict ) 
     601      sh = shelve.open( '../framework/inSh/refCmvId', 'r' ) 
     602      for k in sh.keys(): 
     603        tab, lab, ver = sh[k] 
     604        self.refUid[tab][lab] = k 
     605      sh.close() 
     606 
    394607class checkCmv(object): 
    395608  def __init__(self,tlist): 
Note: See TracChangeset for help on using the changeset viewer.