Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
AnchoredGraftMover.cc
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file protocols/grafting/AnchoredGraftMover.cc
11 /// @brief Method definitions for AnchoredGraftMover
12 /// @author Jared Adolf-Bryfogle (jadolfbr@gmail.com)
13 /// @author Steven Lewis (smlewi@gmail.com)
14 
15 //Unit Headers
18 #include <protocols/moves/Mover.hh>
19 
20 //Core Headers
21 #include <core/pose/Pose.hh>
22 #include <core/pose/util.hh>
25 
30 
35 
36 //Protocol Headers
42 
44 #include <protocols/loops/Loop.hh>
45 #include <protocols/loops/Loops.hh>
48 
49 //Option Headers
50 #include <basic/options/keys/relax.OptionKeys.gen.hh>
51 #include <basic/options/option.hh>
52 
53 //Basic and Utility
54 #include <basic/Tracer.hh>
55 #include <core/scoring/rms_util.hh>
56 #include <map>
57 #include <utility/PyAssert.hh>
58 
59 static basic::Tracer TR("protocols.grafting.AnchoredGraftMover");
60 namespace protocols {
61 namespace grafting {
62  using namespace core::scoring;
63  using namespace core::pose;
64  using namespace core::pack::task;
65  using namespace basic::options;
66  using namespace protocols::loops;
67 
69  :GraftMoverBase(start, end, "AnchoredGraftMover")
70 {
71  //moves::Mover("GraftMover"),
72  set_defaults();
73 }
74 
75 
77 
78 void
80 
81  set_skip_sampling(false);
83  set_mintype(option [OptionKeys::relax::min_type]());
84 
85  //Arm types - default is single_loop_single_arm
89 
90  set_test_control_mode(false);
94  set_cycles(300);
95 
96 }
97 
98 void
99 AnchoredGraftMover::set_scaffold_flexibility(const Size Nter_scaffold_flexibility, const Size Cter_scaffold_flexibility){
100  //Insert flexibility stays at default values (0)
101  Nter_scaffold_flexibility_=Nter_scaffold_flexibility;
102  Cter_scaffold_flexibility_=Cter_scaffold_flexibility;
103 }
104 
105 void
106 AnchoredGraftMover::set_insert_flexibility(Size Nter_insert_flexibility, Size Cter_insert_flexibility)
107 {
108  Nter_insert_flexibility_=Nter_insert_flexibility;
109  Cter_insert_flexibility_=Cter_insert_flexibility;
110 }
111 
112 void
114  cycles_=cycles;
115 }
116 
117 void
120  cen_scorefxn_->set_weight( chainbreak, 20.00);
121  cen_scorefxn_->set_weight( cbeta, 1.0 );
122  cen_scorefxn_->set_weight( vdw, 1.0 );
123  cen_scorefxn_->set_weight( pair, 1.0 );
124  cen_scorefxn_->set_weight( cenpack, 1.0 );
125  cen_scorefxn_->set_weight( rama, 5.0 );
126  cen_scorefxn_->set_weight( hbond_lr_bb, 1.0 );
127  cen_scorefxn_->set_weight( hbond_sr_bb, 1.0 );
128  cen_scorefxn_->set_weight( omega, 5.0 );
129 }
130 
131 void
133  cen_scorefxn_ = score->clone();
134  if (cen_scorefxn_->get_weight(chainbreak) == 0.0){
135  cen_scorefxn_->set_weight(chainbreak, 20.00);
136  }
137 }
138 
139 void
141  mintype_ = mintype;
142 }
143 
144 void
146  skip_sampling_ = skip_sampling;
147 }
148 
149 void
151  if (use_smooth){
152  std::string def_score = option [OptionKeys::relax::centroid::weights]();
154  cen_scorefxn_->set_weight(chainbreak, 20.00);
155  } else {
157  }
158 }
159 
160 void
162  single_loop_double_arm_ = single_loop_double_arm;
163 }
164 
165 void
167  double_loop_double_arm_=double_loop_double_arm;
168 }
169 
170 void
172  double_loop_quad_arm_=double_loop_quad_arm;
173 }
174 
177  return Cter_loop_end_;
178 }
179 
180 void
182  test_control_mode_=test_control_mode;
183 }
184 
185 void
188 }
189 
190 void
191 AnchoredGraftMover::set_movemaps(const MoveMapOP scaffold_mm, const MoveMapOP insert_mm){
192 
193  scaffold_movemap_ = scaffold_mm;
194  insert_movemap_ = insert_mm;
195  use_default_movemap_=false;
196 
197 }
198 
199 void
201  //No Local copy since we will be messing with scaffold_pose anyway.
202 
204 
205  //Run the insertion.
206  Pose combined = insert_piece(pose);
207  core::kinematics::FoldTree original_ft = combined.fold_tree();
208  //Setup for the remodeling
209  core::Size const insert_start(start_+1); //this will be the first residue of the insert
210  core::Size const insert_end(start_+insertion_length_); //this will be the last residue of the insert
211 
212 
213 
214  ///Add variants, create the loops and set the foldtree that will be used for CCD.
216 
217 
218  Loop Nter_loop;
219  Loop Cter_loop;
220  LoopsOP loop_set = new Loops();
221  std::map< Loop, loop_closure::ccd::CcdLoopClosureMoverOP > loop_set_map; //Would not work without owning pointer.
222 
223  //Assert that none or only one boolean for the close type is set.
224 
226 
227  Nter_loop = Loop(Nter_loop_start_, Nter_loop_end_+1, Nter_loop_end_);//(LEFT LOOP)
228  Cter_loop = Loop(Cter_loop_start_-1, Cter_loop_end_, Cter_loop_start_-1);//(RIGHT LOOP)
231 
232 
233  loop_set->add_loop(Nter_loop);
234  loop_set->add_loop(Cter_loop);
236  ft_loop.loops(loop_set);
237  ft_loop.apply(combined);
238 
239  loop_closure::ccd::CcdLoopClosureMover close_for_Nter_loop(Nter_loop, movemap_);
240  loop_closure::ccd::CcdLoopClosureMover close_for_Cter_loop(Cter_loop, movemap_);
241  loop_set_map[Nter_loop]=new loop_closure::ccd::CcdLoopClosureMover(Nter_loop, movemap_);
242  loop_set_map[Cter_loop]=new loop_closure::ccd::CcdLoopClosureMover(Cter_loop, movemap_);
243 
244  }
245 
246  else if (double_loop_quad_arm_){
247  Nter_loop = Loop(Nter_loop_start_, Nter_loop_end_+1, start_);//(LEFT LOOP)
248  Cter_loop = Loop(Cter_loop_start_-1, Cter_loop_end_, end_-1);//(RIGHT LOOP)
251 
252 
253  loop_set->add_loop(Nter_loop);
254  loop_set->add_loop(Cter_loop);
256  ft_loop.loops(loop_set);
257  ft_loop.apply(combined);
258 
259  loop_closure::ccd::CcdLoopClosureMover close_for_Nter_loop(Nter_loop, movemap_);
260  loop_closure::ccd::CcdLoopClosureMover close_for_Cter_loop(Cter_loop, movemap_);
261  loop_set_map[Nter_loop]=new loop_closure::ccd::CcdLoopClosureMover(Nter_loop, movemap_);
262  loop_set_map[Cter_loop]=new loop_closure::ccd::CcdLoopClosureMover(Cter_loop, movemap_);
263  }
264  else if (single_loop_double_arm_){
265 
267  Cter_loop = Loop(Nter_loop_start_, Cter_loop_end_, insert_end);
268  loop_set->add_loop(Cter_loop);
269 
270  loop_closure::ccd::CcdLoopClosureMover close_for_Cter_loop(Cter_loop, movemap_);
271  loop_set_map[Cter_loop]=new loop_closure::ccd::CcdLoopClosureMover(Cter_loop, movemap_);
272 
273  }
274  else{ //single_loop_single_arm
275 
278  loop_set->add_loop(Cter_loop);
279 
280  loop_closure::ccd::CcdLoopClosureMover close_for_Cter_loop(Cter_loop, movemap_);
281  loop_set_map[Cter_loop]=new loop_closure::ccd::CcdLoopClosureMover(Cter_loop, movemap_);
282 
283  }
286 
287 
288 
289 
290 
291 
292  ///////////////////////////////////////Idealize////////////////////////////////////////////////////////
293  //this code also resets conformation variables: omegas to 180, newly made connections phi or psi to reasonable
294  //edges of insert will be somewhat mobile inside minimization (small and CCD moves will ignore it)
295  using namespace core::id;
296 
297  //Idealize the All residues in Movemap since they will all help close the loop(s).
298  //combined.dump_pdb("before_idealize.pdb");
299 
300  //Order of idealization matters here.
301  //Nter regions
303  for(; i<=start_; ++i) {
304  //movemap->set( TorsionID(i, BB, omega_torsion), false ); //fixes omega angle
305  if (movemap_->get_bb(i)){
307  combined.set_omega(i, 180);
308  TR << "mobile " << i << std::endl;
309  }
310  }
311  TR << "ideal " << insert_start << std::endl;
312 
313  //Set individual torsions ON in the movemap for the start and end of the insert
314  movemap_->set( TorsionID(insert_start, BB, phi_torsion), true);
315  combined.set_phi(insert_start, -60);
316 
317  //insert regions
318  i=start_+1;
319  for(; i<=insert_end; ++i) {
320  //movemap->set( TorsionID(i, BB, omega_torsion), false ); //fixes omega angle
321  if (movemap_->get_bb(i)){
323  combined.set_omega(i, 180);
324  TR << "mobile " << i << std::endl;
325  }
326  }
327 
328  movemap_->set( TorsionID(insert_end, BB, psi_torsion), true);
330 
331  TR << "ideal " << insert_end << std::endl;
332  combined.set_omega(insert_end, 180);//Note, upper Nter idealize loop takes care of omega for insert_start-1
333  combined.set_psi(insert_end, -40);
334 
335  //Cter regions
336  i=insert_end+1;
337  for(; i<=Cter_loop_end_; ++i) {
338  //movemap->set( TorsionID(i, BB, omega_torsion), false ); //fixes omega angle
339  if (movemap_->get_bb(i)){
341  combined.set_omega(i, 180);
342  TR << "mobile " << i << std::endl;
343  }
344  }
345 
346 
347 
348  //centroidize the pose before we do stuff to it - sidechains are expensive and unnecessary
350  protocols::simple_moves::ReturnSidechainMover return_sidechains( combined );
351  typeset_swap.apply( combined );
352 
353  //combined.dump_pdb("combined_preclose_cen.pdb");
354 
355  //[Note- Consider having the ability to set a small mover.]
356  protocols::simple_moves::SmallMover small(movemap_, 10, 200); //huge moves for sampling
357  small.angle_max( 'H', 180.0 );
358  small.angle_max( 'E', 180.0 );
359  small.angle_max( 'L', 180.0 );
360 
361 
362  protocols::simple_moves::MinMover min_mover(movemap_, cen_scorefxn_, mintype_, 0.01, true /*use_nblist*/ );
363 
364 
365  /////////////////////////TESTING/////////////////////////////////////////////////////////////
366 
368 
369  /////////////////////////Monte Carlo////////////////////////////////////////////////////////
372  MonteCarlo mc(combined, (*cen_scorefxn_), 0.8);
373 
374  /////////////////////////Protocol//////////////////////////////////////////////////////////
375  TR << "start " << ((*cen_scorefxn_))(combined) << std::endl;
376 
377  for( core::Size i(1); i<=cycles_; ++i){
378 
379  if (!skip_sampling_){small.apply(combined);}
380 
381  for (protocols::loops::Loops::const_iterator it=loop_set->begin(), it_end=loop_set->end(); it!=it_end; ++it){
382 
383  loop_set_map[*it]->apply(combined);
384 
386 
387  min_mover.apply(combined);
388 
390  }
391 
392  if(mc.boltzmann(combined)) TR << i << " " << ((*cen_scorefxn_))(combined) << std::endl;
393 
394  }
395 
396  mc.recover_low(combined);
397  TR << "finish " << ((*cen_scorefxn_))(combined) << std::endl;
398  //combined.conformation().insert_ideal_geometry_at_polymer_bond(Cter_loop.cut());
399 
400  return_sidechains.apply( combined );
401 
402 
403 
404 
405  //Remove cutpoints that were required for CCD.
406  for (protocols::loops::Loops::const_iterator it=loop_set->begin(), it_end=loop_set->end(); it!=it_end; ++it){
409  }
410 
411  //Give back foldtree from pose_into_pose.
412  combined.fold_tree(original_ft);
413 
414  TR << "Complete"<<std::endl;
415  pose = combined;
416 
417 }
418 
419 void
421 
423 
424  task->restrict_to_repacking();
425  task->temporarily_fix_everything();
426 
427  task->temporarily_set_pack_residue(start_, true);
428  task->temporarily_set_pack_residue(start_+1, true);
429 
430  task->temporarily_set_pack_residue(end_, true);
431  task->temporarily_set_pack_residue(end_-1, true);
432 
433  for (Size i=1; i<=pose.total_residue(); ++i){
434  if (movemap_->get_chi(i)){
435  task->temporarily_set_pack_residue(i, true);
436  }
437  }
438 
440  packer->apply(pose);
441 }
442 
443 void
445 
447  task->restrict_to_repacking();
448  task->temporarily_fix_everything();
449  task->temporarily_set_pack_residue(start_, true);
450  task->temporarily_set_pack_residue(start_+1, true);
451 
452  task->temporarily_set_pack_residue(end_, true);
453  task->temporarily_set_pack_residue(end_-1, true);
454 
455  for (Size i=1; i<=pose.total_residue(); ++i){
456  if (movemap_->get_chi(i)){
457  task->temporarily_set_pack_residue(i, true);
458  }
459  }
460  for (Size i=start_+2; i<=end_-2; ++i){
461  task->temporarily_set_pack_residue(i, true);
462  }
463 
465  packer->apply(pose);
466 }
467 
468 
469 }
470 }