Обнаружение химических групп по улыбкам с помощью SmartPython

Программы на Python
Anonymous
Обнаружение химических групп по улыбкам с помощью Smart

Сообщение Anonymous »

В настоящее время я работаю над кодом, который сможет обнаруживать химические группы в молекуле и составлять их список после ввода улыбки молекулы.
В целом код работает отлично, но в коде есть проблемы при обнаружении ароматических циклов, гетероциклов и даже кольца в циклогексаноле. Та же проблема существует и с алкенами: либо он обнаруживает только алкен, но не может отличить цис- и транс- или ароматические соединения.
Может ли кто-нибудь сказать мне, какие умные закономерности я мог бы использовать для поиска? циклы и даже различать их в зависимости от размеров колец и, возможно, также определять особенности, например, присутствуют ли гетероатомы и является ли кольцо ароматическим? И решение для определения разницы между цис- и транс-алкенами.
В моем коде очень длинный список функциональных групп, но я просто добавлю сюда несколько, чтобы вы знали, как это выглядит. :

Код: Выделить всё

from rdkit import Chem

def find_smiles_patterns(smiles):
mol = Chem.MolFromSmiles(smiles)
if mol is None:
return "Invalid SMILES string.  Unable to parse molecule."

# Define a list to store the chemical groups found in the SMILES
chemical_groups = []

# SMARTS patterns to recognize chemical groups
smarts_patterns = {
'C=C': 'Alkene',
'[CX2]#[CX2]': 'Alkyne',
'[CX3]=[CX2]=[CX3]': 'Allene',
'[ClX1][CX4]': 'Alkylchloride',
'[FX1][CX4]': 'Alkylfluoride',
'[BrX1][CX4]': 'Alkylbromide',
'[IX1][CX4]': 'Alkyliodide',
'[OX2H][CX4H2;!$(C([OX2H])[O,S,#7,#15])]': 'Primary_alcohol',
'[OX2H][CX4H;!$(C([OX2H])[O,S,#7,#15])]': 'Secondary_alcohol',
'[OX2H][CX4D4;!$(C([OX2H])[O,S,#7,#15])]': 'Tertiary_alcohol',
'[OX2]([CX4;!$(C([OX2])[O,S,#7,#15,F,Cl,Br,I])])[CX4;!$(C([OX2])[O,S,#7,#15])]': 'Dialkylether',
'[SX2]([CX4;!$(C([OX2])[O,S,#7,#15,F,Cl,Br,I])])[CX4;!$(C([OX2])[O,S,#7,#15])]': 'Dialkylthioether',
'[OX2](c)[CX4;!$(C([OX2])[O,S,#7,#15,F,Cl,Br,I])]': 'Alkylarylether',
'[c][OX2][c]': 'Diarylether',
'[SX2](c)[CX4;!$(C([OX2])[O,S,#7,#15,F,Cl,Br,I])]': 'Alkylarylthioether',
'[c][SX2][c]': 'Diarylthioether',
'[O+;!$([O]~[!#6]);!$([S]*~[#7,#8,#15,#16])]': 'Oxonium',
'[NX3H2+0,NX4H3+;!$([N][!C]);!$([N]*~[#7,#8,#15,#16])]': 'Primary_aliph_amine',
'[NX3H1+0,NX4H2+;!$([N][!C]);!$([N]*~[#7,#8,#15,#16])]': 'Secondary_aliph_amine',
'[NX3H0+0,NX4H1+;!$([N][!C]);!$([N]*~[#7,#8,#15,#16])]': 'Tertiary_aliph_amine',
'[NX4H0+;!$([N][!C]);!$([N]*~[#7,#8,#15,#16])]': 'Quaternary_aliph_ammonium',
'[!#6;!R0]': 'Heterocyclic'
#etc....
}

# Define priority order for chemical groups based on IUPAC nomenclature
priority_order = [
'Carboxylic_acid',
'Carboxylic_ester',
'Lactone',
'Carboxylic_anhydride',
'Carbothioic_acid',
'Aldehyde',
'Ketone',
'Alkylchloride',
'Alkylfluoride',
'Alkylbromide',
'Alkyliodide',
'Alcohol',
'Primary_alcohol',
'Secondary_alcohol',
'Tertiary_alcohol',
'Dialkylether',
'Alkene',
'Alkyne',
'Allene',
'Dialkylthioether',
'Alkylarylether',
'Diarylether',
'Alkylarylthioether',
'Diarylthioether',
'Oxonium',
'Primary_aliph_amine',
'Secondary_aliph_amine',
'Tertiary_aliph_amine',
'Quaternary_aliph_ammonium',
'Heterocycle'
#etc......
]

# Track the atom indices to avoid duplicates
atom_indices = set()

# Iterate over the priority order and check if each chemical group is present in the molecule
for group in priority_order:
if group in smarts_patterns.values():
for smarts_pattern, chemical_group in smarts_patterns.items():
if chemical_group == group:
pattern = Chem.MolFromSmarts(smarts_pattern)
if pattern:

matches = mol.GetSubstructMatches(pattern)

if len(matches) >  0:

print('matches !!! : ', smarts_pattern , smarts_patterns[smarts_pattern], pattern)

print(matches,'\n\n')

for match in matches:
match_set = set(match)
if not any(atom_index in match_set for atom_index in atom_indices):
chemical_groups.append(chemical_group)
atom_indices.update(match_set)

return chemical_groups

smiles = "c1(cccc2c1ccc1c2cccc1CCl)CO"

print(find_smiles_patterns(smiles))

Используется в изобретенной молекуле:
Изображение

УЛЫБКИ: c1(cccc2c1ccc1c2cccc1CCl)CO
Результаты:

Код: Выделить всё

matches !!! :  [ClX1][CX4] Alkylchloride 
((15, 14),)

matches !!! :  [OX2H][CX4H2;!$(C([OX2H])[O,S,#7,#15])] Primary_alcohol 
((17, 16),)

['Alkylchloride', 'Primary_alcohol']
Я пробовал менять смарты, также пытался сделать функцию-заполнитель для обнаружения колец с функцией проверки смайлов вида C1[X]nX1, при этом n равно 2-8 и X есть в списке атомов: C, N, O, S
Однако пока ничего не получилось и похоже, что базы данных для смартов нет.
ДОПОЛНЕНИЕ
Индекс атома в SMILES: c1(cccc2c1ccc1c2cccc1CCl)CO ,
должен быть вот этот , но проверьте еще раз
Изображение


Подробнее здесь: https://stackoverflow.com/questions/784 ... sing-smart

Вернуться в «Python»