Преобразование названия молекулы в улыбки?
Мне было просто интересно, есть ли способ конвертировать IUPAC или обычные молекулярные имена в SMILES? Я хочу сделать это без необходимости вручную конвертировать все, используя онлайн-системы. Любой вклад будет высоко ценится!
Для справки, я сейчас работаю с python и RDkit, так что я не был уверен, сможет ли RDkit сделать это, и я просто не знал. Мои текущие данные в формате CSV.
Спасибо!
7 ответов
RDKit не может конвертировать имена в SMILES. Химический Идентификатор Resolver может преобразовывать имена и другие идентификаторы (например, CAS No) и имеет API, поэтому вы можете конвертировать с помощью скрипта.
from urllib.request import urlopen
def CIRconvert(ids):
try:
url = 'http://cactus.nci.nih.gov/chemical/structure/' + ids + '/smiles'
ans = urlopen(url).read().decode('utf8')
return ans
except:
return 'Did not work'
identifiers = ['3-Methylheptane', 'Aspirin', 'Diethylsulfate', 'Diethyl sulfate', '50-78-2']
for ids in identifiers :
print(ids, CIRconvert(ids))
Выход
3-Methylheptane CCCCC(C)CC
Aspirin CC(=O)Oc1ccccc1C(O)=O
Diethylsulfate CCO[S](=O)(=O)OCC
Diethyl sulfate Did not work
50-78-2 CC(=O)Oc1ccccc1C(O)=O
PubChemPy имеет несколько замечательных функций, которые можно использовать для этой цели. Он поддерживает систематические названия IUPAC, торговые названия и все известные синонимы для данного соединения, как задокументировано в базе данных PubChem:https://pubchempy.readthedocs.io/en/latest/
>>> import pubchempy as pcp
>>> results = pcp.get_compounds('Glucose', 'name')
>>> print results
[Compound(79025), Compound(5793), Compound(64689), Compound(206)]
Первый аргумент — это идентификатор, а второй аргумент — это тип идентификатора, который должен быть одним из имени, смайлов, sdf, inchi, inchikey или формулы. Похоже, что в базе данных PubChem есть 4 соединения, с которыми связано название «глюкоза». Давайте рассмотрим их подробнее:
>>> for compound in results:
>>> print compound.isomeric_smiles
C([C@@H]1[C@H]([C@@H]([C@H]([C@H](O1)O)O)O)O)O
C([C@@H]1[C@H]([C@@H]([C@H](C(O1)O)O)O)O)O
C([C@@H]1[C@H]([C@@H]([C@H]([C@@H](O1)O)O)O)O)O
C(C1C(C(C(C(O1)O)O)O)O)O
Похоже, что все они имеют разную стереохимическую информацию!
OPSIN ( https://opsin.ch.cam.ac.uk/) - это еще одно решение для преобразования name2structure.
Его можно использовать, установив cli, или через https://github.com/gorgitko/molminer
(OPSIN также используется узлами RDKit KNIME)
В принятом ответе используется распознаватель химических идентификаторов, но по какой-то причине мне кажется, что на веб-сайте есть ошибки, а API - сбой.
Таким образом, еще один способ преобразовать улыбки в имя IUPAC - использовать API Python PubChem, который может работать, если ваши улыбки есть в их базе данных.
например
#!/usr/bin/env python
import sys
import pubchempy as pcp
smiles = str(sys.argv[1])
print(smiles)
s= pcp.get_compounds(smiles,'smiles')
print(s[0].iupac_name)
Для этого вы можете использовать pubchem API (PUG REST).
( https://pubchemdocs.ncbi.nlm.nih.gov/pug-rest-tutorial)
По сути, URL-адрес, который вы вызываете, будет принимать соединение как «имя», затем вы даете имя, затем указываете, что хотите «свойство» «CanonicalSMILES», как текст
identifiers = ['3-Methylheptane', 'Aspirin', 'Diethylsulfate', 'Diethyl sulfate', '50-78-2', 'Adamant']
smiles_df = pd.DataFrame(columns = ['Name', 'Smiles'])
for x in identifiers :
try:
url = 'https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/name/' + x + '/property/CanonicalSMILES/TXT'
# remove new line character with rstrip
smiles = requests.get(url).text.rstrip()
if('NotFound' in smiles):
print(x, " not found")
else:
smiles_df = smiles_df.append({'Name' : x, 'Smiles' : smiles}, ignore_index = True)
except:
print("boo ", x)
print(smiles_df)
Вы можете использовать пакетный запрос pubchem:
Если вы измените первую строку на:
из urllib2 импорт URL открыт
он должен работать для python 2.7