В целом код работает отлично, но в коде есть проблемы при обнаружении ароматических циклов, гетероциклов и даже кольца в циклогексаноле. Та же проблема существует и с алкенами: либо он обнаруживает только алкен, но не может отличить цис- и транс- или ароматические соединения.
Может ли кто-нибудь сказать мне, какие умные закономерности я мог бы использовать для поиска? циклы и даже различать их в зависимости от размеров колец и, возможно, также определять особенности, например, присутствуют ли гетероатомы и является ли кольцо ароматическим? И решение для определения разницы между цис- и транс-алкенами.
В моем коде очень длинный список функциональных групп, но я просто добавлю сюда несколько, чтобы вы знали, как это выглядит. :
Код: Выделить всё
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']
Однако пока ничего не получилось и похоже, что базы данных для смартов нет.
ДОПОЛНЕНИЕ
Индекс атома в SMILES: c1(cccc2c1ccc1c2cccc1CCl)CO ,
должен быть вот этот , но проверьте еще раз

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