Source code for bbprep._internal.processes.angle
import numpy as np
import stk
import stko
from bbprep._internal.ensemble.ensemble import Conformer
from .process import Process
[docs]
class MinimiseAngle(Process):
"""Get the molecule with the min/max of a target angle."""
def _run_process(
self,
conformer: Conformer,
conformer_id: int,
) -> float:
key = stk.Smiles().get_key(conformer.molecule) + f"__{conformer_id}"
if key in self._data:
return self._data[key]
atom_positions = self._selector.get_atomic_positions(
conformer.molecule
)
expected = 3
if len(atom_positions) != expected:
msg = f"Selector found {len(atom_positions)} atoms, not 3"
raise RuntimeError(msg)
vectors = (
atom_positions[0] - atom_positions[1],
atom_positions[2] - atom_positions[1],
)
value = np.degrees(stko.vector_angle(*vectors))
self._save_to_data(conformer, conformer_id, value)
return self._data[key]