Source code for bbprep._internal.selectors.xcomx
import numpy as np
import numpy.typing as npt
import stk
from .selector import Selector
[docs]
class XCOMXSelector(Selector):
"""Get binder atom positions with the molecule centroid in the middle."""
[docs]
def select_atoms(
self,
molecule: stk.BuildingBlock,
) -> tuple[int, ...]:
msg = (
"This class can only provide positions, because one "
"position is the centroid of the molecule."
)
raise NotImplementedError(msg)
[docs]
def get_atomic_positions(
self,
molecule: stk.BuildingBlock,
) -> tuple[npt.NDArray[np.float64], ...]:
if molecule.get_num_functional_groups() != 2: # noqa: PLR2004
msg = "Molecule does not have 2 functional groups."
raise ValueError(msg)
positions = [
next(molecule.get_atomic_positions(atom_ids=id_))
for fg in molecule.get_functional_groups()
for id_ in fg.get_bonder_ids() # type: ignore[attr-defined]
]
positions.insert(1, molecule.get_centroid())
return tuple(positions)