首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用rdkit将分子转换为指纹

无法使用rdkit将分子转换为指纹
EN

Stack Overflow用户
提问于 2021-04-28 22:33:40
回答 1查看 237关注 0票数 0

我正在尝试用rdkit把分子的微笑转换成指纹。我有两个微笑: Nc1cccc(N)n1和Nc1cc(CSc2ccc(O)cc2)cc(N)n1。第一个扩展为第二个。换句话说,第二个分子在其结构中包含第一个分子。

我所做的是使用rdkit删除公共部分,以获得不同片段的微笑(CSC1=CC=C(O)C=C1 in kekulized form)。我正在尝试将这个片段转换成分子,然后再转换成指纹,以计算与参考分子的相似性。

Desired transformation

但我得到了一个错误:‘无法对原子进行kekulize’,使用这些原子的索引。这对我来说很奇怪,因为所有的微笑(两个输入的微笑和产生的片段微笑)都可以很容易地用MarvinSketch或Chemdraw (绘制分子的软件)可视化。我甚至让Marvin kekulize碎片微笑,并尝试用它制造一个分子,但我仍然得到同样的错误。下面是我删除片段的代码:

代码语言:javascript
复制
def remove_initial_fragment(mol_smiles, fragment_smiles):
    mol = Chem.MolFromSmiles(mol_smiles) #creates molecule from the longer smiles
    fragment = Chem.MolFromSmiles(fragment_smiles) #the molecule I want to remove

    rm = AllChem.DeleteSubstructs(mol, fragment) #creates new molecule

    return Chem.MolToSmiles(rm) #converts the mol I want back into smiles

smiles_frags = [remove_initial_fragment(x, fragment_smiles) for x in smiles]
mols_frags = [Chem.MolFromSmiles(x) for x in smiles_frags]

在我的例子中,“fragment_smiles”对于所有选择的微笑都是相同的。但是,当我试图将'mols_frags‘列表中的分子转换为指纹时,我遇到了一个错误:

代码语言:javascript
复制
MFP_2 = [AllChem.GetMorganFingerprintAsBitVect(x, 2) for x in mols_frags]

我试着在网上寻找答案,但没有真正有帮助。我甚至尝试单独创建kekulized的微笑,并直接传递它们作为创建指纹的输入,但我仍然收到相同的错误。

这对我来说非常奇怪,因为当我尝试用相同的代码对一组微笑(片段,更长的微笑,结果微笑)执行相同的过程时,它工作起来没有任何问题,我可以没有任何错误地创建指纹。但在我看来,一旦我将微笑/分子作为列表输入,我就会得到错误。你知道为什么会这样吗?或者您是否在我的代码中看到了我没有意识到的任何错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-29 20:26:01

使用fragment_smiles = 'Nc1cccc(N)n1'smiles = ['Nc1cc(CSc2ccc(O)cc2)cc(N)n1', 'Nc1cc(COc2ccc(O)cc2)cc(N)n1']这样的list。我拿到指纹没问题。

似乎在删除子结构之后,有一些smiles_frags是不正确的微笑。

为了证明list中的微笑,给出了一个你可以使用的问题

代码语言:javascript
复制
from rdkit.Chem import AllChem as Chem

fragment = Chem.MolFromSmiles('Nc1cccc(N)n1')

smiles = ['Nc1cc(CSc2ccc(O)cc2)cc(N)n1', 'Nc1cc(COc2ccc(O)cc2)cc(N)n1', 'CC1=CC=Cc2c(N)nc(N)cc12']

for smi in smiles:
    try:
        mol = Chem.MolFromSmiles(smi)
        f1 = Chem.DeleteSubstructs(mol, fragment)
        f2 = Chem.MolFromSmiles(Chem.MolToSmiles(f1))
        fp = Chem.GetMorganFingerprintAsBitVect(f2, 2)
    except:
        print('SMILES:', smi)
        f = Chem.DeleteSubstructs(mol, fragment)
        print('smiles_frag:', Chem.MolToSmiles(f1))

这将提供:

代码语言:javascript
复制
SMILES: CC1=CC=Cc2c(N)nc(N)cc12
smiles_frag: ccccC
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67302261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档