Package iceprod :: Package core :: Module resample
[hide private]
[frames] | no frames]

Source Code for Module iceprod.core.resample

  1  #!/bin/env python 
  2  import os,sys,re,time 
  3  import os.path 
  4   
5 -class linesplit:
6 - def __init__(self,sstring, token = '\s'):
7 self.line = re.split(r'%s' % token, sstring) 8 self.counter = 0
9
10 - def next(self):
11 if self.counter < len(self.line): 12 s = self.line[self.counter] 13 self.counter += 1 14 return s
15
16 - def prev(self):
17 if self.counter >= 0: 18 s = self.line[self.counter] 19 self.counter -= 1 20 return s
21 22 default = None 23
24 -def get_closest_multiple(a,b):
25 if a < b: raise Exception, \ 26 'cannot find multiple of %d. %d is less than %d.' % (b,a,b) 27 while a % b != 0: a += 1 28 return a
29
30 -def offset(a,b,binsize):
31 if a < b: raise Exception, \ 32 'cannot offset. %d < %d' % (a,offset) 33 while (a - b) % binsize != 0: a += 1 34 return a
35
36 -def rebin(filename,fd=sys.stdout,level=1,zmin=default,zmax=default,zbin=default, 37 amin=default,amax=default,abin=default, 38 newdir=default):
39 driverfile = open(filename) 40 table = {} 41 header = [] 42 global_zmin = 9999 43 global_zmax = -9999 44 global_zbin = -1 45 global_amin = 9999 46 global_amax = -9999 47 global_abin = -1 48 49 for line in driverfile: 50 if not line.startswith("#"): 51 entry = {} 52 line = linesplit(line.strip()) 53 word = line.next() 54 entry['file'] = os.path.basename(word) 55 if level == 2: 56 dir = os.path.dirname(word).split(':') 57 entry['startstop'] = dir[0] 58 entry['dir'] = dir[1] 59 elif level == 1: 60 entry['dir'] = os.path.dirname(word) 61 entry['level'] = int(line.next()) 62 if not newdir == default: 63 entry['dir'] = os.path.join(newdir,entry['dir'].split('/')[-1]) 64 65 entry['zmin'] = int(round(float(line.next()))) 66 entry['zmax'] = int(round(float(line.next()))) 67 entry['amin'] = int(round(float(line.next()))) 68 entry['amax'] = int(round(float(line.next()))) 69 if entry['zmin'] < global_zmin: global_zmin = entry['zmin'] 70 if entry['zmax'] > global_zmax: global_zmax = entry['zmax'] 71 if global_zbin < 0: global_zbin = entry['zmax']-entry['zmin'] 72 if entry['amin'] < global_amin: global_amin = entry['amin'] 73 if entry['amax'] > global_amax: global_amax = entry['amax'] 74 if global_abin < 0: global_abin = entry['amax']-entry['amin'] 75 76 if level == 2: 77 table[(entry['zmin'],entry['amin'],entry['startstop'])] = entry 78 elif level == 1: 79 table[(entry['zmin'],entry['amin'])] = entry 80 else: 81 header.append(line.strip()) 82 83 84 if zbin == default: zbin = global_zbin 85 else: zbin = get_closest_multiple(zbin,global_zbin) 86 if zmin == default: zmin = global_zmin 87 else: 88 zmin = max(zmin,global_zmin) 89 zmin = offset(zmin,global_zmin,global_zbin) 90 if zmax == default: zmax = global_zmax 91 else: zmax = min(zmax+zbin,global_zmax) 92 if amin == default: amin = global_amin 93 else: 94 amin = max(amin,global_amin) 95 amin = offset(amin,global_amin,global_abin) 96 if abin == default: abin = global_abin 97 else: abin = get_closest_multiple(abin,global_abin) 98 if amax == default: amax = global_amax 99 else: amax = min(amax+abin,global_amax) 100 101 print >> fd, "# Photonics level1 driver file automatically created " 102 print >> fd, "# by iceprod on %s. " % time.asctime() 103 print >> fd, "# The spacing for this file is dz=%d, da=%d" % (zbin,abin) 104 for line in header: 105 print >> fd, line 106 107 if level == 2: 108 for a in range(amin,amax,abin): 109 for z in range(zmin,zmax-zbin,zbin): 110 for st in ['@starting','@stopping']: 111 entry = table[(z,a,st)] 112 zave = entry['zmin'] 113 aave = entry['amin'] 114 print >> fd, "%s:%s/%s %d %d %d %d" % ( \ 115 entry['startstop'], 116 entry['dir'], 117 entry['file'], 118 zave, zave+zbin, 119 aave, aave+abin) 120 121 122 elif level == 1: 123 for z in range(zmin,zmax-zbin,zbin): 124 for a in range(amin,amax,abin): 125 entry = table[(z,a)] 126 zave = entry['zmin'] 127 aave = entry['amin'] 128 print >> fd, "%s/%s %d %d %d %d %d" % ( \ 129 entry['dir'], 130 entry['file'], 131 entry['level'], 132 zave, zave+zbin, 133 aave, aave+abin)
134 135 136 137 if __name__ == '__main__': 138 # rebin(sys.argv[1],level=2,abin=40,zbin=60) 139 rebin(sys.argv[2],sys.stdout,level=int(sys.argv[1]),amin=int(sys.argv[3]),amax=int(sys.argv[4])) 140