From 591952de90551aff43d86c377d9fb25d4f416944 Mon Sep 17 00:00:00 2001 From: lingyuzeng Date: Tue, 4 Nov 2025 11:28:14 +0000 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0pymol=E5=BF=AB=E9=80=9F?= =?UTF-8?q?=E7=BE=8E=E5=8C=96=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在pymolrc.pml,使用:run /path/to/setup_pymol.py --- setup_pymol.py | 169 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 setup_pymol.py diff --git a/setup_pymol.py b/setup_pymol.py new file mode 100644 index 0000000..d447c0c --- /dev/null +++ b/setup_pymol.py @@ -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") \ No newline at end of file