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(
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, ),
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')
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
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]',
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.
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=(