Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
LoopMover_CCD.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/loops/LoopMover_Perturb_CCD.cc
11 /// @brief kinematic loop closure main protocols
12 /// @author Chu Wang
13 /// @author Mike Tyka
14 
15 // Unit headers
17 
18 // Package headers
21 
24 #include <protocols/loops/Loop.hh>
25 #include <protocols/loops/Loops.hh>
29 #include <boost/foreach.hpp>
30 #define foreach BOOST_FOREACH
31 
32 // Rosetta Headers
33 
37 #include <basic/options/option.hh>
38 #include <core/pose/Pose.hh>
39 #include <core/scoring/Energies.hh>
41 
51 
52 
54 
56 
57 #include <protocols/loops/util.hh>
58 #include <basic/Tracer.hh> // tracer output
59 
60 //Utility and numeric Headers
61 #include <numeric/random/random.hh>
62 #include <utility/tag/Tag.hh>
63 
64 // C++ Headers
65 #include <iostream>
66 #include <map>
67 #include <string>
68 
69 // option key includes
70 
71 #include <basic/options/keys/MonteCarlo.OptionKeys.gen.hh>
72 #include <basic/options/keys/loops.OptionKeys.gen.hh>
73 
74 #include <core/pose/util.hh>
75 #include <utility/vector1.hh>
76 #include <ObjexxFCL/format.hh>
77 #include <fstream>
78 
79 using namespace ObjexxFCL::fmt;
80 
81 namespace protocols {
82 namespace loops {
83 namespace loop_mover {
84 namespace refine {
85 
86 ///////////////////////////////////////////////////////////////////////////////
87 using namespace core;
88 
89 static numeric::random::RandomGenerator RG(84846);
90 static basic::Tracer TR("protocols.loops.loop_mover.refine.LoopMover_Refine_CCD");
91 
93 
94 //constructors
95 LoopMover_Refine_CCD::LoopMover_Refine_CCD()
96  : LoopMover(),
97  set_fold_tree_from_loops_(false),
98  user_defined_move_map_(false),
99  debug_(false),
100  outer_cycles_(3),
101  max_inner_cycles_(200),
102  repack_period_(20),
103  temp_initial_(1.5),
104  temp_final_(0.5)
105 {
106  read_options();
108  protocols::moves::Mover::type("LoopMover_Refine_CCD");
110 }
111 
114 ) : LoopMover( loops_in ),
115  set_fold_tree_from_loops_(false),
116  user_defined_move_map_(false),
117  debug_(false),
118  outer_cycles_(3),
119  max_inner_cycles_(200),
120  repack_period_(20),
121  temp_initial_(1.5),
122  temp_final_(0.5)
123 {
124  read_options();
126  protocols::moves::Mover::type("LoopMover_Refine_CCD");
128 }
129 
130 
132  protocols::loops::LoopsOP loops_in,
134 ) : LoopMover( loops_in ),
135  set_fold_tree_from_loops_(false),
136  user_defined_move_map_(false),
137  debug_(false),
138  outer_cycles_(3),
139  max_inner_cycles_(200),
140  repack_period_(20),
141  temp_initial_(1.5),
142  temp_final_(0.5)
143 {
144  read_options();
145  set_scorefxn( scorefxn );
146  protocols::moves::Mover::type("LoopMover_Refine_CCD");
148 }
149 
150 //destructor
152 
155  return "LoopMover_Refine_CCD";
156 }
157 
158 //clone
160  return new LoopMover_Refine_CCD(*this);
161 }
162 
163 
165 {
166  redesign_loop_ = false;
168  flank_residue_min_ = false; // added by JQX
172  original_fold_tree_ = NULL;
173 }
175 {
176  return move_map_;
177 }
179 {
180  if ( mm ) {
181  move_map_ = mm;
182  user_defined_move_map_ = true;
183  } else {
184  user_defined_move_map_ = false;
185  }
186 }
187 
189  return loops();
190 }
191 
192 std::ostream &operator<< ( std::ostream &os, LoopMover_Refine_CCD const &mover )
193 {
194  moves::operator<<(os, mover);
195  os << "Loops:\n" << *mover.get_loops();
196  os << "Outer cycles: " << mover.outer_cycles_ << "\nMax inner cycles: " << mover.max_inner_cycles_ <<
197  "\nRepack period: " << mover.repack_period_ << "\nInitial temperature: " << mover.temp_initial_ <<
198  "\nFinal temperature: " << mover.temp_final_ << "\nSet fold tree from loop?: " <<
199  (mover.set_fold_tree_from_loops_ ? "True" : "False") << "\nMovemap: ";
200  if (mover.move_map() != 0) {os << std::endl; mover.move_map()->show(os);}
201  else {os << "none" << std::endl;}
202  return os;
203 }
204 
205 void
207 {
208  using namespace basic::options;
209  if ( option[ OptionKeys::loops::outer_cycles ].user() )
210  outer_cycles_ = option[ OptionKeys::loops::outer_cycles ]();
211  if ( option[ OptionKeys::loops::max_inner_cycles ].user() )
212  max_inner_cycles_ = option[ OptionKeys::loops::max_inner_cycles ]();
213  if ( option[ OptionKeys::loops::repack_period ].user() )
214  repack_period_ = option[ OptionKeys::loops::repack_period ]();
215  if ( option[ OptionKeys::MonteCarlo::temp_initial ].user() )
216  temp_initial_ = option[ OptionKeys::MonteCarlo::temp_initial ]();
217  if ( option[ OptionKeys::MonteCarlo::temp_final ].user() )
218  temp_final_ = option[ OptionKeys::MonteCarlo::temp_final ]();
219 
220  debug_ = option[ OptionKeys::loops::debug ].user();
221 
222  repack_neighbors_ = (! basic::options::option[ basic::options::OptionKeys::loops::fix_natsc ]);
223 }
224 
226  core::pack::task::TaskFactoryCOP task_factory_in
227 )
228 {
229  // make local, non-const copy from const input
230  runtime_assert( task_factory_in );
231  task_factory_ = new core::pack::task::TaskFactory( *task_factory_in );
232 }
233 
235 
236 
237 void
240  //using parser implies that the fold tree probably isn't set correctly
241  set_fold_tree_from_loops( tag->getOption< bool >( "set_fold_tree_from_loops", true ) );
242  utility::vector1< utility::tag::TagPtr > const branch_tags( tag->getTags() );
243  bool specified_movemap( false );
244  foreach( utility::tag::TagPtr const tag, branch_tags ){
245  if( tag->getName() == "MoveMap" ) specified_movemap = true;
246  break;
247  }
248  if( specified_movemap ){
250  move_map_->set_bb( false );
251  move_map_->set_chi( false );
252  move_map_->set_jump( false );
253  protocols::rosetta_scripts::parse_movemap( tag, pose, move_map_, data, false/*don't reset movemap, keep falses, unless stated otherwise*/ );
254  }
255  if( tag->hasOption( "loops" ) ){
256  loops( loops_definers::load_loop_definitions(tag, data, pose) );
257  }
258  if( tag->hasOption( "scorefxn" ) ) this->set_scorefxn( new core::scoring::ScoreFunction( *data.get< core::scoring::ScoreFunction * >( "scorefxns", tag->getOption<std::string>( "scorefxn" ) ) ) );
259 
260  if( tag->hasOption("task_operations") ){
262  this->set_task_factory( task_factory );
263  }
264  else task_factory_ = NULL;
265 
266  if( tag->hasOption( "loops_from_cache" ) ) set_use_loops_from_observer_cache( tag->getOption<bool>( "loops_from_cache", 1 ) );
267 
268  if( tag->hasOption( "outer_cycles" ) ) outer_cycles_ = tag->getOption<core::Size>( "outer_cycles", 3 );
269  if( tag->hasOption( "max_inner_cycles" ) ) max_inner_cycles_ = tag->getOption<core::Size>( "max_inner_cycles", 250 );
270  temp_initial( tag->getOption< core::Real >( "temp_initial", 1.5 ) );
271  temp_final( tag->getOption< core::Real >( "temp_final", 0.5 ) );
272 }
273 
275 {
276  using namespace scoring;
277  using namespace basic::options;
278 
279  // scheduler
280  int const fast( option[ OptionKeys::loops::fast ] ); // why is this an int?
281  inner_cycles_ = std::min( max_inner_cycles_, fast ? loops()->loop_size() : Size(10)*loops()->loop_size() );
282 
283  /// must be called once the Pose has become available.
284  resolve_loop_indices( pose );
285 
286  if ( ! get_native_pose() ) set_native_pose( new core::pose::Pose( pose ) );
288 
290 
291  // Use 'get_new_ramping_scorefxn' in case the result of scorefunction() has changed since the last apply. Set weights.
293 
294  Real const temperature_ramp_factor = std::pow( (temp_final_ / temp_initial_),
295  Real(1.0f / (outer_cycles_ * inner_cycles_)) );
296 
297  // make sure we have scored before we instantiate monte carlo and before we ask for a tenA neighbor graph
298  (*ramping_scorefxn())(pose);
299 
301  pack::task::PackerTaskOP pack_task = get_packer_task( pose );
302  pack::pack_rotamers( pose, *ramping_scorefxn(), pack_task );
303  std::string move_type = "repack";
304  mc->boltzmann( pose, move_type );
305  mc->show_scores();
306 
307  debugging_output( pose );
308 
309  // set minimization degrees of freedom for all loops
310  setup_movemap( pose, *loops(), pack_task->repacking_residues(), move_map_ );
311 
314  this,
315  mc,
318  );
319 
320  inner_cycle->set_native_pose( get_native_pose() ); // Native pose may be used in debugging steps that use loop RMSD
321 
322  for (Size i = 1; i <= outer_cycles_; ++i) {
325  mc->set_temperature( mc->temperature() * temperature_ramp_factor );
326  tr().Info << "refinement cycle (outer/inner): " << i << "/" << outer_cycles_ << " ";
327  tr().Info << current_cycle_number_ << "/" << inner_cycles_ << " " << std::endl;
328 
329  inner_cycle->apply( pose );
330 
331  tr().Info << std::flush;
332  } //inner_cycle
333  } //outer_cycle
334 
335  mc->show_counters();
336  pose = mc->lowest_score_pose();
337 
338  if( set_fold_tree_from_loops_ ){ //if requested, put back old foldtree
341  (*ramping_scorefxn())(pose);
342  }
343 }
344 
345 /// @brief setup an appropriate movemap for the given loops
346 /// @param[in] loops The loops to model.
347 /// @param[in] allow_repack Indicates whether or not to allow a position to
348 /// repack.
349 /// @param[out] movemap Output movemap, all settings added here.
350 /// @remarks will enforce the false movemap
352  core::pose::Pose const & pose,
354  utility::vector1< bool > const & allow_repack,
356 )
357 {
359  movemap = move_map_;
360  return;
361  }
362  loops_set_move_map( loops, allow_repack, *movemap );
363  enforce_false_movemap( movemap );
364  if ( core::pose::symmetry::is_symmetric( pose ) ) {
366  }
367 }
368 
369 basic::Tracer & LoopMover_Refine_CCD::tr() const
370 {
371  return TR;
372 }
373 
375 
377  return new LoopMover_Refine_CCD();
378 }
379 
381  return "LoopMover_Refine_CCD";
382 }
383 
385 {
386  if ( scorefxn() != 0 ) {
387  ramping_scorefxn_ = scorefxn()->clone();
388  } else {
390  }
391  return ramping_scorefxn_;
392 }
393 
395 {
396  if ( ! ramping_scorefxn_ ) {
397  return get_new_ramping_scorefxn();
398  }
399  return ramping_scorefxn_;
400 }
401 
403 {
407  loops::fold_tree_from_loops( pose, *( this->loops() ), f_new);
408  pose.fold_tree( f_new );
409  }
411 }
412 
414 {
415  pack::task::PackerTaskOP base_packer_task;
416  // create default Packer behavior if none has been set via TaskFactory
417  if ( task_factory_ == 0 ) {
418  // the default Packer behavior is defined here
419  using namespace core::pack::task;
420  using namespace core::pack::task::operation;
424  task_factory_->push_back( new InitializeFromCommandline );
425  task_factory_->push_back( new IncludeCurrent );
426  task_factory_->push_back( new NoRepackDisulfides );
427 
428  RestrictToLoopsAndNeighborsOP restrict_to_loops_and_neighbors = new RestrictToLoopsAndNeighbors();
429 
430  // This can be simplified by making a constructor that takes these settings as arguments
431  restrict_to_loops_and_neighbors->set_cutoff_distance( 10.0 );
432  restrict_to_loops_and_neighbors->set_design_loop( redesign_loop_ );
433  restrict_to_loops_and_neighbors->set_include_neighbors( repack_neighbors_ );
434  restrict_to_loops_and_neighbors->set_loops( loops() );
435 
436  task_factory_->push_back( restrict_to_loops_and_neighbors );
437 
438  // additional default behavior: packing restricted to active loops
440  }
441  base_packer_task = task_factory_->create_task_and_apply_taskoperations( pose );
442  base_packer_task->set_bump_check( true );
443  return base_packer_task;
444 }
445 
447  Size iteration_number,
448  scoring::ScoreFunctionOP local_scorefxn,
450  pose::Pose & pose
451 ) {
452  // increase CHAINBREAK weight and update monte carlo
453  local_scorefxn->set_weight( scoring::chainbreak, Real(iteration_number)* CHAINBREAK_SCORE_RAMP_FACTOR );
454  mc.score_function( *local_scorefxn );
455  // recover low
456  mc.recover_low( pose );
457  // score info
458 
459  tr().Info << "cycle: " << iteration_number << " " << (*local_scorefxn)(pose) << std::endl;
460 }
461 
463 {
464  if (debug_) {
465  pose.dump_pdb("tmp_fa_repack.pdb");
466  std::ofstream out("score.tmp_repack_fa");
467  out << "scoring for repack_fa " << (*ramping_scorefxn())(pose) << std::endl;
468  ramping_scorefxn()->show( out );
469  out << pose.energies();
470  }
471 }
472 
473 } // namespace refine
474 } // namespace loop_mover
475 } // namespace loops
476 } // namespace protocols