如何通过Pymol API批量计算蛋白质/RNA的二面角?
解决Pymol批量计算残基二面角并生成指定格式结果文件的问题
你的脚本存在几个核心问题:未捕获二面角计算值、遍历范围错误导致重复计算、输出格式不符合要求、未处理无特定原子的残基,以及未实现文件写入。以下是修正后的完整方案:
修正后的Pymol脚本
def calc_dihedral(model, chain, segi, resn, resi): # 定义目标原子名列表 target_atoms = ["CB", "CA", "N", "C"] # 构建每个原子的选择路径 atom_selections = [f"/{model}/{chain}/{segi}/{resn}`{resi}/{name}" for name in target_atoms] # 检查当前残基是否包含所有目标原子(跳过甘氨酸这类无CB的残基) if not all(cmd.select(f"({sel})") for sel in atom_selections): return # 获取二面角数值 dihedral_value = cmd.get_dihedral(*atom_selections, state=0) # 生成指定格式的输出行 output_line = f"{target_atoms[0]} {target_atoms[1]} {target_atoms[2]} {target_atoms[3]} {dihedral_value:.2f}" # 打印到控制台 print(output_line) # 写入结果文件(追加模式) with open("dihedral_results.txt", "a") as f: f.write(output_line + "\n") # 初始化结果文件,清空原有内容并写入表头 with open("dihedral_results.txt", "w") as f: f.write("ATOM1 ATOM2 ATOM3 ATOM4 DIHEDRAL\n") myspace = {'calc_dihedral': calc_dihedral} # 按残基遍历而非所有原子,避免重复计算 cmd.iterate('(all)', 'calc_dihedral(model, chain, segi, resn, resi)', space=myspace, quiet=1)
关键修改说明
- 遍历范围优化:将遍历
(all)改为按残基维度遍历,避免同一残基被重复计算多次 - 原子存在性检查:添加判断逻辑,跳过无CB原子的残基(如甘氨酸),避免运行报错
- 捕获计算结果:保存
cmd.get_dihedral的返回值,用于后续输出 - 格式匹配:直接使用原子名而非完整选择路径输出,严格匹配
NAME NAME NAME NAME DIHEDRAL格式 - 文件输出:初始化结果文件并写入表头,同时实现控制台打印+文件写入双重输出
内容的提问来源于stack exchange,提问作者Riccardo Fusco
相关产品推荐
相关产品推荐

