• 用Python绘制分子结构


    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,效果如下

    在这里插入图片描述

    代码为

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    其中,MolsToGridImage用于将分子结构转化为图像,molsPerRow表示每行绘制的分子数。

    rdkit保存分子结构图

    RDkit内置的画图程序也可以展示分子结构,相比于调用plt而言更加方便,用下面的函数也可以画出苯环,但是并没有plt提供各种缩放、保存按钮而已。

    Draw.ShowMol(mol, size=(400,200))
    
    • 1

    为了解决保存的问题,rdkit提供了Draw.MolToFile函数,可以输出图像。

    Draw.MolToFile(mol, 'Benzene.png', size=(400, 200), kekulize=False)
    
    • 1

    这个图在保存时使用了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))
    
    • 1
    • 2
    • 3
    • 4

    效果如图所示

    在这里插入图片描述

    三维结构

    但这个东西虽然看上去萌,但显然不是个二维生物,接下来就学习绘制一下三维分子结构。这个过程并不复杂,但需要通过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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其中,AllChem.EmbedMolecule用于生成3D构象,一般来说需要引入一个随机量来对三维结构进行初始化,输入随机数种子randomSeed,有利于复现计算结果。

  • 相关阅读:
    线性规划Matlab求解
    自用函数(持续更新)
    eltable 合计行添加tooltip
    java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署
    “突然降级到 iPhone 11 Pro Max 的我,好像……也没有错过什么?”
    Metabase学习教程:仪表盘-8
    c++之旅第七弹——继承
    使用ADS进行serdes仿真时,Tx_Diff中EQ的设置对发送端波形的影响。
    Linux用户管理— 用户组管理命令
    物联网设备带你进入物联网时代,轻松实现数据互联互通
  • 原文地址:https://blog.csdn.net/m0_37816922/article/details/127712895