source: CCCC/trunk/ceda_cc/amap2nco.py @ 321

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CCCC/trunk/ceda_cc/amap2nco.py
Revision 321, 4.5 KB checked in by mjuckes, 5 years ago (diff)

cleaned up c4.py no-args response and amap2nco doc string

Line 
1"""USAGE:
2python amap2nco.py   mappingsFile  inputDirectoryBase outputDirectoryBase
3mappingsFile: text file containing mapping information, generated by c4.py
4inputDirectoryBase: initial part of the directory tree, to be replaced for corrected files
5outputDirectoryBase: initial part of directory tree to be used for corrected files.
6
7A bash script of nco commands will be written to ncoscript.sh. Excecute with, for example, "bash ncoscript.sh"
8
9Check ouput and run ceda-cc to verify that the correct changes have been implemented -- this software does not offer any guarantees.
10
11See file USAGE_amap2nco.txt in code repository for more detail"""
12
13import os, string, random, time
14from xceptions import *
15
16xx='abcdefghijklmnopqrstuvwxyz1234567890$%-=+*'
17
18class map2nco(object):
19
20  def __init__(self,ifile,ipth,opth,newtid=True):
21    assert os.path.isfile( ifile ), 'File %s not found' % ifile
22    ii = open(ifile).readlines()
23    self.directives = []
24    for l in map( string.strip, ii):
25      if l[0] == '@':
26        if l[:5] == '@var:':
27          self.directives.append( ('var',l[5:] ) )
28        elif l[:4] == '@ax:':
29          self.directives.append( ('ax',l[4:] ) )
30        elif l[:4] == '@fn:':
31          self.directives.append( ('fn',l[4:] ) )
32        elif l[:2] == '@:':
33          self.directives.append( ('ga',l[2:] ) )
34        else:
35          raise baseException( 'unrecognised directive:\n %s' % l )
36      elif l[0] != '#':
37        if string.strip(l) != '':
38           raise baseException( 'unrecognised line:\n %s' % l )
39    self.ipth = ipth
40    self.opth = opth
41    self.newtid = newtid
42
43  def parse1( self ):
44    self.flist = []
45    oo = open( 'ncoscript.sh', 'w' )
46    thislist = None
47    lok = {'var':5, 'fn':2, 'ax':5, 'ga':4 }
48    for d in self.directives:
49      assert lok.has_key( d[0] ), 'Directive not recognised'
50      bits = string.split( string.strip( d[1], '"' ), '","' ) 
51      assert len(bits) == lok[d[0]], 'Not enough elements for directive'
52      fpath = bits[0]
53      if thislist == None or thislist[0] != fpath:
54        if thislist != None:
55          self.flist.append( thislist )
56        thislist = [fpath,] 
57      thislist.append( (d[0],bits[1:] ) )
58
59    self.flist.append( thislist )
60    li = len(self.ipth)
61    ndl = []
62    for f in self.flist:
63      assert os.path.isfile( f[0], ), 'File %s not found' % f[0]
64      assert f[0][:li] == self.ipth, 'File not in declared input directory %s' % self.ipth
65      ofile = self.opth + f[0][li:]
66      ofb = string.split( ofile, '/')
67      fn = ofb[-1]
68      odir = string.join( ofb[:-1], '/' ) + '/'
69      if odir not in ndl:
70        if not os.path.isdir( odir ):
71          oo.write( 'echo Creating output directory %s\n' % odir )
72          oo.write( 'mkdir -p %s\n' % odir )
73          ndl.append( odir )
74     
75      toklist = []
76      for d in f[1:]:
77        if d[0] in ['var','ga']:
78          print d
79          var, att, oval, nval = d[1]
80          if d[0] == 'var':
81            token = '%s,%s,o,c,"%s"' % (att,var,nval)
82          else:
83            token = '%s,global,o,c,"%s"' % (att,var,nval)
84          toklist.append(token)
85        elif d[0] == 'fn':
86          fs = string.split( fn, '.' )
87          bits = string.split( fs[0], '_' )
88          assert  d[1][0] in bits, '%s not found in file name: %s' % (d[1][0], fn)
89          i = bits.index( d[1][0] )
90          bits[i] =  d[1][1]
91          fs[0] = string.join( bits, '_' )
92          ofn = string.join( fs, '.' )
93          ofile = odir + ofn
94        else:
95          print 'WARNING: UNREPARABLE ERRORS ARE LISTED'
96          print d
97      cmd = 'ncatted '
98      if self.newtid:
99        tid = ''
100        for k in range(36):
101          tid += xx[random.randint(0,len(xx)-1)]
102        toklist.append( 'tracking_id,global,o,c,"%s"' % tid )
103        toklist.append( 'creation_date,global,o,c,"%s"' % time.ctime() )
104       
105      for t in toklist:
106        cmd += ' -a %s \\\n' % t
107      cmd += ' -o %s \\\n' % ofile
108      cmd += ' %s \n' % f[0]
109      oo.write( 'echo Editting file %s\n'  % fn )
110      oo.write( '%s\n'  % cmd )
111    oo.close()
112   
113if __name__ == '__main__':
114  import sys
115  if len(sys.argv) != 4:
116    if os.path.isfile( 'USAGE_amap2nco.txt' ):
117      for l in open( 'USAGE_amap2nco.txt').readlines():
118        print string.strip(l)
119    else:
120      print __doc__
121  else:
122     mfile, idir, odir = sys.argv[1:]
123     m = map2nco(mfile, idir, odir )
124     m.parse1()
125     
126
127    #@var:/data/work/cordex/early/AFR-44i/SMHI/ECMWF-ERAINT/evaluation/SMHI-RCA4/v1/mon/tas/tas_AFR-44i_ECMWF-ERAINT_evaluation_r1i1p1_SMHI-RCA4_v1_mon_198001-198012.nc","height","long_name","height above the surface","height"
Note: See TracBrowser for help on using the repository browser.