蛋白质PDB文件解析+建图(biopython+DGL)

PDB文件解析

PDB文件设计得非常好,能够比较完整地记录实验测定数据

读懂蛋白质PDB文件-腾讯云开发者社区-腾讯云 (tencent.com)

科学网—PDB文件格式说明 - 李继存的博文 (sciencenet.cn)

从蛋白质结构来看,首先它会有多种不同的测定模型,然后每个模型中包含多条链,每条连上包含若干个残基,每个残基包含若干个原子

在biopython.PDB包中可以找到这些概念对应的模块:model、chain、residue、atom

Bio.PDB软件包 — Biopython 1.79 文档 (osgeo.cn)

首先用PDBParser读取文件,获得structure

struct = parser.get_structure(0,pdbfilepath)
model = struct.get_models().__next__()

struct内部的一层结构是model,我们只取第一个model

然后就可以用循环遍历chains、residues、atoms

for chain in model.get_chains():for residue in chain.get_residues():for atom in residue.get_atoms():

虽然也可以直接从structure中获取atom序列、residue序列、chain序列

但是这样就失去了一些从属关系

另外还可以通过查询的方式获得残基中的某个原子

例如使用residue['CA']就可以获取残基residue中名字为‘CA’的原子(氨基酸α碳原子)

所以我们只需要枚举残基,给每个残基的Cα原子进行编号就可以了

一般的PDB文件中都包含原子坐标数据,可以用它来作为这个氨基酸的一个特征

另外,为了获得序列,我们还需要把氨基酸的三字母缩写转化为一字母缩写,下面是一个转换矩阵。

three2one= {'VAL':'V', 'ILE':'I', 'LEU':'L', 'GLU':'E', 'GLN':'Q','ASP':'D', 'ASN':'N', 'HIS':'H', 'TRP':'W', 'PHE':'F', 'TYR':'Y', 'ARG':'R', 'LYS':'K', 'SER':'S', 'THR':'T', 'MET':'M', 'ALA':'A', 'GLY':'G', 'PRO':'P', 'CYS':'C'
}

使用DGL对蛋白质建图

DGL库接口解析:dgl — DGL 2.1.0 documentation

建图的方法就很多了,得看个人的设计,有只根据Cα原子之间的距离进行建图的,有使用所有原子来建图的,也有用肽链原子+残基Cβ原子+二硫键建图的,只能说是五花八门,不过这些都只是多写几个if 的问题。

特征构造的方式就更多了

简单的,边不加特征,氨基酸作为点用独热向量作为特征

复杂的就多了去了,有加化学键长度的,有对化学键加入类别的,有加入残基直径的,还有加入原子数、分子量、氨基酸电性的,氨基酸特征向量还可以用一些序列比对的特征值,例如blosum,pam,cIndex of /blast/matrices (nih.gov) 总之想法很多,但真正有用的就那么几个。

DGL添加点:(第一个参数是点的个数,后面是一个dict,里面写这个点的特征向量tensor,但必须行数相同)

graph.add_nodes(1, {'pos': pos_feature, 'res': residue_feature})

DGL添加边:(必须用两个tensor来表示两个端点的编号,后面的dict同样是边的特征向量)

值得注意的是,DGL只会添加单向边,所以无向边需要加两次

(ps:在网上看到许多写法都是graph=dgl.add_edges(graph,……),但graph.adde_edges()也是可以用的)

graph.add_edges(torch.tensor([atom_num-1]), torch.tensor([atom_num]), {'feat': Peptide_bond_feature})

这里我使用的是,只根据肽键和Cα原子进行建图,以Cα原子代替氨基酸作为点,边为两个氨基酸之间是否存在肽键,点特征为氨基酸的blosum80特征和坐标特征,边特征为独热向量,方便以后加入其他类型的边。

