蛋白质结构中pdb_strand_id和asym_id相互转化

server/2024/10/20 17:34:34/

pdb_strand_id:是历史上由 PDB 数据库定义的链标识符,用于区分同一PDB文件中不同的链(可以是多肽链或核酸链)。这是结构解析过程中最常见的链标识符。

asym_id:是 mmCIF 格式中使用的一个标识符,表示非对称单元的标识符。它通常表示结构中的一个独立的多肽或核酸链,并用于细致描述每个非对称单元的内容。

mmseqs2进行pdb蛋白质序列聚类分析结果中(mmseqs2进行pdb蛋白质序列聚类分析_mmseq2-CSDN博客),链的ID为pdb_strand_id,而 解析批量下载的mmCif复合体结构并保存为.pt格式文件(解析批量下载的mmCif复合体结构并保存为.pt格式文件-CSDN博客)结果中链的编号为asym_id。再下游模型训练时需要把cluster.csv(mmseqs2蛋白质聚类数据格式转化-CSDN博客) 中 pdb_strand_id转为asym_id。

示例代码:

### 蛋白质链的映射:pdb_strand_id 转 asym_id import tempfile
from Bio.PDB import *
from mmcif.io.PdbxReader import PdbxReader
import osdef find_file_in_directory(file_name, search_directory):# 遍历指定目录及其子目录for root, dirs, files in os.walk(search_directory):# 检查当前目录中的文件是否与指定文件名匹配if file_name in files:# 返回文件的完整路径return os.path.join(root, file_name)# 如果没有找到,返回Nonereturn Nonedef parse_pdb_chain_to_asym_map(pdb_id, search_directory):"""biopython下载.cif结构文件到临时文件夹并解析链 PDB ID 到 asym ID 的映射:param pdb_id: 目标蛋白质结构的 PDB ID:return: 链 PDB ID 到 asym ID 的映射字典"""file_name =  pdb_id.lower() + '.cif'# 先查找有没有本地文件file_path = find_file_in_directory(file_name, search_directory)data = [] # 存储解析后的数据if file_path:with open(file_path, 'r') as file:reader = PdbxReader(file)reader.read(data)else:# 创建临时目录 with tempfile.TemporaryDirectory() as temp_dir:pdbl = PDBList()# 它将从服务器下载指定的文件(2fat.cif)并将其存储在当前工作目录中。pdbl.retrieve_pdb_file(pdb_id, pdir = temp_dir, file_format = 'mmCif')temp_file = os.path.join(temp_dir,file_name)print(temp_file)# 读取并解析 CIF 文件with open(temp_file, 'r') as file:reader = PdbxReader(file)reader.read(data)# 获取 pdbx_poly_seq_scheme 对象block = data[0]pdbx_poly_seq_scheme = block.getObj('pdbx_poly_seq_scheme')# 提取 pdb_strand_id 和 asym_id_idx 的列索引strand_id_idx = pdbx_poly_seq_scheme.getAttributeIndex('pdb_strand_id')  # pdb_strand_idasym_id_idx = pdbx_poly_seq_scheme.getAttributeIndex('asym_id')  # asym_id# 获取对应的值strand_ids = pdbx_poly_seq_scheme.getColumn(strand_id_idx)#print(pdb_strand_ids)asym_ids = pdbx_poly_seq_scheme.getColumn(asym_id_idx)# 加上pdb_id号  pdb_strand_ids = [f"{pdb_id}_{strand_id}" for strand_id in strand_ids]pdb_asym_ids = [f"{pdb_id}_{asym_id}" for asym_id in asym_ids]id_map = {}for pdb_strand_id, pdb_asym_id in zip(pdb_strand_ids, pdb_asym_ids):id_map.update([(pdb_strand_id, pdb_asym_id)])return id_map# 示例用法
pdb_id = "5d0j"
id_map = parse_pdb_chain_to_asym_map(pdb_id, "/Users/zhengxueming/test/mmcif")
print(id_map)

批量转换并保存:


