当前位置: 首页 > article >正文

pdb_strand_id、asym_id 和 entity_id的相互映射

在 mmCIF 文件中,pdb_strand_idasym_id 和 entity_id 是三个关键的标识符,用于描述生物大分子结构中的不同层次和单位。本示例代码将读取一个 .cif.gz 压缩格式的 mmCIF 文件,并提取其中的 entity_poly 和 pdbx_poly_seq_scheme 对象的信息,并构建了链 ID 到非对称单位 ID、实体 ID 到标准氨基酸序列的映射字典。

    • pdb_strand_id 更接近于 PDB 文件格式的传统链标识符,常用于表示 PDB 文件中的链 ID(如链 A、链 B 等)。
    • asym_id 是 mmCIF 文件中的标识符,通常用于表示非对称单元中的具体链,具有更严格的定义,尤其是在涉及对称关系或多个副本时。
    • 在很多情况下,pdb_strand_id 和 asym_id 是相同的,尤其是在结构简单且没有对称关系的情况下,但对于更加复杂的结构或包含对称操作的结构,它们可能不同。
    • entity_id 表示的是整个结构中的一个生物分子实体,和链的编号(pdb_strand_id 和 asym_id)不同。entity_id 用来标识分子层面的唯一实体,而不是具体的物理副本。​​​​​​​

代码:

from mmcif.io.PdbxReader import PdbxReader
import gzip

# mmCIF 文件路径
cif_file_path = '/path/to/your/file.cif.gz'

data = []
# 打开并读取 gzipped mmCIF 文件
with gzip.open(cif_file_path, 'rt') as cif:
    reader = PdbxReader(cif)
    reader.read(data)

# 提取第一个数据块
data = data[0]

# 获取 pdbx_poly_seq_scheme 对象
pdbx_poly_seq_scheme = data.getObj('pdbx_poly_seq_scheme')

# 获取 entity_poly 对象
entity_poly = data.getObj('entity_poly')

# 打印 entity_poly 的所有行信息
for row in entity_poly.getRowList():
    #print(row)
    #print("=====")
    entity_id = row[entity_poly.getIndex('entity_id')]
    polymer_type = row[entity_poly.getIndex('type')]
    strand_id = row[entity_poly.getIndex('pdbx_strand_id')]
    sequence = row[entity_poly.getIndex('pdbx_seq_one_letter_code_can')]
    
    #print(row[entity_poly.getIndex('num_poly_seq')])

    print(f'Entity ID: {entity_id}, Type: {polymer_type}, Strand ID: {strand_id}, Sequence: {sequence}')

# pdbx_strand_id 到 asym_id 映射
pdb2asym = dict({
        (r[pdbx_poly_seq_scheme.getIndex('pdb_strand_id')],
         r[pdbx_poly_seq_scheme.getIndex('asym_id')]) 
        for r in data.getObj('pdbx_poly_seq_scheme').getRowList()
    })

# asym_id 到 entity_id 映射
chs2num = {pdb2asym[ch]:r[entity_poly.getIndex('entity_id')] 
               for r in entity_poly.getRowList() 
               for ch in r[entity_poly.getIndex('pdbx_strand_id')].split(',')
               if r[entity_poly.getIndex('type')]=='polypeptide(L)'}

# get canonical sequences for polypeptide chains
# entity_id中多肽链的序列
num2seq = {r[entity_poly.getIndex('entity_id')]:r[entity_poly.getIndex('pdbx_seq_one_letter_code_can')].replace('\n','') 
           for r in entity_poly.getRowList() 
           if r[entity_poly.getIndex('type')]=='polypeptide(L)'}


print(pdb2asym)
print(chs2num)
print(num2seq)

相同的序列,共享相同的 entity_id

当一个生物分子形成复合物时,可能会有多个相同的链重复出现,这些链属于同一个生物分子(entity),但每条链对应不同的 chain_id。比如一个二聚体蛋白质结构,其中每个亚基是相同的蛋白质序列,这些亚基会被标识为不同的 chain_id,但它们共享相同的 entity_id


http://www.kler.cn/a/323411.html

相关文章:

  • # ubuntu 安装的pycharm不能输入中文的解决方法
  • 【C++】深入理解 C++ 优先级队列、容器适配器与 deque:实现与应用解析
  • 【WebRTC】视频发送链路中类的简单分析(下)
  • MySQL Online DDL
  • C++中 ,new int(10),new int(),new int[10],new int[10]()
  • 从电动汽车到车载充电器:LM317LBDR2G 线性稳压器在汽车中的多场景应用
  • 将Pytorch环境打包,快速部署到另一台机器上(在没有网络,或者网络环境不好的情况下推荐使用)
  • 如何禁止电脑上某个软件运行?电脑设置禁止运行软件的4个方法速成
  • 【深度学习基础模型】去噪自编码器 (Denoising Autoencoders, DAE)详细理解并附实现代码。
  • 如何正确连接和使用滑动变阻器?
  • 信息技术网络安全政策制定
  • GO Serial 学习与使用
  • 决策树与随机森林在机器学习中的应用
  • [数据集][目标检测]猪数据集VOC-2856张
  • 一文上手Kafka【下】
  • 快速订餐:Spring Boot 点餐系统
  • 搭建本地AI聊天界面:Open WebUI与Ollama实战指南
  • 63.【C语言】再议结构体(上)
  • 算法打卡:第十一章 图论part08
  • 什么是算力?cpu+显卡吗?
  • 【JAVA-数据结构】时间和空间复杂度
  • ubuntu中通过源码安装pointnet2_ops_lib
  • 360周鸿祎为什么说大模型已成茶叶蛋?
  • html+css+js实现Progress 进度条
  • 差速轮纯跟踪算法
  • 设备管理平台-支持快速开发