PepFlow / eval /energy.py
Irwiny123's picture
添加PepFlow模型初始代码
ef423c5
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() # cant be pickled
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)
# chains = list(get_chain_dic(os.path.join(input_dir,name,'pocket_merge_renum.pdb')).keys())
# chains.remove(chain)
# interface = f'{chain}_{"".join(chains)}'
interface='A_B'
fast_relax = FastRelax() # cant be pickled
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()) # Only repack, don't change amino acid types
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