Réimplémentation du programme DSSP en Python

geom.py 1.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import math
  2. def vector_from_pos(a, b):
  3. xAB = b[0]-a[0]
  4. yAB = b[1]-a[1]
  5. zAB = b[2]-a[2]
  6. coord_AB = [xAB,yAB,zAB]
  7. return coord_AB
  8. def vector_norm(v):
  9. norm = math.sqrt(v[0]**2 + v[1]**2 + v[2]**2)
  10. return norm
  11. def dot_product(v1,v2):
  12. dot_product = v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]
  13. return(dot_product)
  14. def position_vector(c):
  15. vector = vector_from_pos([0,0,0],c)
  16. return vector
  17. def vectors_substr(v1, v2):
  18. return ([v1[0]-v2[0],
  19. v1[1]-v2[1],
  20. v1[2]-v2[2]])
  21. def vector_angles(v1,v2):
  22. dot_prod = dot_product(v1,v2)
  23. norm_v1 = vector_norm(v1)
  24. norm_v2 = vector_norm(v2)
  25. term = dot_prod/(abs(norm_v1)*abs(norm_v2))
  26. rad_angle = math.acos(term)
  27. return rad_angle
  28. def calc_dihedral(u1, u2, u3, u4):
  29. """ Calculate dihedral angle method. From bioPython.PDB
  30. (adapted to np.array)
  31. Calculate the dihedral angle between 4 vectors
  32. representing 4 connected points. The angle is in
  33. [-pi, pi].
  34. Adapted function of dihedral_angle_from_coordinates.py
  35. by Eric Alcaide.
  36. Source : https://gist.github.com/EricAlcaide
  37. URL : https://gist.github.com/EricAlcaide/30d6bfdb8358d3a57d010c9a501fda56
  38. """
  39. #convert coords to numpy arrays
  40. u1 = np.array(u1)
  41. u2 = np.array(u2)
  42. u3 = np.array(u3)
  43. u4 = np.array(u4)
  44. a1 = u2 - u1
  45. a2 = u3 - u2
  46. a3 = u4 - u3
  47. v1 = np.cross(a1, a2)
  48. v1 = v1 / (v1 * v1).sum(-1)**0.5
  49. v2 = np.cross(a2, a3)
  50. v2 = v2 / (v2 * v2).sum(-1)**0.5
  51. porm = np.sign((v1 * a3).sum(-1))
  52. rad = np.arccos((v1*v2).sum(-1) / ((v1**2).sum(-1) * (v2**2).sum(-1))**0.5)
  53. if not porm == 0:
  54. rad = rad * porm
  55. deg_angle = rad*(180/math.pi)
  56. return deg_angle