import csv## 读取原始数据
with open("test_cluster.csv", 'r') as csvfile:reader = list(csv.reader(csvfile))data = reader[1:]   # 读取数据部分# 得到所有映射的字典cluster_ids = [ item[1].split('_')[0] for item in data ]homolog_ids = [ item[2].split(',') for item in data ]homolog_ids = [ id.split('_')[0] for item in homolog_ids for id in item ]#print(cluster_ids)#print(homolog_ids)pdb_ids = cluster_ids + homolog_idspdb_ids = set(pdb_ids)#print(pdb_ids)pdb_chain_to_asym_map = {}
for id in pdb_ids:#print(id)id_map = parse_pdb_chain_to_asym_map(id, "/Users/zhengxueming/test/mmcif")pdb_chain_to_asym_map.update(id_map)print(pdb_chain_to_asym_map)## 根据new_chain_to_entity_map,替换test_cluster.csv中链PDB ID 为 entity ID并保存到新的csv文件中
with open("test_cluster.csv", 'r') as csvfile:reader = list(csv.reader(csvfile))data = reader[1:]   # 读取数据部分with open("new_test_cluster.csv", 'w', newline='') as csvfile:writer = csv.writer(csvfile)writer.writerow(["IDX","HOMOLOG"])for idx, cluster_id, homolog_ids in data:homolog_id_lst = homolog_ids.split(',')all_id_lst = [cluster_id] + homolog_id_lstwriter.writerow([idx, ','.join([pdb_chain_to_asym_map[pdb_id] for pdb_id in all_id_lst if pdb_id in pdb_chain_to_asym_map.keys()])])

转化前:

转化后:

## 第一列为 index, 第二列为同源序列,其中第一个为代表序列(合并了原来的第二列和第三列后再转化)。


http://www.ppmy.cn/server/133402.html

相关文章

【JavaSE】Java的基础概念

文章目录 JavaSE和JavaEEJVM,JDK,JREJVM字节码什么是字节码 JDK和JREJDK,JRE,JVM,JIT之间的关系 JavaSE和JavaEE JavaSE:Java平台标准版,Java编程语言的基础,包含Java应用程序开发和运行的核心类库和虚拟机等核心组件.JavaEE:Java平台企业版,建立在JavaSE的基础上,增加了支持企…

uni-app写的微信小程序如何体积太大如何处理

方法一:对主包进行分包处理,将使用url: /pages/components/equipment/equipment跳转页面的全部拆分为分包,如url: /pagesS/components/equipment/equipment 在pages.json中添加 "subPackages": [{ "root"…

【C++篇】领会C++标准库:STL

文章目录 前言 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗&#xff1…

认识python数据分析

Python作为一种高效、灵活且易于学习的编程语言,在数据分析领域展现出了强大的应用潜力。 从数据清洗、预处理到复杂的统计分析、可视化及机器学习模型的构建,Python提供了丰富的库和框架,极大地简化了数据分析的流程,提高了工作…

Rhymes AI发布首款开源多模态AI模型Aria 性能超越GPT-4o mini等多家知名AI模型

最近,日本东京的初创公司 Rhymes AI 推出了他们的首款人工智能模型 ——Aria。该公司自称,Aria 是全球首个开源的多模态混合专家(MoE)模型。这个模型不仅具有处理多种输入模态的能力,还声称在能力上与一些知名的商业模…

基于springboot+thymeleaf+springsecurity搭建一套web小案例

一、前言 本案例中的源代码已上传到资源库,可自行下载,传送阵 https://download.csdn.net/download/qq_36260963/89906196 Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的,使用它可以做到专注于Spring应用的开发&#x…

iptables 命令详解

iptables 是 Linux 中用于设置、维护和检查 IP 数据包过滤规则的命令。它是一个强大的工具,广泛用于网络防火墙、安全性和网络地址转换 (NAT) 等。 以下是 iptables 命令的主要选项及其详细说明。 1. 基本语法 iptables [选项] [链名称] [规则匹配条件] [动作][选…

Flutter开发的树莓派应用如何优化性能?

哈喽,我是老刘 前段时间有朋友咨询我在树莓派上开发的Flutter程序如何优化性能的问题。 老刘写了6年多的Flutter代码,树莓派这种平台还真是头一次碰到。 不过我听他说完他们的场景,我就知道他们大概率是碰到性能问题了。 那么今天就来说说这…