Changeset 217 for CCCC


Ignore:
Timestamp:
09/09/14 14:33:10 (6 years ago)
Author:
mjuckes
Message:

updates tp extractMipInfo

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CCCC/trunk/ceda_cc/extractMipInfo.py

    r216 r217  
    100100mips = ( NT_mip( 'cmip5','cmip5_vocabs/mip/', 'CMIP5_*' ), 
    101101         NT_mip( 'ccmi', 'ccmi_vocabs/mip/', 'CCMI1_*')  ) 
     102mips = ( NT_mip( 'cmip5','cmip5_vocabs/mip/', 'CMIP5_*' ), 
     103          ) 
    102104 
    103105cmip5_ignore = ['pfull','phalf','depth','depth_c','eta','nsigma','vertices_latitude','vertices_longitude','ztop','ptop','p0','z1','z2','href','k_c','a','a_bnds','ap','ap_bnds','b','b_bnds','sigma','sigma_bnds','zlev','zlev_bnds','zfull','zhalf'] 
     
    149151      ##l.sort() 
    150152##  print v, l, td[l[0]][v][1].get('standard_name','__NO_STANDARD_NAME__') 
     153 
     154class runcheck1: 
     155  def __init__( self, m, thisatts): 
     156    vars = m.vars 
     157    vdict = m.vdict 
     158    td = m.td 
     159    vd2 = {} 
     160    for v in vars: 
     161     l = vdict[v] 
     162     l.sort() 
     163     if len(l) > 1: 
     164       for att in thisatts: 
     165       ##for att in ['standard_name','units']: 
     166         if att == '__dimensions__': 
     167           atl = map( lambda x: string.join( td[x][v][0] ), l ) 
     168           print '#######', v,l,atl 
     169         else: 
     170           atl = map( lambda x: td[x][v][1].get(att,'__ABSENT__'), l ) 
     171         atl.sort() 
     172         av = [atl[0],] 
     173         for a in atl[1:]: 
     174           if a != av[-1]: 
     175             av.append(a) 
     176         if att == 'standard_name': 
     177           for a in av: 
     178             if a not in snl and a not in snla: 
     179               print "INVALID STANDARD NAME: ",a 
     180         if len(av) > 1: 
     181           ee = {} 
     182    
     183           for a in [True,False]: 
     184             ee[a] = [] 
     185    
     186           isol = [] 
     187           for x in l: 
     188             a = td[x][v][1].get(att,'__ABSENT__') 
     189             try: 
     190              if att == 'standard_name' or ( att == 'long_name' and vd2[v][0] == 2): 
     191               iso = x[:7] == 'CMIP5_O' 
     192               tt = snsubber.isFalseSn( v, a ) 
     193              elif att == 'long_name': 
     194               tt = snsubber.isFalseLn( v, a ) 
     195               dims = td[x][v][0] 
     196               iso = 'depth0m' in dims 
     197              else: 
     198               iso = False 
     199               tt = (False,) 
     200         ##    iso = False 
     201             except: 
     202               print att,v 
     203               raise 
     204             isol.append((iso,x)) 
     205             if tt[0]: 
     206               print 'Substituting ',v,a,tt 
     207               ee[iso].append( tt[1] ) 
     208             else: 
     209               ee[iso].append( a ) 
     210    
     211           for a in [True,False]: 
     212             ok = True 
     213             if len(ee[a]) > 1 : 
     214               for x in ee[a][1:]: 
     215                 if x != ee[a][0]: 
     216                   ok = False 
     217    
     218             if not ok: 
     219                print 'E001: Multiple values : ',att,v 
     220                for t in isol: 
     221                  if t[0] == a: 
     222                    tab = t[1] 
     223                    if att in ['standard_name','long_name']: 
     224                      print tab,td[tab][v][1].get('standard_name','__ABSENT__'),td[tab][v][1].get('long_name','__ABSENT__') 
     225                    else: 
     226                      print tab,td[tab][v][1].get(att,'__ABSENT__') 
     227                    
     228           if att == "standard_name": 
     229             vd2[v] = (2,[ee[True],ee[False]] ) 
     230         else: 
     231           if att == "standard_name": 
     232             tt = snsubber.isFalseSn( v, av[0] ) 
     233             if tt[0]: 
     234               print 'Substituting ',v,av[0],tt 
     235               vd2[v] = (1, tt[1]) 
     236             else: 
     237               vd2[v] = (1, av) 
     238     elif len(l) == 1: 
     239           tab = vdict[v][0] 
     240           a = td[tab][v][1].get('standard_name','__ABSENT__') 
     241           tt = snsubber.isFalseSn( v, a ) 
     242           if tt[0]: 
     243             print 'Substituting ',v,a,tt 
     244             vd2[v] = (1, tt[1]) 
     245           else: 
     246             vd2[v] = (1, a) 
     247           ##print 'MULTIPLE VALUES: ',v,att,av 
     248     else: 
     249      print 'Zero length element: %s' % v 
     250       
     251    
     252class typecheck1: 
     253  def __init__( self, m, thisatts): 
     254    self.type2Atts = ['positive','comment', 'long_name', 'modeling_realm', 'out_name', 'standard_name', 'type', 'units', 'flag_meanings', 'flag_values'] 
     255    self.type3Atts = ['positive','modeling_realm', 'out_name', 'standard_name', 'type', 'units', 'flag_meanings', 'flag_values'] 
     256    self.type4Atts = ['positive','modeling_realm', 'out_name', 'standard_name', 'type', 'units', 'flag_meanings', 'flag_values'] 
     257    self.m = m 
     258    vars = m.vars 
     259    vdict = m.vdict 
     260    td = m.td 
     261    vd2 = {} 
     262    type1, type2, type3, type4, type5 = [[],[],[],[],[],]  
     263    for v in vars: 
     264     l = vdict[v] 
     265     l.sort() 
     266     if len(l) == 1:  
     267       type1.append(v) 
     268     elif len(l) > 1: 
     269       adict = {} 
     270       for att in thisatts: 
     271         if att == '__dimensions__': 
     272           atl = map( lambda x: string.join( td[x][v][0] ), l ) 
     273           print '#######', v,l,atl 
     274         else: 
     275           atl = map( lambda x: td[x][v][1].get(att,'__ABSENT__'), l ) 
     276         atl.sort() 
     277         av = [atl[0],] 
     278         for a in atl[1:]: 
     279           if a != av[-1]: 
     280             av.append(a) 
     281         adict[att] = av 
     282        
     283## check for type 2 
     284       tval = None 
     285       ##if adict[ 'positive' ] == ['__ABSENT__']: 
     286       if all( map( lambda x: len(adict[x]) == 1, self.type2Atts )): 
     287           tval = 2 
     288       elif all( map( lambda x: len(adict[x]) == 1, self.type3Atts )): 
     289           tval = 3 
     290       else: 
     291           l = map( lambda x: '%s:%s, ' % (x,len(adict[x]) ), self.type2Atts ) 
     292           ## print '%s: t3:: ' % v,string.join(l) 
     293       if tval == 2: 
     294         type2.append( v) 
     295       elif tval == 3: 
     296         type3.append( v) 
     297       else: 
     298         type4.append(v) 
     299    xx = float( len(vars) ) 
     300    print string.join( map( lambda x: '%s (%5.1f%%);' % (x,x/xx*100), [len(type1), len(type2), len(type3), len(type4)] ) ) 
     301    self.type1 = type1 
     302    self.type2 = type2 
     303    self.type3 = type3 
     304    self.type4 = type4 
     305 
     306  def exportHtml( self, typecode ): 
     307 
     308    allAtts = ['__dimensions__', 'cell_methods', 'comment', 'long_name', 'modeling_realm', 'out_name', 'standard_name', 'type', 'units', 'valid_max', 'valid_min', 'positive', 'ok_max_mean_abs', 'ok_min_mean_abs', 'flag_meanings', 'flag_values'] 
     309    fixedType1Tmpl = """:%(standard_name)s [%(units)s]</h3> 
     310        %(__dimensions__)s<br/> 
     311        %(long_name)s<br/> 
     312       realm: %(modeling_realm)s; out_name: %(out_name)s; type: %(type)s, <br/> 
     313       cell_methods: %(cell_methods)s; comment: %(comment)s<br/> 
     314""" 
     315    fixedType2TmplA = """:%(standard_name)s [%(units)s]</h3> 
     316        %(long_name)s<br/> 
     317       realm: %(modeling_realm)s; out_name: %(out_name)s; type: %(type)s, <br/> 
     318       comment: %(comment)s<br/> 
     319""" 
     320    fixedType2TmplB = "<li>%s [%s]: %s -- (%s,%s,%s,%s)</li>\n" 
     321         
     322    fixedType3TmplA = """:%(standard_name)s [%(units)s]</h3> 
     323       realm: %(modeling_realm)s; out_name: %(out_name)s; type: %(type)s <br/> 
     324""" 
     325    fixedType3TmplB = "<li>%s [%s]: %s: %s [%s]</li>\n" 
     326         
     327    if typecode == 1: 
     328      oo = open( 'type1.html', 'w' ) 
     329      self.type1.sort() 
     330      ee = {} 
     331      for v in self.type1: 
     332        tab = self.m.vdict[v][0] 
     333        if not ee.has_key(tab): 
     334          ee[tab] = [] 
     335        ee[tab].append( v ) 
     336      keys = ee.keys() 
     337      keys.sort() 
     338      for k in keys: 
     339         oo.write( '<h2>Table %s</h2>\n' % k ) 
     340         for v in ee[k]: 
     341            try: 
     342              etmp = {} 
     343              for a in allAtts: 
     344                etmp[a] = self.m.td[k][v][1].get( a, 'unset' ) 
     345              etmp['__dimensions__'] = string.join( self.m.td[k][v][0] ) 
     346              oo.write( '<h3>' + v + (fixedType1Tmpl % etmp) ) 
     347            except: 
     348              print k, self.m.td[k][v][1].keys() 
     349              raise 
     350      oo.close() 
     351    elif typecode == 2: 
     352      oo = open( 'type2.html', 'w' ) 
     353      self.type2.sort() 
     354      oo.write( '<h2>Variables with fixed attributes</h2>\n' ) 
     355      for v in self.type2: 
     356            l = self.m.vdict[v] 
     357            etmp = {} 
     358            for a in allAtts: 
     359                etmp[a] = self.m.td[l[0]][v][1].get( a, 'unset' ) 
     360            oo.write( '<h3>' + v + (fixedType2TmplA % etmp) ) 
     361            oo.write( '<ul>\n' ) 
     362            for t in l: 
     363              dims = string.join( self.m.td[t][v][0] ) 
     364              sa = tuple( [t,dims,] + map( lambda x: self.m.td[t][v][1].get( x, 'unset' ), ['cell_methods','valid_max', 'valid_min', 'ok_max_mean_abs', 'ok_min_mean_abs'] ) ) 
     365              oo.write( fixedType2TmplB % sa ) 
     366            oo.write( '</ul>\n' ) 
     367      oo.close() 
     368            
     369    elif typecode == 3: 
     370      oo = open( 'type3.html', 'w' ) 
     371      self.type3.sort() 
     372      oo.write( '<h2>Variables with varying long_name/comment</h2>\n' ) 
     373      for v in self.type3: 
     374            l = self.m.vdict[v] 
     375            etmp = {} 
     376            for a in allAtts: 
     377                etmp[a] = self.m.td[l[0]][v][1].get( a, 'unset' ) 
     378            oo.write( '<h3>' + v + (fixedType3TmplA % etmp) ) 
     379            oo.write( '<ul>\n' ) 
     380            for t in l: 
     381              dims = string.join( self.m.td[t][v][0] ) 
     382              sa = tuple( [t,dims,] + map( lambda x: self.m.td[t][v][1].get( x, 'unset' ), ['long_name','comment','cell_methods'] ) ) 
     383              oo.write( fixedType3TmplB % sa ) 
     384            oo.write( '</ul>\n' ) 
     385      oo.close() 
     386            
    151387m = mipCo( mips )   
    152 vars = m.vars 
    153 vdict = m.vdict 
    154 td = m.td 
    155388 
    156389allatts = ms.al 
    157 thisatts = ['standard_name','units','long_name'] 
     390thisatts = ['standard_name','units','long_name','__dimensions__'] 
    158391## need to have standard name first. 
    159392for a in allatts: 
    160393  if a not in thisatts: 
    161394    thisatts.append(a) 
    162  
    163 vd2 = {} 
    164 for v in vars: 
    165   l = vdict[v] 
    166   l.sort() 
    167   if len(l) > 1: 
    168     for att in thisatts: 
    169     ##for att in ['standard_name','units']: 
    170       atl = map( lambda x: td[x][v][1].get(att,'__ABSENT__'), l ) 
    171       atl.sort() 
    172       av = [atl[0],] 
    173       for a in atl[1:]: 
    174         if a != av[-1]: 
    175           av.append(a) 
    176       if att == 'standard_name': 
    177         for a in av: 
    178           if a not in snl and a not in snla: 
    179             print "INVALID STANDARD NAME: ",a 
    180       if len(av) > 1: 
    181         ee = {} 
    182  
    183         for a in [True,False]: 
    184           ee[a] = [] 
    185  
    186         isol = [] 
    187         for x in l: 
    188           a = td[x][v][1].get(att,'__ABSENT__') 
    189           try: 
    190            if att == 'standard_name' or ( att == 'long_name' and vd2[v][0] == 2): 
    191             iso = x[:7] == 'CMIP5_O' 
    192             tt = snsubber.isFalseSn( v, a ) 
    193            elif att == 'long_name': 
    194             tt = snsubber.isFalseLn( v, a ) 
    195             dims = td[x][v][0] 
    196             iso = 'depth0m' in dims 
    197            else: 
    198             iso = False 
    199             tt = (False,) 
    200       ##    iso = False 
    201           except: 
    202             print att,v 
    203             raise 
    204           isol.append((iso,x)) 
    205           if tt[0]: 
    206             print 'Substituting ',v,a,tt 
    207             ee[iso].append( tt[1] ) 
    208           else: 
    209             ee[iso].append( a ) 
    210  
    211         for a in [True,False]: 
    212           ok = True 
    213           if len(ee[a]) > 1 : 
    214             for x in ee[a][1:]: 
    215               if x != ee[a][0]: 
    216                 ok = False 
    217  
    218           if not ok: 
    219              print 'E001: Multiple values : ',att,v 
    220              for t in isol: 
    221                if t[0] == a: 
    222                  tab = t[1] 
    223                  if att in ['standard_name','long_name']: 
    224                    print tab,td[tab][v][1].get('standard_name','__ABSENT__'),td[tab][v][1].get('long_name','__ABSENT__') 
    225                  else: 
    226                    print tab,td[tab][v][1].get(att,'__ABSENT__') 
    227                  
    228         if att == "standard_name": 
    229           vd2[v] = (2,[ee[True],ee[False]] ) 
    230       else: 
    231         if att == "standard_name": 
    232           tt = snsubber.isFalseSn( v, av[0] ) 
    233           if tt[0]: 
    234             print 'Substituting ',v,av[0],tt 
    235             vd2[v] = (1, tt[1]) 
    236           else: 
    237             vd2[v] = (1, av) 
    238   elif len(l) == 1: 
    239         tab = vdict[v][0] 
    240         a = td[tab][v][1].get('standard_name','__ABSENT__') 
    241         tt = snsubber.isFalseSn( v, a ) 
    242         if tt[0]: 
    243           print 'Substituting ',v,a,tt 
    244           vd2[v] = (1, tt[1]) 
    245         else: 
    246           vd2[v] = (1, a) 
    247         ##print 'MULTIPLE VALUES: ',v,att,av 
    248   else: 
    249    print 'Zero length element: %s' % v 
    250     
    251  
    252  
    253  
     395s =typecheck1( m, thisatts) 
     396s.exportHtml( 1 ) 
     397s.exportHtml( 2 ) 
     398s.exportHtml( 3 ) 
Note: See TracChangeset for help on using the changeset viewer.