1
2 import os,sys,re,time
3 import os.path
4
6 - def __init__(self,sstring, token = '\s'):
7 self.line = re.split(r'%s' % token, sstring)
8 self.counter = 0
9
11 if self.counter < len(self.line):
12 s = self.line[self.counter]
13 self.counter += 1
14 return s
15
17 if self.counter >= 0:
18 s = self.line[self.counter]
19 self.counter -= 1
20 return s
21
22 default = None
23
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
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
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
139 rebin(sys.argv[2],sys.stdout,level=int(sys.argv[1]),amin=int(sys.argv[3]),amax=int(sys.argv[4]))
140