import Bio.PDB.PDBParser
import os
import numpy
import torch
import dglparser = Bio.PDB.PDBParser()
# 连接Cα的肽键的边特征向量
Peptide_bond_feature = torch.tensor([1.0,0.0])
# 连接Cα的二硫键的边特征向量
S_S_bond_feature = torch.tensor([0.0,1.0])three2one= {'VAL':'V', 'ILE':'I', 'LEU':'L', 'GLU':'E', 'GLN':'Q','ASP':'D', 'ASN':'N', 'HIS':'H', 'TRP':'W', 'PHE':'F', 'TYR':'Y', 'ARG':'R', 'LYS':'K', 'SER':'S', 'THR':'T', 'MET':'M', 'ALA':'A', 'GLY':'G', 'PRO':'P', 'CYS':'C'
}
# 氨基酸的特征
AA_feature_blosum80 = {
'A' : torch.tensor([ 7, -3, -3, -3, -1, -2, -2,  0, -3, -3, -3, -1, -2, -4, -1,  2,  0, -5, -4, -1, -3, -2, -1]),
'R' : torch.tensor([-3,  9, -1, -3, -6,  1, -1, -4,  0, -5, -4,  3, -3, -5, -3, -2, -2, -5, -4, -4, -2,  0, -2]),
'N' : torch.tensor([-3, -1,  9,  2, -5,  0, -1, -1,  1, -6, -6,  0, -4, -6, -4,  1,  0, -7, -4, -5,  5, -1, -2]),
'D' : torch.tensor([-3, -3,  2, 10, -7, -1,  2, -3, -2, -7, -7, -2, -6, -6, -3, -1, -2, -8, -6, -6,  6,  1, -3]),
'C' : torch.tensor([-1, -6, -5, -7, 13, -5, -7, -6, -7, -2, -3, -6, -3, -4, -6, -2, -2, -5, -5, -2, -6, -7, -4]),
'Q' : torch.tensor([-2,  1,  0, -1, -5,  9,  3, -4,  1, -5, -4,  2, -1, -5, -3, -1, -1, -4, -3, -4, -1,  5, -2]),
'E' : torch.tensor([-2, -1, -1,  2, -7,  3,  8, -4,  0, -6, -6,  1, -4, -6, -2, -1, -2, -6, -5, -4,  1,  6, -2]),
'G' : torch.tensor([ 0, -4, -1, -3, -6, -4, -4,  9, -4, -7, -7, -3, -5, -6, -5, -1, -3, -6, -6, -6, -2, -4, -3]),
'H' : torch.tensor([-3,  0,  1, -2, -7,  1,  0, -4, 12, -6, -5, -1, -4, -2, -4, -2, -3, -4,  3, -5, -1,  0, -2]),
'I' : torch.tensor([-3, -5, -6, -7, -2, -5, -6, -7, -6,  7,  2, -5,  2, -1, -5, -4, -2, -5, -3,  4, -6, -6, -2]),
'L' : torch.tensor([-3, -4, -6, -7, -3, -4, -6, -7, -5,  2,  6, -4,  3,  0, -5, -4, -3, -4, -2,  1, -7, -5, -2]),
'K' : torch.tensor([-1,  3,  0, -2, -6,  2,  1, -3, -1, -5, -4,  8, -3, -5, -2, -1, -1, -6, -4, -4, -1,  1, -2]),
'M' : torch.tensor([-2, -3, -4, -6, -3, -1, -4, -5, -4,  2,  3, -3,  9,  0, -4, -3, -1, -3, -3,  1, -5, -3, -2]),
'F' : torch.tensor([-4, -5, -6, -6, -4, -5, -6, -6, -2, -1,  0, -5,  0, 10, -6, -4, -4,  0,  4, -2, -6, -6, -3]),
'P' : torch.tensor([-1, -3, -4, -3, -6, -3, -2, -5, -4, -5, -5, -2, -4, -6, 12, -2, -3, -7, -6, -4, -4, -2, -3]),
'S' : torch.tensor([ 2, -2,  1, -1, -2, -1, -1, -1, -2, -4, -4, -1, -3, -4, -2,  7,  2, -6, -3, -3,  0, -1, -1]),
'T' : torch.tensor([ 0, -2,  0, -2, -2, -1, -2, -3, -3, -2, -3, -1, -1, -4, -3,  2,  8, -5, -3,  0, -1, -2, -1]),
'W' : torch.tensor([-5, -5, -7, -8, -5, -4, -6, -6, -4, -5, -4, -6, -3,  0, -7, -6, -5, 16,  3, -5, -8, -5, -5]),
'Y' : torch.tensor([-4, -4, -4, -6, -5, -3, -5, -6,  3, -3, -2, -4, -3,  4, -6, -3, -3,  3, 11, -3, -5, -4, -3]),
'V' : torch.tensor([-1, -4, -5, -6, -2, -4, -4, -6, -5,  4,  1, -4,  1, -2, -4, -3,  0, -5, -3,  7, -6, -4, -2]),
'B' : torch.tensor([-3, -2,  5,  6, -6, -1,  1, -2, -1, -6, -7, -1, -5, -6, -4,  0, -1, -8, -5, -6,  6,  0, -3]),
'Z' : torch.tensor([-2,  0, -1,  1, -7,  5,  6, -4,  0, -6, -5,  1, -3, -6, -2, -1, -2, -5, -4, -4,  0,  6, -1]),
'X' : torch.tensor([-1, -2, -2, -3, -4, -2, -2, -3, -2, -2, -2, -2, -2, -3, -3, -1, -1, -5, -3, -2, -3, -1, -2]),
}def get_seq_graph_info(pdbfilepath):struct = parser.get_structure(0,pdbfilepath)model = struct.get_models().__next__()seq = []graph = dgl.DGLGraph()residue_num = 0for chain in model.get_chains():residues = chain.get_residues()# print(chain)chain_start_flag = 1for residue in residues:res_name = three2one[residue.get_resname()]seq.append(res_name)pos_feature = torch.from_numpy(residue['CA'].get_coord()).unsqueeze(0)residue_feature = AA_feature_blosum80[res_name].unsqueeze(0)graph.add_nodes(1, {'pos': pos_feature, 'res': residue_feature})if chain_start_flag == 0 :graph.add_edges(torch.tensor([residue_num-1]), torch.tensor([residue_num]), {'feat': Peptide_bond_feature})graph.add_edges(torch.tensor([residue_num]), torch.tensor([residue_num-1]), {'feat': Peptide_bond_feature})residue_num += 1chain_start_flag = 0return seq,graphpdb_data_dir = 'D:\PVT\data'
file_list = [os.path.join(pdb_data_dir, file) for file in os.listdir(pdb_data_dir)]
for file in file_list:if file.endswith('.pdb'):print("processing "+file)seq,graph = get_seq_graph_info(file)print(seq)print(graph)print("finished!")

