示例#1
0
文件: m4l8.py 项目: zaeemnajeeb/stk
import pytest
import stk

from ....case_data import CaseData

metal_atom = stk.BuildingBlock(
    smiles='[Pd+2]',
    functional_groups=(stk.SingleAtom(stk.Pd(0, charge=2)) for i in range(4)),
    position_matrix=([0, 0, 0], ),
)
linker = stk.BuildingBlock(
    smiles=('[H]C1=NC([H])=C([H])C(C2=C([H])C([H])=C([H])C(C3=C([H])C([H]'
            ')=NC([H])=C3[H])=C2[H])=C1[H]'),
    functional_groups=[
        stk.SmartsFunctionalGroupFactory(
            smarts='[#6]~[#7X2]~[#6]',
            bonders=(1, ),
            deleters=(),
        ),
    ])


@pytest.fixture(
    params=(CaseData(
        molecule=stk.ConstructedMolecule(
            stk.cage.M4L8(
                building_blocks={
                    metal_atom: range(4),
                    linker: range(4, 12)
                },
                reaction_factory=stk.DativeReactionFactory(
示例#2
0
import pytest
import stk

from ....case_data import CaseData


_copper_atom = stk.BuildingBlock(
    smiles='[Cu+2]',
    functional_groups=(
        stk.SingleAtom(stk.Cu(0, charge=2))
        for i in range(4)
    ),
    position_matrix=([0, 0, 0], ),
)

_palladium_atom = stk.BuildingBlock(
    smiles='[Pd+2]',
    functional_groups=(
        stk.SingleAtom(stk.Pd(0, charge=2))
        for i in range(4)
    ),
    position_matrix=([0, 0, 0], ),
)

_bi_1 = stk.BuildingBlock(
    smiles='O=C(O)c1ccc(Br)cc1',
    functional_groups=[
        stk.SmartsFunctionalGroupFactory(
            smarts='[#6]~[#8]~[#1]',
            bonders=(1, ),
            deleters=(2, ),
示例#3
0
def main():
    bb1 = stk.BuildingBlock('NCCN', [stk.PrimaryAminoFactory()])
    bb2 = stk.BuildingBlock('O=CCC=O', [stk.AldehydeFactory()])
    polymer = stk.ConstructedMolecule(
        stk.polymer.Linear(building_blocks=(bb1, bb2),
                           repeating_unit="AB",
                           orientations=(0, 0),
                           num_repeating_units=1))
    bb2 = stk.BuildingBlock('O=CC(C=O)C=O', [stk.AldehydeFactory()])
    cage = stk.ConstructedMolecule(topology_graph=stk.cage.FourPlusSix(
        (bb1, bb2)), )
    cage2 = stk.ConstructedMolecule(topology_graph=stk.cage.FourPlusSix(
        building_blocks=(bb1, bb2),
        optimizer=stk.MCHammer(),
    ), )

    # Produce a Fe+2 atom with 6 functional groups.
    iron_atom = stk.BuildingBlock(
        smiles='[Fe+2]',
        functional_groups=(stk.SingleAtom(stk.Fe(0, charge=2))
                           for i in range(6)),
        position_matrix=[[0, 0, 0]],
    )

    # Define coordinating ligand with dummy bromine groups and
    # metal coordinating functional groups.
    oct_bb = stk.BuildingBlock(
        smiles='C1=NC(C=NBr)=CC=C1',
        functional_groups=[
            stk.SmartsFunctionalGroupFactory(
                smarts='[#6]~[#7X2]~[#35]',
                bonders=(1, ),
                deleters=(),
            ),
            stk.SmartsFunctionalGroupFactory(
                smarts='[#6]~[#7X2]~[#6]',
                bonders=(1, ),
                deleters=(),
            ),
        ],
    )

    # Build iron complex with delta stereochemistry.
    iron_oct_delta = stk.ConstructedMolecule(
        topology_graph=stk.metal_complex.OctahedralDelta(
            metals=iron_atom,
            ligands=oct_bb,
            optimizer=stk.MCHammer(),
        ), )

    # Assign Bromo functional groups to the metal complex.
    iron_oct_delta = stk.BuildingBlock.init_from_molecule(
        molecule=iron_oct_delta,
        functional_groups=[stk.BromoFactory()],
    )

    # Define spacer building block.
    bb3 = stk.BuildingBlock(
        smiles=('C1=CC(C2=CC=C(Br)C=C2)=C'
                'C=C1Br'),
        functional_groups=[stk.BromoFactory()],
    )

    # Build an M4L6 Tetrahedron with a spacer.
    moc = stk.ConstructedMolecule(
        topology_graph=stk.cage.M4L6TetrahedronSpacer(
            building_blocks=(
                iron_oct_delta,
                bb3,
            ),
            optimizer=stk.MCHammer(),
        ), )

    host = stk.ConstructedMolecule(topology_graph=stk.cage.FourPlusSix(
        building_blocks=(
            stk.BuildingBlock(
                smiles='NC1CCCCC1N',
                functional_groups=[
                    stk.PrimaryAminoFactory(),
                ],
            ),
            stk.BuildingBlock(
                smiles='O=Cc1cc(C=O)cc(C=O)c1',
                functional_groups=[stk.AldehydeFactory()],
            ),
        ),
        optimizer=stk.MCHammer(),
    ), )
    guest1 = stk.host_guest.Guest(
        building_block=stk.BuildingBlock('BrBr'),
        displacement=(0., 3., 0.),
    )
    guest2 = stk.host_guest.Guest(
        building_block=stk.BuildingBlock('C1CCCC1'), )

    hg_complex = stk.ConstructedMolecule(topology_graph=stk.host_guest.Complex(
        host=stk.BuildingBlock.init_from_molecule(host),
        guests=(guest1, guest2),
    ), )

    cycle = stk.ConstructedMolecule(topology_graph=stk.macrocycle.Macrocycle(
        building_blocks=(stk.BuildingBlock(
            smiles='[Br]CC[Br]',
            functional_groups=[stk.BromoFactory()],
        ), ),
        repeating_unit='A',
        num_repeating_units=8,
        optimizer=stk.MCHammer(),
    ), )
    axle = stk.ConstructedMolecule(topology_graph=stk.polymer.Linear(
        building_blocks=(
            stk.BuildingBlock('BrCCBr', [stk.BromoFactory()]),
            stk.BuildingBlock('BrCNCBr', [stk.BromoFactory()]),
        ),
        repeating_unit='AB',
        num_repeating_units=3,
        optimizer=stk.MCHammer(),
    ))
    rotaxane = stk.ConstructedMolecule(topology_graph=stk.rotaxane.NRotaxane(
        axle=stk.BuildingBlock.init_from_molecule(axle),
        cycles=(stk.BuildingBlock.init_from_molecule(cycle), ),
        repeating_unit='A',
        num_repeating_units=1,
    ), )

    examples_output = 'output_directory'
    if not os.path.exists(examples_output):
        os.mkdir(examples_output)

    structures = [
        ('bb1', bb1),
        ('bb2', bb2),
        ('bb3', bb3),
        ('polymer', polymer),
        ('cage', cage),
        ('cage2', cage2),
        ('m_iron_oct_delta', iron_oct_delta),
        ('m_moc', moc),
        ('hg_complex', hg_complex),
        ('cycle', cycle),
        ('axle', axle),
        ('rotaxane', rotaxane),
    ]

    # Run optimisations.
    for name, struct in structures:
        if 'm_' in name:
            rdkit_uff_energy = 'NA'
        else:
            rdkit_uff_energy = stko.UFFEnergy(
                ignore_inter_interactions=False).get_energy(struct)
        obabel_uff_energy = (stko.OpenBabelEnergy('uff').get_energy(struct))
        struct.write(os.path.join(examples_output, f'obabel_{name}_unopt.mol'))
        opt = stko.OpenBabel(
            forcefield='uff',
            repeat_steps=10,
            sd_steps=20,
            cg_steps=20,
        )
        opt_struct = opt.optimize(struct)
        opt_struct.write(
            os.path.join(examples_output, f'obabel_{name}_opt.mol'))

        if 'm_' in name:
            new_rdkit_uff_energy = 'NA'
        else:
            new_rdkit_uff_energy = stko.UFFEnergy(
                ignore_inter_interactions=False).get_energy(opt_struct)
        new_obabel_uff_energy = (
            stko.OpenBabelEnergy('uff').get_energy(opt_struct))
        print(f'{name}:\n'
              f'rdkit: {rdkit_uff_energy}, obabel: {obabel_uff_energy}\n'
              f'opt rdkit: {new_rdkit_uff_energy}, '
              f'opt obabel: {new_obabel_uff_energy}\n')
示例#4
0
            carbon=stk.C(0),
            oxygen=stk.O(1),
            sulfur=stk.S(2),
            hydrogen=stk.H(3),
            atom=stk.C(4),
            bonders=(stk.C(0), ),
            deleters=(stk.S(2), stk.H(3)),
        ),
        lambda: stk.Thiol(
            sulfur=stk.S(0),
            hydrogen=stk.H(1),
            atom=stk.C(2),
            bonders=(stk.C(2), ),
            deleters=(stk.S(0), stk.H(1)),
        ),
        lambda: stk.SingleAtom(atom=stk.Fe(0)),
    ),
)
def functional_group1(request) -> stk.GenericFunctionalGroup:
    """
    A :class:`.GenericFunctionalGroup` with 1 bonder atom.

    """

    return request.param()


@pytest.fixture
def functional_group1_2(functional_group1):
    """
    A :class:`.GenericFunctionalGroup` with 1 bonder atom.
import pytest
import stk

from ....case_data import CaseData


metal_atom = stk.BuildingBlock(
    smiles='[Fe+2]',
    functional_groups=(
        stk.SingleAtom(stk.Fe(0, charge=2))
        for i in range(6)
    ),
    position_matrix=([0, 0, 0], ),
)
ditopic_linker = stk.BuildingBlock(
    smiles=(
        '[H]C1=C([H])C(C2=C([H])C([H])=C(Br)C([H])=C2[H])=C([H])C([H])'
        '=C1Br'
    ),
    functional_groups=[stk.BromoFactory()]
)
complex_ligand = stk.BuildingBlock(
    smiles='[H]C1=NC(C([H])=NBr)=C([H])C([H])=C1[H]',
    functional_groups=[
        stk.SmartsFunctionalGroupFactory(
            smarts='[#6]~[#7X2]~[#35]',
            bonders=(1, ),
            deleters=(),
        ),
        stk.SmartsFunctionalGroupFactory(
            smarts='[#6]~[#7X2]~[#6]',
def build_cage_isomers(name, ligand):
    """
    Build all four cage isomers.

    Parameters
    ----------
    name : :class:`str`
        Cage identifier.

    ligand : :class:`stk.BuildingBlock`
        Ligand building block.

    Returns
    -------
    cage_isomers : :class:`dict` of :class:`stk.ConstructedMolecule`
        Constructed cage isomers.

    """

    cage_isomers = {}

    v_alignments = {
        'A': {
            2: 0,
            3: 0,
            4: 0,
            5: 0
        },
        'B': {
            2: 1,
            3: 0,
            4: 0,
            5: 0
        },
        'C': {
            2: 1,
            3: 1,
            4: 0,
            5: 0
        },
        'D': {
            2: 1,
            3: 0,
            4: 1,
            5: 0
        },
    }

    complex = stk.BuildingBlock(
        smiles='[Pd+2]',
        functional_groups=(stk.SingleAtom(stk.Pd(0, charge=2))
                           for i in range(4)),
        position_matrix=np.array([[0, 0, 0]]),
    )

    for v_a in v_alignments:
        v_align = v_alignments[v_a]
        name_ = f'{name}_{v_a}'
        opt_file = f'{name_}_optc.mol'

        # Build cage.
        cage = stk.ConstructedMolecule(
            stk.cage.M2L4Lantern(
                building_blocks={
                    complex: (0, 1),
                    ligand: (2, 3, 4, 5)
                },
                vertex_alignments=v_align,
                reaction_factory=stk.DativeReactionFactory(
                    stk.GenericReactionFactory(
                        bond_orders={
                            frozenset({AromaticCNC, stk.SingleAtom}): 9,
                            frozenset({AromaticCNN, stk.SingleAtom}): 9,
                        }))))

        if exists(opt_file):
            cage = cage.with_structure_from_file(opt_file)
        else:
            print(f'optimizing {name_}')
            cage.write(f'{name_}_unopt.mol')
            cage = optimize_cage(cage, name_)

        cage_isomers[v_a] = cage

    return cage_isomers
示例#7
0
            functional_groups=[stk.BromoFactory()],
        ),
        stk.BuildingBlock(
            smiles='BrCNCCBr',
            functional_groups=[stk.BromoFactory()],
        ),
    ),
    repeating_unit='AB',
    num_repeating_units=2,
), )

_square_planar = stk.ConstructedMolecule(
    topology_graph=stk.metal_complex.SquarePlanar(
        metals=stk.BuildingBlock(
            smiles='[Pd+2]',
            functional_groups=(stk.SingleAtom(stk.Fe(0, charge=2))
                               for i in range(4)),
            position_matrix=[[0, 0, 0]],
        ),
        ligands=stk.BuildingBlock(
            smiles='NBr',
            functional_groups=(stk.PrimaryAminoFactory(), ),
        ),
        optimizer=stk.MCHammer(),
    ))
uff = stko.OpenBabel('uff')
_square_planar_uff = uff.optimize(_square_planar)
_octahedral = stk.ConstructedMolecule(
    topology_graph=stk.metal_complex.Octahedral(
        metals=stk.BuildingBlock(
            smiles='[Fe+2]',
示例#8
0
            carbon=stk.C(0),
            oxygen=stk.O(1),
            sulfur=stk.S(2),
            hydrogen=stk.H(3),
            atom=stk.C(4),
            bonders=(stk.C(0), ),
            deleters=(stk.S(2), stk.H(3)),
        ),
        stk.Thiol(
            sulfur=stk.S(0),
            hydrogen=stk.H(1),
            atom=stk.C(2),
            bonders=(stk.C(2), ),
            deleters=(stk.S(0), stk.H(1)),
        ),
        stk.SingleAtom(atom=stk.Fe(0)),
    ), )
def functional_group1(request):
    """
    A :class:`.GenericFunctionalGroup` with 1 bonder atom.

    """

    return request.param.clone()


@pytest.fixture
def functional_group1_2(functional_group1):
    """
    A :class:`.GenericFunctionalGroup` with 1 bonder atom.
示例#9
0
import pytest
import stk
from rdkit.Chem import AllChem as rdkit

from ....case_data import CaseData

atom = rdkit.MolFromSmiles('[Fe+2]')
atom.AddConformer(rdkit.Conformer(atom.GetNumAtoms()))

_iron_atom = stk.BuildingBlock.init_from_rdkit_mol(atom)
atom_0, = _iron_atom.get_atoms(0)
_iron_atom = _iron_atom.with_functional_groups(
    (stk.SingleAtom(atom_0) for i in range(6)))

_iron_bi_1 = stk.BuildingBlock(smiles='BrN=Cc1ccccn1',
                               functional_groups=[
                                   stk.SmartsFunctionalGroupFactory(
                                       smarts='[#6]~[#7X2]~[#35]',
                                       bonders=(1, ),
                                       deleters=(),
                                   ),
                                   stk.SmartsFunctionalGroupFactory(
                                       smarts='[#6]~[#7X2]~[#6]',
                                       bonders=(1, ),
                                       deleters=(),
                                   ),
                               ])


@pytest.fixture(
    params=(