Rdkit|分子3D构象生成与优化

news2024/10/6 1:37:58


github; 地址

文章目录

  • Rdkit|分子3D构象生成与优化
    • 构象生成算法概述
    • 基于距离(distance-based)
      • 代码示例
    • 距离几何算法生成3D结构
    • 距离几何+ETKDG生成3D构象
    • 距离几何+ETKDG生成多构象
      • 将Conformer类转为Mol类
      • 手动对齐
    • 距离几何+ETKDG+MMFF生成3D构象
    • 距离几何+ETKDG+MMFF生成多构象
    • 多线程生成多构象

Rdkit|分子3D构象生成与优化

RDKit是一款非常强大的分子信息学工具包,其中包含了分子3D构象生成与优化的功能。通过RDKit,您可以将一个分子的2D结构转化为3D结构,并进行能量最小化优化,得到最稳定的构象。

构象生成算法概述

  • 基于距离(distance-based)
  • 基于知识(knowledge-based)

下面是基本代码逻辑

from rdkit import Chem
from rdkit.Chem import Draw
from rdkit.Chem import AllChem

# 读入分子SMILES字符串
mol = Chem.MolFromSmiles('CC(=O)OC1=CC=CC=C1C(=O)O')

# 生成初始3D构象
AllChem.EmbedMolecule(mol)

# 进行能量最小化优化
AllChem.MMFFOptimizeMolecule(mol)

# 输出优化后的3D结构
print(Chem.MolToMolBlock(mol))

基于距离(distance-based)

传统的距离几何(Distance Geometry)法生成构象步骤:

  • (1) 通过分子的连接表信息和一套规则,生成分子的连接边界矩阵(molecule’s distance bounds matrix )
  • (2) 使用三角形边界平滑算法(triangle-bounds smoothing algorithm),对边界矩阵进行平滑处理
  • (3) 根据边界矩阵,随机产生一个距离矩阵。
  • (4) 把产生的距离矩阵映射到三维空间中,并为每个原子计算坐标。
  • (5) 对计算的坐标结果使用力场和边界矩阵进行粗略的优化。

这种方法虽然计算速度快,也能得到分子的三维坐标,但纯粹基于距离计算会导致部分结构的扭曲,也就是结果比较丑。想得到更好的结构,需要进行更细致的力场优化,比如再使用rdkit的通用力场(Universal Force Field,UFF)进行处理。

代码示例

mol = Chem.MolFromSmiles('CC1=CC=C(C=C1)NC2=C3C(=C(C=C2)NC4=CC=C(C=C4)C)C(=O)C5=CC=CC=C5C3=O')
m3d = Chem.AddHs(mol)
print(mol.GetNumAtoms(), m3d.GetNumAtoms())

距离几何算法生成3D结构

使用距离几何算法初始化3D坐标。

生成3D构象:AllChem.EmbedMolecule(mol, randomSeed, clearConfs, useExpTorsionAnglePrefs, useBasicKnowledge, …)

  • mol:传入mol对象
  • randomSeed:随机种子,方便结果重复
  • clearConfs:清除已有构象,默认True
  • useExpTorsionAnglePrefs和useBasicKnowledge两个参数即控制是否使用ETKDG,默认都为True
AllChem.EmbedMolecule(m3d, randomSeed=10, useExpTorsionAnglePrefs=False, useBasicKnowledge=False)
Draw.MolToImage(m3d, size=(250,250))

距离几何+ETKDG生成3D构象

生成3D构象:AllChem.EmbedMolecule()
先用距离几何初始化3D坐标,再使用ETKDG算法优化
参数同上,默认useExpTorsionAnglePrefsuseBasicKnowledge为True

AllChem.EmbedMolecule(m3d, randomSeed=10)
Draw.MolToImage(m3d, size=(250,250))

距离几何+ETKDG生成多构象

生成多个构象:AllChem.EmbedMultipleConfs(mol, numConfs, maxAttempts, randomSeed, clearConfs, pruneRmsThresh, useExpTorsionAnglePrefs, useBasicKnowledge, …)

其中numConfs控制了生成构象的个数。

  • mol:mol对象
  • numConfs:生成的构象数量
  • maxAttempts:尝试生成构象的最多次数
  • randomSeed:随机种子
  • clearConfs:清除已有构象
  • pruneRmsThresh:根据RMS进行合并
  • ETKDG相关参数同上
cids = AllChem.EmbedMultipleConfs(m3d, numConfs=10)
print(len(cids))


获取某个构象GetConformer(id)
通过传入id获取指定构象

# 获取第n个构象
conformer = m3d.GetConformer(id=6)

# 将Conformer对象添加到Mol对象中
m3d.AddConformer(conformer)

将Conformer类转为Mol类

from rdkit import Chem

# 创建一个rdkit.Chem.rdchem.Mol对象
mol = Chem.MolFromSmiles('CCOCC')

# 创建一个新的rdkit.Chem.rdchem.Mol对象,通过复制已有的Mol对象
new_mol = Chem.Mol(mol)

# 创建一个新的rdkit.Chem.rdchem.Conformer对象
conformer = Chem.Conformer()

