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