def test_compile_2nd_matrix_free_rotor_point2(self): """Check the operation of the compile_2nd_matrix_free_rotor() function.""" # The simulated free rotor 2nd degree frame order matrix (1e6 ensembles, axis=[2,1,3]). real = array( [[ 0.3367, -0.0100, -0.0307, -0.0100, 0.3521, -0.0152, -0.0307, -0.0152, 0.3112], [ -0.0104, 0.3520, -0.0152, -0.2908, -0.0559, 0.2602, 0.1989, -0.1685, 0.0664], [ -0.0306, -0.0155, 0.3112, 0.1991, -0.1683, 0.0666, 0.2399, 0.2092, 0.1989], [ -0.0104, -0.2908, 0.1989, 0.3520, -0.0559, -0.1685, -0.0152, 0.2602, 0.0664], [ 0.3520, -0.0563, -0.1684, -0.0563, 0.4362, -0.0841, -0.1684, -0.0841, 0.2118], [ -0.0153, 0.2602, 0.0661, -0.1684, -0.0844, 0.2117, 0.2093, -0.0740, 0.0997], [ -0.0306, 0.1991, 0.2399, -0.0155, -0.1683, 0.2092, 0.3112, 0.0666, 0.1989], [ -0.0153, -0.1684, 0.2093, 0.2602, -0.0844, -0.0740, 0.0661, 0.2117, 0.0997], [ 0.3113, 0.0663, 0.1991, 0.0663, 0.2117, 0.0993, 0.1991, 0.0993, 0.4770]]) # The cone axis. r, theta, phi = cartesian_to_spherical([2, 1, 3]) # The Kronecker product of the eigenframe rotation. Rx2_eigen = self.calc_Rx2_eigen_axis(theta, phi) # Calculate the matrix. f2 = compile_2nd_matrix_free_rotor(self.f2_temp, Rx2_eigen) # Print out. print_frame_order_2nd_degree(real, "real") print_frame_order_2nd_degree(f2, "calculated") print_frame_order_2nd_degree(real-f2, "difference") # Check the values. for i in range(9): for j in range(9): print("Element %s, %s; diff %s." % (i, j, f2[i, j] - real[i, j])) self.assert_(abs(f2[i, j] - real[i, j]) < 1e-3)
def _print_axis_system(self): """Print out of the full system.""" # Open the file. file = open(self.save_path+sep+'axis_system', 'w') # Header. file.write("\n") file.write("The motional axis system\n") file.write("========================\n") # The full axis system. file.write("\nThe full axis system:\n") string = '' for i in range(3): string += '[' for j in range(3): string += "%24.20f" % self.axes[i, j] string += ']\n' file.write(string) # The Euler angles. a, b, g = R_to_euler_zyz(self.axes) file.write("\nEuler angles of the system:\n") file.write(" alpha: %.20f\n" % a) file.write(" beta: %.20f\n" % b) file.write(" gamma: %.20f\n" % g) # The spherical angle system. r, t, p = cartesian_to_spherical(self.axes[:, 2]) file.write("\nSpherical angles of the z-axis:\n") file.write(" theta: %.20f\n" % t) file.write(" phi: %.20f\n" % wrap_angles(p, 0, 2*pi))
def print_axis_system_full(self): """Print out of the full system to file.""" # Open the file. file = open(self.save_path+sep+'axis_system', 'w') # Header. file.write("\n") file.write("The motional axis system\n") file.write("========================\n") # The full axis system. file.write("\nThe full axis system:\n") string = '' for i in range(3): string += '[' for j in range(3): string += "%24.20f" % self.axes[i, j] string += ']\n' file.write(string) # The Euler angles. a, b, g = R_to_euler_zyz(self.axes) file.write("\nEuler angles of the system:\n") file.write(" alpha: %.20f\n" % a) file.write(" beta: %.20f\n" % b) file.write(" gamma: %.20f\n" % g) # The spherical angle system. r, t, p = cartesian_to_spherical(self.axes[:, 2]) file.write("\nSpherical angles of the z-axis:\n") file.write(" theta: %.20f\n" % t) file.write(" phi: %.20f\n" % wrap_angles(p, 0, 2*pi))
def convert_axis_alpha_to_spherical(alpha=None, pivot=None, point=None): """Convert the axis alpha angle to spherical angles theta and phi. @keyword alpha: The axis alpha angle, defined as the angle between a vector perpendicular to the pivot-CoM vector in the xy-plane and the rotor axis. @type alpha: float @keyword pivot: The pivot point on the rotation axis. @type pivot: numpy rank-1 3D array @keyword point: The reference point in space. @type point: numpy rank-1 3D array @return: The theta and phi spherical angles. @rtype: float, float """ # Create the axis. axis = create_rotor_axis_alpha(alpha=alpha, pivot=pivot, point=point) # Coordinate system transform. r, theta, phi = cartesian_to_spherical(axis) # Return the angles. return theta, phi
def permute_axes(permutation='A'): """Permute the axes of the motional eigenframe to switch between local minima. @keyword permutation: The permutation to use. This can be either 'A' or 'B' to select between the 3 permutations, excluding the current combination. @type permutation: str """ # Check that the model is valid. allowed = MODEL_LIST_ISO_CONE + MODEL_LIST_PSEUDO_ELLIPSE if cdp.model not in allowed: raise RelaxError("The permutation of the motional eigenframe is only valid for the frame order models %s." % allowed) # Check that the model parameters are setup. if cdp.model in MODEL_LIST_ISO_CONE: if not hasattr(cdp, 'cone_theta') or not is_float(cdp.cone_theta): raise RelaxError("The parameter values are not set up.") else: if not hasattr(cdp, 'cone_theta_y') or not is_float(cdp.cone_theta_y): raise RelaxError("The parameter values are not set up.") # The iso cones only have one permutation. if cdp.model in MODEL_LIST_ISO_CONE and permutation == 'B': raise RelaxError("The isotropic cones only have one permutation.") # The angles. cone_sigma_max = 0.0 if cdp.model in MODEL_LIST_RESTRICTED_TORSION: cone_sigma_max = cdp.cone_sigma_max elif cdp.model in MODEL_LIST_FREE_ROTORS: cone_sigma_max = pi if cdp.model in MODEL_LIST_ISO_CONE: angles = array([cdp.cone_theta, cdp.cone_theta, cone_sigma_max], float64) else: angles = array([cdp.cone_theta_x, cdp.cone_theta_y, cone_sigma_max], float64) x, y, z = angles # The axis system. axes = generate_axis_system() # Start printout for the isotropic cones. if cdp.model in MODEL_LIST_ISO_CONE: print("\nOriginal parameters:") print("%-20s %20.10f" % ("cone_theta", cdp.cone_theta)) print("%-20s %20.10f" % ("cone_sigma_max", cone_sigma_max)) print("%-20s %20.10f" % ("axis_theta", cdp.axis_theta)) print("%-20s %20.10f" % ("axis_phi", cdp.axis_phi)) print("%-20s\n%s" % ("cone axis", axes[:, 2])) print("%-20s\n%s" % ("full axis system", axes)) print("\nPermutation '%s':" % permutation) # Start printout for the pseudo-ellipses. else: print("\nOriginal parameters:") print("%-20s %20.10f" % ("cone_theta_x", cdp.cone_theta_x)) print("%-20s %20.10f" % ("cone_theta_y", cdp.cone_theta_y)) print("%-20s %20.10f" % ("cone_sigma_max", cone_sigma_max)) print("%-20s %20.10f" % ("eigen_alpha", cdp.eigen_alpha)) print("%-20s %20.10f" % ("eigen_beta", cdp.eigen_beta)) print("%-20s %20.10f" % ("eigen_gamma", cdp.eigen_gamma)) print("%-20s\n%s" % ("eigenframe", axes)) print("\nPermutation '%s':" % permutation) # The axis inversion structure. inv = ones(3, float64) # The starting condition x <= y <= z. if x <= y and y <= z: # Printout. print("%-20s %-20s" % ("Starting condition", "x <= y <= z")) # The cone angle and axes permutations. if permutation == 'A': perm_angles = [0, 2, 1] perm_axes = [2, 1, 0] inv[perm_axes[2]] = -1.0 else: perm_angles = [1, 2, 0] perm_axes = [2, 0, 1] # The starting condition x <= z <= y. elif x <= z and z <= y: # Printout. print("%-20s %-20s" % ("Starting condition", "x <= z <= y")) # The cone angle and axes permutations. if permutation == 'A': perm_angles = [0, 2, 1] perm_axes = [2, 1, 0] inv[perm_axes[2]] = -1.0 else: perm_angles = [2, 1, 0] perm_axes = [0, 2, 1] inv[perm_axes[2]] = -1.0 # The starting condition z <= x <= y. elif z <= x and x <= y: # Printout. print("%-20s %-20s" % ("Starting condition", "z <= x <= y")) # The cone angle and axes permutations. if permutation == 'A': perm_angles = [2, 0, 1] perm_axes = [1, 2, 0] else: perm_angles = [2, 1, 0] perm_axes = [0, 2, 1] inv[perm_axes[2]] = -1.0 # Cannot be here. else: raise RelaxFault # Printout. print("%-20s %-20s" % ("Cone angle permutation", perm_angles)) print("%-20s %-20s" % ("Axes permutation", perm_axes)) # Permute the angles. if cdp.model in MODEL_LIST_ISO_CONE: cdp.cone_theta = (angles[perm_angles[0]] + angles[perm_angles[1]]) / 2.0 else: cdp.cone_theta_x = angles[perm_angles[0]] cdp.cone_theta_y = angles[perm_angles[1]] if cdp.model in MODEL_LIST_RESTRICTED_TORSION: cdp.cone_sigma_max = angles[perm_angles[2]] elif cdp.model in MODEL_LIST_FREE_ROTORS: cdp.cone_sigma_max = pi # Permute the axes (iso cone). if cdp.model in MODEL_LIST_ISO_CONE: # Convert the y-axis to spherical coordinates (the x-axis would be ok too, or any vector in the x-y plane due to symmetry of the original permutation). axis_new = axes[:, 1] r, cdp.axis_theta, cdp.axis_phi = cartesian_to_spherical(axis_new) # Permute the axes (pseudo-ellipses). else: axes_new = transpose(array([inv[0]*axes[:, perm_axes[0]], inv[1]*axes[:, perm_axes[1]], inv[2]*axes[:, perm_axes[2]]], float64)) # Convert the permuted frame to Euler angles and store them. cdp.eigen_alpha, cdp.eigen_beta, cdp.eigen_gamma = R_to_euler_zyz(axes_new) # End printout. if cdp.model in MODEL_LIST_ISO_CONE: print("\nPermuted parameters:") print("%-20s %20.10f" % ("cone_theta", cdp.cone_theta)) if cdp.model == MODEL_ISO_CONE: print("%-20s %20.10f" % ("cone_sigma_max", cdp.cone_sigma_max)) print("%-20s %20.10f" % ("axis_theta", cdp.axis_theta)) print("%-20s %20.10f" % ("axis_phi", cdp.axis_phi)) print("%-20s\n%s" % ("cone axis", axis_new)) else: print("\nPermuted parameters:") print("%-20s %20.10f" % ("cone_theta_x", cdp.cone_theta_x)) print("%-20s %20.10f" % ("cone_theta_y", cdp.cone_theta_y)) if cdp.model == MODEL_PSEUDO_ELLIPSE: print("%-20s %20.10f" % ("cone_sigma_max", cdp.cone_sigma_max)) print("%-20s %20.10f" % ("eigen_alpha", cdp.eigen_alpha)) print("%-20s %20.10f" % ("eigen_beta", cdp.eigen_beta)) print("%-20s %20.10f" % ("eigen_gamma", cdp.eigen_gamma)) print("%-20s\n%s" % ("eigenframe", axes_new))
# Script for checking the free rotor frame order model. # Python module imports. from numpy import array, float64 from os import sep # relax module imports. from data_store import Relax_data_store; ds = Relax_data_store() from lib.geometry.coord_transform import cartesian_to_spherical from status import Status; status = Status() # Generate 3 orthogonal vectors. vect_z = array([2, 1, 3], float64) r, theta, phi = cartesian_to_spherical(vect_z) # Load the tensors. self._execute_uf(uf_name='script', file=status.install_path + sep+'test_suite'+sep+'system_tests'+sep+'scripts'+sep+'frame_order'+sep+'tensors'+sep+'free_rotor_axis2_1_3_rot_tensors.py') # Data init. cdp.ave_pos_beta = 0.5 cdp.ave_pos_gamma = 0.2 cdp.axis_theta = theta cdp.axis_phi = phi # Select the Frame Order model. self._execute_uf(uf_name='frame_order.select_model', model='free rotor') # Set the reference domain. self._execute_uf(uf_name='frame_order.ref_domain', ref='full')
def permute_axes(permutation='A'): """Permute the axes of the motional eigenframe to switch between local minima. @keyword permutation: The permutation to use. This can be either 'A' or 'B' to select between the 3 permutations, excluding the current combination. @type permutation: str """ # Check that the model is valid. allowed = MODEL_LIST_ISO_CONE + MODEL_LIST_PSEUDO_ELLIPSE if cdp.model not in allowed: raise RelaxError( "The permutation of the motional eigenframe is only valid for the frame order models %s." % allowed) # Check that the model parameters are setup. if cdp.model in MODEL_LIST_ISO_CONE: if not hasattr(cdp, 'cone_theta') or not is_float(cdp.cone_theta): raise RelaxError("The parameter values are not set up.") else: if not hasattr(cdp, 'cone_theta_y') or not is_float(cdp.cone_theta_y): raise RelaxError("The parameter values are not set up.") # The iso cones only have one permutation. if cdp.model in MODEL_LIST_ISO_CONE and permutation == 'B': raise RelaxError("The isotropic cones only have one permutation.") # The angles. cone_sigma_max = 0.0 if cdp.model in MODEL_LIST_RESTRICTED_TORSION: cone_sigma_max = cdp.cone_sigma_max elif cdp.model in MODEL_LIST_FREE_ROTORS: cone_sigma_max = pi if cdp.model in MODEL_LIST_ISO_CONE: angles = array([cdp.cone_theta, cdp.cone_theta, cone_sigma_max], float64) else: angles = array([cdp.cone_theta_x, cdp.cone_theta_y, cone_sigma_max], float64) x, y, z = angles # The axis system. axes = generate_axis_system() # Start printout for the isotropic cones. if cdp.model in MODEL_LIST_ISO_CONE: print("\nOriginal parameters:") print("%-20s %20.10f" % ("cone_theta", cdp.cone_theta)) print("%-20s %20.10f" % ("cone_sigma_max", cone_sigma_max)) print("%-20s %20.10f" % ("axis_theta", cdp.axis_theta)) print("%-20s %20.10f" % ("axis_phi", cdp.axis_phi)) print("%-20s\n%s" % ("cone axis", axes[:, 2])) print("%-20s\n%s" % ("full axis system", axes)) print("\nPermutation '%s':" % permutation) # Start printout for the pseudo-ellipses. else: print("\nOriginal parameters:") print("%-20s %20.10f" % ("cone_theta_x", cdp.cone_theta_x)) print("%-20s %20.10f" % ("cone_theta_y", cdp.cone_theta_y)) print("%-20s %20.10f" % ("cone_sigma_max", cone_sigma_max)) print("%-20s %20.10f" % ("eigen_alpha", cdp.eigen_alpha)) print("%-20s %20.10f" % ("eigen_beta", cdp.eigen_beta)) print("%-20s %20.10f" % ("eigen_gamma", cdp.eigen_gamma)) print("%-20s\n%s" % ("eigenframe", axes)) print("\nPermutation '%s':" % permutation) # The axis inversion structure. inv = ones(3, float64) # The starting condition x <= y <= z. if x <= y and y <= z: # Printout. print("%-20s %-20s" % ("Starting condition", "x <= y <= z")) # The cone angle and axes permutations. if permutation == 'A': perm_angles = [0, 2, 1] perm_axes = [2, 1, 0] inv[perm_axes[2]] = -1.0 else: perm_angles = [1, 2, 0] perm_axes = [2, 0, 1] # The starting condition x <= z <= y. elif x <= z and z <= y: # Printout. print("%-20s %-20s" % ("Starting condition", "x <= z <= y")) # The cone angle and axes permutations. if permutation == 'A': perm_angles = [0, 2, 1] perm_axes = [2, 1, 0] inv[perm_axes[2]] = -1.0 else: perm_angles = [2, 1, 0] perm_axes = [0, 2, 1] inv[perm_axes[2]] = -1.0 # The starting condition z <= x <= y. elif z <= x and x <= y: # Printout. print("%-20s %-20s" % ("Starting condition", "z <= x <= y")) # The cone angle and axes permutations. if permutation == 'A': perm_angles = [2, 0, 1] perm_axes = [1, 2, 0] else: perm_angles = [2, 1, 0] perm_axes = [0, 2, 1] inv[perm_axes[2]] = -1.0 # Cannot be here. else: raise RelaxFault # Printout. print("%-20s %-20s" % ("Cone angle permutation", perm_angles)) print("%-20s %-20s" % ("Axes permutation", perm_axes)) # Permute the angles. if cdp.model in MODEL_LIST_ISO_CONE: cdp.cone_theta = (angles[perm_angles[0]] + angles[perm_angles[1]]) / 2.0 else: cdp.cone_theta_x = angles[perm_angles[0]] cdp.cone_theta_y = angles[perm_angles[1]] if cdp.model in MODEL_LIST_RESTRICTED_TORSION: cdp.cone_sigma_max = angles[perm_angles[2]] elif cdp.model in MODEL_LIST_FREE_ROTORS: cdp.cone_sigma_max = pi # Permute the axes (iso cone). if cdp.model in MODEL_LIST_ISO_CONE: # Convert the y-axis to spherical coordinates (the x-axis would be ok too, or any vector in the x-y plane due to symmetry of the original permutation). axis_new = axes[:, 1] r, cdp.axis_theta, cdp.axis_phi = cartesian_to_spherical(axis_new) # Permute the axes (pseudo-ellipses). else: axes_new = transpose( array([ inv[0] * axes[:, perm_axes[0]], inv[1] * axes[:, perm_axes[1]], inv[2] * axes[:, perm_axes[2]] ], float64)) # Convert the permuted frame to Euler angles and store them. cdp.eigen_alpha, cdp.eigen_beta, cdp.eigen_gamma = R_to_euler_zyz( axes_new) # End printout. if cdp.model in MODEL_LIST_ISO_CONE: print("\nPermuted parameters:") print("%-20s %20.10f" % ("cone_theta", cdp.cone_theta)) if cdp.model == MODEL_ISO_CONE: print("%-20s %20.10f" % ("cone_sigma_max", cdp.cone_sigma_max)) print("%-20s %20.10f" % ("axis_theta", cdp.axis_theta)) print("%-20s %20.10f" % ("axis_phi", cdp.axis_phi)) print("%-20s\n%s" % ("cone axis", axis_new)) else: print("\nPermuted parameters:") print("%-20s %20.10f" % ("cone_theta_x", cdp.cone_theta_x)) print("%-20s %20.10f" % ("cone_theta_y", cdp.cone_theta_y)) if cdp.model == MODEL_PSEUDO_ELLIPSE: print("%-20s %20.10f" % ("cone_sigma_max", cdp.cone_sigma_max)) print("%-20s %20.10f" % ("eigen_alpha", cdp.eigen_alpha)) print("%-20s %20.10f" % ("eigen_beta", cdp.eigen_beta)) print("%-20s %20.10f" % ("eigen_gamma", cdp.eigen_gamma)) print("%-20s\n%s" % ("eigenframe", axes_new))