【发布时间】:2021-07-21 22:18:59
【问题描述】:
我正在尝试使用rdkit 将分子微笑转换为指纹。我有两个微笑:
Nc1cccc(N)n1 和 Nc1cc(CSc2ccc(O)cc2)cc(N)n1。第一个扩展为第二个。换句话说,第二个分子在其结构中包含第一个分子。
我所做的是使用 rdkit 删除公共部分以获得不同片段的微笑(CSC1=CC=C(O)C=C1 以 kekulized 形式)。我正在尝试将该片段转换为分子,然后转换为指纹以计算与参考分子的相似性。
但我得到一个错误:'Can't kekulize atom' 带有这些原子的索引。这对我来说很奇怪,因为使用 MarvinSketch 或 Chemdraw(用于绘制分子的软件)可以轻松地可视化所有微笑(两个输入微笑和生成的片段微笑)。我什至让 Marvin kekulize 碎片微笑并尝试从中制造分子,但我仍然得到同样的错误。这是我删除片段的代码:
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”列表中的分子转换为指纹时出现错误:
MFP_2 = [AllChem.GetMorganFingerprintAsBitVect(x, 2) for x in mols_frags]
我尝试在网上寻找答案,但没有任何帮助。我什至尝试单独创建 kekulized 微笑并将它们直接作为创建指纹的输入传递,但我仍然遇到相同的错误。
这对我来说非常奇怪,因为当我尝试使用相同的代码为一组微笑(片段、更长的微笑、最终的微笑)执行相同的过程时,它可以毫无问题地工作,并且我可以毫无错误地创建指纹.但在我看来,一旦我输入微笑/分子作为列表,我就会得到错误。知道为什么会这样吗?或者您是否在我的代码中看到了我不知道的任何错误?
【问题讨论】:
-
如果我理解正确,您有
fragment_smiles = 'Nc1cccc(N)n1'和list,如smiles = ['Nc1cc(CSc2ccc(O)cc2)cc(N)n1', 'Nc1cc(COc2ccc(O)cc2)cc(N)n1']。这对我有用。您的list中的所有微笑都正确吗? RDKit 对阅读 SMILES 非常严格。 -
是的,我有你描述的
fragment_smiles和list。问题不在于删除fragment_smiles。这执行得很好。但是,当我试图从中提取指纹时,我以这种方式获得的微笑会出错。fragment_smiles和list中的微笑都是正确的,因为我用它们来创建整个未改变的分子的指纹,并且没有问题。当我尝试从list中取出一个微笑时,从中删除片段并使用生成的微笑来创建指纹,它可以工作。但是当我尝试自动化它时,它给出了错误 -
我对来自
MFP_2 = [Chem.GetMorganFingerprintAsBitVect(x, 2) for x in mols_frags]的指纹没有任何问题。看来您的smiles_frags/mols_frags之一已损坏。 -
我认为你是对的。我对此进行了更多的修补,我认为我看到一个微笑确实被破坏了。而且因为我将所有内容都作为列表传递,所以脚本会遇到损坏的微笑并完全停止。我正在努力修复它。现在我如何接受您的回答作为解决方案?
标签: python rdkit fingerprinting