def map_x_twiss(self, tws0): E = tws0.E M = self.R(E) zero_tol = 1.e-10 if abs(self.delta_e) > zero_tol: Ei = tws0.E Ef = tws0.E + self.delta_e k = np.sqrt(Ef / Ei) M[0, 0] = M[0, 0] * k M[0, 1] = M[0, 1] * k M[1, 0] = M[1, 0] * k M[1, 1] = M[1, 1] * k M[2, 2] = M[2, 2] * k M[2, 3] = M[2, 3] * k M[3, 2] = M[3, 2] * k M[3, 3] = M[3, 3] * k E = Ef m = tws0 tws = Twiss(tws0) tws.E = E tws.p = m.p tws.beta_x = M[0, 0] * M[0, 0] * m.beta_x - 2 * M[0, 1] * M[0, 0] * m.alpha_x + M[0, 1] * M[0, 1] * m.gamma_x # tws.beta_x = ((M[0,0]*tws.beta_x - M[0,1]*m.alpha_x)**2 + M[0,1]*M[0,1])/m.beta_x tws.beta_y = M[2, 2] * M[2, 2] * m.beta_y - 2 * M[2, 3] * M[2, 2] * m.alpha_y + M[2, 3] * M[2, 3] * m.gamma_y # tws.beta_y = ((M[2,2]*tws.beta_y - M[2,3]*m.alpha_y)**2 + M[2,3]*M[2,3])/m.beta_y tws.alpha_x = -M[0, 0] * M[1, 0] * m.beta_x + (M[0, 1] * M[1, 0] + M[1, 1] * M[0, 0]) * m.alpha_x - M[0, 1] * M[ 1, 1] * m.gamma_x tws.alpha_y = -M[2, 2] * M[3, 2] * m.beta_y + (M[2, 3] * M[3, 2] + M[3, 3] * M[2, 2]) * m.alpha_y - M[2, 3] * M[ 3, 3] * m.gamma_y tws.gamma_x = (1. + tws.alpha_x * tws.alpha_x) / tws.beta_x tws.gamma_y = (1. + tws.alpha_y * tws.alpha_y) / tws.beta_y tws.Dx = M[0, 0] * m.Dx + M[0, 1] * m.Dxp + M[0, 5] tws.Dy = M[2, 2] * m.Dy + M[2, 3] * m.Dyp + M[2, 5] tws.Dxp = M[1, 0] * m.Dx + M[1, 1] * m.Dxp + M[1, 5] tws.Dyp = M[3, 2] * m.Dy + M[3, 3] * m.Dyp + M[3, 5] denom_x = M[0, 0] * m.beta_x - M[0, 1] * m.alpha_x if denom_x == 0.: d_mux = np.pi / 2. * M[0, 1] / np.abs(M[0, 1]) else: d_mux = np.arctan(M[0, 1] / denom_x) if d_mux < 0: d_mux += np.pi tws.mux = m.mux + d_mux denom_y = M[2, 2] * m.beta_y - M[2, 3] * m.alpha_y if denom_y == 0.: d_muy = np.pi / 2. * M[2, 3] / np.abs(M[2, 3]) else: d_muy = np.arctan(M[2, 3] / denom_y) if d_muy < 0: d_muy += np.pi tws.muy = m.muy + d_muy return tws
def periodic_twiss(tws, R): ''' initial conditions for a periodic Twiss slution ''' tws = Twiss(tws) cosmx = (R[0, 0] + R[1, 1]) / 2. cosmy = (R[2, 2] + R[3, 3]) / 2. if abs(cosmx) >= 1 or abs(cosmy) >= 1: logger.warn( "************ periodic solution does not exist. return None ***********" ) #print("************ periodic solution does not exist. return None ***********") return None sinmx = np.sign(R[0, 1]) * sqrt(1. - cosmx * cosmx) sinmy = np.sign(R[2, 3]) * sqrt(1. - cosmy * cosmy) tws.beta_x = abs(R[0, 1] / sinmx) tws.beta_y = abs(R[2, 3] / sinmy) tws.alpha_x = (R[0, 0] - R[1, 1]) / (2. * sinmx) # X[0,0] tws.gamma_x = (1. + tws.alpha_x * tws.alpha_x) / tws.beta_x # X[1,0] tws.alpha_y = (R[2, 2] - R[3, 3]) / (2 * sinmy) # Y[0,0] tws.gamma_y = (1. + tws.alpha_y * tws.alpha_y) / tws.beta_y # Y[1,0] Hx = array([[R[0, 0] - 1, R[0, 1]], [R[1, 0], R[1, 1] - 1]]) Hhx = array([[R[0, 5]], [R[1, 5]]]) hh = dot(inv(-Hx), Hhx) tws.Dx = hh[0, 0] tws.Dxp = hh[1, 0] Hy = array([[R[2, 2] - 1, R[2, 3]], [R[3, 2], R[3, 3] - 1]]) Hhy = array([[R[2, 5]], [R[3, 5]]]) hhy = dot(inv(-Hy), Hhy) tws.Dy = hhy[0, 0] tws.Dyp = hhy[1, 0] #tws.display() return tws
def periodic_twiss(tws, R): ''' initial conditions for a periodic Twiss slution ''' tws = Twiss(tws) cosmx = (R[0, 0] + R[1, 1]) / 2. cosmy = (R[2, 2] + R[3, 3]) / 2. if abs(cosmx) >= 1 or abs(cosmy) >= 1: logger.warn("************ periodic solution does not exist. return None ***********") # print("************ periodic solution does not exist. return None ***********") return None sinmx = np.sign(R[0, 1]) * sqrt(1. - cosmx * cosmx) sinmy = np.sign(R[2, 3]) * sqrt(1. - cosmy * cosmy) tws.beta_x = abs(R[0, 1] / sinmx) tws.beta_y = abs(R[2, 3] / sinmy) tws.alpha_x = (R[0, 0] - R[1, 1]) / (2. * sinmx) # X[0,0] tws.gamma_x = (1. + tws.alpha_x * tws.alpha_x) / tws.beta_x # X[1,0] tws.alpha_y = (R[2, 2] - R[3, 3]) / (2 * sinmy) # Y[0,0] tws.gamma_y = (1. + tws.alpha_y * tws.alpha_y) / tws.beta_y # Y[1,0] Hx = array([[R[0, 0] - 1, R[0, 1]], [R[1, 0], R[1, 1] - 1]]) Hhx = array([[R[0, 5]], [R[1, 5]]]) hh = dot(inv(-Hx), Hhx) tws.Dx = hh[0, 0] tws.Dxp = hh[1, 0] Hy = array([[R[2, 2] - 1, R[2, 3]], [R[3, 2], R[3, 3] - 1]]) Hhy = array([[R[2, 5]], [R[3, 5]]]) hhy = dot(inv(-Hy), Hhy) tws.Dy = hhy[0, 0] tws.Dyp = hhy[1, 0] # tws.display() return tws
def map_x_twiss(self, tws0): E = tws0.E M = self.R(E) # print(E, self.delta_e, M) zero_tol = 1.e-10 if abs(self.delta_e) > zero_tol: # M = self.R(E + ) Ei = tws0.E Ef = tws0.E + self.delta_e # * cos(self.phi) # print "Ei = ", Ei, "Ef = ", Ef k = np.sqrt(Ef / Ei) M[0, 0] = M[0, 0] * k M[0, 1] = M[0, 1] * k M[1, 0] = M[1, 0] * k M[1, 1] = M[1, 1] * k M[2, 2] = M[2, 2] * k M[2, 3] = M[2, 3] * k M[3, 2] = M[3, 2] * k M[3, 3] = M[3, 3] * k # M[4, 5] = M[3, 3]*k E = Ef m = tws0 tws = Twiss(tws0) tws.E = E tws.p = m.p tws.beta_x = M[0, 0] * M[0, 0] * m.beta_x - 2 * M[0, 1] * M[0, 0] * m.alpha_x + M[0, 1] * M[0, 1] * m.gamma_x # tws.beta_x = ((M[0,0]*tws.beta_x - M[0,1]*m.alpha_x)**2 + M[0,1]*M[0,1])/m.beta_x tws.beta_y = M[2, 2] * M[2, 2] * m.beta_y - 2 * M[2, 3] * M[2, 2] * m.alpha_y + M[2, 3] * M[2, 3] * m.gamma_y # tws.beta_y = ((M[2,2]*tws.beta_y - M[2,3]*m.alpha_y)**2 + M[2,3]*M[2,3])/m.beta_y tws.alpha_x = -M[0, 0] * M[1, 0] * m.beta_x + (M[0, 1] * M[1, 0] + M[1, 1] * M[0, 0]) * m.alpha_x - M[0, 1] * M[ 1, 1] * m.gamma_x tws.alpha_y = -M[2, 2] * M[3, 2] * m.beta_y + (M[2, 3] * M[3, 2] + M[3, 3] * M[2, 2]) * m.alpha_y - M[2, 3] * M[ 3, 3] * m.gamma_y tws.gamma_x = (1. + tws.alpha_x * tws.alpha_x) / tws.beta_x tws.gamma_y = (1. + tws.alpha_y * tws.alpha_y) / tws.beta_y tws.Dx = M[0, 0] * m.Dx + M[0, 1] * m.Dxp + M[0, 5] tws.Dy = M[2, 2] * m.Dy + M[2, 3] * m.Dyp + M[2, 5] tws.Dxp = M[1, 0] * m.Dx + M[1, 1] * m.Dxp + M[1, 5] tws.Dyp = M[3, 2] * m.Dy + M[3, 3] * m.Dyp + M[3, 5] denom_x = M[0, 0] * m.beta_x - M[0, 1] * m.alpha_x if denom_x == 0.: d_mux = np.pi / 2. * M[0, 1] / np.abs(M[0, 1]) else: d_mux = np.arctan(M[0, 1] / denom_x) if d_mux < 0: d_mux += np.pi tws.mux = m.mux + d_mux # print M[0, 0]*m.beta_x - M[0, 1]*m.alpha_x, arctan(M[2, 3]/(M[2, 2]*m.beta_y - M[2, 3]*m.alpha_y)) denom_y = M[2, 2] * m.beta_y - M[2, 3] * m.alpha_y if denom_y == 0.: d_muy = np.pi / 2. * M[2, 3] / np.abs(M[2, 3]) else: d_muy = np.arctan(M[2, 3] / denom_y) if d_muy < 0: d_muy += np.pi tws.muy = m.muy + d_muy # print("new") # print(tws) return tws