Get angles#

Calculating bond and valence angles defined by atom triplets.

The function molsysmt.structure.get_angles() computes planar angles formed by sequences of three atoms \((A, B, C)\) where \(B\) is the central apex atom.

Added in version 1.0.0.

Basic usage#

Let’s calculate the valence angle formed by three consecutive atoms in Met-enkephalin:

import molsysmt as msm
import pyunitwizard as puw
import matplotlib.pyplot as plt
molsys = msm.convert(msm.systems['Met-enkephalin']['met_enkephalin.h5msm'])

We select the first three atoms and evaluate their angle with molsysmt.structure.get_angles():

triplet = [0, 1, 2]
angle = msm.structure.get_angles(molsys, triplets=triplet)
print('Valence angle (radians):', angle)
print('Valence angle (degrees):', puw.convert(angle, to_unit='degrees'))
Valence angle (radians): [[0.6446696079651566]] radian
Valence angle (degrees): [[36.93684771675683]] degree

Angle evolution across structural ensembles#

When evaluating angles across multi-structure systems or molecular dynamics simulations, molsysmt.structure.get_angles() tracks the angular fluctuation profile:

traj = msm.convert(msm.systems['pentalanine']['traj_pentalanine.h5msm'])
time = msm.get(traj, time=True)
angles_series = msm.structure.get_angles(traj, triplets=[0, 1, 2])
angles_deg = puw.get_value(puw.convert(angles_series[:, 0], to_unit='degrees'))
time_ns = puw.get_value(puw.convert(time, to_unit='ns'))
fig, ax = plt.subplots(figsize=(7, 3.5))
ax.plot(time_ns, angles_deg, color='teal', lw=1.0)
ax.set_xlabel('Time (ns)')
ax.set_ylabel('Angle (degrees)')
ax.set_title('Valence Angle Fluctuations Across Structures')
plt.tight_layout()
plt.show()
../../../../_images/ad8dd7b722fd56c170462c41a08e9a36941537af231f0c17b4fa65fbc987cba5.png

Computing multiple angle triplets concurrently#

Multiple atom triplets can be passed simultaneously as a list of 3-tuples:

triplets = [[0, 1, 2], [1, 2, 3], [2, 3, 4]]
angles_multi = msm.structure.get_angles(molsys, triplets=triplets)
print('Multiple angles (degrees):', puw.convert(angles_multi, to_unit='degrees'))
Multiple angles (degrees): [[36.93684771675683 120.03546704196674 42.49416671770135]] degree