文章目录

  • SMILES文件简介
  • rdkit绘制分子结构
  • rdkit保存分子结构图
  • 三维结构


SMILES文件简介

SMILES,即简化分子线性输入系统(Simplified molecular input line entry system),是通过ASCII描述分子结构的规范。

Smiles文件有如下规则

  1. 原子用方括号括起,仅有有机物中的C、N、O、P、S、Br、Cl、I等原子可以省略方括号
  2. 氢原子常被省略
  3. 双键为=;三键为#
  4. 结构中的环要被打开,断开处的两个原子用同一个数字表示
  5. 芳环中的C、O、S、N原子用小写字母c,o,s,n表示
  6. 碳链分支用圆括号表示。
  7. 芳香结构中的N原子上连有一个H原子,用[nH]表示
  8. 用@和@@表示手性

rdkit绘制分子结构

rdkit中,通过Chem将Smiles字符串转换为化学结构,然后可以通过Draw将化学结构画出来。

考虑到从简单入手,可以先绘制一个苯环,苯环中只有C,而且一般记作单双键交替的结构,根据成环规则,可写为C1=CC=CC=C1,效果如下

Python化学元素库 python 化学_Python化学元素库

代码为

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参数,其绘制效果如图所示

Python化学元素库 python 化学_化学信息学_02

当然,苯环画起来其实没什么意思,接下来可以画一个有意思的,就是网上流传甚广的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))

效果如图所示

Python化学元素库 python 化学_Python化学元素库_03

三维结构

但这个东西虽然看上去萌,但显然不是个二维生物,接下来就学习绘制一下三维分子结构。这个过程并不复杂,但需要通过MMFFOptimizeMolecule来优化其三维构型,最后得到

Python化学元素库 python 化学_化学信息学_04

好吧,看上去更萌了,其代码如下。

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,有利于复现计算结果。