source: CCCC/tags/1.2.5/ceda_cc/amap2nco.py @ 180

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CCCC/tags/1.2.5/ceda_cc/amap2nco.py@1241
Revision 180, 4.3 KB checked in by mjuckes, 6 years ago (diff)

merged from branches-mnj (which was branched from branches-sp)

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