将反应应用于分子RDKit的消毒错误

时间:2019-03-27 20:25:59

标签: python python-3.x rdkit

对具有楔形键的分子进行反应时出现消毒错误。 在将质子去除反应应用于分子时出现此错误,但在MolBlock信息中看不到任何错误。

这是针对一个反应问题的,我正在尝试对具有异构体SMILES的分子进行简单的反应(质子去除)。

我创建了一个使用SMARTS和SMILES进行反应的函数,但出现以下无法修复的错误。

我正在使用以下代码加载我的输入。

smile = rdkit.Chem.rdmolfiles.MolToSmiles(mol,isomericSmiles=True)

导致:

C/C1=C\\C[C@@H]([C+](C)C)CC/C(C)=C/CC1

我创建以下字典来使用我的SMILES和SMARTS:

reaction_smarts = {}

# proton removal reaction

reaction_smarts["proton_removal"] = "[Ch:1]-[C+1:2]>>[C:1]=[C+0:2].[H+]" 

reactions = {name: AllChem.ReactionFromSmarts(reaction_smarts[name])      for name in reaction_smarts}

# function to run reactions

def run_reaction(molecule, reaction):
    products = []
    for product in reaction.RunReactant(molecule, 0):
        Chem.SanitizeMol(product[0])
        products.append(product[0])
    return products

# apply reaction


products = run_reaction(cation_to_rdkit_mol["mol_name"],  reactions["proton_removal"])

在此步骤中,我遇到此错误,但无法修复。     RDKit ERROR: [10:43:23] Explicit valence for atom # 0 C, 5, is greater than permitted

预期结果应该是具有双键的分子及其立体异构体:

第一个产品:CC(C)=C1C/C=C(\\C)CC/C=C(\\C)CC1

第二个产品:C=C(C)[C@@H]1C/C=C(\\C)CC/C=C(\\C)CC1

第三种产品:C=C(C)[C@H]1C/C=C(\\C)CC/C=C(\\C)CC1

我正在使用Chem.EnumerateStereoisomers.EnumerateStereoisomers()获得所有立体异构体,但我只是获得第一和第二种产品。我还添加了您的初始建议product[0].GetAtomWithIdx(0).SetNumExplicitHs(0),该建议实际上解决了显式价错误。但是现在我想弄清楚如何获得所有这三种立体异构体。

任何提示为何会发生这种情况吗?,因为如果我检查mol嵌段并获得所有关于价的信息,那似乎很好。

1 个答案:

答案 0 :(得分:1)

该错误表明原子0(碳)的显式化合价为5,这表明尽管该键现在是双键,但未除去显式氢,因此化合价为5。我不是对反应SMARTS太熟悉了,尽管手动解决此问题的一种简便方法是在消毒之前将原子0上的氢原子数设置为0:

product.GetAtomWithIdx(0).SetNumExplicitHs(0)
Chem.SanitizeMol(product)

编辑1: 从头开始,我做了一些实验,尝试以下反应:

rxn = AllChem.ReactionFromSmarts('[#6@@H:1]-[#6+:2] >> [#6H0:1]=[#6+0:2]')

通过这种方式,在反应定义中,我们明确指出氢丢失了,所得分子将被消毒。这对您有用吗?

编辑2: 当我运行此反应时,该产品似乎不含阳离子:

mol = Chem.MolFromSmiles('C/C1=C\\C[C@@H]([C+](C)C)CC/C(C)=C/CC1')
rxn  = AllChem.ReactionFromSmarts('[#6@@H:1]-[#6+:2] >> [#6H0:1]=[#6+0:2]')
products = list()
for product in rxn.RunReactant(mol, 0):
    Chem.SanitizeMol(product[0])
    products.append(product[0])
print(Chem.MolToSmiles(products[0]))

Output:
'CC(C)=C1C/C=C(\\C)CC/C=C(\\C)CC1'

编辑3: 我想我现在已经知道您在寻找什么:

mol = Chem.MolFromSmiles('C/C1=C\\C[C@@H]([C+](C)C)CC/C(C)=C/CC1')

# Reactant SMARTS
reactant_smarts = '[CH3:1][C+:2][C@@H:3]'

# Product SMARTS
product_smarts = [
'[CH2:1]=[CH0+0:2][CH:3]',
'[CH2:1]=[CH0+0:2][C@H:3]',
'[CH2:1]=[CH0+0:2][C@@H:3]',
]

# Reaction SMARTS
reaction_smarts = str(reactant_smarts + '>>' + '.'.join(product_smarts))

# RDKit Reaction
rxn = AllChem.ReactionFromSmarts(reaction_smarts)

# Get Products
results = list()
for products in rxn.RunReactant(mol, 0):
    for product in products:
        Chem.SanitizeMol(product)
        results.append(product)
        print(Chem.MolToSmiles(product))

Output:
'C=C(C)C1C/C=C(\\C)CC/C=C(\\C)CC1'
'C=C(C)[C@H]1C/C=C(\\C)CC/C=C(\\C)CC1'
'C=C(C)[C@@H]1C/C=C(\\C)CC/C=C(\\C)CC1'
'C=C(C)C1C/C=C(\\C)CC/C=C(\\C)CC1'
'C=C(C)[C@H]1C/C=C(\\C)CC/C=C(\\C)CC1'
'C=C(C)[C@@H]1C/C=C(\\C)CC/C=C(\\C)CC1'

请注意,我们两次获得相同的产物,我认为这是因为反应物SMARTS与两个CH3基团均匹配,因此该反应适用于两个CH3基团。我希望这是您要寻找的。