Rosetta
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
movers.py
Go to the documentation of this file.
1 # Mover classes for surface docking protocol
2 # Emily Koo
3 
4 # Import python modules
5 import math
6 from random import randint
7 from os.path import exists
8 import glob
9 from append_data import *
10 
11 # Import Rosetta modules
12 from rosetta import *
13 from rosetta.protocols.rigid import *
14 import rosetta.core.scoring.solid_surface
15 import rosetta.core.scoring.constraints
16 
17 # Import custom modules
18 from surf_param import *
19 from constraints import *
20 
21 #=========================== Setup movers ==============================
22 class Abinitio:
23  def __init__(self, PDB, frag3, frag9):
24  print "Creating Ab initio instance..."
25  print ">> Loading fragment files..."
26  print PDB
27  self.fragset_9mer = core.fragment.ConstantLengthFragSet(9, frag9)
28  self.fragset_3mer = core.fragment.ConstantLengthFragSet(3, frag3)
29 
30  print ">> Setting up movemap..."
31  self.movemap = MoveMap()
32  self.movemap.set_bb(True)
33  self.movemap.set_chi(False)
34  self.mover_9mer = ClassicFragmentMover(self.fragset_9mer, self.movemap)
35  self.mover_3mer = ClassicFragmentMover(self.fragset_3mer, self.movemap)
36 
37  print ">> Setting up ClassicAbinitio mover..."
38  self.abinitio = ClassicAbinitio(self.fragset_3mer, self.fragset_9mer, self.movemap)
39  # Set rg to 0 to get more extended conformers
40  self.abinitio.set_score_weight(rg, 0.0)
41 
42  def apply(self, pose):
43 
44  # Score pose
45  self.score_low = create_score_function("RS_centroid.wts")
46  self.score_low(pose)
47  self.score_low.show(pose)
48  print ".............Abinitio starting................"
49  self.abinitio.init(pose)
50  self.abinitio.apply(pose)
51  print "................Abinitio done................."
52  print "\n"
53 
54  def info(self):
55  return self.__doc__
56 
57  def get_name(self):
58  return self.__class__.__name__
59 
61  # Set-up default parameters
62  kT = 0.5
63  inner_cycles = 6
64  outer_cycles = 43 # will be changed
65  n_moves = 6 # number of small/shear moves
66  max_angle = 30
67 
68  def __init__(self):
69  print "Creating centroid relax instance..."
70  print ">> Loading score function..."
71  self.score_low = create_score_function("RS_centroid.wts")
72  self.smallmin_type = "linmin"
73  self.shearmin_type = "dfpmin_armijo"
74 
75  # Construct movemap
76  self.movemap = rosetta.MoveMap()
77  self.movemap.set_bb(True)
78 
79  self._setupMovers()
80 
81  def _setupMovers(self):
82  print ">> Setting up small and shear movers..."
83  # Small trial
84  self.small_mover = rosetta.SmallMover(self.movemap, self.kT, self.n_moves/2)
85  self.small_mover.angle_max(self.max_angle)
86  self.smallmin_mover = rosetta.MinMover(self.movemap, self.score_low, self.smallmin_type, 0.1, True)
87  self.small_seq = rosetta.SequenceMover()
88  self.small_seq.add_mover(self.small_mover)
89  self.small_seq.add_mover(self.smallmin_mover)
90 
91  # Shear trial
92  self.shear_mover = rosetta.ShearMover(self.movemap, self.kT, self.n_moves)
93  self.shear_mover.angle_max(self.max_angle)
94  self.shearmin_mover = rosetta.MinMover(self.movemap, self.score_low,self.shearmin_type, 0.01, True)
95  self.shear_seq = rosetta.SequenceMover()
96  self.shear_seq.add_mover(self.shear_mover)
97  self.shear_seq.add_mover(self.shearmin_mover)
98 
99  def _setupTrial(self, pose):
100  print ">> Setting up trial movers..."
101  self.mc = MonteCarlo(pose, self.score_low, self.kT)
102  self.small_trial = rosetta.TrialMover(self.small_seq, self.mc)
103  self.shear_trial = rosetta.TrialMover(self.shear_seq, self.mc)
104 
105  self.small_rep = rosetta.RepeatMover(self.small_trial, self.inner_cycles)
106 
107  def set_nmoves(self, nmoves):
108  self.n_moves = nmoves
109 
110  def set_max_angle(self, angle):
111  # Changes max angles for small and shear movers
112  self.max_angle = angle
113 
114  def apply(self, pose):
115 
116  # Score pose
117  self.score_low(pose)
118 
119  # Set up MonteCarlo and trial movers
120  self._setupTrial(pose)
121 
122  # Set outer cycles = protein length
123  self.outer_cycles = pose.total_residue()
124 
125  print ">> Starting centroid relaxation..."
126  for outerLoop in range(self.outer_cycles):
127  self.score_low.show(pose)
128  self.mc.recover_low(pose)
129  self.shear_trial.apply(pose)
130  self.small_rep.apply(pose)
131 
132  self.mc.show_counters()
133  self.mc.recover_low(pose)
134  print ">> Finished centroid relaxation."
135 
136  def info(self):
137  return self.__doc__
138 
139  def get_name(self):
140  return self.__class__.__name__
141 
143  # Set-up default parameters
144  kT = 0.5
145  n_moves = 6 # number of small/shear moves
146  tolerance = 0.01 # min mover tolerance
147 
148  def __init__(self, score_high, score_pack, std_scorefxn, nosmallshear):
149  print "Creating full atom relax instance..."
150  print ">> Initializing variables..."
151 
152  # Score functions
153  self.score_high = score_high
154  self.score_pack = score_pack
155  self.std_scorefxn = std_scorefxn
156 
157  self.nosmallshear = nosmallshear
158  # Initial min movers for small and shear
159  self.smallmin_type = "dfpmin_armijo"
160  self.shearmin_type = "dfpmin_armijo"
161 
162  # Initialize constraint files
163  self.constraints = 'False' # constraints toggle. false by default
164  self.sol_cst = None
165  self.ads_cst = None
166 
167  # Other variables
168  self.max_angle = 30
169  self.outer_cycles = 5
170  self.inner_cycles = 0
171  self.outer_cycle = 0 # Current ramp cycle
172  self.ref_cycles = 0
173  self.curr_cycle = 0 # Current ref cycle
174  self.protStart = 0
175  self.totalRes = 0
176 
177  # Packer task
178  self.task = None
179 
180  # Movemaps
181  # Both bb and chi flexible
182  self.movemap = None
183  # Only chi flexible
184  self.chi_mm = None
185 
186  self.state = "ads"
187  self.sol_constraints = False
188  self.ads_constraints = False
189  self.name = "" #name of decoy
190 
191  def set_scorefxn(self, scorefxn):
192  # Set scorefxn to specified scorefxn
193  self.score_high = scorefxn
194 
195  def set_mc(self, pose):
196  # Get input pose to set up mc and trial movers
197  self.mc = MonteCarlo(pose, self.score_high, self.kT)
198 
199 
200  def set_params(self, pose):
201 
202  # Set mc
203  self.set_mc(pose)
204 
205  # Set movemap
206  self.set_movemap(pose.total_residue(), pose.num_jump() + 1)
207 
208  # Set up basic movers
209  self._setupMovers()
210 
211  # Set up trial movers
212  self._setupTrial(pose)
213 
214  # Set up Dock MCM
215  self.dockMCM = DockMCMProtocol(pose.num_jump(), self.score_high, self.score_pack)
216 
217  # Set up surface energies to score only protein
218  self._setupSurfe(pose)
219 
220  def set_nmoves(self, nmoves):
221  self.n_moves = nmoves
222 
223  def set_max_angle(self, angle):
224  # Changes max angle for shear mover
225  self.max_angle = angle
226  # Set max angle for small mover
227  self.small_mover.angle_max('H',angle/3)
228  self.small_mover.angle_max('E',angle/2)
229  self.small_mover.angle_max('L',angle)
230 
231 
232  def set_movemap(self, totalRes, protStart):
233  # Get user input
234  self.protStart = protStart
235  self.totalRes = totalRes
236 
237  # Update movemap
238  self._setupMovemap()
239 
240  def loadSurf(self, file):
241  print ">> Loading surface vectors..."
242  pdb = load(file)
243  self.SURFA0 = get_markers(pdb)[0]
244  self.SURFA1 = get_markers(pdb)[1]
245  self.SURFA2 = get_markers(pdb)[2]
246 
247  def loadConstraints(self, PDB):
248 
249  if self.sol_cst is None:
250  # Atom pair and dihedral constraints
251  self.sol_cst = load_constraints(PDB)[0]
252  if self.ads_cst is None:
253  self.ads_cst = load_constraints(PDB)[1]
254 
255  def set_constraints_weight(self, weight):
256  self.score_high.set_weight(atom_pair_constraint, weight)
257  self.score_high.set_weight(dihedral_constraint, weight)
258 
259  def _setupSurfe(self, pose):
260 
261  print ">> Setting up surface energy..."
262  # Set Surface Energy to 0 - Get score only from protein
263  surfe = core.scoring.solid_surface.SurfaceEnergies()
264  surfe.set_total_residue(pose.total_residue())
265  surfe.set_residue_range_not_surface(pose.num_jump() + 1, pose.total_residue())
266  pose.set_new_energies_object(surfe)
267  self.score_high(pose)
268 
269  def _setupMovemap(self):
270 
271  print ">> Setting up movemap..."
272  # Construct movemap
273  self.movemap = rosetta.MoveMap()
274  self.movemap.set_bb(False)
275  self.movemap.set_chi(False)
276 
277  # Only allow protein bb and chi to move
278  for residue in range(self.protStart, self.totalRes + 1):
279  self.movemap.set_bb(residue, True)
280  self.movemap.set_chi(residue, True)
281 
282  # If prot only, no jumps
283  if self.protStart > 1:
284  # Allow jump between surface and protein to move
285  self.movemap.set_jump(self.protStart - 1, True)
286 
287  def _setupMovers(self):
288  print ">> Setting up small and shear movers..."
289  # Small mover
290  self.small_mover = rosetta.SmallMover(self.movemap, self.kT, self.n_moves)
291  self.small_mover.angle_max(self.max_angle)
292  self.smallmin_mover = rosetta.MinMover(self.movemap, self.score_high, self.smallmin_type, self.tolerance, True)
293 
294  # Shear mover
295  self.shear_mover = rosetta.ShearMover(self.movemap, self.kT, self.n_moves/2)
296  self.shear_mover.angle_max(self.max_angle)
297  self.shearmin_mover = rosetta.MinMover(self.movemap, self.score_high, self.shearmin_type, self.tolerance, True)
298 
299  # Set up specific min movers
300  self.min_dfp_mover = rosetta.MinMover(self.movemap, self.score_high,"dfpmin_armijo", self.tolerance, True)
301  self.min_lin_mover = rosetta.MinMover(self.movemap, self.score_high,"linmin", self.tolerance, True)
302 
303  def _setupTrial(self, pose):
304  print ">> Setting up trial movers..."
305 
306  # Check to see if movemap is set
307  if self.movemap is None:
308  self.set_movemap(pose.total_residue(), pose.num_jump() + 1)
309 
310  # Small seq movers
311  self.small_seq = rosetta.SequenceMover()
312  self.small_seq.add_mover(self.small_mover)
313  self.small_seq.add_mover(self.smallmin_mover)
314 
315  # Shear seq movers
316  self.shear_seq = rosetta.SequenceMover()
317  self.shear_seq.add_mover(self.shear_mover)
318  self.shear_seq.add_mover(self.shearmin_mover)
319 
320  # Trial small/shear movers
321  self.smallmin_trial = rosetta.TrialMover(self.small_seq, self.mc)
322  self.shearmin_trial = rosetta.TrialMover(self.shear_seq, self.mc)
323 
324  # Trial min movers
325  self.min_dfp_trial = rosetta.TrialMover(self.min_dfp_mover, self.mc)
326  self.min_lin_trial = rosetta.TrialMover(self.min_lin_mover, self.mc)
327 
328  # Repeat mover for inner/outer cycles
329  self.min_seq = rosetta.SequenceMover()
330  self.min_seq.add_mover(self.smallmin_trial)
331  self.min_seq.add_mover(self.shearmin_trial)
332 
333  self.inner_min_rep = rosetta.RepeatMover(self.min_seq, self.inner_cycles)
334 
335  def _setMinmovers(self, minmover):
336  # Update min mover types
337  print ">>> Updating min mover types..."
338  self.smallmin_mover.min_type(minmover)
339  self.shearmin_mover.min_type(minmover)
340 
341 
342  def _slideProt(self, pose):
343  print ">>> Move protein onto surface..."
344  # Symmetry move to get protein in middle of surface
345  surface_symm_move(pose, pose.num_jump() + 1, pose.total_residue(), self.SURFA0, self.SURFA1, self.SURFA2)
346 
347  # Slide protein into contact with surface
348  self.slide_into_contact = FaDockingSlideIntoContact(pose.num_jump())
349  self.slide_into_contact.apply(pose)
350 
351  #self.std_scorefxn.show(pose)
352 
353  def _moveProt(self, pose):
354 
355  print ">>> Moving protein away from surface..."
356  # Moving apart protein and surface
357  self.trans_mover = RigidBodyTransMover(pose, pose.num_jump())
358  self.trans_mover.step_size(50)
359  self.trans_mover.apply(pose)
360 
361  def _randMovers(self, pose):
362  print ">>> Randomizing protein position..."
363 
364  # Moving apart protein and surface
365  self._moveProt(pose)
366 
367  # Spin about a random axis
368  #self.spin_mover = RigidBodySpinMover(pose.num_jump())
369  #self.spin_mover.apply(pose)
370  self.random_mover = RigidBodyRandomizeMover(pose, pose.num_jump(), partner_downstream)
371  self.random_mover.apply(pose)
372  #self.std_scorefxn.show(pose)
373  # Slide protein to surface
374  self._slideProt(pose)
375 
376  def applyConstraints(self, pose, state):
377 
378  print ">>> Reading constraints..."
379  # Read in constraints
380  if state == "sol":
381  if (self.sol_constraints is False):
382  apply_constraints(pose, self.sol_cst)
383  self.sol_constraints = True;
384 
385 
386  elif state == "ads":
387  if (self.ads_constraints is False):
388  apply_constraints(pose, self.ads_cst)
389  self.ads_constraints = True;
390 
391  # IMPORTANT! Or constraints will not be activated for other movers
392  self.mc.reset_scorefxn(pose, self.score_high)
393  #self.score_high.show(pose)
394 
395  def _setupPackertask(self, pose):
396 
397  print ">> Setting Side-chain packer task..."
398  self.task = standard_packer_task(pose)
399  self.task.restrict_to_repacking()
400  self.task.or_include_current(True)
401 
402  print ">> Setting repacking range..."
403  for r in range(1, pose.total_residue()+1):
404  if r < pose.num_jump() + 1:
405  # Don't pack surface
406  self.task.nonconst_residue_task(r).prevent_repacking()
407  else:
408  # Pack protein
409  self.task.nonconst_residue_task(r).restrict_to_repacking()
410 
411  def fullRepack(self, pose):
412  # Full repack of protein only (PackRotamersMover)
413 
414  # Set up packer task if not done
415  if self.task is None:
416  self._setupPackertask(pose)
417 
418  #print "Before full repack", #self.score_high.show(pose)
419  self.full_repack = PackRotamersMover(self.score_pack, self.task)
420  self.full_repack.apply(pose)
421  #print "After full repack", #self.score_high.show(pose)
422 
423  """
424  # Followed by dfp min with only chi flexible
425  if self.chi_mm is None:
426  self._setChimap(pose)
427 
428  chi_minmover = rosetta.MinMover(self.chi_mm, self.score_pack, "dfpmin_armijo", self.tolerance, True)
429  chi_minmover.apply(pose)
430  print "After chi minmover", #self.score_high.show(pose)
431  """
432  def _setChimap(self, pose):
433 
434  self.chi_mm = MoveMap()
435  self.chi_mm.set_bb(False)
436  self.chi_mm.set_chi(False)
437  for residue in range(pose.num_jump() + 1, pose.total_residue() + 1):
438  self.chi_mm.set_chi(residue, True)
439 
440  def _rotamerTrialmin(self, pose):
441  # Rotamer trial min mover
442  #print "Before Rotamer Trial Min scorefxn", #self.score_high.show(pose)
443  self.rt_min = RotamerTrialsMinMover(self.score_high, self.task)
444  self.rt_min.apply(pose)
445  #print "After Rotamer Trial Min scorefxn", #self.score_high.show(pose)
446 
447  def _dock(self, pose):
448  # Docking protocol
449  print ">>> Dock MCM protocol..."
450  #print "Before:"
451  #self.score_high.show(pose)
452  self.dockMCM.apply(pose)
453  #print "After:"
454  #self.score_high.show(pose)
455 
456  def _fullatomRelax(self, pose):
457 
458  print ">> Outer cycle = ", self.outer_cycle
459  # Adsorbed cycles only
460  if self.curr_cycle == 1 and self.outer_cycle == 1 and self.state == "ads":
461  # Take protein and surface apart and
462  # randomly orient and dock protein during first adsorbed state cycle
463  self._randMovers(pose)
464  # Rigid body docking
465  self._dock(pose)
466 
467  if not self.nosmallshear:
468  # Initial settings =================================
469  self.mc.reset(pose)
470  self.mc.reset_scorefxn(pose, self.score_high)
471  self.score_high(pose)
472 
473  # Outer cycle refinements ============================
474  self._setMinmovers("dfpmin_armijo")
475  print ">>> Small/shear refinements outer cycle..."
476  self.min_seq.apply(pose)
477 
478  # Inner cycle refinements ============================
479  self._setMinmovers("linmin")
480 
481  print ">>> Small/shear refinements inner cycles..."
482  self.inner_min_rep.apply(pose) # shear trial, small trial
483 
484  # Recover lowest scoring decoy
485  self.mc.recover_low(pose)
486 
487  # DockMCM
488  if self.state == "ads":
489  # Rigid body docking protocol on surface
490  self._dock(pose)
491 
492  def apply(self, pose):
493 
494  # Check to make sure movemap is right
495  #if self.totalRes is not pose.total_residue() or self.protStart is not pose.num_jump() + 1:
496  # self.set_params(pose)
497 
498  # Do full atom relax
499  self._fullatomRelax(pose)
500 
501  # Reset applied constraints toggles
502  self.ads_constraints = False
503  self.sol_constraints = False
504 
505  def info(self):
506  return self.__doc__
507 
508  def get_name(self):
509  return self.__class__.__name__
510 
511 
def standard_packer_task
Definition: __init__.py:537
def load
Definition: IO.py:5