PSP - 计算蛋白质复合物链间接触的残基与面积

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/134884889

在蛋白质复合物中,通过链间距离,可以计算出在接触面的残基与接触面的面积,使用 BioPython 库 与 SASA (Solvent Accessible Surface Area,溶剂可及表面积) 库。SASA 计算主要以 水分子 是否通过为基础,水分子的半径是1.4 A,直径是 2.8 A,所以以 2.8 A 的距离,判断链间是否连接。

相关函数:

  1. 获取 蛋白质复合物 的链列表,即 get_chain_ids()
  2. 获取 残基-原子 字典,注意原子名称与 PDB 的名称可能不同,即 get_atom_list()
  3. 获取 全原子 列表,即 get_all_atoms()
  4. 判断是否原子之间是否相连,即 is_contact()
  5. 获取全部的接触面,原子计算残基维度,即 get_contacts()
  6. 打印 ChimeraX 的显示命令,即 get_chimerax_cmd()
  7. 端到端的计算接触残基,即 cal_chain_interface_residue()
  8. 计算 SASA 面积,即 cal_sasa()
  9. 获取复合物多链的子结构,即 get_sub_structure()
  10. 端到端的计算接触面积,即 cal_chain_interface_area()

以 PDB 8j18 为例,计算链 A 与 链 R 的接触残基与面积:

AR

