一、代码来源:

计算rmsd参考:GitHub - 0ut0fcontrol/isoRMSD: calculating RMSD between 2 conformers with different atom names

这个github代码是在命令行中输入命令运行的,命令如下:

python isoRMSD.py -r crystal_ligand.sdf -p crystal_out_1.sdf -o rmsd.txt

这样执行计算一对小分子还算方便,小分子格式支持mol2,sdf,mol,pdb,虽然支持这么多种格式,但是计算的时候有些能用mol2算却不能用sdf算,如果计算不出来可以转换一下小分子的格式没准就可以了。但是这个代码批量计算小分子rmsd时实现就很麻烦,所以把主要用的的代码拿出来,需要批量的部分,保存结果的部分可以根据需求自己写写。-r后面接的是参考分子。

二、主要代码:

根据需求写读取多个文件的循环 ,结果保存也可以根据需求自己写

import os
import sys
import math
from numpy.lib.shape_base import column_stack
import pandas as pd
from os.path import split
from oddt.toolkits import rdk as toolkit
from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit.Chem.AllChem import AlignMolrfile = 'crystal_ligand.sdf'#参考小分子
pfile = 'crystal_out_0.sdf'
ref_fmt = rfile.split(".")[-1]
ref_oddt = next(toolkit.readfile(ref_fmt, rfile))
ref_rdk = Chem.RemoveHs(ref_oddt.Mol)probe_fmt = pfile.split(".")[-1]
probe_oddt_supp = toolkit.readfile(probe_fmt, pfile)data = []
for i, probe_oddt in enumerate(probe_oddt_supp):if probe_oddt is None:name = "NaN"rmsd_notalign = 10000.0rmsd_align = 10000.0else:probe_rdk = Chem.RemoveHs(probe_oddt.Mol)try:name = probe_rdk.GetProp("_Name")name = "_".join(name.split())except KeyError as e:name = "NaN"ref = AllChem.AssignBondOrdersFromTemplate(probe_rdk, ref_rdk)rmsd_notalign = GetBestRMSD(probe_rdk, ref, align=False)data.append((name,rmsd_notalign))print(data)
#下面是定义计算的函数,可以不动,上面加上批处理的一些代码就好
def GetBestRMSD(probe, ref, refConfId=-1, probeConfId=-1, maps=None, align=True):# When mapping the coordinate of probe will changed!!!ref.pos = orginXYZ(ref)probe.pos = orginXYZ(probe)try:name = probe.GetProp("_Name")except KeyError as e:name = "NaN"if not maps:matches = ref.GetSubstructMatches(probe, uniquify=False)if not matches:raise ValueError("mol %s does not match mol %s"% (ref.GetProp("_Name"), probe.GetProp("_Name")))if len(matches) > 1e6:print("{} matches detected for molecule {}, this may lead to a performance slowdown.".format(len(matches), name))maps = [list(enumerate(match)) for match in matches]bestRMSD = 10000.0for amap in maps:if align:rmsd = AlignMol(probe, ref, probeConfId, refConfId, atomMap=amap)else:rmsd = RMSD_NotAlign(probe, ref, amap)bestRMSD = min(bestRMSD, rmsd)return bestRMSDdef RMSD_NotAlign(probe, ref, amap):rmsd = 0.0atomNum = ref.GetNumAtoms() + 0.0for (pi, ri) in amap:posp = probe.pos[pi]posf = ref.pos[ri]rmsd += dist_2(posp, posf)rmsd = math.sqrt(rmsd / atomNum)return rmsddef orginXYZ(mol):mol_pos = {}for i in range(0, mol.GetNumAtoms()):pos = mol.GetConformer().GetAtomPosition(i)mol_pos[i] = posreturn mol_posdef dist_2(atoma_xyz, atomb_xyz):dis2 = 0.0for i, j in zip(atoma_xyz, atomb_xyz):dis2 += (i - j) ** 2return dis2

阅读代码细节的一些参考链接:

1)Python中if __name__ == ‘__main__‘:的作用和原理

(20条消息) Python中if __name__ == ‘__main__‘:的作用和原理_农村詹姆斯的博客-CSDN博客

2)split(“.“)[-1]:(20条消息) split(“.“)[-1]的怎么用_花落雨微扬的博客-CSDN博客_split[-1]

3)parser = argparse.ArgumentParser():

(20条消息) 常用编程记录——parser = argparse.ArgumentParser()_umbrellalalalala的博客-CSDN博客

4)python 判断变量是否是 None 的三种写法:

(20条消息) python 判断变量是否是 None 的三种写法_Python热爱者的博客-CSDN博客

5)python中{},[],(),字典,列表,元组详解: Python基础 括号()[]{}的详解_python_脚本之家 (jb51.net)

6)GetSubstructMatches():rdkit.Chem.rdchem module — The RDKit 2022.09.1 documentation

RDKit|分子子结构的删除、替换与切割 - 简书 (jianshu.io)

