Source code for bbprep._internal.generators.etkdg
import stk
from rdkit.Chem import AllChem
from bbprep._internal.ensemble.ensemble import Conformer, Ensemble
from .generator import Generator
[docs]
class ETKDG(Generator):
"""Generate conformers as stk molecules with :func:`AllChem.ETKDGv3()`."""
def __init__(self, num_confs: int) -> None:
"""Initialise ETKDG generator.
`v3`:
New version from DOI: 10.1021/acs.jcim.0c00025
with improved handling of macrocycles.
"""
self._num_confs = num_confs
[docs]
def generate_conformers(
self,
molecule: stk.BuildingBlock,
) -> Ensemble:
rdkit_molecule = molecule.to_rdkit_mol()
rdkit_molecule.RemoveAllConformers()
params = AllChem.ETKDGv3() # type: ignore[attr-defined]
params.randomSeed = 1000
cids = AllChem.EmbedMultipleConfs( # type: ignore[attr-defined]
mol=rdkit_molecule,
numConfs=self._num_confs,
params=params,
)
ensemble = Ensemble(base_molecule=molecule)
for cid in cids:
pos_mat = rdkit_molecule.GetConformer(id=cid).GetPositions()
ensemble.add_conformer(
conformer=Conformer(
molecule=molecule.with_position_matrix(pos_mat),
conformer_id=cid,
source="etkdg-v3",
permutation=None,
),
)
return ensemble