Biopython的PDB模块能否处理CONECT记录?丢失记录该如何解决?
Biopython处理PDB文件保留CONECT记录的解决方案
- Biopython的
PDBParser默认不会读取CONECT记录,PDBIO默认也不会写入该类记录,这是因为核心的结构层级对象没有内置存储共价键连接信息的属性,所以常规读写流程会直接丢失CONECT内容,可通过以下两种方法解决:
方案1:使用内置参数读取CONECT并手动写入
适用于需要对结构做复杂操作(如原子修改、坐标对齐等)的场景:
- Biopython 1.78及以上版本的
PDBParser支持get_conect=True参数,读取到的CONECT信息会存储在结构对象的connect_dict属性中,键为原子序列号,值为该原子连接的其他原子序列号列表。 - 用
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
相关产品推荐
相关产品推荐

