Files
pymol/setup_pymol.py
lingyuzeng 591952de90 添加pymol快速美化脚本
在pymolrc.pml,使用:run /path/to/setup_pymol.py
2025-11-04 11:28:14 +00:00

169 lines
6.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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")