【3.1.3】通过RDKit将SDF转smiles

SDF (Structure Data File)是常见的化学数据文件,SMILES (Simplified Molecular Input Line Entry Specification)是一种用ASCII字符串明确描述分子结构的规范。它们被广泛应用于计算化学,化学信息学等领域

一、将SMILES转化为SDF文件

我们可以认为SMILES是分子图的一种字符串表达,RDKit提供了利用ETKGD[1]方法将存储在SMILES中的二维结构信息转化为三维结构的接口。具体的,我们利用EmbedMolecule模块将二维分子图转化为三维分子坐标,如果有必要我们可以再利用MMFFOptimizeMolecule模块对分子结构进行简单优化,最后利用MolToMolFile模块将三维结构信息存储到SDF文件中。

from rdkit import Chem
from rdkit.Chem import AllChem
smiles = 'CCNC(C)=O'
mol = AllChem.AddHs(Chem.MolFromSmiles(smiles))
AllChem.EmbedMolecule(mol)
AllChem.MMFFOptimizeMolecule(mol)
Chem.MolToMolFile(mol,'the sdf file path you want to save')

经过三维化的分子结构

从上图中我们可以看到利用EmbedMolecule和MMFFOptimizeMolecule这两个模块,我们向原本平面化的分子拓扑结构中引入了立体的信息。

二、将SDF文件转化为SMILES

SDF文件中有比SMILES更丰富的结构信息,如果将SDF文件转化为SMILES必然会引起信息的损失,因此一般我们只有希望提升存储效率等情况下需要用到这一转化。RDKit中的MolToSMILES模块为我们提供了实现这一转化的接口,在此之前,我们需要利用MolFromMolFile这一模块将SDF文件中存储的分子信息转变为RDKit中的Mol对象。

mol = Chem.MolFromMolFile('the sdf file path you saved')
smi = Chem.MolToSmiles(mol)

使用上述MolFromMolFile模块时,如果分子结构中包含一些不常见成键信息(比如分子中碳原子成了5根键)时,会导致代码报错,这时我们需要将MolFromMolFile中的sanitize参数设置为False,这样RDKit在读取分子文件时就会跳过对成键信息的验证。我们以一个二茂铁分子的SDF文件举例

ferrocene.sdf

mol = Chem.MolFromMolFile('./ferrocene.sdf')
smi = Chem.MolToSmiles(mol)

在运行上述代码时,此时MolFromMolFile中的sanitize参数默认等于True,返回的mol对象为None,若此使对这个mol进行MolToSMILES就会报如下图所示的错误

转化二茂铁分子SDF文件时的报错信息

若设置sanitize=False则可避免这一报错

>>> mol = Chem.MolFromMolFile('./ferrocene.sdf',sanitize=False)
>>> smi = Chem.MolToSmiles(mol)
>>> print(smi)
[H]c12c3([H])c4([H])c5([H])c1([H])[Fe]23451678c2([H])c1([H])c6([H])c7([H])c28[H]

参考资料

个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn