技术背景

关于拉氏图的更多介绍,可以参考下这篇博客,这里简单引述一部分内容:

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

参考链接

  1. https://blog.csdn.net/MCANDML/article/details/80672174

一个用来画拉氏图的简单Python脚本的更多相关文章

  1. 测试网站页面网速的一个简单Python脚本

    无聊之余,下面分享一个Python小脚本:测试网站页面访问速度 [root@huanqiu ~]# vim pywww.py #!/usr/bin/python # coding: UTF-8 imp ...

  2. 一个爬取Bing每日壁纸的python脚本

    1. 背景 Bing搜索每天的背景图片有些比较适合做桌面,但是有的提供下载有的不提供下载.每天去点击下载又不太方便,所以第一次学习了一下python爬虫怎么写,写的很简单. 2. 相关技术 2.1 P ...

  3. 简单python脚本,将jupter notebook的ipynb文件转为pdf(包含中文)

    直接执行的python代码ipynb2pdf.py 主要思路.将ipynb文件转成tex文件,然后使用latex编译成pdf.由于latex默认转换不显示中文,需要向tex文件中添加相关中文包. 依赖 ...

  4. Python脚本控制的WebDriver 常用操作 <六> 打印当前页面的title及url

    下面将使用WebDriver来答应浏览器页面的title和访问的地址信息 测试用例场景 测试中,访问1个页面然后判断其title是否符合预期是很常见的1个用例: 假设1个页面的title应该是'hel ...

  5. 获取上海地区AQI质量数据Python脚本

    一个获取上海地区AQI质量的Python脚本 https://github.com/yanyueoo7/Raspberrypi/blob/master/GetPmData_Shanghai.py #! ...

  6. 在C语言中如何嵌入python脚本

    最近在写配置文件时,需要使用python脚本,但脚本是一个监控作用,需要它一直驻留在linux中运行,想起C语言中能够使用deamon函数来保留一个程序一直运行,于是想到写一个deamon,并在其中嵌 ...

  7. Windows 下针对python脚本做一个简单的进程保护

    前提: 大家运行的脚本程序经常会碰到系统异常关闭.或被其他用户错杀的情况.这样就需要一个进程保护的工具. 本文结合windows 的计划任务,实现一个简单的进程保护的功能. 利用py2exe生产 ex ...

  8. Python与Hack之window下运行带参数的Python脚本,实现一个简单的端口扫描器

    1.前提是:windows已经配置好Python的环境变量: 2.进入cmd命令行模式: **输入python命令,检测是否环境配置好:显示这样说明配置环境变量没问题 **用cd命令进入Python脚 ...

  9. 使用一个Python脚本来运行一个简单的Django项目

    创建视图 Django是一个模型-模板-视图(model-template-view,MTV)框架. 视图部分通常检查看HTTP给出的请求和查询或者结构,这些信息是发送到表示层的数据. 我们在 hel ...

  10. cocos2d-x使用python脚本创建项目的简单方法

    本文有CC原创,转载请注明地址:http://blog.csdn.net/oktears/article/details/13297003 在cocos2d-x2.1.4以上的版本中,取消了使用vs模 ...

随机推荐

  1. IDEA不能搜索插件解决方案

    前言 平时在idea中搜索插件的时候,总是加载半天都不出,最后加载好久什么也没搜到,看到一篇大佬的解决博客,完美解决现将解决步骤分享如下: 1.首先打开系统设置,选择 Pligins,点击设置按钮(用 ...

  2. 超级简单实用的CSS3动画,增添网页效果

    有时候做网页,如果都写成静态的没有动态效果,犹如一张张图片,没有视觉感受,没有达到很好的视觉效果. 其实一些简单的CSS3动画,可以增添网页的动态感,使自己设计的网页更有视觉享受.1.图片有一定角度的 ...

  3. Mybatis Plus的@TableId标签

    @TableId1.如果数据库字段设成user_id在初始生成后,在代码中会变成userId,不会设置成主键使用**@TableId(value="user_id",type = ...

  4. Java 创建/识别条形码

    项目刚好需要用到就记录一下 -- 依赖 <!-- 条形码生成 --><dependency> <groupId>net.sf.barcode4j</group ...

  5. minio 安装

    mybatis 相关:https://baomidou.com/pages/223848/#fieldfillhttps://mybatis-flex.com/zh/intro/maven.html ...

  6. 简单粗暴通过 Binlog 日志来恢复 MySQL 数据

    引言 Binlog 日志的主要作用: 1.增量备份. 2.主从复制. 操作步骤 1.登录 MySQL -> 执行 show variables like '%log_bin%'; 查询 binl ...

  7. 鸿蒙HarmonyOS实战-ArkTS语言基础类库(并发)

    一.并发 并发是指在一个时间段内,多个事件.任务或操作同时进行或者交替进行的方式.在计算机科学中,特指多个任务或程序同时执行的能力.并发可以提升系统的吞吐量.响应速度和资源利用率,并能更好地处理多用户 ...

  8. Java中类的构造 与 方法的重载

    类的构造方法 定义:构造方法与类名相同,且没有返回值,且不需要void修饰 Car bmcar = new Car(); 特点:类中没有定义时,会默认有一个无参的构造方法,在无参的构造方法中为成员变量 ...

  9. 2024-06-05:用go语言,给定三个正整数 n、x 和 y, 描述一个城市中由 n 个房屋和 n 条街道连接的情况。 城市中存在一条额外的街道连接房屋 x 和房屋 y。 需要计算对于每个街道数(

    2024-06-05:用go语言,给定三个正整数 n.x 和 y, 描述一个城市中由 n 个房屋和 n 条街道连接的情况. 城市中存在一条额外的街道连接房屋 x 和房屋 y. 需要计算对于每个街道数( ...

  10. c# 拖拽列表顺序 | 拖拽合并分组 | 移除分组功能

    动图演示: 背景: 一开始做功能的时候没有增加排序的索引(sort-index),后来要求做拖拽排序功能:所以写了这个不需要初始排序就可以完成的拖拽功能:如果是table表格排序逻辑和这个相似,这里拿 ...