计算与思考

记录我的计算生物学和思考

pymol蛋白氢键绘制与残基界面观察

我已经获取了对接后的蛋白模型,由一个配体ligand和一个受体receptor组成,分为两条链。现在,我需要观察残基落在结构域的哪一部分,因此,用pymol最直观。

以下代码均为pymol代码,需要在pymol环境下输入。注意,此处我假设该蛋白是双链且命名为A,B。且0001为文件名称(0001.pdb)。XXX为受体名称,配体名称为ab。请自行查找替换代码中标识的位置为你的对应名称。

# 1. 提取界面残基 (A链=XXX受体, B链=ab配体)
select XXX_int_0001, byres((0001 and chain A) within 4.0 of (0001 and chain B))
select ab_int_0001, byres((0001 and chain B) within 4.0 of (0001 and chain A))

# 2. 根据你提供的残基号,定义 XXX受体 的 A1 和 A2 结构域,最末尾的数字为结构域长度。
#这里,代码格式为select 你想叫的结构域名称,文件名 and chain ? and 哪些残基属于这个结构域。
select XXX_A1, 0001 and chain A and resi 100-159
select XXX_A2, 0001 and chain A and resi 210-250

# 3. 找出真正落在 A1 和 A2 上的界面残基(交集)
select A1_binding_site, XXX_int_0001 and XXX_A1
select A2_binding_site, XXX_int_0001 and XXX_A2

# 4. 隐藏  模型的所有结构
hide everything, 0001

# 5. 显示界面残基为棒状
show sticks, XXX_int_0001
show sticks, ab_int_0001

# 6. 精准配色!
# 抗体配体 (B链) 显示为品红色
color magenta, ab_int_0001
# XXX受体 (A链) 界面默认设为灰色
color gray80, XXX_int_0001
# 将落在 A1 上的界面残基高亮为亮蓝色
color cyan, A1_binding_site
# 将落在 A2 上的界面残基高亮为深蓝色
# (注意: 如果你的模型没有结合在A2,这个命令不会报错,只是没有原子被上色)
color marine, A2_binding_site

# 7. 重新计算并显示氢键(橙红色虚线)
distance hb_0001_new, ab_int_0001, XXX_int_0001, mode=2
hide labels, hb_0001_new
color orange-red, hb_0001_new
set dash_width, 3, hb_0001_new

# 8. 在界面文本框打印出落在 A1 和 A2 上的残基名称和序号
print "=== XXX A1 结合残基 ==="
iterate A1_binding_site, print(resn + " " + resi)
print "=== XXX A2 结合残基 ==="
iterate A2_binding_site, print(resn + " " + resi)

# 9. 聚焦并摆正视角
zoom XXX_int_0001 ab_int_0001
orient XXX_int_0001 ab_int_0001

当然,如果你觉得每次替换都很麻烦,也可以用我的自制小脚本。需要在Python环境下运行。

/下载链接

# -*- coding: utf-8 -*-
import os
import re

def generate_pymol_script(folder_path, xxx_replacement=None):
    """
    根据文件夹名称生成PyMOL脚本
    
    Args:
        folder_path: 文件夹路径
        xxx_replacement: 用于替换XXX的字符串,如果为None则使用文件夹名
    """
    # 获取文件夹名称
    folder_name = os.path.basename(folder_path)
    
    # 提取数字部分(保留前导零,当作文本处理)
    match = re.search(r'BC_(\d+)', folder_name)
    if match:
        number = match.group(1)  # 保留原始数字文本,包括前导零
    else:
        number = folder_name
    
    # 对象名使用完整的文件夹名(如 BC_00714),以字母开头,PyMOL可直接识别
    obj_name = folder_name
    
    # 如果没有提供XXX替换值,使用文件夹名
    if xxx_replacement is None:
        xxx_replacement = folder_name
    
    # 模板代码
    # {OBJ_NAME} = PyMOL中的对象名(完整文件夹名)
    # 0001 = 作为选择名后缀的数字
    template = """# 1. 提取界面残基 (A链=XXX受体, B链=ab配体) 
 select XXX_int_0001, byres(({OBJ_NAME} and chain A) within 4.0 of ({OBJ_NAME} and chain B)) 
 select ab_int_0001, byres(({OBJ_NAME} and chain B) within 4.0 of ({OBJ_NAME} and chain A)) 
 
 # 2. 根据你提供的残基号,定义 XXX受体 的 A1 和 A2 结构域,最末尾的数字为结构域长度。 
 #这里,代码格式为select 你想叫的结构域名称,文件名 and chain ? and 哪些残基属于这个结构域。 
 select XXX_A1, {OBJ_NAME} and chain A and resi 100-159 
 select XXX_A2, {OBJ_NAME} and chain A and resi 210-250 
 
 # 3. 找出真正落在 A1 和 A2 上的界面残基(交集) 
 select A1_binding_site, XXX_int_0001 and XXX_A1 
 select A2_binding_site, XXX_int_0001 and XXX_A2 
 
 # 4. 隐藏  模型的所有结构 
 hide everything, {OBJ_NAME} 
 
 # 5. 显示界面残基为棒状 
 show sticks, XXX_int_0001 
 show sticks, ab_int_0001 
 
 # 6. 精准配色! 
 # 抗体配体 (B链) 显示为品红色 
 color magenta, ab_int_0001 
 # XXX受体 (A链) 界面默认设为灰色 
 color gray80, XXX_int_0001 
 # 将落在 A1 上的界面残基高亮为亮蓝色 
 color cyan, A1_binding_site 
 # 将落在 A2 上的界面残基高亮为深蓝色 
 # (注意: 如果你的模型没有结合在A2,这个命令不会报错,只是没有原子被上色) 
 color marine, A2_binding_site 
 
 # 7. 重新计算并显示氢键(橙红色虚线) 
 distance hb_0001_new, ab_int_0001, XXX_int_0001, mode=2 
 hide labels, hb_0001_new 
 color orange-red, hb_0001_new 
 set dash_width, 3, hb_0001_new 
 
 # 8. 在界面文本框打印出落在 A1 和 A2 上的残基名称和序号 
 print "=== XXX A1 结合残基 ===" 
 iterate A1_binding_site, print(resn + " " + resi) 
 print "=== XXX A2 结合残基 ===" 
 iterate A2_binding_site, print(resn + " " + resi) 
 
 # 9. 聚焦并摆正视角 
 zoom XXX_int_0001 ab_int_0001 
 orient XXX_int_0001 ab_int_0001"""
    
    # 替换占位符
    result = template.replace('XXX', xxx_replacement)
    result = result.replace('{OBJ_NAME}', obj_name)
    result = result.replace('0001', number)
    
    # 获取脚本所在目录
    script_dir = os.path.dirname(os.path.abspath(__file__))
    
    # 输出文件路径(放到脚本所在目录)
    output_path = os.path.join(script_dir, f'{folder_name}_pymol_script.txt')
    
    # 写入文件
    with open(output_path, 'w', encoding='utf-8') as f:
        f.write(result)
    
    print(f"已生成: {output_path}")
    return output_path

if __name__ == '__main__':
    # 获取脚本所在目录
    script_dir = os.path.dirname(os.path.abspath(__file__))
    # 获取脚本所在文件夹的名称
    folder_name = os.path.basename(script_dir)
    # 构建完整路径
    folder_path = os.path.join(script_dir)
    
    # 使用 aa 作为XXX替换值
    generate_pymol_script(folder_path, 'aa')

发表回复

Your email address will not be published. Required fields are marked *.

*
*

滇ICP备2026013454号-1