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

python · 浏览次数 : 31

小编点评

拉普拉斯图(Ramachandran图)是一种用于描述蛋白质结构中氨基酸残基的二面角(ψ和φ)的可视化工具。它可以帮助我们判断蛋白质的构象是否合理。通过计算蛋白质主链中的Cα、N、O等原子的二面角,可以生成拉普拉斯图并分析蛋白质的构象。 在这段博客中,作者提供了一个Python脚本,用于读取PDB文件、生成拉普拉斯图并判断蛋白质构象的合理性。脚本还提供了参数配置选项,如KDE带宽和高斯波包的σ值,以便用户可以根据需要调整输出结果。 使用此脚本,您可以轻松地分析多个蛋白质结构的拉普拉斯图,并比较它们之间的构型差异。此外,脚本还允许您在原始论文中查看详细信息,以便更好地了解其工作原理和应用。 以下是脚本的主要功能: 1. 读取PDB文件并提取氨基酸残基的坐标。 2. 计算二面角(ψ和φ)并生成拉普拉斯图。 3. 显示拉普拉斯图及其等高线。 4. 提供参数配置选项,以便用户根据需求调整输出结果。 总之,这是一个强大的工具,可帮助研究人员更直观地分析蛋白质结构的合理性,并比较不同蛋白质之间的构象差异。

正文

技术背景

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

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脚本相似的内容:

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

这里我提供了一个用于画拉氏图的Python脚本源代码,供大家免费使用。虽然现在也有很多免费的平台和工具可以用,但很多都是黑箱,有需要的开发者可以直接在这个脚本基础上二次开发,定制自己的拉氏图绘制方法。

PPT 配色方法

https://www.bilibili.com/video/BV1ha411g7f5/?p=10 https://dribbble.com/ 问题1:配色太多,主题色混乱 一个主色,两辅色 问题2:随意配色 问题3:颜色搭配没有重点 我们该如何配色 画四个圆,取四个色,用来做后面的配色 图片取色

来自多彩世界的控制台——C#控制台输出彩色字符画

引言 看到酷安上有这样一个活动,萌生了用 C# 生成字符画的想法,先放出原图。 酷安手绘牛啤 §1 黑白 将图像转换成字符画在 C# 中很简单,思路大致如下: 加载图像,逐像素提取明度。 根据明度映射到字符列表中对应的字符。 输出字符。 GetChars函数负责将传入的图像按一定比例导出字符画的字符

快速绘制流程图「GitHub 热点速览 v.22.47」

画流程图一直是研发的一个难题,如何画得通俗易懂已经够让人头疼了,还要美观大方。用 d2 的语法描述下流程,d2 会自动帮你生成一张配色极佳的流程图。说到研发的选择,本周特推的 choiceof.dev 罗列了众多开发过程中会遇到的选项,你可以自测下你同主流研发的契合度。 本周周榜呢,有监控网络流量的

C# AutoCAD 利用Editor.CommandAsync 同步监测自带命令的执行情况

#1官方文档并无相关解释:AutoCAD 2023 Developer and ObjectARX Help | Editor.CommandAsync Method | Autodesk #2 上例子,我用自带的命令画一个圆,画完后我要修改它的颜色,此时该如何操作呢,下面是可用的代码 [Comma

Python作图三维等高面

在一维空间下,我们要表示密度时可以给出一个二维的函数y=f(x),画出来是一条二维平面上的曲线。在二维空间下,我们要表示密度可以使用一个三维的函数z=f(x,y),画出来是一个三维空间的曲面。而三维空间下,密度表示是一个四维的函数:q=f(x,y,z),这个密度我们在三维空间已经没有办法用线或者面去...

Android 自定义带动画的柱状图

功能分析 假设要使用柱状图展示用户一周的数据,通用的做法是对接三方图表SDK或者自己通过代码绘制。 1、三方SDK通常包体较大,且定制性差,对特定的UI需求兼容性差; 2、自己绘制,比较复杂,而且要考虑各种兼容适配; 今天,我们使用一种简单的方式,来制作柱状图,不仅代码简单,而且支持UI样式、动画自

开源免费绘制小工具drawio推荐

最近给客户做架构评估写报告时,需要画一些架构示例简图,需求很简单,没到非要用付费软件的程度。 同事推荐一款开源免费的绘制软件drawio,实际体验不错,可以满足我的使用需求。 drawio官方网站: https://www.drawio.com/ 不但有提供Windows的版本,也有我需要的macO

[译]这几个CSS小技巧,你知道吗?

# 前言 在网页设计和前端开发中,CSS属性是非常重要的一部分。掌握常用的CSS属性不仅可以使你的网页看起来更美观,还能提升用户体验,今天小编为大家介绍8个常见的CSS小技巧: # 1.修改滚动条样式 下图是我们常见的滚动条,现在需要改变滚动条的宽度和颜色了,并把它画的圆一点。 ![](https:

Axure 获取验证码

拖两个矩形框,一个用来做文档输入,一个做获取验证码的按钮 设置全局变量OnLoadVariable的初如值为60 1、用例中的条件:当OnLoadVariable的值不等于0 2、用例中的步骤 禁用“按钮” 设置当前元件文本的值为“[[OnLoadVariable-1]]秒后重新获取 设置全局变量的