一个用来画拉氏图的简单Python脚本

技术背景

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

Ramachandran plot(拉氏图)是由G. N. Ramachandran等人于1963年开发的,用来描述蛋白质结构中氨基酸残基二面角\(\psi\)\(\phi\)是否在合理区域的一种可视化方法。同时也可以反映出该蛋白质的构象是否合理。

思路是比较简单的,就是找到一个蛋白质主链中的C,C\(_{\alpha}\),N,O这几种原子,然后计算对应共价键的二面角即可。计算相关内容可以参考我之前写过的这两篇文章:AlphaFold2中的残基刚体表示
和使用numpy计算分子内坐标。这里我们就简单的做一个Python的脚本,可以用来读取pdb文件,生成对应的拉氏图,用来判断对应的蛋白质构象是否合理,也可以用来比较两个同类蛋白之间的构型差异。

脚本与使用方法

先把下面这个Python脚本文件保存到本地为rplot.py

# rplot.py
""" 
READMERun this script with command:```bash$ python3 rplot.py --input ../tutorials/pdb/case5.pdb --levels 8 --sigma 0.2 --grids 30```
Requirementshadder, numpy, matplotlib
"""
try:from hadder.parsers import read_pdb
except ImportError:import osos.system('python3 -m pip install hadder --upgrade')from hadder.parsers import read_pdb
import matplotlib.pyplot as plt
import numpy as npimport 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 figdef torsion(crds, index1, index2, index3, index4):crd1 = crds[index1]crd2 = crds[index2]crd3 = crds[index3]crd4 = crds[index4]vector1 = crd1 - crd2vector2 = crd4 - crd3axis_vector = crd3 - crd2vec_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 phidef psi_phi_from_pdb(pdb_name):pdb_obj = read_pdb(pdb_name)atom_names = pdb_obj.flatten_atomscrds = pdb_obj.flatten_crdsc_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, phidef 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 Zpsi_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 isrecommended.--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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何实现超大场景的三维模型(3D)轻量化

三维工厂K3DMaker是一款三维模型浏览、分析、轻量化、顶层合并构建、几何校正、格式转换、调色裁切等功能专业处理软件。可以进行三维模型的网格简化、纹理压缩、层级优化等操作,从而实现三维模型轻量化。轻量化压缩比大,模型轻量化效率高,自动化处理能力高;采用多种算法对…

HP惠普笔记本使用问题和开启TPM

HP电脑使用 开机按F10,进入BIOS,如果是英文,切换到 Advanced,选择 Display Language,选择 简体中文然后返回上一页,切换到 安全引导配置 选择“启用传统支持和禁用安全引导”,然后F10 保存退出 开机+ESC是进入主菜单,可以从这里选择,进入引导 HP电脑在桌面使用快捷键…

Mysql之基本操作(库,表,用户管理)

库中有表,表中有数据 一、查看帮助信息点击查看代码 mysql> help create //help 后面跟上具体命令可以查看帮助二、查看支持的字符集点击查看代码 show charset; //查看支持的字符集 默认拉丁文字 latin1utf8 | UTF-8 Unicode //阉割版的 utf8mb4 | UTF-8 Unicode …

海康SDK报错Structure.getFieldOrder()

就是你调用的这个结构体以及其引用的其他结构体,可能没有getFieldOrder()的方法,你只要按照顺序把他填上去就好了。比如 public static class NET_DVR_TIME extends Structure {//校时结构参数public int dwYear; //年public int dwMonth; //月public int dwDa…

数字证书的应用场景有哪些?

在当今数字化飞速发展的时代,数字证书作为保障信息安全和身份认证的重要工具,发挥着越来越关键的作用。那么,数字证书究竟在哪些场景中得到了广泛的应用呢? 一、电子商务领域 在电子商务交易中,数字证书确保了交易双方的身份真实性和交易数据的完整性、保密性。例如,当消…

jenkins引用多个maven配置

普通项目都是用maven打包,有个特殊的项目是用到单独本地的maven库。 jenkins配置maven构建选项选择对应的maven名称即可本帖子也是纯手工制作,转载请标明出处-----------burukku(づ。◕ᴗᴗ◕。)づ

Java EE改名Jakarta EE,jakarta对程序的影响

Spring Framework作为Java领域最为流行的框架,有非常庞大的用户群体和项目应用,Java开源框架里绝对的TOP1。我们首先看看Java EE更名Jakarta对Spring Framework的影响。Spring Framework 6正式发布,携JDK 17&Jakarta EE开启新篇章,Spring Framework为何一跃将JDK的base…

硬盘二次开盘数据恢复

硬盘二次开盘数据恢复是一个相对复杂且风险较高的过程,通常发生在首次开盘数据恢复失败或未能完全恢复数据的情况下。 一、二次开盘的定义与背景 定义:硬盘二次开盘指的是在硬盘首次开盘数据恢复失败后,再次对硬盘进行开盘操作以尝试恢复数据的过程。 背景:硬盘开盘通常是因…

记一次aspnetcore发布部署流程初次使用k8s

主题: aspnetcorewebapi项目,提交到gitlab,通过jenkins(gitlab的ci/cd)编译、发布、推送到k8s。 关于gitlab、jenkins、k8s安装,都是使用docker启动服务。 首先新建一个项目,为了方便浏览就把swaggerr非开发环境不展示去掉 下面就是需要准备Dockerfile和k8s.yaml文件,这里…

硬盘数据误删格式化数据恢复

立即停止使用硬盘 在意识到硬盘数据被误删或格式化后,应立即停止使用该硬盘。任何新的数据写入都可能覆盖原始数据,从而降低恢复的可能性。 数据恢复 数据恢复软件是恢复误删或格式化数据的有效手段。以下是一些知名的数据恢复软件及其使用方法: 安装与选择模式:在格式化的…

bev_feature与真实坐标的关系

在生成 BEV feature 时的 scatter: nx = int((point_cloud_range[3]-point_cloud_range[0])/voxel_size[0])# Create the canvas for this sample canvas = torch.zeros(self.in_channels,self.nx * self.ny,dtype=voxel_features.dtype,device=voxel_features.device)# coors[…

【设计模式(六)】结构性模式--代理模式

结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大…