import math import numpy as np def vector_from_pos(a, b): xAB = b[0]-a[0] yAB = b[1]-a[1] zAB = b[2]-a[2] coord_AB = [xAB,yAB,zAB] return coord_AB def vector_norm(v): norm = math.sqrt(v[0]**2 + v[1]**2 + v[2]**2) return norm def dot_product(v1,v2): dot_product = v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2] return(dot_product) def position_vector(c): vector = vector_from_pos([0,0,0],c) return vector def vectors_substr(v1, v2): return ([v1[0]-v2[0], v1[1]-v2[1], v1[2]-v2[2]]) def vector_angles(v1,v2): dot_prod = dot_product(v1,v2) norm_v1 = vector_norm(v1) norm_v2 = vector_norm(v2) term = dot_prod/(abs(norm_v1)*abs(norm_v2)) rad_angle = math.acos(term) return rad_angle def calc_dihedral(u1, u2, u3, u4): """ Calculate dihedral angle method. From bioPython.PDB (adapted to np.array) Calculate the dihedral angle between 4 vectors representing 4 connected points. The angle is in [-pi, pi]. Adapted function of dihedral_angle_from_coordinates.py by Eric Alcaide. Source : https://gist.github.com/EricAlcaide URL : https://gist.github.com/EricAlcaide/30d6bfdb8358d3a57d010c9a501fda56 """ #convert coords to numpy arrays u1 = np.array(u1) u2 = np.array(u2) u3 = np.array(u3) u4 = np.array(u4) a1 = u2 - u1 a2 = u3 - u2 a3 = u4 - u3 v1 = np.cross(a1, a2) v1 = v1 / (v1 * v1).sum(-1)**0.5 v2 = np.cross(a2, a3) v2 = v2 / (v2 * v2).sum(-1)**0.5 porm = np.sign((v1 * a3).sum(-1)) rad = np.arccos((v1*v2).sum(-1) / ((v1**2).sum(-1) * (v2**2).sum(-1))**0.5) if not porm == 0: rad = rad * porm deg_angle = rad*(180/math.pi) return deg_angle