AllChem.EmbedMolecule(mol, randomSeed=1)

# 设置Conformer对象的原子坐标
for atom_idx in range(mol.GetNumAtoms()):
    position = mol.GetConformer().GetAtomPosition(atom_idx)
    conformer.SetAtomPosition(atom_idx, position)

# 将Conformer对象添加到新的Mol对象中
new_mol.AddConformer(conformer)


计算不同构象间的差异:AlignMolConformers(mol, RMSlist, …)

对同一分子不同的构象先进行重叠排列,再计算RMS(root mean square)值
RMSlist:用于接收RMS的列表,它由第一个构象与剩余9个构象依次比对产生。

rmslist = []

AllChem.AlignMolConformers(m3d, RMSlist=rmslist)

print(len(rmslist))
rmslist


也可以计算任意两个指定构象的RMS值GetConformerRMS(mol, confId1, confId2, atomIds, prealigned)

  • confId1:第一个构象
  • confId2:第二个构象
  • atomIds:需要对比的原子,默认全部
  • prealigned:构象是否已经对齐,默认False(没有时,函数会自动将它们对齐)
AllChem.GetConformerRMS(m3d, 1, 9, prealigned=True)

手动对齐

也可以使用AllChem.AlignMol()方法。这个方法需要两个参数,即待对齐的两个分子。

注意,AlignMol()方法会修改第二个分子的坐标,将其与第一个分子对齐。如果您想保留原来的分子,可以先复制一份再进行对齐。

from rdkit import Chem
from rdkit.Chem import AllChem

# 读取分子
mol1 = Chem.MolFromSmiles('CCO')
mol2 = Chem.MolFromSmiles('CC(=O)O')
AllChem.EmbedMolecule(mol1, randomSeed=1)
AllChem.EmbedMolecule(mol2, randomSeed=1)
# 对齐分子
AllChem.AlignMol(mol1, mol2)

# 打印对齐后的分子坐标
print(Chem.MolToMolBlock(mol2))

距离几何+ETKDG+MMFF生成3D构象

对距离几何产生的构象,进行ETKDG优化后,还可以继续使用MMFF94等力场进行优化。不过需要注意的是,MMFF力场中的原子类型编码采用了自身的芳香性模型,因此在使用MMFF相关方法后,分子的芳香属性(aromaticity flags)会改变。

使用MMFF94进行优化构象:MMFFOptimizeMolecule(mol, mmffVariant, maxIters, …)

  • mmffVariant:可选"MMFF94"或"MMFF94s",默认MMFF94
  • maxIters:最多迭代次数,默认200
AllChem.EmbedMolecule(m3d, randomSeed=10)
AllChem.MMFFOptimizeMolecule(m3d)
Draw.MolToImage(m3d, size=(250,250))

距离几何+ETKDG+MMFF生成多构象

其实当使用ETKDG算法生成3D构象时,通常无需再使用MMFF94力场优化。如果执意要这么做,有一个方便的函数可以调用

使用MMFF94优化多个构象:MMFFOptimizeMoleculeConfs()
返回的结果是元组组成的列表,每个元组表示每个构象的收敛值能量(not_converged, energy)。如果not_converged是0,则收敛,接近最稳态,否则没有到达最稳态。

res = AllChem.MMFFOptimizeMoleculeConfs(m3d)
res

多线程生成多构象

可以通过numThreads参数进行设置。

  • EmbedMultipleConfs(mol, numThreads)
  • MMFFOptimizeMoleculeConfs(mol, numThreads)
    • numThreads:默认为1,表示单进程执行。设置为0表示将会使用本机最大线程数执行。
