diff --git a/ess/TraceWin.py b/ess/TraceWin.py index ec65f6b70ba7950090e1fbb9c415f067a7e6ff26..e5ee440a7688e45dcbfc059da4e3baafe456c02b 100644 --- a/ess/TraceWin.py +++ b/ess/TraceWin.py @@ -7,9 +7,9 @@ class dst: Class afterwards hold the following dictionary items: - - x [cm] + - x [m] - xp [rad] - - y [cm] + - y [m] - yp [rad] - phi [rad] - E [MeV] @@ -45,6 +45,10 @@ class dst: Table=numpy.fromfile(fin, dtype=numpy.float64, count=self.Np*6) self._data=Table.reshape(self.Np,6) + # convert x,y from cm to m: + self._data[:,0]*=1e-2 + self._data[:,2]*=1e-2 + Footer=numpy.fromfile(fin, dtype=numpy.float64, count=1) self.mass=Footer[0] @@ -84,9 +88,18 @@ class dst: out+=pack('d',self.Ib) out+=pack('d',self.freq) out+=pack('b',125) + + data=self._data.copy() + + # convert x,y from m to cm: + data[:,0]*=1e2 + data[:,2]*=1e2 + data=self._data.reshape(self.Np*6,1) + for x in data: out+=pack('d',x) + out+=pack('d',self.mass) print >>fout, out #data.tofile(fout) @@ -111,9 +124,9 @@ class plt: - Zgen [cm] (location) - phase0 [deg] (ref phase) - wgen [MeV] (ref energy) - - x [array, cm] + - x [array, m] - xp [array, rad] - - y [array, cm] + - y [array, m] - yp [array, rad] - phi [array, rad] - E [array, MeV] @@ -184,6 +197,9 @@ class plt: for j in xrange(7): c=self._columns[j] data[c]=Table[:,j] + # convert x,y from cm to m + if c in ['x', 'y']: + data[c]*=1e-2 self._data.append(data) def __getitem__(self, key): @@ -217,37 +233,16 @@ class plt: self.s.append(self[i]['Zgen']/100.0) self.s=numpy.array(self.s) - def calc_rel(self): - ''' - Calculates relativistic gamma/beta - at each position, based on - AVERAGE beam energy - (NOT necessarily reference) - ''' - import numpy - - if not hasattr(self,'avg'): - self.calc_avg() - self.gamma=[] - self.beta=[] - for i,j in zip(self.Nelp,xrange(len(self.Nelp))): - Eavg=self.avg['E'][j] - self.gamma.append((self.mc2+Eavg)/self.mc2) - self.beta.append(numpy.sqrt(1.-1./self.gamma[-1]**2)) - self.gamma=numpy.array(self.gamma) - self.beta=numpy.array(self.beta) - def calc_avg(self): ''' Calculates averages of 6D coordinates at each element, such that e.g. self.avg["x"] gives average X at each location. - Units: cm + Units: m, rad, MeV ''' import numpy - self.avg=dict(x=[], xp=[], y=[], yp=[], E=[], phi=[]) vals=self._columns[:-1] @@ -257,24 +252,25 @@ class plt: for v in vals: self.avg[v].append(numpy.average(data[v])) - def calc_std(self): + def calc_rel(self): ''' - Calculates the beam sizes - + Calculates relativistic gamma/beta + at each position, based on + AVERAGE beam energy + (NOT necessarily reference) ''' - import numpy - if not hasattr(self,'sigma'): - self.calc_sigma() - - vals=self._columns[:-1] - - self.std={} - - for j in xrange(len(vals)): - v=vals[j] - self.std[v]=numpy.sqrt(self.sigma[:,j,j]) + if not hasattr(self,'avg'): + self.calc_avg() + self.gamma=[] + self.beta=[] + for i,j in zip(self.Nelp,xrange(len(self.Nelp))): + Eavg=self.avg['E'][j] + self.gamma.append((self.mc2+Eavg)/self.mc2) + self.beta.append(numpy.sqrt(1.-1./self.gamma[-1]**2)) + self.gamma=numpy.array(self.gamma) + self.beta=numpy.array(self.beta) def calc_minmax(self,pmin=5,pmax=95): ''' @@ -285,7 +281,6 @@ class plt: ''' import numpy - self.min=dict(x=[], xp=[], y=[], yp=[], E=[]) self.max=dict(x=[], xp=[], y=[], yp=[], E=[]) @@ -327,11 +322,29 @@ class plt: i=self.Nelp[j] data=self[i] - self.sigma.append([[numpy.mean( (data[n]-self.avg[n][j]) * (data[m] - self.avg[m][j]) ) for n in vals] for m in vals]) self.sigma=numpy.array(self.sigma) + def calc_std(self): + ''' + Calculates the beam sizes + + ''' + + import numpy + + if not hasattr(self,'sigma'): + self.calc_sigma() + + vals=self._columns[:-1] + + self.std={} + + for j in xrange(len(vals)): + v=vals[j] + self.std[v]=numpy.sqrt(self.sigma[:,j,j]) + def calc_twiss(self): ''' Calculates emittance, beta, alfa, gamma @@ -350,6 +363,12 @@ class plt: self.twiss_eps.append([numpy.sqrt(numpy.linalg.det(self.sigma[j][i:i+2][:,i:i+2])) for i in (0,2,4)]) self.twiss_eps=numpy.array(self.twiss_eps) + # Calculate normalized emittance: + # TODO: this is NOT correct normalization for longitudinal + self.twiss_eps_normed=self.twiss_eps.copy() + for i in xrange(3): + self.twiss_eps_normed[:,i]*=self.gamma*self.beta + # Calculate beta: # This is a factor 10 different from what TraceWin plots self.twiss_beta = [[self.sigma[j][i][i]/self.twiss_eps[j,i/2] for i in (0,2,4)] for j in xrange(len(self.Nelp))] @@ -359,12 +378,6 @@ class plt: self.twiss_alpha = [[-self.sigma[j][i][i+1]/self.twiss_eps[j,i/2] for i in (0,2,4)] for j in xrange(len(self.Nelp))] self.twiss_alpha = numpy.array(self.twiss_alpha) - # Calculate normalized emittance: - # TODO: this is NOT correct normalization for longitudinal - self.twiss_eps_normed=self.twiss_eps.copy() - for i in xrange(3): - self.twiss_eps_normed[:,i]*=self.gamma*self.beta -