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...