添加pymol快速美化脚本

在pymolrc.pml,使用:run /path/to/setup_pymol.py
This commit is contained in:
2025-11-04 11:28:14 +00:00
parent dcb6d15a16
commit 591952de90

169
setup_pymol.py Normal file
View File

@@ -0,0 +1,169 @@
# setup_pymol.py - PyMOL 自定义设置脚本
from pymol import cmd
def setup_rendering(bg_color='white', transparency=0.5, ray_shadow=False):
"""设置 PyMOL 的背景、透明度和渲染优化"""
cmd.bg_color(bg_color)
if ray_shadow:
cmd.set('ray_shadows', 'on')
cmd.set('ray_shadow', 0.2)
else:
cmd.set('ray_shadows', 'off')
cmd.set('ray_shadow', 0)
cmd.set('transparency_mode', 2)
cmd.set('transparency', transparency)
cmd.set('surface_quality', 1)
# 移除了 surface_color_by_atom因为某些版本不支持
# 使用 color 命令可以达到类似效果
print(f"✓ 渲染设置完成: 背景={bg_color}, 透明度={transparency}, 阴影={'' if ray_shadow else ''}")
def clean_structure(remove_water=True, remove_metals=True, remove_ions=True):
"""
清理结构中的水分子、金属离子和其他离子
参数:
remove_water (bool): 是否删除水分子,默认 True
remove_metals (bool): 是否删除金属离子,默认 True
remove_ions (bool): 是否删除其他常见离子,默认 True
"""
removed_items = []
# 1. 删除水分子
if remove_water:
water_count = cmd.count_atoms('resn HOH+WAT+H2O+DOD+D2O')
if water_count > 0:
cmd.remove('resn HOH+WAT+H2O+DOD+D2O')
removed_items.append(f'水分子 ({water_count} 个原子)')
# 2. 删除常见金属离子
if remove_metals:
metals = [
'NA', 'K', 'MG', 'CA', 'ZN', 'FE', 'MN', 'CU', 'NI', 'CO',
'CD', 'HG', 'PB', 'AG', 'AU', 'PT', 'CR', 'MO', 'W', 'V'
]
metal_selection = '+'.join(metals)
metal_count = cmd.count_atoms(f'resn {metal_selection}')
if metal_count > 0:
cmd.remove(f'resn {metal_selection}')
removed_items.append(f'金属离子 ({metal_count} 个原子)')
# 3. 删除其他常见离子(氯离子、硫酸根等)
if remove_ions:
ions = ['CL', 'BR', 'I', 'F', 'SO4', 'PO4', 'NO3', 'NH4']
ion_selection = '+'.join(ions)
ion_count = cmd.count_atoms(f'resn {ion_selection}')
if ion_count > 0:
cmd.remove(f'resn {ion_selection}')
removed_items.append(f'其他离子 ({ion_count} 个原子)')
if removed_items:
print("✓ 结构清理完成:")
for item in removed_items:
print(f" - 已删除 {item}")
else:
print("✓ 未发现需要清理的分子")
def create_colored_objects(protein_color='orange', nucleic_color='white', ligand_color='red'):
"""创建蛋白质、核酸和小分子对象,并应用指定颜色"""
if len(cmd.get_object_list()) == 0:
print("⚠ 警告: 未检测到已加载的结构,请先加载 PDB 文件")
return
obj_created = []
# 1. 创建蛋白质对象
if cmd.count_atoms('polymer.protein') > 0:
cmd.create('Protein_obj', 'polymer.protein')
cmd.color(protein_color, 'Protein_obj')
cmd.show('surface', 'Protein_obj')
obj_created.append(f'Protein_obj ({protein_color}, {cmd.count_atoms("Protein_obj")} 原子)')
# 2. 创建核酸对象
if cmd.count_atoms('polymer.nucleic') > 0:
cmd.create('Nucleic_obj', 'polymer.nucleic')
cmd.color(nucleic_color, 'Nucleic_obj')
cmd.show('surface', 'Nucleic_obj')
obj_created.append(f'Nucleic_obj ({nucleic_color}, {cmd.count_atoms("Nucleic_obj")} 原子)')
# 3. 创建小分子对象(排除水分子和离子)
ligand_selection = 'organic and not (resn HOH+WAT+H2O+DOD+D2O)'
if cmd.count_atoms(ligand_selection) > 0:
cmd.create('Ligand_obj', ligand_selection)
cmd.color(ligand_color, 'Ligand_obj')
cmd.show('surface', 'Ligand_obj')
obj_created.append(f'Ligand_obj ({ligand_color}, {cmd.count_atoms("Ligand_obj")} 原子)')
# 缩放到所有对象
cmd.zoom('all')
if obj_created:
print("✓ 对象创建完成:")
for obj in obj_created:
print(f" - {obj}")
else:
print("⚠ 未创建任何对象,请检查结构类型")
def quick_setup(bg_color='white', transparency=0.5,
protein_color='orange', nucleic_color='white', ligand_color='red',
clean=True):
"""
一键完成所有设置:清理结构 + 渲染优化 + 对象创建与着色
参数:
bg_color (str): 背景颜色
transparency (float): 透明度 (0-1)
protein_color (str): 蛋白质颜色
nucleic_color (str): 核酸颜色
ligand_color (str): 小分子颜色
clean (bool): 是否清理水分子和离子,默认 True
使用示例:
quick_setup() # 默认设置+清理
quick_setup(clean=False) # 不清理
quick_setup('black', 0.3, 'cyan', 'yellow', 'magenta')
"""
print("\n" + "="*60)
print("开始 PyMOL 快速设置...")
print("="*60)
# 1. 清理结构(如果启用)
if clean:
clean_structure()
# 2. 设置渲染
setup_rendering(bg_color, transparency)
# 3. 创建并着色对象
create_colored_objects(protein_color, nucleic_color, ligand_color)
print("\n" + "="*60)
print("✓ PyMOL 快速设置完成!")
print("="*60 + "\n")
# 注册函数到 PyMOL 的全局命名空间
cmd.extend('setup_rendering', setup_rendering)
cmd.extend('clean_structure', clean_structure)
cmd.extend('create_colored_objects', create_colored_objects)
cmd.extend('quick_setup', quick_setup)
print("\n" + "="*60)
print("PyMOL 自定义函数已加载")
print("\n可用命令:")
print(" setup_rendering - 设置背景和渲染")
print(" clean_structure - 清理水分子和离子")
print(" create_colored_objects - 创建并着色对象")
print(" quick_setup - 一键完成所有设置")
print("\n使用示例:")
print(" quick_setup() # 默认设置(包含清理)")
print(" quick_setup(clean=False) # 不清理水和离子")
print(" clean_structure() # 单独清理")
print("="*60 + "\n")