def angle_between_3_XYZs(p1: mp.XYZ, p2: mp.XYZ, p3: mp.XYZ) -> float: """ return the angle between 3 points, in radians:w """ ba = p1.as_nparray() - p2.as_nparray() bc = p3.as_nparray() - p2.as_nparray() cosine_angle = np.dot(ba, bc) / (np.linalg.norm(ba) * np.linalg.norm(bc)) return np.arccos(cosine_angle)
def angle_between_3_XYZs( p1: mp.XYZ, p2: mp.XYZ, p3: mp.XYZ ) -> float: """ return the angle between 3 points, in radians:w """ ba = p1.as_nparray() - p2.as_nparray() bc = p3.as_nparray() - p2.as_nparray() cosine_angle = np.dot( ba, bc ) / ( np.linalg.norm( ba ) * np.linalg.norm( bc ) ) return np.arccos( cosine_angle )
def rotation_matrix_around_vec( axis: mp.XYZ, theta: float ): """ calcualted the rotation matrix to roatate an boject around axis theta radian degrees based on: http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/ and http://stackoverflow.com/questions/6802577/python-rotation-of-3d-vector """ return linalg.expm3(np.cross(np.eye(3), axis.as_list()/np.float64(linalg.norm(axis.as_list()))*theta))
def main(): pdb = parse_PDB(sys.argv[1]) for name, xyz in zip( ['B', 'C', 'X'], [XYZ(7.5, 0, 0), XYZ(0, 7.5, 0), XYZ(7.5, 7.5, 7.5)]): new_chain = copy.deepcopy(pdb.chains['A']) new_chain.change_chain_name(name) new_chain.translate_xyz(xyz) pdb.add_chain(new_chain) pdb.renumber() write_PDB('test.pdb', pdb)
def read_RBs(file_name): results = [] with open(file_name, 'r') as fin: for l in fin: floats = [float(a) for a in l.split()[1:]] rb = RigidBody(XYZ(floats[0], floats[1], floats[2]), XYZ(floats[3], floats[4], floats[5]), XYZ(floats[6], floats[7], floats[8]), XYZ(floats[9], floats[10], floats[11])) results.append(rb) break print(results)
def rotation_matrix_around_vec(axis: mp.XYZ, theta: float): """ calcualted the rotation matrix to roatate an boject around axis theta radian degrees based on: http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/ and http://stackoverflow.com/questions/6802577/python-rotation-of-3d-vector """ return linalg.expm3( np.cross( np.eye(3), axis.as_list() / np.float64(linalg.norm(axis.as_list())) * theta))