Generators¶
Classes for generating conformer ensembles using standard rdkit algorithms or torsion scans.
Example:¶
We can use geometrical ranges (in the GeometryScanner classes) to build
ensembles along specific collective variables:
import stk
import bbprepared
import stko
bb = stk.BuildingBlock(smiles="C1=CC=C(C=C1)C2=CC=CC=C2")
The desired range is actually a change from the initial configuration and can be set by the user (using SMARTS strings). Any combination of variables can be used, although you will start hitting a combinatorial nightmare with too many ranges. Once you have an ensemble, you can do normal analysis.
generator = bbprepared.generators.GeometryScanner(
target_ranges=(
bbprepared.generators.BondRange(
smarts="[#6X3H0]-!@[#6X3H0]",
expected_num_atoms=2,
scanned_ids=(0, 1),
scanned_range=[-0.5, -0.3, -0.2, 0, 0.2, 0.3, 0.5],
),
),
)
ensemble = generator.generate_conformers(bb)
energies = [
stko.MMFFEnergy(ignore_inter_interactions=False).get_energy(
conformer.molecule
)
for conformer in ensemble.yield_conformers()
]
Using the xtb scan method,
bbprepared can now scan torsions with improved accuracy in bbprepared.generators.XtbTorsionScanner.
You can install xtb with mamba install xtb in a mamba environment, or
by downloading the source from the site above.
import stk
import bbprepared
smiles = "C(C#CC1C=CC=C(Br)C=1)1C=CC=C(Br)C=1"
building_block = stk.BuildingBlock(
smiles=smiles,
functional_groups=(stk.BromoFactory(),),
)
# Rotate around alkynes.
smarts_to_rotate = "[#6X3][#6X3][#6X2H0]#!@[#6X2H0][#6X3][#6X3]"
selected_indices = (0, 1, 4, 5)
expected_num_atoms = 6
selector = bbprep.selectors.BySmartsSelector(
smarts=smarts_to_rotate,
selected_indices=selected_indices,
)
generator = XtbTorsionScanner(
target_torsions=(
bbprep.generators.TorsionRange(
smarts=smarts_to_rotate,
expected_num_atoms=expected_num_atoms,
scanned_ids=selected_indices,
scanned_range=range(0, 359, 20),
),
),
# We cannot test this code because xtb is a dependancy.
xtb_path=xtb_path,
output_dir=calculation_dir,
)
ensemble = generator.generate_conformers(molecule)
# This gives an ensemble with conformers that have a score attribute
# equal to the GFN2-xTB energy in Ha.
for conformer in ensemble.yield_conformers():
energy = conformer.score * 2625.5 # to kJ/mol.
# Plot...