Changeset 277


Ignore:
Timestamp:
28/01/15 11:31:44 (5 years ago)
Author:
mjuckes
Message:

additional features for ESA-CCI

Location:
CCCC/trunk/ceda_cc
Files:
4 edited

Legend:

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

    r273 r277  
    116116    self.dir = dir 
    117117 
    118   def getSimpleList(self,file,bit=None,omt=None): 
     118  def getSimpleList(self,file,bit=None,omt=None,options=None): 
    119119    ii = open('%s/%s/%s' % (CC_CONFIG_DIR, self.dir,file) ) 
    120120    oo = [] 
     121    if options == 'returnMappings': 
     122      assert bit == -1, 'only support returnMappings for bit == -1' 
     123      ee = {} 
     124 
     125    
    121126    for l in ii.readlines(): 
    122127      if l[0] != '#': 
     
    127132          oo.append(ll) 
    128133        else: 
    129           oo.append(string.split(ll)[bit]) 
    130     return oo 
     134          if options == 'returnMappings': 
     135            bb = string.split(ll) 
     136            ee[bb[-1]] = string.join( bb[:-1] ) 
     137            oo.append( bb[-1] ) 
     138          else: 
     139            oo.append(string.split(ll)[bit]) 
     140    if options == 'returnMappings': 
     141      return oo, ee 
     142    else: 
     143      return oo 
    131144 
    132145validSpecsInstitutions = ['IC3', 'MPI-M', 'KNMI', 'UOXF', 'CNRM-CERFACS', 'ENEA', 'MOHC', 'SMHI', 'IPSL', 'UREAD', 'ECWMF'] 
    133  
    134 def getVocabs(pcfg): 
    135   "Returns a dictionary of vocabulary details for the project provided." 
    136   if pcfg.projectV.id == 'SPECS': 
    137                ##'experiment_id':utils.patternControl( 'experiment_id', "(?P<val>.*)[0-9]{4}", list=validSpecsExptFamilies ), \ 
    138     vocabs = { 'variable':utils.mipVocab(pcfg), \ 
    139                'Conventions':utils.listControl( 'Conventions', ['CF-1.6'] ), \ 
    140                'frequency':utils.listControl( 'frequency', validSpecsFrequencies ), \ 
    141                'experiment_id':utils.listControl( 'experiment_id', validSpecsExptFamilies ), \ 
    142                'initialization_method':utils.patternControl( 'initialization_method', "[0-9]+" ), \ 
    143                'physics_version':utils.patternControl( 'physics_version', "[0-9]+" ), \ 
    144                'realization':utils.patternControl( 'realization', "[0-9]+" ), \ 
    145                'startdate':utils.patternControl( 'startdate', "S[0-9]{8}" ), \ 
    146                ## 'associated_experiment':utils.patternControl( 'associated_experment', "(?P<val>(N/A|(decadal|seasonal): r\*i[0-9]{1,4}p[0-9]{1,4}))" ), \ 
    147                'project_id':utils.listControl( 'project_id', ['SPECS', 'NMME-SPECS'] ), \ 
    148                ## 'institution':utils.listControl( 'institution', validSpecsInstitutions ), \ 
    149                'modeling_realm':utils.listControl( 'realm', ['atmos', 'ocean', 'land', 'landIce', 'seaIce', 'aerosol', 'atmosChem', 'ocnBgchem'], split=True ), \ 
    150              } 
    151   elif pcfg.projectV.id == 'CMIP5': 
    152                ##'experiment_id':utils.patternControl( 'experiment_id', "(?P<val>.*)[0-9]{4}", list=validSpecsExptFamilies ), \ 
    153     lrdr = readVocab( 'cmip5_vocabs/') 
    154     vocabs = { 'variable':utils.mipVocab(pcfg), \ 
    155                'Conventions':utils.listControl( 'Conventions', ['CF-1.4','CF-1.5'] ), \ 
    156                'experiment_id':utils.listControl( 'experiment_id', lrdr.getSimpleList( 'experiments.txt' ) ), \ 
    157                'frequency':utils.listControl( 'frequency', validCmip5Frequencies ), \ 
    158                'initialization_method':utils.patternControl( 'initialization_method', "[0-9]+" ), \ 
    159                'physics_version':utils.patternControl( 'physics_version', "[0-9]+" ), \ 
    160                'realization':utils.patternControl( 'realization', "[0-9]+" ), \ 
    161                'project_id':utils.listControl( 'project_id', ['CMIP5'] ), \ 
    162                ## 'institution':utils.listControl( 'institution', validSpecsInstitutions ), \ 
    163                'modeling_realm':utils.listControl( 'realm', ['atmos', 'ocean', 'land', 'landIce', 'seaIce', 'aerosol', 'atmosChem', 'ocnBgchem'], split=True ), \ 
    164              } 
    165   elif pcfg.projectV.id == 'CCMI': 
    166      
    167     lrdr = readVocab( 'ccmi_vocabs/') 
    168     vocabs = { 'variable':utils.mipVocab(pcfg), \ 
    169                'frequency':utils.listControl( 'frequency', validCcmiFrequencies ), \ 
    170                'experiment_id':utils.listControl( 'experiment_id', lrdr.getSimpleList( 'ccmi_experiments.txt', bit=-1 ) ), \ 
    171 ## do not preserve or check relation between model and institution. 
    172                'institution':utils.listControl( 'institution', lrdr.getSimpleList( 'models_insts.txt', bit=1 ) ), \ 
    173                'model_id':utils.listControl( 'model_id', lrdr.getSimpleList( 'models_insts.txt', bit=0 ) ), \ 
    174                'modeling_realm':utils.listControl( 'realm', ['atmos', 'ocean', 'land', 'landIce', 'seaIce', 'aerosol', 'atmosChem', 'ocnBgchem'] ), \ 
    175                'project_id':utils.listControl( 'project_id', ['CCMI'] ) } 
    176  
    177   elif pcfg.projectV.id == 'ESA-CCI': 
    178     lrdr = readVocab( 'esacci_vocabs/') 
    179     vocabs = { 'variable':utils.mipVocab(pcfg), \ 
    180                'version':utils.patternControl( 'version',  '^(fv[0-9]+(\.[0-9]+){0,1})$' ), \ 
    181                'level':utils.listControl( 'level', lrdr.getSimpleList( 'procLevel01.txt', bit=0 ) ), \ 
    182                'platform':utils.listControl( 'platforms', lrdr.getSimpleList( 'platforms.txt', bit=0), enumeration=True, split=True, splitVal=',' ), \ 
    183                'institution':utils.listControl( 'institution', lrdr.getSimpleList( 'institutions.txt', omt='last' ) ), \ 
    184                'Conventions':utils.patternControl( 'Conventions', '^CF-1.[56789](,.*){0,1}$' ), \ 
    185                'sensor':utils.listControl( 'sensors', lrdr.getSimpleList( 'sensors.txt', bit=0 ) ), \ 
    186                'cdm_data_type':utils.listControl( 'cdm_data_type', lrdr.getSimpleList( 'threddsDataType.txt', bit=0 ) ), \ 
    187                'time_coverage_duration':utils.patternControl( 'time_coverage_duration',  'ISO8601 duration', cls='ISO' ), \ 
    188                'spatial_resolution':utils.patternControl( 'spatial_resolution',  '([0-9]+(.[0-9]+){0,1})(km|m).*' ), \ 
    189                'project':utils.listControl( 'project', ['Climate Change Initiative - European Space Agency'] ), \ 
    190                'cciProject':utils.listControl( 'project', lrdr.getSimpleList( 'cciProject.txt', bit=-1 ) ), \ 
    191                'var':utils.listControl( 'var', lrdr.getSimpleList( 'variables.txt', bit=-1 ) ) \ 
    192              } 
    193   elif pcfg.projectV.id == '__dummy': 
    194     vocabs = { 'variable':utils.mipVocab(pcfg,dummy=True) } 
    195   else: 
    196     vocabs = { 'variable':utils.mipVocab(pcfg), \ 
    197            'driving_experiment_name':utils.listControl( 'driving_experiment_name', validCordexExperiment ), \ 
    198            'project_id':utils.listControl( 'project_id', ['CORDEX'] ), \ 
    199            'CORDEX_domain':utils.listControl( 'CORDEX_domain',  validCordexDomains ), \ 
    200            'driving_model_id':utils.listControl( 'driving_model_id',  validGcmNames ), \ 
    201            'driving_model_ensemble_member':utils.patternControl( 'driving_model_ensemble_member',  'r[0-9]+i[0-9]+p[0-9]+' ), \ 
    202            'rcm_version_id':utils.patternControl( 'rcm_version_id',  '[a-zA-Z0-9-]+' ), \ 
    203            'model_id':utils.listControl( 'model_id',  validRcmNames ), \ 
    204            'institute_id':utils.listControl( 'institute_id',  validInstNames ), \ 
    205            'frequency':utils.listControl( 'frequency', validCordexFrequencies ) } 
    206  
    207   return vocabs 
    208146 
    209147class projectConfig(object): 
     
    289227      self.controlledFnParts = ['level','cciProject','var','version'] 
    290228      self.requiredVarAttributes = ['long_name', 'standard_name', 'units'] 
    291       self.drsMappings = {'variable':'@var','platform':'platform','sensor':'sensor','level':'@level'} 
     229      self.drsMappings = {'variable':'@var','platform':'platform','sensor':'sensor','level':'#level', \ 
     230                'spatial_resolution':'spatial_resolution', 'ecv':'@ecv','version':'#version','convention_version':'#gdsv'} 
    292231      self.globalAttributesInFn = [None,] 
    293232    elif project == '__dummy': 
     
    410349    self.trangeIndex = -1 
    411350 
    412     self.vocabs = getVocabs(self) 
     351    self.getVocabs() 
    413352    test = False 
    414353    if test: 
     
    420359    ##assert self.project != 'CCMI', 'Not completely set up for CCMI yet' 
    421360 
     361  def getVocabs(self): 
     362  ## "Returns a dictionary of vocabulary details for the project provided." 
     363    if self.projectV.id == 'SPECS': 
     364               ##'experiment_id':utils.patternControl( 'experiment_id', "(?P<val>.*)[0-9]{4}", list=validSpecsExptFamilies ), \ 
     365      vocabs = { 'variable':utils.mipVocab(self), \ 
     366               'Conventions':utils.listControl( 'Conventions', ['CF-1.6'] ), \ 
     367               'frequency':utils.listControl( 'frequency', validSpecsFrequencies ), \ 
     368               'experiment_id':utils.listControl( 'experiment_id', validSpecsExptFamilies ), \ 
     369               'initialization_method':utils.patternControl( 'initialization_method', "[0-9]+" ), \ 
     370               'physics_version':utils.patternControl( 'physics_version', "[0-9]+" ), \ 
     371               'realization':utils.patternControl( 'realization', "[0-9]+" ), \ 
     372               'startdate':utils.patternControl( 'startdate', "S[0-9]{8}" ), \ 
     373               ## 'associated_experiment':utils.patternControl( 'associated_experment', "(?P<val>(N/A|(decadal|seasonal): r\*i[0-9]{1,4}p[0-9]{1,4}))" ), \ 
     374               'project_id':utils.listControl( 'project_id', ['SPECS', 'NMME-SPECS'] ), \ 
     375               ## 'institution':utils.listControl( 'institution', validSpecsInstitutions ), \ 
     376               'modeling_realm':utils.listControl( 'realm', ['atmos', 'ocean', 'land', 'landIce', 'seaIce', 'aerosol', 'atmosChem', 'ocnBgchem'], split=True ), \ 
     377             } 
     378    elif self.projectV.id == 'CMIP5': 
     379               ##'experiment_id':utils.patternControl( 'experiment_id', "(?P<val>.*)[0-9]{4}", list=validSpecsExptFamilies ), \ 
     380      lrdr = readVocab( 'cmip5_vocabs/') 
     381      vocabs = { 'variable':utils.mipVocab(self), \ 
     382               'Conventions':utils.listControl( 'Conventions', ['CF-1.4','CF-1.5'] ), \ 
     383               'experiment_id':utils.listControl( 'experiment_id', lrdr.getSimpleList( 'experiments.txt' ) ), \ 
     384               'frequency':utils.listControl( 'frequency', validCmip5Frequencies ), \ 
     385               'initialization_method':utils.patternControl( 'initialization_method', "[0-9]+" ), \ 
     386               'physics_version':utils.patternControl( 'physics_version', "[0-9]+" ), \ 
     387               'realization':utils.patternControl( 'realization', "[0-9]+" ), \ 
     388               'project_id':utils.listControl( 'project_id', ['CMIP5'] ), \ 
     389               ## 'institution':utils.listControl( 'institution', validSpecsInstitutions ), \ 
     390               'modeling_realm':utils.listControl( 'realm', ['atmos', 'ocean', 'land', 'landIce', 'seaIce', 'aerosol', 'atmosChem', 'ocnBgchem'], split=True ), \ 
     391             } 
     392    elif self.projectV.id == 'CCMI': 
     393     
     394      lrdr = readVocab( 'ccmi_vocabs/') 
     395      vocabs = { 'variable':utils.mipVocab(self), \ 
     396               'frequency':utils.listControl( 'frequency', validCcmiFrequencies ), \ 
     397               'experiment_id':utils.listControl( 'experiment_id', lrdr.getSimpleList( 'ccmi_experiments.txt', bit=-1 ) ), \ 
     398## do not preserve or check relation between model and institution. 
     399               'institution':utils.listControl( 'institution', lrdr.getSimpleList( 'models_insts.txt', bit=1 ) ), \ 
     400               'model_id':utils.listControl( 'model_id', lrdr.getSimpleList( 'models_insts.txt', bit=0 ) ), \ 
     401               'modeling_realm':utils.listControl( 'realm', ['atmos', 'ocean', 'land', 'landIce', 'seaIce', 'aerosol', 'atmosChem', 'ocnBgchem'] ), \ 
     402               'project_id':utils.listControl( 'project_id', ['CCMI'] ) } 
     403 
     404    elif self.projectV.id == 'ESA-CCI': 
     405      lrdr = readVocab( 'esacci_vocabs/') 
     406      cciProjectList, self.ecvMappings = lrdr.getSimpleList( 'cciProject.txt', bit=-1, options='returnMappings' ) 
     407      vocabs = { 'variable':utils.mipVocab(self), \ 
     408               'version':utils.patternControl( 'version',  '^(fv[0-9]+(\.[0-9]+){0,1})$', examples=['fv1.1'] ), \ 
     409               'level':utils.listControl( 'level', lrdr.getSimpleList( 'procLevel01.txt', bit=0 ) ), \ 
     410               'platform':utils.listControl( 'platforms', lrdr.getSimpleList( 'platforms.txt', bit=0), enumeration=True, split=True, splitVal=',' ), \ 
     411               'institution':utils.listControl( 'institution', lrdr.getSimpleList( 'institutions.txt', omt='last' ) ), \ 
     412               'Conventions':utils.patternControl( 'Conventions', '^CF-1.[56789](,.*){0,1}$', examples=['CF-1.6'] ), \ 
     413               'sensor':utils.listControl( 'sensors', lrdr.getSimpleList( 'sensors.txt', bit=0 ) ), \ 
     414               'cdm_data_type':utils.listControl( 'cdm_data_type', lrdr.getSimpleList( 'threddsDataType.txt', bit=0 ) ), \ 
     415               'time_coverage_duration':utils.patternControl( 'time_coverage_duration',  'ISO8601 duration', cls='ISO',examples=['P1Y'] ), \ 
     416               'spatial_resolution':utils.patternControl( 'spatial_resolution',  '([0-9]+(.[0-9]+){0,1})(km|m).*', examples=['20km'] ), \ 
     417               'project':utils.listControl( 'project', ['Climate Change Initiative - European Space Agency'] ), \ 
     418               'cciProject':utils.listControl( 'cciproject', cciProjectList ), \ 
     419               'var':utils.listControl( 'var', lrdr.getSimpleList( 'variables.txt', bit=-1 ) ) \ 
     420             } 
     421    elif self.projectV.id == '__dummy': 
     422      vocabs = { 'variable':utils.mipVocab(self,dummy=True) } 
     423    else: 
     424      vocabs = { 'variable':utils.mipVocab(self), \ 
     425           'driving_experiment_name':utils.listControl( 'driving_experiment_name', validCordexExperiment ), \ 
     426           'project_id':utils.listControl( 'project_id', ['CORDEX'] ), \ 
     427           'CORDEX_domain':utils.listControl( 'CORDEX_domain',  validCordexDomains ), \ 
     428           'driving_model_id':utils.listControl( 'driving_model_id',  validGcmNames ), \ 
     429           'driving_model_ensemble_member':utils.patternControl( 'driving_model_ensemble_member',  'r[0-9]+i[0-9]+p[0-9]+' ), \ 
     430           'rcm_version_id':utils.patternControl( 'rcm_version_id',  '[a-zA-Z0-9-]+' ), \ 
     431           'model_id':utils.listControl( 'model_id',  validRcmNames ), \ 
     432           'institute_id':utils.listControl( 'institute_id',  validInstNames ), \ 
     433           'frequency':utils.listControl( 'frequency', validCordexFrequencies ) } 
     434 
     435    self.vocabs = vocabs 
     436 
     437 
    422438  def setEsaCciFNType(self,id): 
    423439      self.groupIndex =  self.fnoptions['groupIndex'][id] 
  • CCCC/trunk/ceda_cc/extractMipInfo.py

    r271 r277  
    1313 
    1414heightRequired = ['tas','tasmax','tasmin','huss','sfcWind','sfcWindmax','wsgsmax','uas','vas'] 
    15  
    16 ms = mipTableScan() 
    17 snc = snlist() 
    18  
    19 snl, snla = snc.gen_sn_list( ) 
     15cmip5_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'] 
     16cmip5AxesAtts = ['axis', 'bounds_values', 'climatology', 'coords_attrib', 'formula', 'index_only', 'long_name', 'must_call_cmor_grid', 'must_have_bounds', 'out_name', 'positive', 'requested', 'requested_bounds', 'standard_name', 'stored_direction', 'tolerance', 'type', 'units', 'valid_max', 'valid_min', 'value', 'z_bounds_factors', 'z_factors'] 
     17 
     18 
    2019NT_mip = collections.namedtuple( 'mip',['label','dir','pattern'] ) 
    2120NT_var = collections.namedtuple( 'var',['name','sn','snStat','realm','units','longName','comment','mip'] ) 
     
    151150    return (False,'no match','') 
    152151 
    153 snsubber = snsub() 
    154  
    155  
    156 cmip5_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'] 
    157152 
    158153class mipCo: 
     
    414409                     thisok = True 
    415410               if thisok: 
    416                  print 'INFO ############### conditional match found', tab, v 
     411                 print 'INFO[typecheck]: conditional match found', tab, v 
    417412               else: 
    418413                 if pmatch: 
     
    423418               av.append(a) 
    424419         adict[att] = av 
    425          ##if v == "snd": 
    426            ##print adict 
    427420        
    428421## check for type 2 
     
    543536      oo.close() 
    544537            
    545  
    546 mips = ( NT_mip( 'cmip5','cmip5_vocabs/mip/', 'CMIP5_*' ), 
    547          NT_mip( 'ccmi', 'ccmi_vocabs/mip/', 'CCMI1_*')  ) 
    548 cordex_mip = NT_mip( 'cordex', 'cordex_vocabs/mip/', 'CORDEX_*') 
    549 specs_mip = NT_mip( 'specs', 'specs_vocabs/mip/', 'SPECS_*') 
    550 mips = ( cordex_mip, ) 
    551 mips = ( specs_mip, ) 
    552 mips = ( NT_mip( 'cmip5','cmip5_vocabs/mip/', 'CMIP5_*' ), ) 
    553 mips = ( cordex_mip, NT_mip( 'ccmi', 'ccmi_vocabs/mip/', 'CCMI1_*'), NT_mip( 'cmip5','cmip5_vocabs/mip/', 'CMIP5_*' ), specs_mip) 
    554 mips = ( NT_mip( 'ccmi', 'ccmi_vocabs/mip/', 'CCMI1_*'),  ) 
    555 m = mipCo( mips )   
    556 h = helper() 
    557  
    558 keys = m.adict.keys() 
    559 keys.sort() 
    560 fh = open( 'axes_json.txt', 'w' ) 
    561 for k in keys: 
    562   ee = m.dd[m.adict[k][0]][k][0] 
    563   ee["__name__"] = k 
    564   fh.write( json.dumps( ee ) + '\n' ) 
    565 fh.close() 
    566  
    567 al = [] 
    568 for k0 in m.dd.keys(): 
    569   for k1 in m.dd[k0].keys(): 
    570     al += m.dd[k0][k1][0].keys() 
    571 ald = uniquify( al ) 
    572 ald.sort() 
    573 i = ald.index('standard_name') 
    574 ald.pop(i) 
    575 ald = ['standard_name', ] + ald 
    576  
    577 cmip5AxesAtts = ['axis', 'bounds_values', 'climatology', 'coords_attrib', 'formula', 'index_only', 'long_name', 'must_call_cmor_grid', 'must_have_bounds', 'out_name', 'positive', 'requested', 'requested_bounds', 'standard_name', 'stored_direction', 'tolerance', 'type', 'units', 'valid_max', 'valid_min', 'value', 'z_bounds_factors', 'z_factors'] 
    578  
    579 def getTupList(m): 
    580   vl = [] 
    581   keys = m.vdict.keys() 
    582   keys.sort() 
    583   for k in keys: 
    584     for t in m.vdict[k]: 
    585 ##NT_var = collections.namedtuple( 'mip',['name','sn','snStat','realm','units','longName','comment'] ) 
    586       sn, r, units, ln, c = map( lambda x: m.td[t][k][1].get(x,None), ['standard_name','modeling_realm','units','long_name','comment'] )  
    587       mipid = string.split(t,'_')[0] 
    588       if c == '': 
    589         c = None 
    590       v = NT_var( k, sn, 'exists', r, units, ln, c,mipid ) 
    591       vl.append(v) 
    592   return vl 
    593  
    594 tl = getTupList(m) 
    595 tl1 = uniquify(tl) 
    596 tl2 = [tl1[0],] 
    597 for t in tl1[1:]: 
    598   if t[:7] == tl2[-1][:7]: 
     538class run(object): 
     539 
     540  def __init__(self): 
    599541    pass 
    600   elif t[:3] == tl2[-1][:3] and t[4:6] == tl2[-1][4:6]: 
    601     if (t.mip == 'CMIP5' and tl2[-1].mip == 'CCMI1') or (t.mip == 'CCMI1' and tl2[-1].mip == 'CMIP5'): 
    602       tl2[-1] = t 
    603     else: 
    604       print 'What to do??' 
    605       print tl2[-1] 
    606       print t 
    607   else: 
    608     tl2.append(t) 
    609 print len(tl),len(tl1) 
    610 for t in tl1[:20]: 
    611   print t 
    612  
    613 v = runcheck1( m, ald, isAxes=False ) 
     542 
     543  def  run(self): 
     544    self.m = mipCo( mips )   
     545    self.json() 
     546    al = [] 
     547    for k0 in self.m.dd.keys(): 
     548      for k1 in self.m.dd[k0].keys(): 
     549        al += self.m.dd[k0][k1][0].keys() 
     550    ald = uniquify( al ) 
     551    ald.sort() 
     552    i = ald.index('standard_name') 
     553    ald.pop(i) 
     554    ald = ['standard_name', ] + ald 
     555    self.ald = ald 
     556 
     557    return self.m,ald 
     558 
     559  def getTupList(self): 
     560    vl = [] 
     561    keys = self.m.vdict.keys() 
     562    keys.sort() 
     563    for k in keys: 
     564      for t in self.m.vdict[k]: 
     565  ##NT_var = collections.namedtuple( 'mip',['name','sn','snStat','realm','units','longName','comment'] ) 
     566        sn, r, units, ln, c = map( lambda x: self.m.td[t][k][1].get(x,None), ['standard_name','modeling_realm','units','long_name','comment'] )  
     567        mipid = string.split(t,'_')[0] 
     568        if c == '': 
     569          c = None 
     570        v = NT_var( k, sn, 'exists', r, units, ln, c,mipid ) 
     571        vl.append(v) 
     572    self.tupList = vl 
     573    return vl 
     574 
     575  def compTupList(self): 
     576    tl1 = uniquify(self.tupList) 
     577    tl2 = [tl1[0],] 
     578###  these lines comment on all differences of variables with the same name, including differences in comments. 
     579    for t in tl1[1:]: 
     580      if t[:7] == tl2[-1][:7]: 
     581        pass 
     582      elif t[:3] == tl2[-1][:3] and t[4:6] == tl2[-1][4:6]: 
     583        if (t.mip == 'CMIP5' and tl2[-1].mip == 'CCMI1') or (t.mip == 'CCMI1' and tl2[-1].mip == 'CMIP5'): 
     584          tl2[-1] = t 
     585        else: 
     586          print 'What to do??' 
     587          print tl2[-1] 
     588          print t 
     589      else: 
     590        tl2.append(t) 
     591    return tl1, tl2 
     592 
     593  def runchecks(self): 
     594    self.v = runcheck1( self.m, self.ald, isAxes=False ) 
    614595## check consistency of dimension 
    615 r = runcheck1( m, ald, isAxes=True ) 
    616 for e in r.errors: 
    617   print ".....",e 
     596    self.r2 = runcheck1( self.m, self.ald, isAxes=True ) 
     597    return self.v, self.r2 
     598 
     599  def json(self): 
     600    keys = self.m.adict.keys() 
     601    keys.sort() 
     602    fh = open( 'axes_json.txt', 'w' ) 
     603    for k in keys: 
     604      ee = self.m.dd[self.m.adict[k][0]][k][0] 
     605      ee["__name__"] = k 
     606      fh.write( json.dumps( ee ) + '\n' ) 
     607    fh.close() 
     608 
     609ms = mipTableScan() 
     610snc = snlist() 
     611snl, snla = snc.gen_sn_list( ) 
     612snsubber = snsub() 
     613 
     614mips = { "cmip5":NT_mip( 'cmip5','cmip5_vocabs/mip/', 'CMIP5_*' ), 
     615"ccmi":NT_mip( 'ccmi', 'ccmi_vocabs/mip/', 'CCMI1_*'), 
     616"cordex":NT_mip( 'cordex', 'cordex_vocabs/mip/', 'CORDEX_*'), 
     617"specs":NT_mip( 'specs', 'specs_vocabs/mip/', 'SPECS_*') } 
     618 
     619mipl = ['cmip5'] 
     620mips = map( lambda x: mips[x], mipl ) 
     621r = run() 
     622 
     623m,ald = r.run() 
     624 
     625tl = r.getTupList() 
     626tl1,tl2 = r.compTupList() 
     627v,r2 = r.runchecks() 
    618628 
    619629allatts = ms.al 
     
    623633  if a not in thisatts: 
    624634    thisatts.append(a) 
    625 s =typecheck1( m, thisatts, helper=h) 
     635 
     636h = helper() 
     637s = typecheck1( m, thisatts, helper=h) 
    626638s.exportHtml( 1 ) 
    627639s.exportHtml( 2 ) 
  • CCCC/trunk/ceda_cc/unitTestsS1.py

    r276 r277  
    5151SPECS tas_Amon_EC-EARTH3_seaIceClimInit_series2_S19930501_r1i1p1_199306-199306.nc False 
    5252SPECS tas_Amon_EC-EARTH3_seaIceClimInit_S19930501_r1i1p1_199306-199306.nc True 
    53 ESA-CCI 20120101015548-ESACCI-L3U_GHRSST-SSTskin-AATSR-LT-v02.0-fv01.1.nc True 
     53ESA-CCI 20120101015548-ESACCI-L3U_GHRSST-SSTskin-AATSR-LT-v02.0-fv01.1.nc True CCIplus 
    5454ESA-CCI 20120101015548-ESACCI-L3U-GHRSST-SSTskin-AATSR-LT-v02.0-fv01.1.nc False 
    5555ESA-CCI 20120101015548-ESACCI-L3U_GHRSST-SSTskin-AATSR-LT-v02.0-fv.1.nc False""" 
     
    5959  ee[t[0]].append( t[1:] ) 
    6060 
     61cga = utils_c4.checkGlobalAttributes(parent=cfgd['ESA-CCI']) 
    6162module = 'checkFileName' 
    6263keys = ee.keys() 
     
    8384    if ok: 
    8485      print 'OK: [%s] %s: %s %s file name %s' % (testId,fn,vstr,k,pstr) 
     86      if len(l) > 2 and l[2]  == 'CCIplus': 
     87        cga.globalAts =  {'platform':'platform','sensor':'sensor', \ 
     88                'spatial_resolution':'1 km'} 
     89        cga.var = 'var' 
     90        cga.completed = True 
     91        ee1 = cga.getDrs() 
     92        if ee1['ecv'] == 'Sea Surface Temperature': 
     93          print 'OK: [%sb] %s: DRS dictionary generated' % (testId,fn) 
     94        else: 
     95          print 'Failed: [%sb] %s: DRS dictionary not generated correctly' % (testId,fn) 
     96         
    8597    else: 
    8698      print 'Failed: [%s] %s: %s %s file name %s' % (testId,fn,vstr,k,pstr) 
  • CCCC/trunk/ceda_cc/utils_c4.py

    r276 r277  
    380380    assert self.completed, 'method getDrs should not be called if checks have not been completed successfully' 
    381381    ee = {} 
     382    drsDefaults = { 'convention_version':'n/a'} 
    382383    if not self.globalAts.has_key('product'): 
    383384        self.globalAts['product'] = 'output' 
     
    392393      elif self.drsMappings[k] == '@mip_id': 
    393394        ee[k] = string.split( self.globalAts["table_id"] )[1] 
    394       elif self.drsMappings[k] == '@level': 
    395         ee[k] = self.parent.fnDict['level'] 
     395      elif self.drsMappings[k] == '@ecv': 
     396        ee[k] = self.pcfg.ecvMappings[ self.parent.fnDict['project'] ] 
     397      elif self.drsMappings[k][0] == '#': 
     398        thisk = self.drsMappings[k][1:] 
     399        if drsDefaults.has_key( thisk ): 
     400          ee[k] = self.parent.fnDict.get(thisk, drsDefaults[thisk] ) 
     401        else: 
     402          ee[k] = self.parent.fnDict[thisk] 
    396403      else: 
    397404        ee[k] = self.globalAts[ self.drsMappings[k] ] 
     
    940947class patternControl(object): 
    941948 
    942   def __init__(self,tag,pattern,list=None,cls=None): 
     949  def __init__(self,tag,pattern,list=None,cls=None,examples=None,badExamples=None,runTest=True): 
    943950    if cls != None: 
    944951      assert cls in ['ISO'], 'value of cls [%s] not recognised' % cls 
     
    956963        print "Failed to compile pattern >>%s<< (%s)" % (pattern, tag) 
    957964      self.pattern = pattern 
     965     
     966    self.examples = examples 
     967    self.badExamples = badExamples 
    958968    self.list = list 
    959969    self.cls = cls 
     970 
     971    if runTest: 
     972      if examples != None: 
     973        for e in examples: 
     974          assert self.check(e), 'Internal check failed: example %s does not fit pattern %s' % (e,self.pattern) 
    960975 
    961976  def check(self,val): 
Note: See TracChangeset for help on using the changeset viewer.