无法使用rdkit将分子转换为指纹
Can't convert molecule to fingerprint with rdkit
我正在尝试使用 rdkit
将分子微笑转换为指纹。我有两个微笑:
Nc1cccc(N)n1 和 Nc1cc(CSc2ccc(O)cc2)cc(N)n1。第一个扩展为第二个。换句话说,第二个分子在其结构中包含第一个分子。
我所做的是使用 rdkit 删除公共部分以获得不同片段的微笑(kekulized 形式的 CSC1=CC=C(O)C=C1)。我正在尝试将该片段转换为分子,然后转换为指纹以计算与参考分子的相似性。
Desired transformation
但我收到错误消息:“无法使用这些原子的索引对原子进行 kekulize”。这对我来说很奇怪,因为使用 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 微笑并将它们直接作为创建指纹的输入传递,但我仍然遇到相同的错误。
这对我来说太奇怪了,因为当我尝试用相同的代码对一组微笑(片段、更长的微笑、最终的微笑)执行相同的过程时,它没有问题,而且我可以毫无问题地创建指纹任何错误。但在我看来,一旦我将 smiles/molecules 作为列表输入,就会出现错误。知道为什么会这样吗?还是您在我的代码中发现了我不知道的任何错误?
与 fragment_smiles = 'Nc1cccc(N)n1'
和 list
类似 smiles = ['Nc1cc(CSc2ccc(O)cc2)cc(N)n1', 'Nc1cc(COc2ccc(O)cc2)cc(N)n1']
。我获取指纹没问题。
看起来好像删除子结构后,有一些smiles_frags不正确的SMILES。
为了证明 list
中的 SMILES 给出了你可以使用的问题
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))
这将得到:
SMILES: CC1=CC=Cc2c(N)nc(N)cc12
smiles_frag: ccccC
我正在尝试使用 rdkit
将分子微笑转换为指纹。我有两个微笑:
Nc1cccc(N)n1 和 Nc1cc(CSc2ccc(O)cc2)cc(N)n1。第一个扩展为第二个。换句话说,第二个分子在其结构中包含第一个分子。
我所做的是使用 rdkit 删除公共部分以获得不同片段的微笑(kekulized 形式的 CSC1=CC=C(O)C=C1)。我正在尝试将该片段转换为分子,然后转换为指纹以计算与参考分子的相似性。
Desired transformation
但我收到错误消息:“无法使用这些原子的索引对原子进行 kekulize”。这对我来说很奇怪,因为使用 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 微笑并将它们直接作为创建指纹的输入传递,但我仍然遇到相同的错误。
这对我来说太奇怪了,因为当我尝试用相同的代码对一组微笑(片段、更长的微笑、最终的微笑)执行相同的过程时,它没有问题,而且我可以毫无问题地创建指纹任何错误。但在我看来,一旦我将 smiles/molecules 作为列表输入,就会出现错误。知道为什么会这样吗?还是您在我的代码中发现了我不知道的任何错误?
与 fragment_smiles = 'Nc1cccc(N)n1'
和 list
类似 smiles = ['Nc1cc(CSc2ccc(O)cc2)cc(N)n1', 'Nc1cc(COc2ccc(O)cc2)cc(N)n1']
。我获取指纹没问题。
看起来好像删除子结构后,有一些smiles_frags不正确的SMILES。
为了证明 list
中的 SMILES 给出了你可以使用的问题
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))
这将得到:
SMILES: CC1=CC=Cc2c(N)nc(N)cc12
smiles_frag: ccccC