一个用来画拉氏图的简单Python脚本
技术背景
关于拉氏图的更多介绍,可以参考下这篇博客,这里简单引述一部分内容:
Ramachandran plot(拉氏图)是由G. N. Ramachandran等人于1963年开发的,用来描述蛋白质结构中氨基酸残基二面角\(\psi\)和\(\phi\)是否在合理区域的一种可视化方法。同时也可以反映出该蛋白质的构象是否合理。
思路是比较简单的,就是找到一个蛋白质主链中的C,C\(_{\alpha}\),N,O这几种原子,然后计算对应共价键的二面角即可。计算相关内容可以参考我之前写过的这两篇文章:AlphaFold2中的残基刚体表示和使用numpy计算分子内坐标。这里我们就简单的做一个Python的脚本,可以用来读取pdb文件,生成对应的拉氏图,用来判断对应的蛋白质构象是否合理,也可以用来比较两个同类蛋白之间的构型差异。
脚本与使用方法
先把下面这个Python脚本文件保存到本地为rplot.py
:
# rplot.py
"""
README
Run this script with command:
```bash
$ python3 rplot.py --input ../tutorials/pdb/case5.pdb --levels 8 --sigma 0.2 --grids 30
```
Requirements
hadder, numpy, matplotlib
"""
try:
from hadder.parsers import read_pdb
except ImportError:
import os
os.system('python3 -m pip install hadder --upgrade')
from hadder.parsers import read_pdb
import matplotlib.pyplot as plt
import numpy as np
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--input", help="Set the input pdb filename. Absolute file path is recommended.")
parser.add_argument("--levels", help="Contour levels.", default='8')
parser.add_argument("--sigma", help="KDE band width.", default='0.2')
parser.add_argument("--grids", help="Number of grids.", default='30')
args = parser.parse_args()
pdb_name = args.input
num_levels = int(args.levels)
sigma = float(args.sigma)
num_grids = int(args.grids)
def plot(fig, X, Y, Z, num_levels=8):
plt.xlabel(r'$\psi$')
plt.ylabel(r'$\phi$')
levels = np.linspace(np.min(Z), np.max(Z), num_levels)
fc = plt.contourf(X, Y, Z, cmap='Greens', levels=levels)
plt.colorbar(fc)
return fig
def torsion(crds, index1, index2, index3, index4):
crd1 = crds[index1]
crd2 = crds[index2]
crd3 = crds[index3]
crd4 = crds[index4]
vector1 = crd1 - crd2
vector2 = crd4 - crd3
axis_vector = crd3 - crd2
vec_a = np.cross(vector1, axis_vector)
vec_b = np.cross(vector2, axis_vector)
cross_ab = np.cross(vec_a, vec_b)
axis_vector /= np.linalg.norm(axis_vector, axis=-1, keepdims=True)
sin_phi = np.sum(axis_vector * cross_ab, axis=-1)
cos_phi = np.sum(vec_a * vec_b, axis=-1)
phi = np.arctan(sin_phi / cos_phi)
return phi
def psi_phi_from_pdb(pdb_name):
pdb_obj = read_pdb(pdb_name)
atom_names = pdb_obj.flatten_atoms
crds = pdb_obj.flatten_crds
c_index = np.where(atom_names=='C')[0]
n_index = np.where(atom_names=='N')[0]
ca_index = np.where(atom_names=='CA')[0]
psi = torsion(crds, n_index[:-1], ca_index[:-1], c_index[:-1], n_index[1:])
phi = torsion(crds, c_index[:-1], n_index[1:], ca_index[1:], c_index[1:])
return psi, phi
def gaussian2(x1, x2, sigma1=1.0, sigma2=1.0, A=0.5):
return np.sum(A*np.exp(-0.5*(x1**2/sigma1**2+x2**2/sigma2**2))/np.pi/sigma1/sigma2, axis=-1)
def potential_energy(position, psi, phi, sigma1, sigma2):
# (A, )
psi_, phi_ = position[:, 0], position[:, 1]
# (A, R)
delta_psi = psi_[:, None] - psi[None]
delta_phi = phi_[:, None] - phi[None]
# (A, )
Z = -np.log(gaussian2(delta_psi, delta_phi, sigma1=sigma1, sigma2=sigma2, A=2.0)+1)
return Z
psi_grids = np.linspace(-np.pi, np.pi, num_grids)
phi_grids = np.linspace(-np.pi, np.pi, num_grids)
grids = np.array(np.meshgrid(psi_grids, phi_grids)).T.reshape((-1, 2))
psi, phi = psi_phi_from_pdb(pdb_name)
Z = potential_energy(grids, psi, phi, sigma, sigma).reshape((psi_grids.shape[0], phi_grids.shape[0])).T
X,Y = np.meshgrid(psi_grids, phi_grids)
fig = plt.figure()
plt.title('Ramachandran plot for {}'.format(pdb_name.split('/')[-1]))
plot(fig, X, Y, Z, num_levels=num_levels)
plt.plot(psi, phi, '.', color='black')
plt.show()
然后加载一个本地pdb文件:
$ python rplot.py case2.pdb
生成图像效果如下:
关于这个脚本还有一些常量可以配置:
$ python3 rplot.py --help
usage: rplot.py [-h] [--input INPUT] [--levels LEVELS] [--sigma SIGMA]
[--grids GRIDS]
optional arguments:
-h, --help show this help message and exit
--input INPUT Set the input pdb filename. Absolute file path is
recommended.
--levels LEVELS Contour levels.
--sigma SIGMA KDE band width.
--grids GRIDS Number of grids.
例如说,我们可以把KDE中高斯波包的sigma值配置的更小一点(默认值为0.2),这样图像显示的会更集中,还可以把levels调多一点(默认值为8),这样显示的等高线会更密一些:
$ python3 rplot.py --input ../tutorials/pdb/case2.pdb --sigma 0.1 --levels 10
效果如下:
总结概要
这里我提供了一个用于画拉氏图的Python脚本源代码,供大家免费使用。虽然现在也有很多免费的平台和工具可以用,但很多都是黑箱,有需要的开发者可以直接在这个脚本基础上二次开发,定制自己的拉氏图绘制方法。
版权声明
本文首发链接为:https://www.cnblogs.com/dechinphy/p/rplot.html
作者ID:DechinPhy
更多原著文章:https://www.cnblogs.com/dechinphy/
请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html
参考链接
一个用来画拉氏图的简单Python脚本的更多相关文章
- 测试网站页面网速的一个简单Python脚本
无聊之余,下面分享一个Python小脚本:测试网站页面访问速度 [root@huanqiu ~]# vim pywww.py #!/usr/bin/python # coding: UTF-8 imp ...
- 一个爬取Bing每日壁纸的python脚本
1. 背景 Bing搜索每天的背景图片有些比较适合做桌面,但是有的提供下载有的不提供下载.每天去点击下载又不太方便,所以第一次学习了一下python爬虫怎么写,写的很简单. 2. 相关技术 2.1 P ...
- 简单python脚本,将jupter notebook的ipynb文件转为pdf(包含中文)
直接执行的python代码ipynb2pdf.py 主要思路.将ipynb文件转成tex文件,然后使用latex编译成pdf.由于latex默认转换不显示中文,需要向tex文件中添加相关中文包. 依赖 ...
- Python脚本控制的WebDriver 常用操作 <六> 打印当前页面的title及url
下面将使用WebDriver来答应浏览器页面的title和访问的地址信息 测试用例场景 测试中,访问1个页面然后判断其title是否符合预期是很常见的1个用例: 假设1个页面的title应该是'hel ...
- 获取上海地区AQI质量数据Python脚本
一个获取上海地区AQI质量的Python脚本 https://github.com/yanyueoo7/Raspberrypi/blob/master/GetPmData_Shanghai.py #! ...
- 在C语言中如何嵌入python脚本
最近在写配置文件时,需要使用python脚本,但脚本是一个监控作用,需要它一直驻留在linux中运行,想起C语言中能够使用deamon函数来保留一个程序一直运行,于是想到写一个deamon,并在其中嵌 ...
- Windows 下针对python脚本做一个简单的进程保护
前提: 大家运行的脚本程序经常会碰到系统异常关闭.或被其他用户错杀的情况.这样就需要一个进程保护的工具. 本文结合windows 的计划任务,实现一个简单的进程保护的功能. 利用py2exe生产 ex ...
- Python与Hack之window下运行带参数的Python脚本,实现一个简单的端口扫描器
1.前提是:windows已经配置好Python的环境变量: 2.进入cmd命令行模式: **输入python命令,检测是否环境配置好:显示这样说明配置环境变量没问题 **用cd命令进入Python脚 ...
- 使用一个Python脚本来运行一个简单的Django项目
创建视图 Django是一个模型-模板-视图(model-template-view,MTV)框架. 视图部分通常检查看HTTP给出的请求和查询或者结构,这些信息是发送到表示层的数据. 我们在 hel ...
- cocos2d-x使用python脚本创建项目的简单方法
本文有CC原创,转载请注明地址:http://blog.csdn.net/oktears/article/details/13297003 在cocos2d-x2.1.4以上的版本中,取消了使用vs模 ...
随机推荐
- docker-compose搭建的Mysql主主复制
注意下面几点: 1)要保证同步服务期间之间的网络联通.即能相互`ping`通,能使用对方授权信息连接到对方数据库(防火墙开放3306端口). 2)关闭selinux. 3)同步前,双方数据库中需要同步 ...
- Vue 渲染模板时怎么保留模板中的HTML 注释呢?
在组件中将 comments 选项设置为 true ...
- 如何模拟HTTP请求并验证功能
要模拟HTTP请求并验证功能,你可以使用Spring Boot提供的MockMvc工具,它允许我们在没有实际启动HTTP服务器的情况下测试Spring MVC控制器.以下是一个使用MockMvc进行H ...
- Swoole 实践篇之结合 WebSocket 实现心跳检测机制
原文首发链接:Swoole 实践篇之结合 WebSocket 实现心跳检测机制 大家好,我是码农先森. 引言 前段时间在 Swoole 的交流群里,有群友提问:"如何判断用户端是否在线&qu ...
- 『手撕Vue-CLI』函数柯里化优化代码
开篇 在上一篇文章中,给 nue-cli 添加了拉取版本号的功能,这一次来优化一下代码,使用函数柯里化的方式来优化代码. 实现 函数柯里化 函数柯里化是一种将使用多个参数的一个函数转换成一系列使用一个 ...
- Win11安装VMware Workstation Pro,Centos,Xshell,Xftp(Linux学习需要)
注意:1.win11不能安装太低版本的VMware Workstation Pro,否则启动linux会出现蓝屏 2.win11是默认没有开虚拟机平台支持的,所以同时也要开启,否则也会出现蓝屏. ...
- itest(爱测试) 开源接口测试,敏捷测试管理平台10.0.0RC1 发布,重点增加压测功能
一:itest work 简介 itest work 开源敏捷测试管理,包含极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock,还有压测 ,又有丰富的统计分析,8合1工作站.可按 ...
- Qt-数据库操作MySql
1 简介 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=87 说明:本文简单说明在Qt中操作数据库,用MySql数据库进行试验. Qt 提供了 ...
- Centos7安装Nginx教程,一步安装http和https
nginx是一款轻量级web服务器,主要有负载均衡和反向代理的特性. 安装准备 nginx一些模块需要依赖lib库,所以先安装lib库,执行以下命令: [root@localhost local]# ...
- codemirror-editor-vue3 编辑器只要换行保存就会有小红点
先看示例 找了篇博客写的贼详细 https://blog.csdn.net/xujingyiss/article/details/118992763 只要设置这二个 let conten ...