如何从含双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
相关产品推荐
相关产品推荐

