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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:45:39