| import pyrosetta |
| from pyrosetta import init, pose_from_pdb, get_fa_scorefxn |
| from pyrosetta.rosetta.protocols.relax import FastRelax |
| from pyrosetta.rosetta.protocols.analysis import InterfaceAnalyzerMover |
| from pyrosetta.rosetta.core.pack.task import TaskFactory |
| from pyrosetta.rosetta.core.pack.task.operation import RestrictToRepacking |
| from pyrosetta.rosetta.protocols.minimization_packing import PackRotamersMover |
|
|
| import os |
| import pandas as pd |
| import subprocess |
| import numpy as np |
| import shutil |
| from tqdm import tqdm |
| import pickle |
|
|
| from joblib import delayed, Parallel |
| from utils import * |
|
|
| input_dir=".Tests" |
| output_dir="./Pack" |
|
|
| def get_chain_dic(input_pdb): |
| parser = PDBParser() |
| structure = parser.get_structure("protein", input_pdb) |
| chain_dic = {} |
| for model in structure: |
| for chain in model: |
| chain_dic[chain.id] = len([res for res in chain if is_aa(res) and res.has_id('CA')]) |
|
|
| return chain_dic |
|
|
| def get_rosetta_score_base(pdb_path,chain_id='A'): |
| try: |
| init() |
| pose = pyrosetta.pose_from_pdb(pdb_path) |
| chains = list(get_chain_dic(pdb_path).keys()) |
| chains.remove(chain_id) |
| interface = f'{chain_id}_{"".join(chains)}' |
| fast_relax = FastRelax() |
| scorefxn = get_fa_scorefxn() |
| fast_relax.set_scorefxn(scorefxn) |
| mover = InterfaceAnalyzerMover(interface) |
| mover.set_pack_separated(True) |
| stabs,binds = [],[] |
| for i in range(5): |
| fast_relax.apply(pose) |
| stab = scorefxn(pose) |
| mover.apply(pose) |
| bind = pose.scores['dG_separated'] |
| stabs.append(stab) |
| binds.append(bind) |
| return {'name':pdb_path,'stab':np.array(stabs).mean(),'bind':np.array(binds).mean()} |
| except: |
| return {'name':pdb_path,'stab':999.0,'bind':999.0} |
|
|
|
|
| def get_rosetta_score(pdb_path,chain='A'): |
| try: |
| init() |
| pose = pyrosetta.pose_from_pdb(pdb_path) |
| |
| |
| |
| interface='A_B' |
| fast_relax = FastRelax() |
| scorefxn = get_fa_scorefxn() |
| fast_relax.set_scorefxn(scorefxn) |
| mover = InterfaceAnalyzerMover(interface) |
| mover.set_pack_separated(True) |
| fast_relax.apply(pose) |
| energy = scorefxn(pose) |
| mover.apply(pose) |
| dg = pose.scores['dG_separated'] |
| return [pdb_path,energy,dg] |
| except: |
| return [pdb_path,999.0,999.0] |
|
|
| def pack_sc(name='1a1m_C',num_samples=10): |
| try: |
| if os.path.exists(os.path.join(output_dir,name,'rosetta')): |
| shutil.rmtree(os.path.join(output_dir,name,'rosetta')) |
| os.makedirs(os.path.join(output_dir,name,'rosetta'),exist_ok=True) |
| init() |
| tf = TaskFactory() |
| tf.push_back(RestrictToRepacking()) |
| packer = PackRotamersMover() |
| packer.task_factory(tf) |
| for i in range(num_samples): |
| pose = pose_from_pdb(os.path.join(input_dir,name,f'pocket_merge_renum_bb.pdb')) |
| packer.apply(pose) |
| pose.dump_pdb(os.path.join(output_dir,name,'rosetta',f'packed_{i}.pdb')) |
| except: |
| return None |