如何使用 RDKIT 从 mol 文件中获取所有 n 个原子片段(子结构)?

How to obtain all n atom fragments (substructures) from a mol file using RDKIT?

提问人:meadeytabeedy 提问时间:4/19/2023 最后编辑:meadeytabeedy 更新时间:4/20/2023 访问量:559

问:

我有兴趣获得在较大分子中包含 4 个非氢原子的片段或子结构。

最接近实现此目的的示例来自 https://iwatobipen.wordpress.com/2020/08/12/get-and-draw-molecular-fragment-with-user-defined-path-rdkit-memo/

我使用了他们的工作,但我不相信在他们的方法中发现了“所有”4 个原子子结构。他们使用围绕中心原子的“半径”概念。这并不能区分我正在寻找的所有可能的子结构。

有没有人对改进此代码以实现我的目标或未来工作的不同方向有任何建议?

我遵循了上面链接提供的方法。提供了各种子结构,但不是“全部”,运行此方法时指定了 4 个原子片段。

具体示例:Major Structure I am using as Eample

子结构示例我没有看到使用这种方法,但我相信我应该在半径 1 或半径 2 处看到。1]1

from rdkit import Chem
from rdkit.Chem import Draw
from rdkit.Chem.Draw import IPythonConsole
from rdkit.Chem import AllChem
AllChem.SetPreferCoordGen(True)
def getSubmolRadN(mol, radius):
    atoms=mol.GetAtoms()
    submols=[]
    for atom in atoms:
        env=Chem.FindAtomEnvironmentOfRadiusN(mol, radius, atom.GetIdx())
        amap={}
        submol=Chem.PathToSubmol(mol, env, atomMap=amap)
        subsmi=Chem.MolToSmiles(submol, rootedAtAtom=amap[atom.GetIdx()], canonical=False)
        submols.append(Chem.MolFromSmiles(subsmi, sanitize=False))
    return submols
mol = Chem.MolFromSmiles('C=C(S)C(N)(O)C')
submols = getSubmolRadN(mol,1)
Draw.MolsToGridImage(submols, highlightAtomLists=[[0] for _ in range(len(submols))], molsPerRow=5)
submols = getSubmolRadN(mol,2)
Draw.MolsToGridImage(submols, highlightAtomLists=[[0] for _ in range(len(submols))], molsPerRow=5)
submols = getSubmolRadN(mol,3)
Draw.MolsToGridImage(submols, highlightAtomLists=[[0] for _ in range(len(submols))], molsPerRow=5)

半径 1 和 2、半径 3 的输出出现错误Outputs of radii 1 and 2

聚合物 RDKIT 分子 化学信息学

评论

0赞 Tarquinius 4/19/2023
“在一个较大的分子中包含 4 个非氢原子”我想这还不够具体。您想在分子内的特定半径内有 4 个非氢原子吗?您想让 4 个非氢原子由一个或多个碳连接吗?现在,我可以给你代码来检查你的示例结构是否具有 4 个非氢原子。示例结构的输出将为 True。或者你想找到与 4 个非氢原子相连的每个碳原子?
0赞 meadeytabeedy 4/20/2023
感谢您的提问。我正在寻找包含 4 个非氢原子的所有子结构。另一种说法是用债券来解释。我想要所有包含 3 个键的片段,其中氢原子不是 4 个原子或 3 个键合子结构的一部分。关于半径问题,我没有明确地关注“半径”,而是关注包含 4 个原子和 3 个键的所有子结构。在图论中,通常忽略氢,而将其他原子算作节点,我在这里试图练习。
0赞 meadeytabeedy 4/20/2023
此外,我相信我找到了为我执行此操作的功能。RDKit rdkit。Chem.rdmolops.FindAllSubgraphsOfLengthMToN

答:

3赞 rapelpy 4/20/2023 #1

要找到 4 个相连的非氢原子,您可以使用 。SMARTS

由于 4 的连接可以是线性的,也可以有一个分支,并且不能以氢结尾(如果您有明确的氢,则很重要),因此这两个 SMARTS 应该可以工作。

from rdkit import Chem
from rdkit.Chem import Draw, rdDepictor
rdDepictor.SetPreferCoordGen(True)
from rdkit.Chem.Draw import IPythonConsole
IPythonConsole.molSize = (200, 150)

smarts_linear = Chem.MolFromSmarts('[!#1]~*~*~[!#1]')
smarts_branch = Chem.MolFromSmarts('[!#1]~*(~[!#1])~[!#1]')

smarts_linear

enter image description here

smarts_branch

enter image description here

为了更好地测试,我将使用具有明确氢气的分子。

mol = Chem.AddHs(Chem.MolFromSmiles('C=C(S)C(N)(O)C'))
mol

enter image description here

sub_linear = mol.GetSubstructMatches(smarts_linear)
sub_branch = mol.GetSubstructMatches(smarts_branch)
all_subs = sub_linear + sub_branch

found_subs = []

for n in range(len(all_subs)):
    found_subs.append(mol)

Draw.MolsToGridImage(found_subs, molsPerRow=4, highlightAtomLists=all_subs, subImgSize=(200,150))

enter image description here

0赞 meadeytabeedy 4/20/2023 #2

以前的用户(rapelpy)也回答了这个问题。我的一个团队成员能够生成一个代码来获取路径或子图。澄清一下,路径没有子图的分支。

from rdkit import Chem
from rdkit.Chem import Draw
from rdkit.Chem.Draw import IPythonConsole
from rdkit.Chem import AllChem
AllChem.SetPreferCoordGen(True)
from rdkit.Chem import rdmolops
import csv

mol = Chem.MolFromSmiles('C=C(S)C(N)(O)C')
mol


# Find all subgraphs of length 3 in the molecule
#Subgraphs have branching
subgraphs = Chem.FindAllSubgraphsOfLengthN(mol, 3)

#Paths is no branching
#subgraphs = Chem.FindAllPathsOfLengthN(mol, 3)
print(len(subgraphs))

# Print out the connected SMILES for each subgraph
for subgraph in subgraphs:
    # Get the subgraph as a new molecule object
    sub_mol = Chem.PathToSubmol(mol, subgraph)
    # Generate the connected SMILES string for the subgraph
    subgraph_smiles = Chem.MolToSmiles(sub_mol, kekuleSmiles=True)
    print(subgraph_smiles)

Output
11
C=CCC
C=CCO
C=CCN
C=C(C)S
CCCS
OCCS
NCCS
CC(C)O
CC(C)N
CC(N)O
CC(N)O