Files
pymol/script/ppi.py
2024-09-07 09:12:14 +08:00

102 lines
2.9 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.
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@file :ppi.py
@Description: :
@Date :2023/09/01 16:56:22
@Author :lyzeng
@Email :pylyzeng@gmail.com
@version :1.0
'''
import sys
from dataclasses import dataclass, field, InitVar
from functools import partial
from pymol import cmd
from pymol.cmd import util
from pathlib import Path
from collections import defaultdict
# local import
from .pymolbase import PyMOLBase
@dataclass
class PyMOLConcrete(PyMOLBase):
file: Path
ligand_positions: defaultdict = field(default_factory=lambda: defaultdict(list), init=False)
def __post_init__(self, file):
self.load_file(file)
self.global_obj_name = self.cleanpdb(file.stem)
def load_file(self, file):
# 加载文件到PyMOL这里是一个示例您可能需要使用实际的PyMOL命令
cmd.load(file)
pass
def collect_ligand_positions(self, model, chain, resn, resi):
position = f'/{model}//{chain}/{resi}'
self.ligand_positions[resn].append(position)
def gather_ligand_info(self):
cmd.iterate('organ', 'collect_ligand_positions(model, chain, resn, resi)', space={'collect_ligand_positions': partial(self.collect_ligand_positions)})
@staticmethod
def cleanpdb(before_string):
"""
处理传入参数pdb 例如: pdb1b12.ent 1b12.pdb 转化成 1b12
"""
# print(f'try to format {before_string}')
if '.ent' in before_string:
before_string = before_string[3:-4].lower()
elif '.pdb' in before_string:
before_string = before_string[:4].lower()
elif len(before_string) == 4:
before_string = before_string.lower()
else:
if len(before_string) != 4:
raise ValueError(f'length out of 4 {before_string}')
return before_string
@dataclass
class PDBAnalyzer:
pdb: Path # 使用Path对象代替字符串
ChA: str
ChB: str
dist: str
# 主运行函数
def run(self):
cmd.delete('all')
cmd.load(str(self.pdb)) # 将Path对象转为字符串以兼容PyMOL命令
pdb_name = self.pdb.stem # 获取不包括扩展名的文件名
# ...(省略了其他设置和选择)
# 调用封装好的函数
self.HBond()
self.Pi_Pi_interaction()
self.Cation_Pi_interaction()
self.Salt_bridge_positive()
self.Salt_bridge_negative()
# ...(省略了其他设置和保存)
cmd.save(f'{pdb_name}_interaction.pse')
class
# 主程序
def main():
pdb_file = Path(sys.argv[1]) # 使用Path对象
CHA = sys.argv[2]
CHB = sys.argv[3]
dist = sys.argv[4]
cmd.set('bg_rgb', 'white')
analyzer = PDBAnalyzer(pdb_file, CHA, CHB, dist)
analyzer.run()
if __name__ == "__main__":
main()