提问人:meadeytabeedy 提问时间:4/19/2023 最后编辑:meadeytabeedy 更新时间:4/20/2023 访问量:559
如何使用 RDKIT 从 mol 文件中获取所有 n 个原子片段(子结构)?
How to obtain all n atom fragments (substructures) from a mol file using RDKIT?
问:
我有兴趣获得在较大分子中包含 4 个非氢原子的片段或子结构。
最接近实现此目的的示例来自 https://iwatobipen.wordpress.com/2020/08/12/get-and-draw-molecular-fragment-with-user-defined-path-rdkit-memo/
我使用了他们的工作,但我不相信在他们的方法中发现了“所有”4 个原子子结构。他们使用围绕中心原子的“半径”概念。这并不能区分我正在寻找的所有可能的子结构。
有没有人对改进此代码以实现我的目标或未来工作的不同方向有任何建议?
我遵循了上面链接提供的方法。提供了各种子结构,但不是“全部”,运行此方法时指定了 4 个原子片段。
子结构示例我没有看到使用这种方法,但我相信我应该在半径 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)
答:
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
smarts_branch
为了更好地测试,我将使用具有明确氢气的分子。
mol = Chem.AddHs(Chem.MolFromSmiles('C=C(S)C(N)(O)C'))
mol
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))
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
评论