Source code for stk._internal.topology_graphs.rotaxane.vertices

import rdkit.Chem.AllChem as rdkit

from stk._internal.topology_graphs.vertex import Vertex


[docs] class AxleVertex(Vertex):
[docs] def place_building_block(self, building_block, edges): return building_block.with_centroid( position=self._position, atom_ids=building_block.get_placer_ids(), ).get_position_matrix()
[docs] def map_functional_groups_to_edges(self, building_block, edges): return {}
[docs] class CycleVertex(Vertex): """ Places the cycles in a :class:`NRotaxane`. """ def __init__(self, id, position, flip): """ Initialize a :class:`.CycleVertex` instance. Parameters ---------- id : :class:`int` The id of the vertex. position : :class:`tuple` of :class:`float` The position of the vertex. flip : :class:`bool` If ``True``, the orientation of building blocks placed by the vertex will be flipped. """ self._flip = flip super().__init__(id, position)
[docs] def get_flip(self): """ Return ``True`` if the vertex flips building blocks it places. Returns ------- :class:`bool` ``True`` if the vertex flips building blocks it places. """ return self._flip
[docs] def clone(self): clone = super().clone() clone._flip = self._flip return clone
[docs] def place_building_block(self, building_block, edges): rdkit_mol = building_block.to_rdkit_mol() macrocycle = max(rdkit.GetSymmSSSR(rdkit_mol), key=len) return ( building_block.with_centroid( position=self._position, atom_ids=macrocycle, ) .with_rotation_between_vectors( start=building_block.get_plane_normal(macrocycle), target=[-1 if self._flip else 1, 0, 0], origin=self._position, ) .get_position_matrix() )
[docs] def map_functional_groups_to_edges(self, building_block, edges): return {}
def __str__(self): return ( f"Vertex(id={self._id}, " f"position={self._position.tolist()}, " f"flip={self._flip})" )