文章目录
- SMILES文件简介
- rdkit绘制分子结构
- rdkit保存分子结构图
- 三维结构
SMILES文件简介
SMILES,即简化分子线性输入系统(Simplified molecular input line entry system),是通过ASCII描述分子结构的规范。
Smiles文件有如下规则
- 原子用方括号括起,仅有有机物中的C、N、O、P、S、Br、Cl、I等原子可以省略方括号
- 氢原子常被省略
- 双键为=;三键为#
- 结构中的环要被打开,断开处的两个原子用同一个数字表示
- 芳环中的C、O、S、N原子用小写字母c,o,s,n表示
- 碳链分支用圆括号表示。
- 芳香结构中的N原子上连有一个H原子,用[nH]表示
- 用@和@@表示手性
rdkit绘制分子结构
在rdkit
中,通过Chem
将Smiles字符串转换为化学结构,然后可以通过Draw
将化学结构画出来。
考虑到从简单入手,可以先绘制一个苯环,苯环中只有C,而且一般记作单双键交替的结构,根据成环规则,可写为C1=CC=CC=C1
,效果如下
代码为
from rdkit import Chem
from rdkit.Chem import Draw
import matplotlib.pyplot as plt
Benzene = 'C1=CC=CC=C1'
mol = Chem.MolFromSmiles(Benzene)
img = Draw.MolsToGridImage([mol],molsPerRow=1)
plt.imshow(img)
plt.axis('off')
plt.show()
其中,MolsToGridImage
用于将分子结构转化为图像,molsPerRow
表示每行绘制的分子数。
rdkit保存分子结构图
RDkit
内置的画图程序也可以展示分子结构,相比于调用plt
而言更加方便,用下面的函数也可以画出苯环,但是并没有plt
提供各种缩放、保存按钮而已。
Draw.ShowMol(mol, size=(400,200))
为了解决保存的问题,rdkit
提供了Draw.MolToFile
函数,可以输出图像。
Draw.MolToFile(mol, 'Benzene.png', size=(400, 200), kekulize=False)
这个图在保存时使用了kekulize
参数,其绘制效果如图所示
当然,苯环画起来其实没什么意思,接下来可以画一个有意思的,就是网上流传甚广的2,3二氧杂二环[2,2,2]-5-辛烯
smi = 'C1CC2C=CC1OO2'
mol = Chem.MolFromSmiles(smi)
Draw.ShowMol(mol, size=(400,200))
Draw.MolToFile(mol, 'smi.png', size=(400, 200))
效果如图所示
三维结构
但这个东西虽然看上去萌,但显然不是个二维生物,接下来就学习绘制一下三维分子结构。这个过程并不复杂,但需要通过MMFFOptimizeMolecule
来优化其三维构型,最后得到
好吧,看上去更萌了,其代码如下。
from rdkit.Chem import AllChem
smi = 'C1CC2C=CC1OO2'
m3d = Chem.MolFromSmiles(smi)
AllChem.EmbedMolecule(m3d, randomSeed=3)
AllChem.MMFFOptimizeMolecule(m3d)
Draw.MolToFile(m3d, 'm3d.png', size=(400, 200))
其中,AllChem.EmbedMolecule
用于生成3D构象,一般来说需要引入一个随机量来对三维结构进行初始化,输入随机数种子randomSeed
,有利于复现计算结果。