7)AllChem.AssignBondOrdersFromTemplate():rdkit.Chem.AllChem module — The RDKit 2022.09.1 documentation

8)关于rdkit包中的函数可以用下面这个网页索引:Index — The RDKit 2022.09.1 documentation

计算小分子之间的RMSD相关推荐

  1. Python:计算两个蛋白或小分子之间的RMSD

    Python脚本:计算两个蛋白或小分子之间的RMSD 用法: python rmsd.py protein1.pdb protein2.pdb rmsd.py # Root-mean-square d ...

  2. 计算两个蛋白或小分子之间的RMSD

    计算两个蛋白或小分子之间的RMSD # Root-mean-square deviation (RMSD) for proteins and/or ligands # in PDB files. #c ...

  3. RDKit:计算不同小分子构象之间的RMSD

    计算两个小分子之间的RMSD,可以用来判断两个构象的接近程度. RDKit:计算不同分子或构象之间的RMSD点击打开链接 第一步:安装Anaconda Win或者Linux系统下Anaconda安装, ...

  4. RDKit:计算不同分子或构象之间的RMSD

    RDKit:计算不同分子或构象之间的RMSD Linux(CentOS 7_x64位)系统下安装RDkit(修正)点击打开链接 有时我们需要计算两个(或更多)分子之间的RMSD,可以用来判断两个构象的 ...

  5. 薛定谔 | 小分子叠合

    所谓分子叠合就是将同一种分子不同构象移动到一起,使得二者整体保证原子的叠合.这类操作之后往往会有一个RMSD的指标用于衡量这两个分子之间的空间相似度.数值越小,二者差异越小.蛋白.核酸的分子叠合很多软 ...

  6. 分子模拟软件amber_使用Amber创建小分子与蛋白质复合蛋白的坐标和拓扑文件

    复合蛋白amber坐标和拓扑文件的创建 作者:朱宁    来源:大科研小分享 前言 分子动力学(Molecular Dynamics, MD)是一门结合物理,数学和化学的综合技术.目前主流分子动力学软 ...

  7. 微信小程序 高德地图知道两点求道路_微信小程序——计算2点之间的距离

    关于计算2点之间的距离都依赖了腾讯地图,所以请先在 下面具体讲计算2点之间距离的方法. 方法一: getPosition: function() {var that = this; wx.getLoc ...

  8. 小分子药物logp预测/计算

    众所周知,有机小分子拥有很多内禀属性,如logP, logD,溶解度,和pKa等.可以帮助我们在实验过程中快速评估和预测小分子行为.如化合物的亲脂性常常由logP和logD表示.所谓logP是对P(分 ...

  9. 微信小程序——计算2点之间的距离

    关于计算2点之间的距离都依赖了腾讯地图,所以请先在腾讯地图官网申请key.具体流程看下图: 下面具体讲计算2点之间距离的方法. 方法一: 1.通过 wx.getLocation(Object obje ...

最新文章

  1. 30年前的热门研究,今获经典论文奖,贝叶斯网络之父旧论文「考古」
  2. java自然排序_Java中的自然排序顺序字符串比较 - 是内置的吗?
  3. 一种电磁铁磁场分析测量
  4. 15行代码AC——Link/Cut Tree CodeForces - 614A(爆long long处理+快速幂讲解)
  5. 华为主题包hwt下载_华为主题 | 黑白人物
  6. git merge和git merge --no-ff有什么区别?
  7. [BZOJ3944]Sum
  8. Linux多线程编程-线程间参数传递
  9. wps怎么在中文后面加数字_怎样给wps底部加上页面数字 - 卡饭网
  10. 微信小程序的布局css样式
  11. 在Android Studio中的混淆debug与release
  12. android平板ps,移动端和平板上的Photoshop Touch(支持iOS和Android)
  13. Python | 实现简单的康威生命游戏
  14. 《今日美国》Twitter账号遭遇黑客攻击
  15. 图解AODV协议(demo)
  16. 一个网络请求的历险之旅
  17. 开源框架springboot-mybatis-wr-separation实现springboot+mybatis读写分离
  18. 计算机网络第四章答案
  19. 在Windows上配置Maven环境
  20. 将字符数组中存放的数字字符转换为数

热门文章

  1. 微信支付--敏感词加密
  2. Balsamiq Mockups Keygen
  3. 零知识证明的硬件加速
  4. 让我告诉你如何写一个优秀的广告文案
  5. 树莓派 与Pi仪表盘安装
  6. CSS(红色标记:待练习效果)
  7. 超实用移动固态硬盘,Lexar雷克沙SL100 Pro
  8. 网络计算机amd,AMD推出第六代 APU,为笔记本电脑及一体机带来史无前例的高清流媒体、网络游戏以及创新计算体验...
  9. (json web token)JWT攻击
  10. 关于“No enclosing instance of type * is accessible. Must qualify the allocation with an enclo……”的总结与思考