PSP - 蛋白质真实长序列查找 PDB 结构短序列的算法

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

在蛋白质结构预测的过程中,输入一般是蛋白质序列(长序列),预测出 PDB 三维结构,再和 Ground Truth 的 PDB 进行比较,GT 的 PDB 是实验测出,比真实的蛋白质序列要短,需要使用算法进行查找。

满足约束:PDB 结构序列的长度 小于 蛋白质序列的长度,并且是子集关系。

  • 黄色是 PDB 官网的结构
  • 蓝色是预测的全长序列的结构
  • 粉色是通过算法,截取的子结构

即:
效果

源码:

def match_sub_seq(seq_long, seq_short):"""匹配序列子串,返回区间范围,一般用于长FASTA与短PDBSeq之间的预处理"""def get_seq_max_idx(seq_l, seq_s):"""序列匹配结果,返回连续最大索引"""np = len(seq_l)nf = len(seq_s)res = [0] * npi, j = 0, 0same = 0is_next, next_i = True, 0while i < np:rp = seq_l[i]  # pdb 的 残基rf = seq_s[j]  # fasta 的残基if is_next:next_i = i + 1is_next = Falseif rp == rf:same += 1j += 1else:j = 0same = 0if seq_l[i] == seq_s[j]:same += 1j += 1if i < np:res[i] = max(same, res[i])i += 1if j >= nf:j = 0same = 0# 避免 "AAABCDEFGAB" 与 "AABCDEFG" 情况if rp != rf:i = next_iis_next = Truereturn resnl, ns = len(seq_long), len(seq_short)size = 0gap_list = []  # 区间范围tmp_seq_short = seq_short# print(f"[Info] seq_long: {seq_long}")# print(f"[Info] seq_short: {seq_short}")prev_idx = 0while size < ns:# print(f"[Info] tmp_seq_short: {tmp_seq_short}")res = get_seq_max_idx(seq_long, tmp_seq_short)max_val = max(res)  # 最大索引值max_indices = [i for i, x in enumerate(res) if x == max_val]for j in sorted(max_indices):# print(j, prev_idx)if j <= prev_idx:continueelse:max_idx = jbreaks_idx, e_idx = max_idx-max_val+1, max_idx+1prev_idx = e_idxgap_list.append([s_idx, e_idx])tmp_sub_long = seq_long[s_idx:e_idx]tmp_short = tmp_seq_short[:max_val]assert tmp_sub_long == tmp_shorttmp_seq_short = tmp_seq_short[max_val:]size += max_val# 验证逻辑f_seq = ""for gap in gap_list:f_seq += seq_long[gap[0]:gap[1]]assert f_seq == seq_shortreturn gap_list

从索引中,提取 PDB:

def extract_pdb_from_gap(pdb_path, output_path, gap_list):"""从残基的 gap list 提取新的 PDB 文件"""d3to1 = {'CYS': 'C', 'ASP': 'D', 'SER': 'S', 'GLN': 'Q', 'LYS': 'K','ILE': 'I', 'PRO': 'P', 'THR': 'T', 'PHE': 'F', 'ASN': 'N','GLY': 'G', 'HIS': 'H', 'LEU': 'L', 'ARG': 'R', 'TRP': 'W','ALA': 'A', 'VAL': 'V', 'GLU': 'E', 'TYR': 'Y', 'MET': 'M'}d1to3 = invert_dict(d3to1)# chain_idx = 0atom_num_idx = 1res_seq_num_idx = 0pre_res_seq_num = ""   # 残基可能是52Achain_id_list = []out_lines = []line_idx = 0lines = read_file(pdb_path)res_ca_dict = dict()for idx, line in enumerate(lines):# 只处理核心行record_type = str(line[:6].strip())  # 1~6if record_type not in ["ATOM", "HETATM"]:continuerecord_type = "ATOM"line_idx += 1# 重新设置 atom_serial_num# atom_num = int(line[6:11].strip())  # 7~11atom_num = atom_num_idxatom_num_idx += 1# 替换为标准氨基酸residue_name = str(line[17:20].strip())  # 18~20if residue_name not in d3to1_ex:continueif residue_name in d3to1_ex and residue_name not in d3to1.keys():a = d3to1_ex[residue_name]residue_name = d1to3[a]# 不修改链名chain_id = str(line[21].strip())  # 22if chain_id not in chain_id_list:  # 更换链chain_id_list.append(chain_id)pre_res_seq_num = ""# chain_idx += 1# chain_id = chr(ord("A") + chain_idx - 1)# 重新设置 res_seq_numres_seq_num = line[22:27].strip()  # 23~26 \ 23~27if pre_res_seq_num != res_seq_num:  # 更换残基pre_res_seq_num = res_seq_numres_seq_num_idx += 1res_ca_dict[res_seq_num_idx] = Falseres_seq_num = res_seq_num_idx# 确保只有一个CAatom_name = str(line[12:16].strip())  # 13~16if atom_name == "CA":if res_ca_dict[res_seq_num]:print(f"[Warning] PDB res {res_seq_num} has more than one CA! ")continueelse:res_ca_dict[res_seq_num] = Truecoordinates_x = str(line[30:38].strip())  # 31~38coordinates_y = str(line[38:46].strip())  # 39~46coordinates_z = str(line[46:54].strip())  # 47~54occupancy = str(line[54:60].strip())  # 55~60temperature_factor = str(line[60:66].strip())  # 61~66element_symbol = str(line[76:78])  # 77~78# 判断残基索引是否在 gap_list 中,其余保持不变is_skip = Truefor gap in gap_list:if gap[0] <= res_seq_num-1 < gap[1]:is_skip = Falseif is_skip:continueout_line = "{:<6}{:>5} {:^4} {:<3} {:<1}{:>4}    {:>8}{:>8}{:>8}{:>6}{:>6}          {:>2}".format(str(record_type), str(atom_num), str(atom_name), str(residue_name),str(chain_id), str(res_seq_num),str(coordinates_x), str(coordinates_y), str(coordinates_z),str(occupancy), str(temperature_factor),str(element_symbol))out_lines.append(out_line)create_empty_file(output_path)write_list_to_file(output_path, out_lines)def truncate_pdb_by_sub_seq(pdb_path, sub_seq, output_path):"""根据子序列提取新的 PDB 文件"""seq_str, n_chains, chain_dict = get_seq_from_pdb(pdb_path)pdb_seq = list(chain_dict.values())[0]try:gap_list = match_sub_seq(pdb_seq, sub_seq)except Exception as e:print(f"[Warning] input sub_seq is not pdb sub seq! {pdb_path}")return output_pathextract_pdb_from_gap(pdb_path, output_path, gap_list)# 验证逻辑seq_str, n_chains, chain_dict = get_seq_from_pdb(output_path)new_seq = list(chain_dict.values())[0]assert new_seq == sub_seq, print(f"[Error] new_seq: {new_seq}, sub_seq: {sub_seq}")return output_path

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

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

