Ошибка санации при применении реакции на молекулу RDKit - PullRequest
1 голос
/ 27 марта 2019

Ошибка санации при применении реакции к молекуле с клиновой связью.Я получаю эту ошибку при применении реакции удаления протона к молекуле, но не вижу никакой ошибки в информации MolBlock.

Это связано с проблемой реакции, в которой я пытаюсь применить простую реакцию (удаление протона).) к молекуле с ее изомерными улыбками.

Я создаю функцию для применения реакции, используя SMARTS и SMILES, но я получаю следующую ошибку, которую не могу исправить.

Я использую следующуюкод для загрузки моих входных данных.

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

, что приводит к:

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

Я создаю следующий словарь, чтобы использовать мои УЛЫБКИ и СМАРТЫ:

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 Ответ

1 голос
/ 28 марта 2019

Ошибка утверждает, что Явная валентность для атома 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'

Обратите внимание, что мы получаем одни и те же продукты дважды, я думаю, это потому, что реагент СМАРТС соответствует обеим группам СН3, следовательно, реакция применяется к обеим.Я надеюсь, что это то, что вы ищете.

...