源码如下:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2022. All rights reserved.
Created by C. L. Wang on 2023/12/8
"""import osfrom Bio.PDB import NeighborSearch
from Bio.PDB import PDBParser, Selection
from Bio.PDB.Chain import Chain
from Bio.PDB.Model import Model
from Bio.PDB.Structure import Structurefrom root_dir import DATA_DIRclass MainComplexChainDist(object):"""复合物,多链距离计算"""def __init__(self):pass@staticmethoddef get_chain_ids(structure):chain_ids = []for chain in structure.get_chains():chain_ids.append(chain.id)return chain_ids@staticmethoddef get_atom_list(structure, chains):"""获取 atom list 列表注意: 输出的 atom 名字与 PDB 文件中的 atom 名字略有差异,例如8jtl 第1个,PRO: CG 对应 OG1,CD 对应 CG28jtl 第2个,VAL: CG1 对应 CD1,CG2 对应 CD2"""output = dict()for chain in structure:if chain.id in chains:for residue in chain.get_residues():het_flag, res_seq, i_code = residue.get_id()the_id = (chain.id + "_" + str(res_seq) + "_" + i_code).strip()for atom in residue.get_unpacked_list():if het_flag == ' ':if the_id in output:output[the_id].append(atom)else:output[the_id] = [atom]return output# Filter out all the atoms from the chain,residue map given by residue_map@staticmethoddef get_all_atoms(residue_map):all_atoms_out = []for residue in residue_map:for atom in residue_map[residue]:all_atoms_out.append(atom)# Set the b-factor to zero for coloring by contactsatom.set_bfactor(0.0)return all_atoms_out@staticmethoddef is_contact(res_1, other_atoms, cutoff):for atom in res_1:ns = NeighborSearch(other_atoms)center = atom.get_coord()neighbors = ns.search(center, cutoff)  # 5.0 for distance in angstromresidue_list = Selection.unfold_entities(neighbors, 'R')  # R for residuesif len(residue_list) > 0:return Truereturn False@classmethoddef get_contacts(cls, struc, all_atoms, verbose, cutoff):progress = 0contacts = []for residue in struc:progress += 1# if len(verbose) > 0:#     print(verbose, progress, "out of", len(struc))atom_list = struc[residue]outcome = cls.is_contact(atom_list, all_atoms, cutoff)if outcome:contacts.append(residue)return contacts@staticmethoddef get_chimerax_cmd(contacts, chain_id, pdb_id="2"):"""计算命令"""tmp_list = []for item in contacts:req_id = int(item.split("_")[1])tmp_list.append(req_id)contacts_gap = []prev, post = -1, -1for i in tmp_list:if prev == -1:prev = post = icontinueif i - post == 1:post = ielse:contacts_gap.append(f"#{pdb_id}/{chain_id}:{prev}-{post}")prev = post = icmd = "select " + " ".join(contacts_gap)return cmd@classmethoddef cal_chain_interface_residue(cls, structure, chain1, chain2, cutoff=7.5):"""计算复合物结构的链内距离"""chain_ids = cls.get_chain_ids(structure)# ['A', 'B', 'G', 'R', 'S']print(f"[Info] chain_ids: {chain_ids}")assert chain1 in chain_ids and chain2 in chain_ids# C 表示 chain,即将 structure 展开 chain 的形式# 同时支持 A, R, C, M, Sstructure_c = Selection.unfold_entities(structure, target_level="C")atom_dict1 = cls.get_atom_list(structure_c, chains=[chain1])atom_dict2 = cls.get_atom_list(structure_c, chains=[chain2])print(f"[Info] res_num: {len(atom_dict1.keys())}")all_atoms_1 = cls.get_all_atoms(atom_dict1)all_atoms_2 = cls.get_all_atoms(atom_dict2)cutoff = cutoffcontacts_1 = cls.get_contacts(atom_dict1, all_atoms_2, "First molecule, residue ", cutoff)contacts_2 = cls.get_contacts(atom_dict2, all_atoms_1, "Second molecule, residue ", cutoff)print(f"[Info] contacts_1: {len(contacts_1)}")print(f"[Info] contacts_2: {len(contacts_2)}")return contacts_1, contacts_2@staticmethoddef cal_sasa(structure):"""计算单体的表面积"""import freesasastructure = freesasa.structureFromBioPDB(structure)result = freesasa.calc(structure)# classArea = freesasa.classifyResults(result, structure)return result.totalArea()@staticmethoddef get_sub_structure(structure, chain_list):"""获取 PDB 结构的子结构"""new_structure = Structure(0)new_model = Model(0)# 遍历模型中的所有链for chain in structure[0]:# 获取链的IDtmp_chain_id = chain.get_id()if tmp_chain_id not in chain_list:continue# 创建一个新的结构对象,只包含当前链new_chain = Chain(tmp_chain_id)new_chain.child_list = chain.child_listnew_model.add(new_chain)new_structure.add(new_model)return new_structure@classmethoddef cal_chain_interface_area(cls, structure, chain1, chain2):sub_all_structure = cls.get_sub_structure(structure, [chain1, chain2])sub1_structure = cls.get_sub_structure(structure, [chain1])sub2_structure = cls.get_sub_structure(structure, [chain2])v1_area = cls.cal_sasa(sub_all_structure)v2_area = cls.cal_sasa(sub1_structure) + cls.cal_sasa(sub2_structure)inter_area = max(int((v2_area - v1_area) // 2), 0)return inter_areadef process(self, input_path, chain1, chain2):"""核心逻辑"""print(f"[Info] input_path: {input_path}")print(f"[Info] chain1: {chain1}, chain2: {chain2}")chain1 = chain1.upper()chain2 = chain2.upper()parser = PDBParser(QUIET=True)structure = parser.get_structure("def", input_path)contacts_1, contacts_2 = self.cal_chain_interface_residue(structure, chain1, chain2, cutoff=7.5)cmd1 = self.get_chimerax_cmd(contacts_1, chain1)cmd2 = self.get_chimerax_cmd(contacts_2, chain2)print(f"[Info] chimerax: {cmd1}")print(f"[Info] chimerax: {cmd2}")inter_area = self.cal_chain_interface_area(structure, chain1, chain2)print(f"[Info] inter_area: {inter_area}")def main():ccd = MainComplexChainDist()# input_path = os.path.join(DATA_DIR, "templates", "8p3l.pdb")# ccd.process(input_path, "A", "D")  # 2562# ccd.process(input_path, "A", "J")  # 490input_path = os.path.join(DATA_DIR, "templates", "8j18.pdb")# ccd.process(input_path, "R", "S")  # 0ccd.process(input_path, "A", "R")  # 1114if __name__ == '__main__':main()

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

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

相关文章

Hugging Face 给普通用户提供了一个 2 vCPU 16GB 的免费空间

Hugging Face 给普通用户提供了一个 2 vCPU 16GB 的免费空间,并且支持部署 Gradio 构建的应用程序,非常方便,下面我们进入 https://huggingface.co/spaces/ ,点击创建空间。

【kubernetes】k3s集群搭建(正在更新……)

文章目录 一、k3s简介二、快速搭建1.控制平面2.镜像加速 Pod容器集1.创建和管理pod Deployment(部署)与ReplicaSet(副本集)滚动更新 Service命名空间YAML语法管理对象常用命令缩写YAML规范 声明式配置对象标签选择器 容器运行时接口(CRI)与镜像导入导出容器运行时接口(CRI) 金丝…

Proteus仿真--160128LCD中文显示温度与时间

本文介绍基于160128LCD的中文温度与时间显示设计(完整仿真源文件及代码见文末链接) 本文基于51单片机实现160128LCD的中文温度与时间的现实,其中万年历芯片选用DS1302时钟芯片,温度传感器选用DS18B20温度传感器 仿真图如下 仿真…

105.长度最小的子数组(力扣)|滑动窗口

代码演示 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int result INT_MAX; // 用于存储最小子数组的长度int sum 0; // 滑动窗口的长度int i 0; // 滑动窗口的起始位置int sumlength 0; // 当前子数…

SOLIDWORKS Flow Simulation电子机箱散热

这一次我们来聊聊电子冷却问题&#xff0c;以这个机箱散热问题为例&#xff0c;我们一般的散热设计要求是CPU不能超过80℃&#xff0c;北桥芯片温度不能超过85℃&#xff0c;南桥芯片不超过95℃。在实际情况下芯片内部的各处温度是不一样&#xff0c;面对与芯片级别的散热分析我…

windows下开机启动nignx、mysql、redis等服务

解决phpStudy开机自启动失败&#xff1a;创建Windows系统服务 在使用phpStudy作为我的集成开发环境时&#xff0c;我遇到了一个突然的挑战&#xff1a;服务无法在开机时自动启动。面对这一挑战&#xff0c;官方没有提供解决方案&#xff0c;所以我决定自行寻找答案。其他的服务…

基于Java技术的选课管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

C语言——螺旋矩阵(注释详解)

一、前言&#xff1a; 螺旋矩阵是指一个呈螺旋状的矩阵&#xff0c;它的数字由第一行开始到右边不断变大&#xff0c;向下变大&#xff0c;向左变大&#xff0c;向上变大&#xff0c;如此循环。 二、市面解法&#xff08;较难理解,代码长度短&#xff09;&#xff1a; 根据阶数…

Android File Transfer for Mac:畅享强大的安卓文件传输工具

作为一款功能强大的安卓文件传输工具&#xff0c;Android File Transfer for Mac&#xff08;以下简称AFT&#xff09;为Mac用户提供了便捷快速的安卓设备文件管理体验。无论是传输照片、音乐、视频还是文档&#xff0c;AFT都能满足你的需求&#xff0c;让你的文件传输更加高效…

目标检测mAP计算以及coco评价标准

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 讲一下目标检测中的一些常见的指标 在我们使用目标检测网络训练时 最后在验证集上会得到一个coco的评价列表 就像我们图中给的这一系列参数列表一样 我们再进一步引入两个概念 第一个叫做precisi…

Linux高级管理-搭建网站服务

在Ihternet 网络环境中&#xff0c;Web 服务无疑是最为流行的应用系统。有了Web站点&#xff0c;企业可以充分 展示自己的产品&#xff0c;宣传企业形象。Web站点还为企业提供了与客户交流、电子商务交易平台等丰富 的网络应用。部署与维护Web 服务是运维工程师必须掌握的一个技…

VisualStudio反汇编功能使用

VisualStudio反汇编功能使用 使用方法 到达断点时&#xff1a;CtrlK&#xff08;松开&#xff09;G&#xff08;后按&#xff09;唤出反汇编界面&#xff0c;就可以看到当前代码对应的汇编语言了 注意&#xff1a;进入反汇编窗口后可以F10单次调试一条汇编指令 其他&#…