Changeset 128


Ignore:
Timestamp:
03/03/14 21:37:33 (6 years ago)
Author:
mjuckes
Message:

class updated to fill global attributes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CedaCdoScripts/branch/c1/cdoLib.py

    r127 r128  
    1 import string, time 
     1import string, time, random 
     2import cdms2 as cdms 
    23 
    34scriptVersion = 0.50 
     5scriptName = 'cdoLib.py' 
    46ifreq = 'mon' 
    57ofreq = 'monClim' 
     
    1618                        'fd':('eca_fd','yr','Frost days','Count of frost days (Tmin below zero) per year') } 
    1719 
     20rcout = open( 'cdo_stdout.txt', 'w' ) 
     21rcerr = open( 'cdo_stderr.txt', 'w' ) 
     22def run_cmd( cmd, comment='', strict=True, append=None, out=None  ): 
     23    if type(cmd) == type('x'): 
     24      args = map( lambda x: string.strip(x, "'"), string.split( cmd )) 
     25    else: 
     26      args = cmd 
     27    log.info( cmd ) 
     28    if append != None: 
     29      fho = open( append, 'a' ) 
     30      clo = True 
     31    elif out != None: 
     32      fho = open( out, 'w' ) 
     33      clo = True 
     34    else: 
     35      fho = rcout 
     36      clo = False 
     37    proc = subprocess.Popen( args, stdout=fho, stderr=rcerr, env={ 'LD_LIBRARY_PATH':'/usr/local/lib'} ) 
     38    std = proc.communicate() 
     39    rc = proc.returncode 
     40    if rc != 0: 
     41      print args 
     42      print std[0] 
     43      print std[1] 
     44      if strict: 
     45        assert rc == 0, 'Failed (%s) [rc=%s] executing %s' % (comment,rc,str(cmd)) 
     46      elif rc != 0: 
     47        print 'Failed (%s) [rc=%s] executing %s' % (comment,rc,str(cmd)) 
     48    if clo: 
     49      fho.close() 
     50    return rc 
     51 
     52def writeat( fh, tag, str,log): 
     53  if len(str) + len(tag) + 2 > 1024 : 
     54    log.warn( 'TRUNCATING global attribute %s: %s' % (tag,str) ) 
     55    strl = 1022 - len(tag) 
     56    str = str[:strl] 
     57  fh.write( '%s %s\n' % (tag,str) ) 
    1858 
    1959class cdoWrap: 
     
    2868    self.cmip5Input = False 
    2969    self.uidBase = '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM-+#' 
     70    self.lenUid = 80 
    3071    if selyear != None: 
    3172      self.chainedIn.append( "-selyear," + string.join( map( str, selyear ), ',' ) ) 
    3273      print self.chainedIn 
    3374 
    34  
    35   def uid(self,len): 
     75  def uid(self,l1): 
    3676      tid = '' 
    37       for k in range(len): 
     77      for k in range(l1): 
    3878          tid += self.uidBase[random.randint(0,len(self.uidBase)-1 )] 
    3979      return tid 
     
    4787 
    4888  def fullCmd(self): 
    49     self.fcdo = 'cdo ' + self.cdoop 
     89    self.fcdo = 'cdo -s setgatts,%s -%s' % ('tmp_atlist.txt',self.cdoop) 
    5090    for s in self.chainedIn: 
    5191      self.fcdo += ' ' + s 
     
    5393  def apply(self,ifile,ofile): 
    5494    self.fullCmd() 
    55     print '%s %s %s' % (self.fcdo,ifile,ofile) 
    56     self.creation_date = time.ctime() 
     95    cmd = '%s %s %s' % (self.fcdo,ifile,ofile) 
     96    run_cmd( cmd, 'applying' ) 
    5797    self.ifile = ifile 
     98    self.ofile = ofile 
     99 
     100  def scanIfiles(self,ifiles): 
     101    self.tids = '' 
     102    self.ifiles = '' 
     103    self.hists = '' 
     104    for file in ifiles: 
     105        ##nc = cdms.open( '%s%s.nc' % (edir,file[0]) ) 
     106        nc = cdms.open( file[0] ) 
     107        tid = nc.attributes.get( 'tracking_id', 'none' ) 
     108        crd = nc.attributes.get( 'creation_date', 'none' ) 
     109        table_id = nc.attributes.get( 'table_id', 'none' ) 
     110        if self.cmip5Input: 
     111          realization = nc.realization[0] 
     112          initialization_method = nc.initialization_method[0] 
     113          physics_version = nc.physics_version[0] 
     114        if 'time' in nc.axes.keys(): 
     115           calendar = nc.getAxis('time').attributes.get( 'calendar', 'none' ) 
     116           if calendar == 'none': 
     117             print 'calendar attribute not found' 
     118        else: 
     119           print 'time axis not found' 
     120           calendar = 'none' 
     121        print 'calendar = %s' % calendar 
     122        log.info( 'File: %s; tracking id: %s; creation date: %s' % (file[0],tid,crd) ) 
     123 
     124        self.tids += '%s,' % tid 
     125        self.crds = crd 
     126        self.hists = nc.history 
     127        nc.close() 
     128        self.ifiles += '%s,' % file[0] 
    58129 
    59130  def globalAts(self,var=None): 
     131        self.creation_date = time.ctime() 
    60132        doc_filename = 'ceda_cmip5_processing_%s.pdf' % self.doctag() 
    61133        oo = open( 'tmp_atlist.txt', 'w' ) 
     
    77149        oo.write( '%s %s\n' % ('frequency ', ofreq ) ) 
    78150        oo.write( '%s %s\n' % ('input_variable ', var ) ) 
    79         oo.write( '%s %s\n' % ('input_file ', self.ifile ) ) 
    80151        oo.write( '%s %s\n' % ('proc_code_repository_url ', 'http://proj.badc.rl.ac.uk/svn/exarch/CedaCdoScripts' ) ) 
    81152        oo.write( '%s %s\n' % ('proc_code_home_url ', 'http://proj.badc.rl.ac.uk/exarch/wiki/PackageRBPS' ) ) 
     
    103174 
    104175          oo.write( '%s %s\n' % ('tasmin_crit',tasmin_crit) ) 
     176 
     177        multiFile = False 
     178        if multiFile: 
     179          parts = string.split( self.ifiles, ',' ) 
     180          if len( parts) > 1: 
     181            bits = string.split( parts[0], '_' ) 
     182            stem = string.join( bits[0:-1], '_' ) 
     183            dat = string.split( bits[-1], '.' )[-1] 
     184            attr = '%s_%%(date)s.nc [%s' % (stem,dat) 
     185            for p in parts[1:]: 
     186              bits = string.split( p, '_' ) 
     187              dat = string.split( bits[-1], '.' )[-1] 
     188              attr += ',' + dat 
     189            attr += ']' 
     190            writeat(oo, 'input_files ', attr, log ) 
     191          else: 
     192            writeat(oo, 'input_files ', self.ifiles, log ) 
     193        else: 
     194          writeat(oo, 'input_files ', self.ifiles, log ) 
     195 
     196        if len( self.tids ) > 511: 
     197           log.warning( 'WARN003: truncating tid list for %s\n%s' % (ofilename, self.tids) ) 
     198           self.tids = self.tids[0:500] + '.....' 
     199 
     200        oo.write( '%s %s\n' % ('input_tids ', self.tids) ) 
     201        oo.write( '%s %s\n' % ('input_creation_date ', self.crds) ) 
     202        oo.write( '%s %s\n' % ('tracking_id ', self.uid(self.lenUid)) ) 
     203        writeat( oo, 'history ', '%s; %s' % (string.replace(self.hists,'\n',';;'), '%s: %s: %s' % (creation_date, 'CDO script', self.proc_description)), log ) 
    105204        oo.close() 
    106205 
    107  
    108 import getopt, sys 
     206import getopt, sys, logging, subprocess 
     207 
    109208args = getopt.getopt( sys.argv[1:], 'i:m:e:r:b:x:o:', ['onlyVars=','scratch=','omitVars=','version=','log='] ) 
    110209edict = {} 
     
    112211  edict[a[0][1:]] = a[1] 
    113212 
     213log_filename = 'wraplog.txt' 
     214log = logging.getLogger( __name__ ) 
     215fh = logging.FileHandler( log_filename ) 
     216log.level = logging.INFO 
     217log.addHandler( fh ) 
     218creation_date = time.ctime() 
     219log.info( 'Starting %s wrapper script, version %5.2f' % (scriptName, scriptVersion) ) 
     220 
     221 
    114222optag = 'mclim' 
    115223tstring = '%s%2.2i%2.2i-%2.2i%2.2i%2.2i' % time.gmtime()[0:6] 
    116224log_filename = edict.get( '-log', 'ceda_cmip5_processing_log_%s_%s.txt' % (optag,tstring) ) 
    117225c = cdoWrap( 'mclim', batch='xxxx', selyear=range(1901,1931),log=log_filename ) 
    118 c.apply('d1','d2') 
     226ifile = '/data/work/tmp/cru_ts3.21.1901.2012.pet.dat.nc' 
     227ofile = 'cru_ts3.21.clim30-1901-1930.pet.nc' 
     228c.scanIfiles( ( [ifile,], ) ) 
    119229c.globalAts(var='dummy') 
     230c.apply(ifile,ofile) 
Note: See TracChangeset for help on using the changeset viewer.