运行结果:

点数61,边数120

可以看出这个蛋白质只是一条肽链

这样我们就从PDB文件中得到了 氨基酸序列和蛋白质的图

接下来就可以愉快地使用GNN之类的东西提取特征啦

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

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

相关文章

python学习笔记----面向对象(十)

一、什么是类 类是一个抽象的模板,用于创建具体的实例。可以将类理解为一个蓝图,它定义了一系列对象共有的属性(数据)和方法(函数)。类是对一组具有相同属性和功能的对象的抽象。例如,你可以定…

Jupyter Notebook魔术命令

Jupyter Notebook是一个基于网页的交互式笔记本,支持运行多种编程语言。 Jupyter Notebook 的本质式一个Web应用程序,便于创建和共享文学化程序文档,支持实现代码,数学方程,可视化和markdown。用途包括:数据…

2.6Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3-基础-Vue生命周期

在使用vue进行日常开发中,我们总有这样的需求,想在页面刚一加载出这个表格组件时,就发送请求去后台拉取 数据,亦或者想在组件加载前显示个loading图,当组件加载出来就让这个loading图消失等等这样或那样的需求。 要实…

Flutter笔记:Widgets Easier组件库(9)使用弹窗

Flutter笔记 Widgets Easier组件库(9):使用弹窗 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress o…

自定义拦截器jwt登录校验接口模拟账号登录

五一闲在宿舍,本来想写一个自己的简易博客网站,发现vue基础太差,做不出来页面效果于是便放弃,但也没有完全放弃。于是我分析了一下简易博客的后端实现流程,除了最基本的crud以外,在自己目前的对接口的分析中…

Ubuntu启动后进入GRUB故障-Minimal BASH like line editing is supported.

目录 1.问题描述 2.解决方案 2.1 临时性办法 2.2 工具永久性修复 总结 1.问题描述 PC安装Ubuntu系统第二天重启后提示GUN GRUB version 2.04,之前是WindowsOS装Ubuntu后无法进入图形界面。具体原因据网友提供线索据说是由于在Windows上进行更新/重装/修改了引…

2024年 Java 面试八股文——Mybatis篇

目录 1. 什么是Mybatis? 2. 说说Mybatis的优缺点 3. Xml映射文件中,都有哪些标签 4. #{}和&{}有什么区别 5. Mybatis是如何进行分页的,分页插件的原理是什么 6. Mybatis是如何将sql执行结果封装为目标对象并返回的? 7. Mybatis是怎…

从 Servlet 到 DispatcherServlet(SpringMvc 容器的创建)

