Réimplémentation du programme DSSP en Python

geom.py 1.7KB

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