Source code for PDBNucleicAcids.Geometry
"""Functions that address atom geometry."""
import numpy as np
[docs]
def calculate_normal_vector(v1, v2, v3) -> np.float64:
"""Compute normal vector from three 3D points."""
u1 = v2 - v1
u2 = v3 - v1
# Calcolo del vettore normale
normal = np.cross(u1, u2)
# Normalizzazione manuale del vettore normale
norm = np.linalg.norm(normal)
if norm == 0:
raise ValueError("Vettore normale nullo")
normal_normalized = normal / norm
return normal_normalized
[docs]
def angle_between_vectors(v1, v2) -> np.float64:
"""Compute angle between two vectors."""
cos_theta = np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
return np.degrees(np.arccos(np.clip(cos_theta, -1.0, 1.0)))
[docs]
def angle_between_planes(plane1, plane2) -> np.float64:
"""Compute angle between two planes, composed of three 3D points each."""
v1, v2, v3 = plane1
v4, v5, v6 = plane2
normal1 = calculate_normal_vector(v1, v2, v3)
normal2 = calculate_normal_vector(v4, v5, v6)
angle = angle_between_vectors(normal1, normal2)
return angle
[docs]
def plane_separation(plane1, plane2) -> np.float64:
"""Calcola la distanza verticale tra due piani."""
v1, v2, v3 = plane1
v4, v5, v6 = plane2
# Ottieni i vettori normali
normal1 = calculate_normal_vector(v1, v2, v3)
# normal2 = calculate_normal_vector(v4, v5, v6)
# Ottieni i centri dei piani
center1 = np.mean(plane1, axis=0)
center2 = np.mean(plane2, axis=0)
# Calcola il vettore tra i centri dei due piani
center_vector = center2 - center1
# Proietta il vettore tra i centri lungo la direzione del normale del
# primo piano
separation: np.float64 = abs(np.dot(center_vector, normal1))
return separation