相关文章

Android:控制按键灯亮灭【button-backlight】

/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java 1.导包 import java.io.DataOutputStream; import java.io.FileOutputStream; Handler mHandler3; 2.新建handler对象 public void init(Context context, IWindowManager windowMan…

制作linux deb安装包

dpkg 命令命令详解 dpkg -i手动安装软件包(这个命令并不能解决软件包之前的依赖性问题),如果在安装某一个软件包的时候遇到了软件依赖的问题,可以用apt-get -f install在解决信赖性这个问题.     dpkg --info “软件包名” --列出软件包解包后的包名称. dpkg -l–列出当前…

java 基础面试题——问题+答案——第1期

一、问题 在Java基础面试中&#xff0c;面试官可能会问及一系列基础知识&#xff0c;以确保对Java语言的核心概念和基本特性有清晰的理解。以下是一些可能的问题&#xff1a; Java基础&#xff1a; 解释Java的基本特性。什么是Java虚拟机&#xff08;JVM&#xff09;&#xff…

2024深圳电子展,加快粤港澳电子信息发展,重点打造“湾区经济”

在“十四五”期间&#xff0c;中国电子信息产业面临着新形势和新特点。随着国家对5G、人工智能、工业互联网、物联网等“新基建”的加速推进&#xff0c;以及形成“双循环”新格局的形势&#xff0c;新型显示、集成电路等产业正在加速向国内转移。这一过程不仅带来了新的应用前…

主从复制读写分离?

主从复制和读写分离是常见的数据库架构策略&#xff0c;它们可以提高系统的性能和可靠性。下面是一个简单的实现方法&#xff1a; 主从复制&#xff1a; 配置主数据库&#xff1a;在主数据库上启用二进制日志&#xff08;binary log&#xff09;&#xff0c;用于记录所有修改数…

【ES6.0】-详细模块化、export与Import详解

【ES6.0】-详细模块化、export与Import详解 文章目录 【ES6.0】-详细模块化、export与Import详解一、模块化概述二、ES6模块化的语法规范三、export导出模块3.1 单变量导出3.2 导出多个变量3.3 导出函数3.4 导出对象第一种第二种&#xff1a; 3.5 类的导出第一种第二种 四、imp…

FFNPEG编译脚本

下面是一个ffmpeg编译脚本&#xff1a; #!/bin/bash set -eu -o pipefail set eu o pipefailFFMPEG_TAGn4.5-dev build_path$1 git_repo"https://github.com/FFmpeg/FFmpeg.git" cache_tool"" sysroot"" c_compiler"gcc" cxx_compile…

2023年亚太地区数学建模大赛 C 题

我国新能源电动汽车的发展趋势 新能源汽车是指以先进技术原理、新技术、新结构的非常规汽车燃料为动力来源&#xff08;非常规汽车燃料指汽油、柴油以外的燃料&#xff09;&#xff0c;将先进技术进行汽车动力控制和驱动相结合的汽车。新能源汽车主要包括四种类型&#xff1a;…

【mybatis注解实现条件查询】

文章目录 步骤1: 引入MyBatis依赖步骤2: 创建数据模型步骤3: 创建Mapper接口步骤4: 配置MyBatis步骤5: 执行条件查询 步骤1: 引入MyBatis依赖 <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.x.…

MobaXterm连接节点一段时间后超时Session stopped

1、MobaXterm &#xff08;1&#xff09;设置ssh 超时时间 &#xff08;2&#xff09;设置保持连接 如果服务器端设置了超时时间&#xff0c;会以服务器为准&#xff0c;具体设置&#xff1a; 2、服务端 cat /etc/ssh/sshd_config | grep "ClientAlive" 可以把设置…

一穿一戴一世界 | 紫光展锐2023智能穿戴沙龙成功举办

11月23日&#xff0c;紫光展锐在深圳成功举办了以“一穿一戴一世界”为主题的2023智能穿戴沙龙。展锐智能穿戴沙龙已举办四届&#xff0c;旨在为行业提供启发性的观点和前瞻性的创新理念。本届沙龙吸引了终端厂商、行业翘楚、生态伙伴等行业各领域超过500人汇聚一堂&#xff0c…

【HTML5-webscoket实时通信(web)】

websocket是什么&#xff1f; 就是用来创建网络聊天室&#xff0c;实时通信websocket的方法有哪些&#xff1f; https://developer.mozilla.org/zh-CN/docs/Web/API/WebSockets如何实现&#xff1a;&#xff08;以下实现流程&#xff09; 前端&#xff1a; // 直播中// 聊天web…

机器篇——决策树(六) 细说 评估指标的交叉验证

本小节&#xff0c;细说 评估指标的交叉验证。 三. 评估指标 3. 交叉验证(cross validation) (1). 概念 交叉验证(cross validation, cv) 主要用于模型训练或建模应用中&#xff0c;如分类预测、PCR、PLS 回归建模等。在给定的样本空间中&#xff0c;拿出大部分…

HCIA-RS基础-静态路由协议

摘要&#xff1a;静态路由是一种在网络中广泛应用的路由选择方案&#xff0c;它以其简单的配置和低开销而备受青睐。本文将介绍静态路由的配置方法、默认路由的设置、路由的负载分担和备份策略。通过学习本文&#xff0c;希望可以你能够掌握静态路由的基本概念和在华为模拟器中…

贪心算法个人见解

目录 基本思想&#xff1a; 贪心算法的步骤&#xff1a; 示例&#xff1a; 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种基于贪心策略的算法范式&#xff0c;它在每一步选择中都采取当前状态下的最优选择&#xff0c;而不考虑全局最优解。贪心算法通常适用于那些…

U-Boot 之九 详解 Pinctrl 子系统、命令、初始化流程、使用方法

嵌入式芯片中,引脚复用是一个非常常见的功能,U-Boot 提供一个类似 Linux Kernel 的 Pinctrl 子系统来处理引脚复用功能。正好最近用到了这部分功能,需要移植 Pinctrl 驱动,特此记录一下学习过程。 架构 U-Boot 提供一个类似 Linux Kernel 的 Pinctrl 子系统,用来统一各芯…

Double 4 VR智能互动教学系统在小语种课堂中的教学应用

小语种课堂一直是教育领域的一个难点。由于语言本身的复杂性和文化背景的差异&#xff0c;小语种教学一直是一个挑战。传统的课堂教学方法往往难以激发学生的学习兴趣和动力&#xff0c;教学效果不尽如人意。而Double 4 VR智能互动教学系统为小语种课堂带来了新的可能。 Double…

视频服务网关的三大部署(三)

视频网关是软硬一体的一款产品&#xff0c;可提供多协议&#xff08;RTSP/ONVIF/GB28181/海康ISUP/EHOME/大华、海康SDK等&#xff09;的设备视频接入、采集、处理、存储和分发等服务&#xff0c; 配合视频网关云管理平台&#xff0c;可广泛应用于安防监控、智能检测、智慧园区…

RK WiFi部分信道在部分地区无法使用的原因

不同国家支持的WiFi信道不一样&#xff0c;需要正确设置wificountrycode 修改路径&#xff1a; device\rockchip\common\BoardConfig.mk 修改内容&#xff1a;androidboot.wificountrycodeXX 该属性会被解析为 ro.boot.wificountrycode framework层会在&#xff1a; framewor…

用好语言模型:temperature、top-p等核心参数解析

编者按&#xff1a;我们如何才能更好地控制大模型的输出? 本文将介绍几个关键参数&#xff0c;帮助读者更好地理解和运用 temperature、top-p、top-k、frequency penalty 和 presence penalty 等常见参数&#xff0c;以优化语言模型的生成效果。 文章详细解释了这些参数的作用…