source: CCCC/tags/0.1/amap2nco.py @ 143

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CCCC/tags/0.1/amap2nco.py@283
Revision 143, 4.2 KB checked in by mjuckes, 6 years ago (diff)

extended attribute mapping support to prompt for missing global attriutes

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