Biopython中克隆PDB文件链并整合至同一结构的最简方法
解决Biopython PDB模块复制并重命名链的问题
Biopython的PDB模块确实没有现成的一行式克隆链函数,不过可以自己封装一个简单的工具函数来实现需求,同时避免ID冲突。以下是具体实现步骤和代码:
核心思路
手动遍历源链的所有残基和原子,逐个复制它们的属性(坐标、ID、名称等),创建新的链对象并设置新的链ID,最后将新链添加到模型中。后续再对新链应用对称矩阵完成坐标转换。
完整代码示例
from Bio.PDB import PDBParser, PDBIO, StructureBuilder import numpy as np def clone_chain(source_chain, new_chain_id): # 创建新链对象 builder = StructureBuilder.StructureBuilder() builder.init_chain(new_chain_id) # 遍历源链的每个残基 for res in source_chain: # 初始化新残基(保留残基ID、插入码等) builder.init_residue(res.get_resname(), res.get_id()[0], res.get_id()[1], res.get_id()[2]) # 遍历残基的每个原子 for atom in res: # 复制原子坐标、名称、ID、B因子等属性 builder.init_atom( atom.get_name(), atom.get_coord().copy(), # 复制坐标数组,避免引用同一对象 atom.get_bfactor(), atom.get_occupancy(), atom.get_altloc(), atom.get_fullname(), atom.get_serial_number(), atom.get_element() ) return builder.get_chain() # 1. 读取原始PDB结构 parser = PDBParser(QUIET=True) structure = parser.get_structure("my_structure", "input.pdb") model = structure[0] # 取第一个模型(大多数PDB只有一个模型) chain_a = model["A"] # 2. 克隆链A为链B chain_b = clone_chain(chain_a, "B") model.add(chain_b) # 3. 应用对称矩阵转换链B的坐标(示例矩阵,替换为你的实际矩阵) symmetry_matrix = np.array([ [-1, 0, 0, 0], [0, 1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1] ]) for res in chain_b: for atom in res: coord = atom.get_coord() # 转换为齐次坐标并应用矩阵 homogeneous_coord = np.append(coord, 1) new_homogeneous = symmetry_matrix.dot(homogeneous_coord) new_coord = new_homogeneous[:3] atom.set_coord(new_coord) # 4. 保存修改后的结构 io = PDBIO() io.set_structure(structure) io.save("output.pdb")
关键细节说明
- 避免ID冲突:新链使用全新的链ID(示例中为"B"),残基和原子的ID在链内保持唯一即可,无需修改,因为不同链的ID不会互相干扰。
- 坐标复制:使用
atom.get_coord().copy()确保新原子拥有独立的坐标数组,后续修改不会影响原链。 - 对称矩阵应用:将原子坐标转换为齐次坐标后与矩阵相乘,再转换回三维坐标,这是PDB结构中应用对称变换的标准方式。
内容的提问来源于stack exchange,提问作者biohacker
相关产品推荐
相关产品推荐

