Réimplémentation du programme DSSP en Python

geom.py~ 1.7KB

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