You are here

Distorted metal coordination geometry after relaxation (SetupMetalMover was used, fold tree and constraints were set manually)

2 posts / 0 new
Last post
Distorted metal coordination geometry after relaxation (SetupMetalMover was used, fold tree and constraints were set manually)
#1

 

Hello,

I am trying to relax Zn containing peptides like zinc fingers, but always got distorted geometries of the coordination site and much higher scores after the relax. Still, the rest of the peptide looks nice.

To detect the Zn coordination the SetupMetalsMover() was used. Because the fold tree still contains a jump between the first residue and the metal (in the documentation of Rosetta it was said that the function should set up the fold tree correctly by itself), the fold tree was set manually to connect the Zn with one coordinating residue. Also, the distance and angle constraints were set with a cst-file. FastRelax() was used with the standard ref2015 score function for relaxing. An ensemble of ten outputs was created and stored in pdb-files. The files (the cst file was uploaded as txt) and the used code are attached.

All ten runs lead to similar results (therefore only one pdb output file is attached). It seems like that Rosetta tried to maximize the distances between the His and the Zn. Then I also changed the radius of the Zn from 1.09 to 0.5 in the atom_properties.txt and the mm_atom_properties.txt in the pyrosetta\database\chemicals folder or set the charge to 0 in the ZN.params file, hoping to minimize the maybe detected clash between the Zn and the N of His, but the results stayed identical. I surely have overlooked something important and would like to ask, if someone can help.

Thank you in advance!

#Start
from pyrosetta import *
init()


#Metal detection
from pyrosetta.rosetta.protocols.simple_moves import SetupMetalsMover
metaldetector = SetupMetalsMover()


#Fold Tree
ft = FoldTree()
ft.add_edge(1,30,-1)
ft.add_edge(5,31,1)


#Scorefunction
from pyrosetta.teaching import get_fa_scorefxn
scorefxn = get_fa_scorefxn()


#Constraints
from pyrosetta.rosetta.protocols.constraint_movers import ConstraintSetMover 
constraints = ConstraintSetMover()
constraints.constraint_file('constr_ZnF.cst')
constraints.add_constraints(True)


#Relax function
from rosetta.protocols.relax import FastRelax
relax = FastRelax()
relax.set_scorefxn(scorefxn)
relax.constrain_relax_to_start_coords(True)
relax.constrain_coords(True)

#Generation of ensemble
E_relax=[]
for i in range(1,11):
	
	#Create the pose from PDB-File
	ZnF_Pose = pose_from_pdb('5znf.clean.pdb')       
	
	#Using the SetupMetalMover
	metaldetector.apply(ZnF_Pose)        

	#Set the correct fold tree
	ZnF_Pose.fold_tree(ft)                                   
	
	#Set constraints
	constraints.apply(ZnF_Pose)                      
	
	#Relax
	relax.apply(ZnF_Pose)
	
	#Calculate score of relaxed pose and store it the list E_relax
	E_relax.append(scorefxn(ZnF_Pose))
	
	#Create PDB-File from relaxed pose
	ZnF_Pose.dump_pdb('ZnF_Pose_relax_{}.pdb'.format(i))
	
	


#Mean Score, standard deviation and standard error

mean_E_rel = sum(E_relax)/len(E_relax)

A = []
for i in range(0,10):
	a = (E_relax[i]-mean_E_rel)**2
	A.append(a)

std_E_rel = (sum(A) / (len(E_relax)-1))**(0.5)
SEM_E_rel = std_E_rel/((len(E_relax))**(0.5))



#Score of the starting structure

ZnF_Pose_start = pose_from_pdb('5znf.clean.pdb')
metaldetector.apply(ZnF_Pose_start)
ZnF_Pose_start.fold_tree(ft)
constraints.apply(ZnF_Pose_start)
start_E = scorefxn(ZnF_Pose_start)
ZnF_Pose_start.dump_pdb('ZnF_pose_start.pdb')


#Outputfile with score of starting structure, mean score of ensemble and score of each relaxed structure 

txtfile = 'ZnF_FastRelax_score.txt'

myfile = open(txtfile, 'w')

myfile.write('start_E = {}\nmean_E_rel = {} ; Std = {} ; SEM = {}\n\nE_rel\n'.format(start_E, mean_E_rel, std_E_rel, SEM_E_rel))

for i in range(0,len(E_relax)):
	myfile.write('{}\n'.format(E_relax[i]))
	

myfile.close()

 

Post Situation: 
Tue, 2020-01-21 11:18
TLP

You need to do your relaxation with a scorefunction that has the metalbinding_constraint scoreterm turned on (given a nonzero weight).  Reweight this scoreterm to, say, 1.0 in the scorefxn object with scorefxn.set_weight( core.scoring.metalbinding_constraint, 1.0 ).

Tue, 2020-01-21 12:16
vmulligan