DispatcherServlet 的继承体系 SpringMvc 是一个具有 Spring 容器(ApplicationContext)的 Servlet。其中,HttpServlet 属于 JDK 的内容,从 HttpServletBean 开始,便属于 Spring 体系中的内容。 HttpServletBean&…

华为手机 鸿蒙系统-android studio识别调试设备,开启adb调试权限

1.进入设置-关于手机-版本号,连续点击7次 认证:有锁屏密码需要输入密码, 开启开发者配置功能ok 进入开发者配置界面 打开调试功能 重新在androd studio查看可运行running devices显示了, 不行的话,重启一下android …

【开源物联网平台】window环境下搭建调试监控设备环境

🌈 个人主页:帐篷Li 🔥 系列专栏:FastBee物联网开源项目 💪🏻 专注于简单,易用,可拓展,低成本商业化的AIOT物联网解决方案 目录 一、使用docker脚本部署zlmediakit 1.1 …

Nextjs+Antd5.0打造面向AI的文档可视化引擎(最新更新)

hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下我开发的文档引擎 Nocode/WEP 的最新更新。 issue收集: https://github.com/MrXujiang/Nocode-Wep/issues 演示地…

ReentrantReadWriteLock(可重入读写锁)源码解读与使用

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java源码解读-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 1. 前言 2. 读写锁是什么 3. ReentrantReadWriteLock是什么 4. 源码解…

ColdDTA:利用数据增强和基于注意力的特征融合进行药物靶标结合亲和力预测

ColdDTA发表在Computers in Biology and Medicine 的一篇一区文章 突出 • 数据增强和基于注意力的特征融合用于药物靶点结合亲和力预测。 • 与其他方法相比,它在 Davis、KIBA 和 BindingDB 数据集上显示出竞争性能。 • 可视化模型权重可以获得可解释的见解。 …

Python梯度提升决策树库之lightgbm使用详解

概要 LightGBM是一个快速、分布式、高性能的梯度提升决策树(Gradient Boosting Decision Tree)库,它在机器学习和数据挖掘领域被广泛应用。本文将介绍LightGBM库的安装方法、主要特性、基本功能、高级功能、以及在实际应用中的场景和总结。 安装 首先,需要安装LightGBM库…

第Y9周:重要模块解读

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制🚀 文章来源:K同学的学习圈子 目录 以con.py为例: 一、autopad 二、Conv 三、Focus 四、C2f 文件…

Golang | Leetcode Golang题解之第66题加一

题目&#xff1a; 题解&#xff1a; func plusOne(digits []int) []int {n : len(digits)for i : n - 1; i > 0; i-- {if digits[i] ! 9 {digits[i]for j : i 1; j < n; j {digits[j] 0}return digits}}// digits 中所有的元素均为 9digits make([]int, n1)digits[0]…

如何基于nginx组建多个子目录网站

华子目录 实验要求实验步骤 实验要求 组建多个子目录网站www.openlab.com&#xff0c;该网站有2个子目录www.openlab.com/sxhkt和www.openlab.com/zywww.openlab.com/sxhkt使用http读取www.openlab.com/zy使用https读取 实验步骤 准备工作 [rootserver ~]# setenforce 0[ro…

串口单线半双工转换电路

用来把单线半双工模式的串口转换成双线&#xff0c;然后才能连接到普通的双线USB 串口模块&#xff0c;比如CH340 之类的。电路设计来自大佬的博客&#xff1a;AVR half-duplex software UART supporting single pin operation。他在Arduino 上用软件模拟串口功能&#xff0c;利…

测试PG中事务隔离级别

我们知道事务隔离级别有&#xff1a;读未提交&#xff0c;读已提交&#xff0c;可重复读&#xff0c;可序列化。 读未提交 存在 脏读&#xff0c;不可重复读&#xff0c;幻读&#xff1b; 读已提交 存在 不可重复读&#xff0c;幻读 可重复读 存在 幻读 PG 下默认为读已提交…

微信小程序使用蓝牙连接硬件

目录 一、蓝牙官方api文档 二、蓝牙重要参数介绍 三、案例教程 1. 获取蓝牙权限&#xff08;openBluetoothAdapter&#xff09; 2. 开始搜索蓝牙设备(startBluetoothDevicesDiscovery) 3. 监听搜索到新设备的事件(onBluetoothDeviceFound) 4.连接蓝牙设备&#xff08;crea…