cids = AllChem.EmbedMultipleConfs(m3d, numThreads=0)
res = AllChem.MMFFOptimizeMoleculeConfs(m3d, numThreads=0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/752049.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sevlet规范:HttpServlet类 和 HttpServletRequest接口 源码解析

1. HTTP协议解读 什么是协议? 协议实际上是某些人,或者某些组织提前制定好的一套规范,大家都按照这个规范来,这样可以做到沟通无障碍。 协议就是一套规范,就是一套标准。由其他人或其他组织来负责制定的。 我说的话你…

PyCharm 自动添加作者信息、创建时间等信息

PyCharm 自动添加作者信息、创建时间等信息‘ 第一步 找到settings 第二步,找到下图所示位置输入下面代码,作者改成你自己的缩写,你也可以添加其他的 Project :${PROJECT_NAME} File :${NAME}.py IDE &…

【iOS】编译与链接

前言 计算机语言分为机器语言、汇编语言和高级语言。 可以将高级语言分为两种:编译语言和解释型语言(直译式语言)。 解释型语言(逐步进行解释执行) 解释语言编写的程序在每次运行时都需要通过解释器对程序进行动态…

【Leetcode】142.环形链表II

题意: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则…

多媒体开发之cgo

go语言作为近十年来优秀的现代开发语言的代表,由于继承了c语言的简洁和很多现代语言的表达方式,在广泛的应用场景中得到众多爱好者的喜爱,如何将go和c、c进行联合开发,拓展整个开发生态,不用重复造轮子,掌握…

k8s 持久化存储

我们继续来查看 k8s 的卷,上一次我们分享了将磁盘挂载到容器中,empyDir 和 gitRepo 都是会随着 pod 的启动而创建,随着 pod 的删除而销毁 那么我们或许会有这样的需求,期望在 pod 上面读取节点的文件或者使用节点的文件系统来访问…

Win10 配置ADB安装2023.7.12版本

目录 1. ADB工具介绍2. ADB安装流程 参考 Win10 配置安装ADB教程总结20200514, fastboot刷机 1. ADB工具介绍 ADB ( Android Debug Bridge),即Android 调试桥。是 Google 为开发人员提供的一种命令行工具,用于与安卓设备进行通信&#xff0…

开源网安加入东莞市大数据协会,共建安全可靠软件产业生态

​近日,开源网安成为东莞市大数据协会会员单位,与协会共同构建安全可靠软件产业生态,在科技创新、共建安全生态等方面发力,推动软件产业引领经济高质量发展,推动大湾区企业加快数字化建设进程。 东莞市大数据协会致力于…

Oracle使用PL/SQL导出表,结果显示insert语句

导出表到sql文件中有两种方法,下面我们列举两种方法的操作 1、选择工具->导出->选中要导出的表->点击sql插入->自定义导出路径以及文件,点击导出即可。当然也可以在where子句中增加条件,以便筛选导出 2、首选查询表数据&#xff…

阿里云无影云电脑使用方法_3分钟上手教程

阿里云无影云电脑即无影云电脑,云电脑如何使用?云电脑购买后没有用户名和密码,先创建用户设置密码,才可以登录连接到云电脑。云桌面想要访问公网还需要开通互联网访问功能。阿里云百科来详细说下阿里云无影云电脑从购买、创建用户…

Low-Light Image Enhancement via Stage-Transformer-Guided Network 论文阅读笔记

这是TCSVT 2023年的一篇暗图增强的论文 文章的核心思想是,暗图有多种降质因素,单一stage的model难以实现多降质因素的去除,因此需要一个multi-stage的model,文章中设置了4个stage。同时提出了用预设query向量来代表不同的降质因素…

Kubernetes 组件介绍

Kubernetes 组件 部署完 Kubernetes,便拥有了一个完整的集群 一组工作机器,称为节点, 会运行容器化应用程序。每个集群至少有一个工作节点 工作节点会托管 Pod ,而 Pod 就是作为应用负载的组件。 控制平面管理集群中的工作节点…

【JAVA8】Stream\Comparator

Stream Reduction, 给N个数值,求出其总和/最大值/最小值/均值这一类的操作,称为Reduction Option Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。 Optional 类的引入很好的解…

<网络>UPD协议详解

UDP协议详解 网络传输的实质UDP协议端格式UDP的特点面向数据报UDP的缓冲区UDP使用注意事项基于UDP的应用层协议 网络传输的实质 在网络中,我们通过调用系统函数send/recv/write/read使用套接字来进行主机之间的网络通信,那么是不是我们在调用这几个函数…

vue3使用provideinject实现祖孙组件通讯

vue3使用provide&inject实现祖孙组件通讯 之前在使用vue2时,写过一篇博客记录父子组件的数据通讯 简单来说,父传子通过自定义属性,子传父通过自定义事件,兄弟间通过事件总线。也有更直观的vuex实现任意组件之间的数据通讯&a…

掘金量化—Python SDK文档—2.策略程序架构

目录 Python SDK文档 2.策略程序架构 2.1掘金策略程序初始化 2.2行情事件处理函数 2.3交易事件处理函数 2.4其他事件处理函数 2.5策略入口 Python SDK文档 2.策略程序架构 2.1掘金策略程序初始化 通过init 函数初始化策略,策略启动即会自动执行。在 init 函数中可以&#x…

数据结构与算法——什么是线性表(线性存储结构)

我们知道,具有“一对一”逻辑关系的数据,最佳的存储方式是使用线性表。那么,什么是线性表呢? 线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来&#xf…

【Unity面试篇】Unity 面试题总结甄选 |Unity基础篇 | ❤️持续更新❤️

2.2 前言 关于Unity面试题相关的所有知识点:🐱‍🏍2023年Unity面试题大全,共十万字面试题总结【收藏一篇足够面试,持续更新】为了方便大家可以重点复习某个模块,所以将各方面的知识点进行了拆分并更新整理…

swin-transformer

面向视觉任务的transfomer Vision Transformer(ViT)在视觉任务中的局限性 需求数据量巨大 CNN中是图像整体输入,并且经过多年的演变,发展出了多个不同的优化策略。从而在学习时能够在一定先验知识的前提下拟合数据。 而transformer是将图像切割成若干较小…

精彩回放 | AI驱动下的流程挖掘如何提升企业决策和运营效率?

流程挖掘是一种从事件日志中发现、监控和优化实际业务流程的技术。在AI的驱动下,流程挖掘能进行更深层次的自动化和智能化处理,从而帮助企业更准确地了解和优化业务流程,提高决策的精确度和运营的效率。然而,AI驱动的流程挖掘在实…