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

Biopython的PDB模块能否处理CONECT记录?丢失记录该如何解决?

Biopython处理PDB文件保留CONECT记录的解决方案
  • Biopython的PDBParser默认不会读取CONECT记录,PDBIO默认也不会写入该类记录,这是因为核心的结构层级对象没有内置存储共价键连接信息的属性,所以常规读写流程会直接丢失CONECT内容,可通过以下两种方法解决:

方案1:使用内置参数读取CONECT并手动写入

适用于需要对结构做复杂操作(如原子修改、坐标对齐等)的场景:

  1. Biopython 1.78及以上版本的PDBParser支持get_conect=True参数,读取到的CONECT信息会存储在结构对象的connect_dict属性中,键为原子序列号,值为该原子连接的其他原子序列号列表。
  2. 用PDBIO完成原子写入后,手动筛选保留原子对应的CONECT记录,按PDB格式规范追加到输出文件末尾即可。
    示例代码:
from Bio.PDB import PDBParser, PDBIO

# 读取PDB时开启CONECT读取参数
parser = PDBParser(QUIET=True, get_conect=True)
struct = parser.get_structure("input_struct", "input.pdb")

# 此处插入你的配体提取逻辑,如筛选特定残基、链的原子
io = PDBIO()
io.set_structure(struct)

with open("output.pdb", "w") as f:
    # 先写入原子信息,暂不写END标记
    io.save(f, write_end=False)
    # 收集所有保留的原子序列号
    kept_atom_serial = {
        atom.get_serial_number() 
        for model in struct 
        for chain in model 
        for residue in chain 
        for atom in residue
    }
    # 筛选并写入符合要求的CONECT记录
    for atom_serial, connected_serials in struct.connect_dict.items():
        if atom_serial not in kept_atom_serial:
            continue
        # 过滤掉已被删除的原子连接
        valid_connected = [s for s in connected_serials if s in kept_atom_serial]
        if not valid_connected:
            continue
        # 按PDB规范拼接CONECT行,每行固定80字符
        conect_line = f"CONECT{atom_serial:5d}"
        for s in valid_connected:
            conect_line += f"{s:5d}"
        conect_line = conect_line.ljust(80)
        f.write(f"{conect_line}\n")
    # 写入结束标记
    f.write("END".ljust(80) + "\n")

方案2:直接读写原始PDB行

适用于仅需简单筛选配体、不需要修改结构的场景,不受Biopython版本限制,效率更高:
直接逐行解析原始PDB文件,先筛选出目标HETATM行并收集对应原子序列号,再筛选包含这些序列号的CONECT行,一起写入新文件即可。
示例代码:

kept_serials = set()
with open("input.pdb", "r") as f_in, open("output.pdb", "w") as f_out:
    # 第一遍遍历:筛选目标HETATM行,收集对应原子序列号
    for line in f_in:
        if line.startswith("HETATM"):
            # 此处替换为你的配体筛选规则,如残基名、链ID匹配
            res_name = line[17:20].strip()
            chain_id = line[21:22].strip()
            if res_name == "LIG" and chain_id == "A":
                serial = int(line[6:11].strip())
                kept_serials.add(serial)
                f_out.write(line)
    # 第二遍遍历:筛选匹配的CONECT行写入
    f_in.seek(0)
    for line in f_in:
        if line.startswith("CONECT"):
            first_serial = int(line[6:11].strip())
            if first_serial in kept_serials:
                f_out.write(line)
    f_out.write("END\n")

注意事项

  • 低于1.78的Biopython版本不支持get_conect参数,建议优先升级版本,或直接使用方案2处理。
  • 如果你修改了原子的序列号,需要同步调整CONECT记录中对应的序列号值,避免连接关系错位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:48:00