You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从含双HEADER的单PDB文件中提取复合物组分并重命名蛋白链

我有一个PDB文件,其中包含两个分子:受体(receptor)和配体(ligand),每个分子都有独立的HEADER,所有内容都存放在同一个PDB文件中。

受体部分的HEADER如下(对应PDB文件第1-6行):

HEADER rec.pdb
REMARK original generated coordinate pdb file
ATOM      1  N   GLY A   1     -51.221 -13.970  37.091  1.00  0.00      RA0  N
ATOM      2  H   GLY A   1     -50.383 -13.584  37.482  1.00  0.00      RA0  H
ATOM      3  CA  GLY A   1     -50.902 -15.071  36.197  1.00  0.00      RA0  C
ATOM      4  C   GLY A   1     -49.525 -15.659  36.443  1.00  0.00      RA0  C

配体部分对应PDB文件的第11435至11440行,内容如下:

HEADER lig.000.00.pdb
ATOM      1  N   MET A   1      27.318 -26.957  12.663  1.00  0.00      LA0  N
ATOM      2  H   MET A   1      27.313 -27.570  11.870  1.00  0.00      LA0  H
ATOM      3  CA  MET A   1      28.374 -27.102  13.668  1.00  0.00      LA0  C
ATOM      4  CB  MET A   1      28.531 -28.564  14.090  1.00  0.00      LA0  C
ATOM      5  CG  MET A   1      27.224 -29.154  14.628  1.00  0.00      LA0  C

注意:受体和配体的ATOM行第11列分别带有标识字符串RA0和LA0。

我的需求是将受体的链ID重命名为A,配体的链ID重命名为B。我计划先将两个部分分别提取为独立对象,修改链ID后再合并为同一个PDB文件。

我使用Bio3D包编写了如下R代码,但运行失败,提取配体时提示无匹配条目:

library(bio3d)
pdb_infile <- "myfile.pdb"

pdb <- read.pdb(pdb_infile)
receptor_segment.sele <- atom.select(pdb, segid = "RA0",  verbose = TRUE)
receptor_pdb <- trim.pdb(pdb, receptor_segment.sele)
ligand_segment.sele <- atom.select(pdb, segid = "LA0",  verbose = TRUE)
ligand_pdb <- trim.pdb(pdb, ligand_segment.sele) # showed no entry

请问该如何实现需求?可接受R或Python语言的解决方案。


解决方案

方案1:Python纯文本处理(无额外依赖,最稳妥)

原Bio3D代码失败的核心原因是read.pdb默认只会读取第一个HEADER对应的结构,后续配体部分的内容会被默认忽略,直接操作原始文本可以完全规避这个问题:

with open("myfile.pdb", "r", encoding="utf-8") as f_in, open("output.pdb", "w", encoding="utf-8") as f_out:
    for line in f_in:
        if line.startswith("ATOM"):
            # PDB格式中segid位于第73-76列(0索引切片为72:76),去空格后匹配标识
            segid = line[72:76].strip()
            if segid == "RA0":
                # 链ID位于第22列(0索引为21),替换为A
                line = line[:21] + "A" + line[22:]
            elif segid == "LA0":
                # 替换链ID为B
                line = line[:21] + "B" + line[22:]
        f_out.write(line)

运行后直接得到修改好链ID的PDB文件,所有原有注释、HEADER信息都会保留。

方案2:R Bio3D修正方案

如果要继续使用Bio3D,需要开启多结构读取参数:

library(bio3d)
# 开启multi参数读取所有结构
pdb <- read.pdb("myfile.pdb", multi = TRUE)
# 直接按segid列筛选修改
pdb$atom$chain[pdb$atom$segid == "RA0"] <- "A"
pdb$atom$chain[pdb$atom$segid == "LA0"] <- "B"
# 输出结果
write.pdb(pdb, file = "output.pdb")

如果开启multi = TRUE后仍然无法匹配到LA0的条目,直接使用方案1即可。


内容的提问来源于stack exchange,提问作者littleworth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:06:01