【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]
参考资料
- https://zhuanlan.zhihu.com/p/392213951
- J. Chem. Inf. Comp. Sci. 2015, 55, 2562-2574
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn