首页 > 编程语言 >一个用来画拉氏图的简单Python脚本

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

时间:2024-07-05 16:09:28浏览次数:13  
标签:脚本 phi psi 画拉氏 grids Python -- np pdb

技术背景

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

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

标签:脚本,phi,psi,画拉氏,grids,Python,--,np,pdb
From: https://www.cnblogs.com/dechinphy/p/18285931/rplot

相关文章

  • Python多线程-线程池ThreadPoolExecutor
    1.线程池不是线程数量越多,程序的执行效率就越快。线程也是一个对象,是需要占用资源的,线程数量过多的话肯定会消耗过多的资源,同时线程间的上下文切换也是一笔不小的开销,所以有时候开辟过多的线程不但不会提高程序的执行效率,反而会适得其反使程序变慢,得不偿失。为了防止无尽的线程......
  • Python的垃圾回收机制
    Python的垃圾回收机制引入计数器为主,标记清除和分代回收为辅1.引入计数器环状双向链表refchain在python程序中创建的任何对象都会放在refchain链表中当python程序运行时,会根据数据类型的不同找到其对应的结构体,根据结构体中的字段来进行创建相关的数据,然后将对象添加到rec......
  • python中logging
    Python的logging模块是一个用于记录应用程序日志消息的标准模块。它非常强大且灵活,允许你记录各种级别的日志消息,并配置输出格式、日志的存储位置以及处理日志的不同方式。以下是logging模块的基本介绍和用法。defcreate_logger(log_file):log_format='%(asctime)s......
  • 为什么现在的AI编程师都是用Python来编程?
    前言: 在当今AI大火的时节,涌入了一大批AI编程师,和AI训练师!显而易见他们都是用的Python语言来编程的。当然AI也给我们的工作带来了很多便利,比如AI绘画,写文章,视频剪辑,脚本创做等等方面现在都可以来用AI来协助我高效完成工作。那么我们来看看现在的AI编程师为什么都用Python语言......
  • python基础汇总(1)
    开始可以借鉴阿里腾讯开发规范——实际中运用会大体相近1、注释#:单行注释‘’‘’‘’或者“”“”“”:多行注释2、标识符合法:ABC、ABC_123、姓名、_123不合法:123、1ABC、if(保留字)、init(预定义标识符)(1)当标识符用作模块名时,应尽量短小,并且全部使用小写字母,可以使......
  • 《python机器学习从入门到高级》
    《python机器学习从入门到高级》分类算法:引言我们在之前的文章已经介绍了机器学习的一些基础概念,当拿到一个数据之后如何处理、如何评估一个模型、以及如何对模型调参等。接下来,我们正式开始学习如何实现机器学习的一些算法。回归和分类是机器学习的两大最基本的问题,对于......
  • python数据结构(树和二叉树)
    树非线性结构一对多根结点(无前驱)多个叶子结点(无后继)其他数据元素(一个前驱,多个后驱)树与二叉树转换树与二叉树均可用二叉链表作为存储结构,则以二叉链表为媒介可导出树之间的一个对应关系-----即给定一颗树,可以找到唯一一颗二叉树与之对应。把树转化为二叉树步骤一:加线......
  • Box,一个字典操作python库
     Box介绍Box是一个让字典操作变得异常简单与直观,支持通过属性访问字典内容的库。 特点概述属性访问Box允许用户像访问对象属性一样访问字典的值,提升了代码的可读性和易用性。无缝嵌套自动将嵌套的字典转换为Box对象,使得处理复杂字典结构变得轻而易举。灵活性......
  • Python速通(条件语句)
    (牛牛的选择)牛牛在牛客网经过了两次笔试分别获得了Tencent和Alibaba的面试资格,不巧的是这两次面试的时间冲突了。两家公司牛牛都想去,他决定通过笔试的成绩判断去参加哪家公司的面试。现在输入两行浮点数,分别表示牛牛在Tencent和Alibaba的笔试成绩,请比较两个成绩,输出笔试成绩较高的......
  • 小白也能看懂的Python基础教程(9)
    目录Python文件操作1、文件操作概述什么是文件?文件操作包含哪些内容呢?文件操作的作用2、文件的基本操作open()打开函数mode访问模式详解读操作相关方法read()方法:readlines()方法:readline()方法:file读取文件之readfile读取文件之readlines和reanline相对和绝对......