Changeset 384


Ignore:
Timestamp:
16/09/15 18:38:48 (5 years ago)
Author:
mjuckes
Message:

partial migration to dreq2

Location:
CMIP6dreqbuild/trunk/src/workbook
Files:
3 edited

Legend:

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

    r383 r384  
    1717    self.a = collections.defaultdict( list ) 
    1818 
     19def mycc(s): 
     20      s = string.replace( s, '&', '' ) 
     21      if len(s) > 0 and s[-1] == '+': 
     22        s = s[:-1] + 'ETC' 
     23## camelcase the input string 
     24      s1 = string.lower( string.replace(string.strip(str( s) ), '-', ' ') ) 
     25      return string.replace( string.capwords( s1 ), ' ', '' ) 
     26 
    1927empty=re.compile('^$') 
    2028 
     
    3543class main(object): 
    3644 
    37   def __init__(self,src,rq,repl=False): 
     45  def __init__(self,src,rq,doRepl=False,run=False,schemaMode='dreq'): 
     46    self.schemaMode = schemaMode 
    3847    self.src=src 
     48    fok = [test(os.path.isfile(src),'%s not found' % src), ] 
     49    assert all( fok), 'Required input file(s) missing' 
     50 
     51    for sh in [rq.expt,rq.exgp,rq.objec,rq.refti, rq.revti, rq.vars, rq.grps, rq.rqvg, rq.rqli, rq.rqit, rq.rqsect]: 
     52       print sh['__info__'] 
     53 
    3954    self.repl = collections.defaultdict( list ) 
    4055    self.err0010 = collections.defaultdict( int ) 
     
    4560 
    4661    self.objectives = collections.defaultdict( dict ) 
    47     self.objectiveLinks = collections.defaultdict( dict ) 
    48  
    49     if repl: 
     62    self.objectiveLinks = collections.defaultdict( s1 ) 
     63    self.dsortdd = {} 
     64 
     65    if doRepl: 
    5066      self.importRepl() 
    5167      self.importRemove() 
     
    5369      self.importInsert() 
    5470    self.e15_10 = 0 
     71    self.doc = xml.dom.minidom.parse( self.src  ) 
     72    self.skey = {'experiment':rq.expt, 'exptgroup':rq.exgp, \ 
     73         'objective':rq.objec, 'var':rq.vars,'ovar':rq.refti, 'groupitem':rq.grps, \ 
     74         'revisedtabitem':rq.revti, 'requestlink':rq.rqli, 'requestitem':rq.rqit, \ 
     75         'requestvargroup':rq.rqvg, 'tablesection':rq.rqsect} 
     76 
     77    self.prep(rq) 
     78    if run: 
     79      self.run(rq) 
     80      if self.schemaMode == 'dreq2': 
     81        self.write2() 
     82      self.finish() 
     83 
     84  def prep(self,rq): 
     85## keys here match section element names in schema 
     86    #for k in [ 'var','ovar','groupitem', 'revisedtabitem']: 
     87## lists for 3 new sections 
     88### uuid, spid, tmid, cell_methods, cell_measures, description, procNote, prov 
     89    structure = []  
     90### uuid, label, dimensions, shape, levels, levelFlag 
     91    spatialshp = [] 
     92### uuid, label, dimension, tstyle 
     93    temporalshp = [] 
     94### cmor variables 
     95    self.cmv = [] 
     96    self.cmvinfo = ('uuid','stid','label','title','description','vid', \ 
     97                    'deflate_level', 'shuffle', 'ok_max_mean_abs', 'flag_meanings', 'type', 'ok_min_mean_abs',  \ 
     98                    'deflate', 'valid_min', 'flag_values', 'modeling_realm', 'valid_max', 'positive', 'mipTable', \ 
     99                    'prov', 'provNote', 'frequency', 'rowIndex', 'coordinates') 
     100### request variables 
     101    self.rqv = [] 
     102    for ksect in [ 'ovar','groupitem']: 
     103      thissh = self.skey[ksect] 
     104      if ksect == 'ovar': 
     105            tab2freq = {u'CMIP5_cfOff':'subhr', u'CORDEX_mon':'mon', u'SPECS_day':'day', u'CMIP5_day':'day', \ 
     106       u'PMIP3_OImon':'mon', u'CORDEX_day':'day', u'CMIP5_LImon':'mon', u'CMIP5_OImon':'mon', \ 
     107       u'CMIP5_Lmon':'mon', u'CMIP5_3hr':'3hr', u'CMIP5_Omon':'mon', u'PMIP3_OIclim':'monClim', \ 
     108       u'PMIP3_fx':'fx', u'CORDEX_fx':'fx', u'PMIP3_LImon':'mon', u'CMIP5_6hrPlev':'6hr', u'PMIP3_Lmon':'mon', \ 
     109       u'PMIP3_Amon':'mon', u'SPECS_Omon':'mon', u'CCMI1_fixed':'fx', u'PMIP3_Aclim':'monClim', u'CMIP5_6hrLev':'6hr', \ 
     110       u'CMIP5_Oclim':'monClim', u'PMIP3_LIclim':'monClim', u'CCMI1_monthly':'mon', u'CMIP5_fx':'fx', \ 
     111       u'CMIP5_cfDay':'day', u'CORDEX_6h':'6hr', u'PMIP3_day':'day', u'SPECS_OImon':'mon', u'CMIP5_cfMon':'mon', \ 
     112       u'CORDEX_sem':'monClim', u'SPECS_6hr':'6hr', u'CMIP5_cfSites':'subhr', u'CCMI1_hourly':'hr', u'CMIP5_aero':'day', \ 
     113       u'CMIP5_Amon':'mon', u'PMIP3_Omon':'mon', u'CCMI1_daily':'day', u'SPECS_fx':'fx', u'PMIP3_Lclim':'monClim', \ 
     114       u'PMIP3_Oclim':'monClim', u'SPECS_Amon':'mon', u'SPECS_Lmon':'mon', u'CMIP5_cf3hr':'3hr', u'CORDEX_3h':'3hr', \ 
     115       u'CCMI1_annual':'yr', u'CMIP5_Oyr':'yr'} 
     116            kk = ['uuid', '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', 'gpid','rowIndex','priority'] 
     117            id = kk.index('dimensions') 
     118            thisnt = collections.namedtuple( 'ovar', kk ) 
     119            ov = [] 
     120            dset = set() 
     121            ds2 = set() 
     122            ovuu = {} 
     123            for k in thissh: 
     124              if k[0] != '_': 
     125                rr = thissh[k][:] 
     126                if rr[id] == 's|c|a|l|a|r': 
     127                  print 'ERROR.060.0001: bad dimension string detected and corrected: %s' % rr[id] 
     128                  rr[id] = 'scalar' 
     129                tt = thisnt._make( rr )  
     130                ov.append( tt ) 
     131                dset.add( ov[-1].dimensions ) 
     132                ds2.add( (tt.dimensions,tt.cell_methods,tt.cell_measures) ) 
     133                ovuu[tt.uuid] = tt 
     134                if rr[22][-3:] in ['mon','day','3hr']: 
     135                  fr = rr[22][-3:] 
     136                elif rr[22][-2:] in [ 'yr','fx']: 
     137                  fr = rr[22][-2:] 
     138                else: 
     139                  fr = tab2freq[rr[22]] 
    55140    
    56     fok = [test(os.path.isfile(src),'%s not found' % src), ] 
    57  
    58     assert all( fok), 'Required input file(s) missing' 
    59  
    60     for sh in [rq.objec,rq.refti, rq.revti, rq.vars, rq.grps, rq.rqvg, rq.rqli, rq.rqit, rq.rqsect]: 
    61        print sh['__info__'] 
    62  
    63     doc = xml.dom.minidom.parse( src  ) 
    64     main = doc.childNodes[0] 
     141                self.cmv.append( (tt.uuid, (tt.dimensions,tt.cell_methods,tt.cell_measures), tt.var, tt.title, tt.comment, tt.vid, \ 
     142                    tt.deflate_level, tt.shuffle, tt.ok_max_mean_abs, tt.flag_meanings, tt.type, tt.ok_min_mean_abs, \ 
     143                    tt.deflate, tt.valid_min, tt.flag_values, tt.modeling_realm, tt.valid_max, tt.positive, tt.mipTable, \ 
     144                    '', '', fr, tt.rowIndex, '') ) 
     145                self.rqv.append( (str( uuid.uuid1() ),'%s-%s' % (tt.mipTable,tt.var), tt.uuid, tt.gpid, tt.priority) ) 
     146            self.dsort( dset ) 
     147            print self.dsortdd[ksect][0].keys() 
     148      elif ksect == 'groupitem': 
     149            kk = ['group', 'var', 'table', 'freq', 'descriptionEx', 'shape', 'levels', 'tstyle', 'mask', 'misc', 'mip', 'uuid', 'new', 'gpid', 'vkey', 'vid'] 
     150            thisnt = collections.namedtuple( 'groupitem', kk + ['cmorv',] ) 
     151            il = kk.index( 'levels' ) 
     152            iu = kk.index( 'uuid' ) 
     153            dset = set() 
     154            dsgpi = set() 
     155            gi = [] 
     156            s1 = set() 
     157            sm = set() 
     158            varsets = [] 
     159            nov = 0 
     160            for k in thissh: 
     161              if k[0] != '_': 
     162                rr = thissh[k][:] 
     163## 
     164## split variable, create 2nd record at 23 levels. 
     165## 
     166                if rr[il] in  {u'17 (or 23 )', u'17 (or 23)', u'17 (or23)'}: 
     167                  rr0 = rr + [rr[1] + '23',] 
     168                  rr0[il] = 23 
     169                  rr0[iu] = str( uuid.uuid1() ) 
     170                  tt = thisnt._make( rr0 ) 
     171                  gi.append( tt ) 
     172                  rr[il] = 17 
     173                  tt = thisnt._make( rr + [rr[1],] ) 
     174                  varsets.append( (rr0[iu], 2, rr[iu], 1, 'HighResMIP variables at multiple vertical resolutions' ) ) 
     175                elif rr[il] == u'Model levels or 27Plevs': 
     176                  rr0 = rr + [rr[1] + '27',] 
     177                  rr0[il] = 27 
     178                  rr0[iu] = str( uuid.uuid1() ) 
     179                  gi.append( tt ) 
     180                  rr[il] = 'all' 
     181                  tt = thisnt._make( rr + [rr[1],] ) 
     182                  varsets.append( (rr0[iu], 0, rr[iu], 0, 'Variables on model levels or 27 pressure levels' ) ) 
     183                else: 
     184                  tt = thisnt._make( rr + [rr[1],] ) 
     185                   
     186                gi.append( tt ) 
     187                sm.add( tt.mask ) 
     188 
     189            print '####### masks: ',sm 
     190            smdd = {} 
     191            dsn = {'floating ice shelf':u'floating ice sheet', u'ocean':u'sea' } 
     192            d1 = {u'land':(False,'area: mean where land'), \ 
     193                  u'grounded ice sheet':(True,'area: mean where grounded_ice_sheet'), \ 
     194                  u'ice sheet':(True,'area: mean where ice_sheet'), \ 
     195                  u'floating ice sheet':(True,'area: mean where floating_ice_sheet'), \ 
     196                  u'floating ice shelf':(True,'area: mean where floating_ice_sheet'), 
     197                  u'sea':(False,'area: mean where sea') } 
     198            for s in sm: 
     199              if s in  ['', u'none',u'Southern hemisphere', u'Northern hemisphere']: 
     200                smdd[s] = (False,'') 
     201              else: 
     202                smdd[s] = d1[ dsn.get( s,s ) ] 
     203 
     204            for tt in gi: 
     205                gr = 'a' 
     206                if tt.mip == 'OMIP' or any( [string.find(tt.table,i) != -1 for i in ['Omon','Oyr','Oclim','OImon'] ] ): 
     207                  gr = 'o' 
     208                dset.add( (tt.shape,tt.levels,tt.tstyle,gr) ) 
     209                dsgpi.add( (tt.shape,tt.levels,tt.tstyle,gr,smdd[tt.mask]) ) 
     210### need to check where variables are, perhaps, refering to "ovar" 
     211            ##kk = ['group', 'var', 'table', 'freq', 'descriptionEx', 'shape', 'levels', 'tstyle', 'mask', 'misc', 'mip', 'uuid', 'new', 'gpid', 'vkey', 'vid'] 
     212                if ovuu.has_key(tt.vid): 
     213                  tt1 = ovuu[tt.vid] 
     214                  self.cmv.append( (tt.uuid, (tt.shape,tt.levels,tt.tstyle,gr,smdd[tt.mask]), tt.var, 'from %s' % tt.table, tt.descriptionEx, tt1.vid, \ 
     215                    tt1.deflate_level, tt1.shuffle, tt1.ok_max_mean_abs, tt1.flag_meanings, tt1.type, tt1.ok_min_mean_abs, \ 
     216                    tt1.deflate, tt1.valid_min, tt1.flag_values, tt1.modeling_realm, tt1.valid_max, tt1.positive, 'n%s' % tt.freq, \ 
     217                    '', '', tt.freq, '', '') ) 
     218                  self.rqv.append( (str( uuid.uuid1() ),'%s-%s' % (tt.group,tt.var), tt.uuid, tt.gpid, tt1.priority) ) 
     219                  nov += 1 
     220                else: 
     221                  self.cmv.append( (tt.uuid, (tt.shape,tt.levels,tt.tstyle,gr,smdd[tt.mask]), tt.var, 'from %s' % tt.table, tt.descriptionEx, tt.vid, \ 
     222                    0, 0, 0, 0, '', 0, \ 
     223                    0,0,0, '', 0, '', 'n%s' % tt.freq, \ 
     224                    '', '', tt.freq, '', '') ) 
     225                  self.rqv.append( (str( uuid.uuid1() ),'%s-%s' % (tt.group,tt.var), tt.uuid, tt.gpid, 1) ) 
     226## Variables marked with shape '?' from PMIP are actually defined by OMIP .... 
     227                if tt.shape == '?': 
     228                  print 'WARN: shape not set: %s, %s, %s' % ( tt.shape,tt.mip,tt.var) 
     229 
     230            ##['', u'none', u'land', u'grounded ice sheet', u'floating ice sheet', u'floating ice shelf', u'ocean', u'ice sheet', u'sea', u'Southern hemisphere', u'Northern hemisphere'] 
     231            self.dsort( dset,mode=ksect ) 
     232            print ' ............. nov=%s [%s]' % (nov,len(gi)) 
     233 
     234 
     235####################################################################################### 
     236################# 
     237    std = set() 
     238    ssd = set() 
     239    etd = {} 
     240    esd = {} 
     241    tshp = { 'time':['time-mean','Temporal mean'], 'time1':['time-point','Instantaneous value (i.e. synoptic or time-step value)'], \ 
     242             'time2':['climatoglogy','Climatological mean'], \ 
     243             '':['None','No spatial dimensions ... fixed field'], 'xxxx':['unknown','dimension not recognised'] } 
     244    for ksect in [ 'ovar','groupitem']: 
     245#### create structure list for spatial and temporal dimensions 
     246      for t in self.dsortdd[ksect][0].keys(): 
     247        tdim, tt = self.dsort_u1( self.dsortdd[ksect][0][t], self.dsortdd[ksect][1] ) 
     248 
     249        std.add( tdim ) 
     250        ssd.add( tt ) 
     251        ##ssd.add( (sdim,lfl,nl) ) 
     252 
     253    for s in std: 
     254       label, description = tshp.get(s,tshp['xxxx']) 
     255       u = str( uuid.uuid1() ) 
     256       etd[s] = (u,label,description,s) 
     257    kk = 0 
     258    for s in ssd: 
     259       d,lfl,nl = s 
     260       u = str( uuid.uuid1() ) 
     261       kk+=1 
     262       lab = 'ssd.%3.3i' % kk 
     263       description = 'ssd.%3.3i' % kk 
     264       esd[s] = (u,lab,description,d,lfl,nl) 
     265 
     266    self.dimsTime = etd 
     267    self.dimsTimeInfo = ['uuid','label','title','dimensions'] 
     268    self.dimsSpace = esd 
     269    self.dimsSpaceInfo = ['uuid','label','title','dimensions','levelFlag','levels'] 
     270        
     271    sshp = set() 
     272    eshp = set() 
     273    ll = [] 
     274    nt_dims = collections.namedtuple( 'dims', ['uuid','label','spid','tmid','cell_methods','cell_measures','description','procNote','prov'] ) 
     275    kk = 0 
     276    strdd = {} 
     277    for dims,cmet,cmea in ds2: 
     278        tdim, tt = self.dsort_u1( self.dsortdd['ovar'][0][dims], self.dsortdd['ovar'][1] ) 
     279        d1,odim,d2,crd = self.dsortdd['ovar'][0][dims] 
     280        sdim,lfl,nl = tt 
     281        u = str( uuid.uuid1() ) 
     282        spid = esd[tt][0] 
     283        tmid = etd[tdim][0] 
     284        kk += 1 
     285        label = 'str.%3.3i' % kk 
     286        proc = '' 
     287        prov = 'CMIP5, OMIP' 
     288        desc = '' 
     289        strdd[(dims,cmet,cmea)] = u 
     290        ll.append( nt_dims._make( [u,label,spid,tmid, cmet, cmea, desc, proc, prov] ) ) 
     291 
     292    ttt = [ {u'Instantaneous (end of year)', 'instantaneous', 'point', 'Synoptic', u'synoptic', u'time: point'}, 
     293        {'Mean', u'time: mean', u'Time mean', u'daily mean', u'mean', u'time mean', u'time: day', u'time: mean', u'weighted time mean', 'Cumulative annual fraction'}, set(), {''}] 
     294    cmetl = ['time: point', 'time: mean', 'time: mean within years time: mean over years ', ''] 
     295    for shp,lvls,sty,gr,tmsk in dsgpi: 
     296        t = (shp,lvls,sty,gr) 
     297        tdim, tt = self.dsort_u1( self.dsortdd['groupitem'][0][t], self.dsortdd['groupitem'][1] ) 
     298        tflm, msk = tmsk 
     299        sdim,lfl,nl = tt 
     300        u = str( uuid.uuid1() ) 
     301        spid = esd[tt][0] 
     302        tmid = etd[tdim][0] 
     303        cmea = 'area: areacell%s' % gr 
     304        cmet = '' 
     305        for i in range(4): 
     306          if sty in ttt[i]: 
     307            cmet = cmetl[i] 
     308        if cmet == '': 
     309          cmet = msk 
     310        elif msk != '': 
     311          cmet += ' ' + msk 
     312        kk += 1 
     313        label = 'str.%3.3i' % kk 
     314        proc = '' 
     315        prov = 'CMIP5, endorsed MIPs' 
     316        desc = '' 
     317        strdd[(shp,lvls,sty,gr,tmsk)] = u 
     318        ll.append( nt_dims._make( [u,label,spid,tmid, cmet, cmea, desc, proc, prov] ) ) 
     319 
     320    self.structList = ll 
     321    self.strdd = strdd 
     322    oo = open( 'test.csv', 'w' ) 
     323    for l in ll: 
     324      oo.write( '%s,%s,%s,%s,%s,%s,%s,%s,%s,\n' % l ) 
     325    oo.close() 
     326 
     327  def dsort_u1(self,eed,sde): 
     328        tdim = eed[2] 
     329        sdim = eed[0] 
     330        nl = sde[sdim] 
     331        lfl = 'true' 
     332        if nl == -1: 
     333          lfl = 'false' 
     334          nl = 0 
     335        elif nl == -2: 
     336          nl = 0 
     337        return (tdim, (sdim,lfl,nl) ) 
     338 
     339 
     340  def dsort( self, dset, mode='ovar' ): 
     341      """Sort the dimensions string into spatial, temporal and other sections, 
     342       returns a dictionary of tuples: spatial dimensions, other, temporal, coords and a 2nd, keyyed on spatial dimensions with a level count indicator.  """ 
     343      vdims = {'plev3':3,'plev8':8,'alt40':40,'alevhalf':-1,'olevel':-1,'rho':-1,'sdepth':-1,'alevel':-1} 
     344      odims = {'sza5','vegtype','scatratio','dbze','typepdec','vgidx','tau'} 
     345      dl = sorted( list(dset) ) 
     346      if mode == 'ovar': 
     347        eed = {} 
     348        sss = [set(),set(),set(),set()] 
     349        for s in dl: 
     350          if s[:4] == 'time': 
     351            bits = ['',s[4:]] 
     352          else: 
     353            bits = string.split(s, '|time', maxsplit=1 ) 
     354          if len(bits) == 1: 
     355            ts = '' 
     356          else: 
     357            ts = 'time' 
     358 
     359          b0 = bits[0] 
     360          b1 = '' 
     361          bb = string.split(bits[0],'|') 
     362          if bb[-1] in odims: 
     363            if bb[-1] == 'tau': 
     364                b0 = bits[0][:-4] 
     365                ts = 'tau|time' 
     366            else: 
     367              b0 = string.join( bb[:-1], '|' ) 
     368              b1 = bb[-1] 
     369             
     370          if len(bits) == 1: 
     371              tup = (b0,b1,'','') 
     372          elif len(bits) == 2: 
     373              b2 = string.split( bits[1], '|', maxsplit=1 ) 
     374              if len(b2) == 2: 
     375                  tup = (b0,b1, ts + b2[0], b2[1]) 
     376              else: 
     377                  tup = (b0,b1, ts + bits[1], '') 
     378          eed[s] = tup 
     379          for k in range(4): 
     380            sss[k].add(tup[k]) 
     381 
     382        ##print 'dimensions:',dl 
     383        ##print 'spatial:',sss[0] 
     384        ##print 'other:',sss[1] 
     385        ##print 'temporal:',sss[2] 
     386        ##print 'coord:',sss[3] 
     387        lcount = {} 
     388        for s in sss[0]: 
     389          bits = string.split( s, '|' ) 
     390          nl = -2 
     391          for b in bits: 
     392            if vdims.has_key(b): 
     393              assert nl == -2, 'Duplicate vertical level count in %s' % s 
     394              nl = vdims[b] 
     395          lcount[s] = nl 
     396      else: 
     397        ## input is a set of tuples,  shape, levels, tstyle, o/a 
     398        ## aim is to extract spatial, other, temporal dimensions + coords.  
     399        sss = [set(),set(),set()] 
     400        ttt = [ (u'Instantaneous (end of year)', 'instantaneous', 'point', 'Synoptic', u'synoptic', u'time: point'), 
     401        ('Mean', u'time: mean', u'Time mean', u'daily mean', u'mean', u'time mean', u'time: day', u'time: mean', u'weighted time mean', 'Cumulative annual fraction'), (), ('',)] 
     402        ttdd = {} 
     403        kkk = ['time1','time','time2',''] 
     404        for i in range(4): 
     405          for k in ttt[i]: 
     406            ttdd[k] = kkk[i] 
     407 
     408        ##lll =  {[u'1.0', u'14.0', u'16.0',  u'17.0', u'27.0', u'3.0', u'36.0', u'4.0', u'40.0', u'7.0', ]:'flt', [u'17 (or 23 )', u'17 (or 23)', u'17 (or23)']:'obs', [u'Model levels or 27Plevs', u'all', u'all model levels', u'all model levels above 400hPa', u'all*', u'integrated over depth'], [u'single level',], [u'soil levels',], [u'surface',], [[u'100 m',] } 
     409        dds = {'2D':'XYT', 'XY':'XYT', '':'?', '2D ':'XYT', 'XYZ':'XYZT', }  
     410## 'K'?? 'XYK' 
     411        dd = {'XKT':('latitude|basin','','time','',False), \ 
     412             'XYZKT':('latitude|longitude|%s','effectRad','time','',True), \ 
     413             'XYZT':('latitude|longitude|%s','','time','',True), \ 
     414              'KZT':('alevel','spectband','time','',False), \ 
     415              'XYT':('latitude|longitude','','time','',False), \ 
     416              'XYKT':('latitude|longitude','angle','time','',False), \ 
     417              'YZT':('longitude|%s','','time','',True), \ 
     418              'XYK':('latitude|longitude','snowband','time','',False), \ 
     419              'K':('sistraits','','time','',False), \ 
     420              'scalar':('','','time','',False), \ 
     421              'ZST1':('alevel','site','time','',False), \ 
     422              'BasinYT':('latitude|basin','','time','',False), \ 
     423              '?':( '?', '?','?',False) 
     424             } 
     425               
     426        for d in dl: 
     427          for k in range(3): 
     428            sss[k].add( d[k] ) 
     429        ##print 'shape: ',sss[0] 
     430        ##print 'levels: ',sss[1] 
     431        ##print 'tstyle: ',sss[2] 
     432        ls0 = set() 
     433        ls1 = set() 
     434## 
     435## sort shapes 
     436## 
     437        for s in sss[0]: 
     438          if not dd.has_key( dds.get(s,s) ): 
     439            print 'NO SOLUTION FOUND FOR SHAPE: "%s"' % s 
     440          else: 
     441            tt = dd[dds.get(s,s)] 
     442            if tt[-1]: 
     443              ls0.add( s ) 
     444## 
     445## look at shapes which require additional information about vertical coord 
     446## 
     447        for d in dl: 
     448          if d[0] in ls0: 
     449             ls1.add( d[1] ) 
     450 
     451        lset = {'soil levels':'slevel', 'all model levels above 400hPa':'aslevel'}  
     452        lsdd = {} 
     453        for l in ls1: 
     454          ii = 0 
     455          if l in ['all','all*','all model levels']: 
     456            ii = -1 
     457            this = '%slevel'  
     458          elif lset.has_key(l): 
     459            ii = -1 
     460            this = lset[l] 
     461          elif l == '': 
     462            ii = -2 
     463            this = l 
     464          else: 
     465            ii = int( float(l) ) 
     466            if ii > 1.5: 
     467              this = 'plev%s' % ii 
     468            else: 
     469              this = '' 
     470          lsdd[l] = (ii,this) 
     471##['', 1.0, u'all', 3.0, 4.0, u'soil levels', 7.0, 40.0, u'all model levels', u'17 (or 23)', u'all*', 14.0, u'Model levels or 27Plevs', 16.0, 17.0, u'all model levels above 400hPa', u'17 (or23)', 36.0, u'17 (or 23 )', 27.0] 
     472               
     473        lcount = {} 
     474        eed = {} 
     475        for d in dl: 
     476          s = d[0] 
     477          if not dd.has_key( dds.get(s,s) ): 
     478            print 'NO SOLUTION FOUND FOR SHAPE: "%s"' % s 
     479          else: 
     480            tt = dd[dds.get(s,s)] 
     481            if tt[-1]: 
     482              n,zz = lsdd[d[1]] 
     483              if len(zz) > 0 and zz[0] == '%': 
     484                zz = zz % d[3] 
     485              sc = tt[0] % zz 
     486            else: 
     487              sc = tt[0] 
     488              if string.find( sc, 'alevel' ) != -1 or string.find( sc, 'olevel' ): 
     489                n = -1 
     490              else: 
     491                n = -2 
     492          lcount[sc] = n 
     493          eed[d] = (sc,tt[1],ttdd[d[2]],tt[3]) 
     494      self.dsortdd[mode] = (eed,lcount) 
     495 
     496  def run(self,rq): 
     497 
     498    main = self.doc.childNodes[0] 
    65499    xsn = [] 
    66500    ff = {} 
     
    78512    print xsn 
    79513    print ff.keys() 
     514    self.ff = ff 
    80515 
    81516    addex = False 
     
    111546    assert len( dups ) == 0, 'Duplicate refs: %s, %s' % (str(dups),str(map( lambda x: rq.rqvg[x[1]], dups )) ) 
    112547         
    113     for k in [ 'objective','var','ovar','groupitem', 'revisedtabitem', 'requestlink', 'requestitem','requestvargroup','tablesection' ]: 
     548## keys here match section element names in schema 
     549    sectlist = [ 'experiment','exptgroup','objective','var', 'requestlink', 'requestitem','requestvargroup','tablesection' ] 
     550    if self.schemaMode != 'dreq2': 
     551      sectlist = ['ovar','groupitem','revisedtabitem'] + sectlist 
     552 
     553    for k in sectlist: 
     554      thissh = self.skey[k] 
    114555## set labmod False for section in which label coercion is not wanted 
    115556      labmod = True 
    116     ##for k in [ 'var']: 
    117 ## keys here match section element names in schema 
    118       thissh = {'objective':rq.objec, 'var':rq.vars,'ovar':rq.refti, 'groupitem':rq.grps, \ 
    119          'revisedtabitem':rq.revti, 'requestlink':rq.rqli, 'requestitem':rq.rqit, \ 
    120          'requestvargroup':rq.rqvg, 'tablesection':rq.rqsect}[k] 
    121557      lll = [] 
    122558      for i in thissh.keys(): 
     
    139575          dothis = True 
    140576          if k != 'var': 
    141             item = doc.createElement( 'item' ) 
     577            item = self.doc.createElement( 'item' ) 
     578 
    142579          if k == 'objective': 
    143580 ## - mip; tab; expt; rlid; ny 
    144581            labmod = False 
    145582            kk = ['mip', 'label', 'title', 'description'] 
    146             thisl = string.replace(string.strip(str( ll[1] ) ), '-', ' ') 
     583            ##thisl = string.replace(string.strip(str( ll[1] ) ), '-', ' ') 
    147584## camelcase this label. 
    148             thisl = string.replace( string.capwords( thisl ), ' ', '' ) 
     585            ##thisl = string.replace( string.capwords( thisl ), ' ', '' ) 
     586            thisl = mycc( ll[1] ) 
    149587            mip = str( ll[0] ) 
    150588            self.objectives[mip][thisl] = i 
     
    153591                item.setAttribute( kk[j], thisv ) 
    154592            item.setAttribute( 'uuid', str(i) ) 
     593          elif k == 'experiment': 
     594            labmod = False 
     595            kk = ['uuid','egid','label','description','mip','mcfg','tier','nstart','starty','endy','yps','ensz','ntot','comment'] 
     596            thisl = str( ll[2] ) 
     597            for j in range(len(kk)): 
     598                thisv = str( uniCleanFunc(ll[j]) ) 
     599                item.setAttribute( kk[j], thisv ) 
     600          elif k == 'exptgroup': 
     601            labmod = False 
     602            kk = ['uuid','label','tierMin','ntot'] 
     603            thisl = str( ll[1] ) 
     604            for j in range(len(kk)): 
     605                thisv = str( ll[j] ) 
     606                item.setAttribute( kk[j], thisv ) 
    155607          elif k == 'var': 
    156608##- sn; units; description; procnote; procComment; prov 
     
    159611            thisuuid = str(i) 
    160612            if not ( self.replItems.has_key( str(i) ) or self.remo.has_key(str(i)) ): 
    161               item = doc.createElement( 'item' ) 
     613              item = self.doc.createElement( 'item' ) 
    162614              item.setAttribute( 'id', 'tmpid.%4.4i' % idk ) 
    163615              item.setAttribute( 'uuid', str(i) ) 
     
    295747            obj = string.strip(str( ll[3] ) ) 
    296748            if mip == "GMMIP": 
    297               bits = string.split( obj, ' ' ) 
     749              bits = [ mycc(x) for x in string.split( obj, ' ' ) ] 
    298750            else: 
    299               bits = [ string.replace( string.capwords( string.strip(x) ), ' ', '' ) for x in string.split( obj, ',' ) ] 
     751              bits = [ mycc(x) for x in string.split( obj, ',' ) ] 
    300752            for b in bits: 
    301               self.objectiveLinks[mip][b] = str( ll[0] ) 
     753              self.objectiveLinks[mip].a[b].append( str( ll[0] ) ) 
    302754         
    303755            thisl = string.strip(str( ll[2] ) ) 
     
    315767 ## - mip; tab; expt; rlid; ny 
    316768            kk = ['mip', 'tab', 'expt', 'rlid', 'ny'] 
    317             thisl = string.strip(str( '%s-%s-%s' % (ll[0],ll[1],ll[2]) ) ) 
     769            thisl = mycc( '%s %s' % (ll[0],ll[1]) ) 
    318770            for j in range(len(kk)): 
    319771                if kk[j] == 'ny': 
     
    362814              vare2[item.getAttribute('units')] =  item.getAttribute('label') 
    363815            ff[k][0].appendChild( item ) 
    364         if k == 'var': 
    365             print '******************************************' 
    366             print vare.keys() 
    367             print vare2.keys() 
    368             print '******************************************' 
    369816             
    370  
    371  
     817  def write2(self): 
     818    """write sections for cmor variable, request variable, structure, spatial and temporal dimensions""" 
     819    for ksect in [ u'cmorvar',  u'spatialshape', u'temporalshape', u'structure', 'requestvar']: 
     820        dil = self.ff[ksect][0].getElementsByTagName('item') 
     821        for d in dil: 
     822          self.ff[ksect][0].removeChild(d) 
     823        if ksect == u'cmorvar': 
     824          for r in self.cmv: 
     825            stid = self.strdd[r[1]] 
     826            item = self.doc.createElement( 'item' ) 
     827            for k in range(len(self.cmvinfo)): 
     828              n = self.cmvinfo[k] 
     829              if n == "stid": 
     830                item.setAttribute( n, stid ) 
     831              else: 
     832                item.setAttribute( n, str(r[k]) ) 
     833            self.ff[ksect][0].appendChild( item ) 
     834        elif ksect == u'structure': 
     835          flds = self.structList[0]._fields 
     836          for nt in self.structList: 
     837            item = self.doc.createElement( 'item' ) 
     838            for f in flds: 
     839              item.setAttribute( f, str( nt.__dict__[f] ) ) 
     840            self.ff[ksect][0].appendChild( item ) 
     841        elif ksect == u'spatialshape': 
     842          for k in self.dimsSpace.keys(): 
     843            rr = self.dimsSpace[k] 
     844            item = self.doc.createElement( 'item' ) 
     845            for i in range(len(self.dimsSpaceInfo)): 
     846              item.setAttribute( self.dimsSpaceInfo[i], str( rr[i] ) ) 
     847            self.ff[ksect][0].appendChild( item ) 
     848        elif ksect == u'temporalshape': 
     849          for k in self.dimsTime.keys(): 
     850            rr = self.dimsTime[k] 
     851            item = self.doc.createElement( 'item' ) 
     852            for i in range(len(self.dimsTimeInfo)): 
     853              item.setAttribute( self.dimsTimeInfo[i], str( rr[i] ) ) 
     854            self.ff[ksect][0].appendChild( item ) 
     855    ##self.dimsTimeInfo = ['uuid','label','title','dimensions'] 
     856    ##self.dimsSpaceInfo = ['uuid','label','title','dimensions','levelFlag','levels'] 
    372857 
    373858  def finish(self): 
    374     this = doc.getElementsByTagName('remarks')[0] 
     859    ol = [] 
     860    for m in self.objectives.keys(): 
     861      not_used = [] 
     862      used = [] 
     863      not_found = [] 
     864      found = [] 
     865      allused = (m != 'GMMIP') and (self.objectiveLinks[m].a.has_key( 'All' ) or self.objectiveLinks[m].a.has_key( 'All?' ) ) 
     866      for o in self.objectives[m].keys(): 
     867        if allused or self.objectiveLinks[m].a.has_key(o): 
     868          used.append(o) 
     869          for u in self.objectiveLinks[m].a[o]: 
     870            ol.append( (m,self.objectives[m][o], u ) ) 
     871        else: 
     872          not_used.append(o) 
     873      for o in self.objectiveLinks[m].a.keys(): 
     874        if (o in {'All','All?'} and len(self.objectives[m].keys()) > 0 ) or self.objectives[m].has_key(o): 
     875          found.append(o) 
     876        else: 
     877          not_found.append(o) 
     878      print 'INFO: %s: OK %s: unused: %s: not found:%s' % (m,str(used),str(not_used),str(not_found)) 
     879    this = self.doc.getElementsByTagName('objectiveLink')[0] 
    375880    dil = this.getElementsByTagName('item') 
    376881    for d in dil: 
    377882          this.removeChild(d) 
    378  
    379     txt = doc.toprettyxml(indent='\t', newl='\n', encoding=None) 
    380     oo = open( 'trial_20150831.xml', 'w' ) 
     883    for t in ol: 
     884       item = self.doc.createElement( 'item' ) 
     885       item.setAttribute( 'label', t[0] ) 
     886       item.setAttribute( 'oid', t[1] ) 
     887       item.setAttribute( 'rid', t[2] ) 
     888       thisuuid = str( uuid.uuid1() ) 
     889       item.setAttribute( 'uuid', thisuuid ) 
     890       this.appendChild( item ) 
     891 
     892    this = self.doc.getElementsByTagName('remarks')[0] 
     893    dil = this.getElementsByTagName('item') 
     894    for d in dil: 
     895          this.removeChild(d) 
     896 
     897    txt = self.doc.toprettyxml(indent='\t', newl='\n', encoding=None) 
     898    if self.schemaMode == 'dreq2': 
     899      ofn = 'trial2_20150831.xml' 
     900    else: 
     901      ofn = 'trial_20150831.xml' 
     902    oo = open( ofn, 'w' ) 
    381903    lines = string.split( txt, '\n' ) 
    382904    for line in lines: 
     
    415937         self.insert[bits[1]] = bits[3] 
    416938 
    417 sampleXml = '../framework/out/dreqSample.xml' 
     939mode = 'dreq2' 
     940sampleXml = '../framework/out/%sSample.xml' % mode 
    418941cmip5GrpLk = collections.defaultdict( dict ) 
    419942from scansh import rq 
     
    424947  for v in rq.cmip5Grps[k]: 
    425948    cmip5GrpLk[tab][v] = k 
    426 m = main(sampleXml, rq) 
     949 
     950m = main(sampleXml, rq,run=True, schemaMode=mode) 
     951 
    427952if len(m.err0010.keys()) > 0: 
    428953  ks = m.err0010.keys() 
  • CMIP6dreqbuild/trunk/src/workbook/scansh.py

    r383 r384  
    2525    self.rqsect = sopen( 'requestVarSections' ) 
    2626    self.objec = sopen( 'objectives' ) 
     27    self.expt = sopen( 'experiments' ) 
     28    self.exgp = sopen( 'exptGroups' ) 
    2729 
    2830    self.cmip5Grps = shelve.open( '%s/cmip5Groups' % odir, 'r' ) 
     
    6971        nok += 1 
    7072      else: 
    71         print 'NOT FOUND:',r 
     73        ## print 'ERROR.010.0010: NOT FOUND:',r 
    7274        knf += 1 
    7375    else: 
     
    8991          nok1 += 1 
    9092        else: 
    91           print 'NOT FOUND:',r 
     93          print 'ERROR.010.0020: NOT FOUND:',r 
    9294          knf += 1 
    9395      elif r[-4] == 1: 
     
    9597          nok2 += 1 
    9698        else: 
    97           print 'NOT FOUND:',r 
     99          print 'ERROR.010.0030: NOT FOUND:',r 
    98100          knf += 1 
    99101      else: 
     
    118120          nok1 += 1 
    119121        else: 
    120           print 'NOT FOUND:',r 
     122          print 'ERROR.010.0040: NOT FOUND:',r 
    121123          knf += 1 
    122124## old vars 
     
    125127          nok2 += 1 
    126128        else: 
    127           print 'NOT FOUND:',r 
     129          print 'ERROR.010.0050: NOT FOUND:',r 
    128130          knf += 1 
    129131    else: 
  • CMIP6dreqbuild/trunk/src/workbook/utils_wb.py

    r383 r384  
    1818          ss = string.replace( ss, u'\u2018', "'" ) 
    1919          ss = string.replace( ss, u'\u2019', "'" ) 
     20          ss = string.replace( ss, u'\u201c', "'" ) 
     21          ss = string.replace( ss, u'\u201d', "'" ) 
    2022          ss = string.replace( ss, u'\u2026', '...' ) 
     23## 2022: bullet 
     24          ss = string.replace( ss, u'\u2022', '*' ) 
    2125          ss = string.replace( ss, u'\u25e6', 'o' ) 
     26### xb0: degree symbol 
     27          ss = string.replace( ss, u'\xb0', 'o' ) 
     28          ss = string.replace( ss, u'\xb1', '+/m' ) 
    2229          ss = string.replace( ss, u'\xb2', '2' ) 
    2330          ss = string.replace( ss, u'\xb3', '3' ) 
     31## xa0: non-breaking space 
     32          ss = string.replace( ss, u'\xa0', ' ' ) 
     33          ss = string.replace( ss, u'\xfc', 'ue' ) 
    2434          if jsFilt: 
    2535            ss = string.replace( ss, '"', "'" ) 
Note: See TracChangeset for help on using the changeset viewer.