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')