# REMARK 1 CREATED WITH OPENMM 8.2, 2025-04-07 # HETATM 1 O A 1 0.428 0.562 -0.006 1.00 0.00 O # HETATM 2 H1 A 1 1.257 1.041 -0.006 1.00 0.00 H # HETATM 3 H2 A 1 -0.243 1.245 -0.006 1.00 0.00 H # TER 4 A 1 # CONECT 1 2 3 # CONECT 2 1 # CONECT 3 1 # END from math import acos, sqrt, pi def calc_hoh_angle(h1: tuple[float], h2: tuple[float], o: tuple[float]) -> float: x1 = h1[0] - o[0] y1 = h1[1] - o[1] z1 = h1[2] - o[2] x2 = h2[0] - o[0] y2 = h2[1] - o[1] z2 = h2[2] - o[2] xyz12 = (x1 * x2) + (y1 * y2) + (z1 * z2) angle = acos(xyz12 / (sqrt(x1**2 + y1**2 + z1**2) * sqrt(x2**2 + y2**2 + z2**2))) return angle * 180 / pi # OpenMM # Gaussian print( calc_hoh_angle( h1=(0.694, 0.998, 0.000), h2=(-0.859, 1.209, 0.000), o=(-0.157, 0.554, 0.000) ) ) print( calc_hoh_angle( h1=(0.000, 0.781, -0.456), h2=(0.000, -0.781, -0.456), o=(0.000, 0.000, 0.114) ) )