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 //#include <protocols/loops/loop_mover/LoopMover.hh>
20 #include <protocols/loops/Loop.hh>
21 #include <protocols/loops/Loops.hh>
24 // AUTO-REMOVED #include <boost/foreach.hpp>
25 #define foreach BOOST_FOREACH
26 
27 // Rosetta Headers
29 
31 #include <core/id/TorsionID.hh>
36 #include <basic/options/option.hh>
37 #include <core/pose/Pose.hh>
38 #include <core/scoring/Energies.hh>
40 #include <core/fragment/FragSet.hh>
42 
43 // AUTO-REMOVED #include <core/pack/task/TaskFactory.hh>
45 // AUTO-REMOVED #include <core/pack/task/PackerTask.hh>
46 // AUTO-REMOVED #include <core/pack/task/operation/TaskOperations.hh>
47 // AUTO-REMOVED #include <core/pack/rotamer_trials.hh>
48 // AUTO-REMOVED #include <core/pack/pack_rotamers.hh>
49 // AUTO-REMOVED #include <protocols/simple_moves/BackboneMover.hh>
50 // AUTO-REMOVED #include <protocols/moves/DataMap.hh>
51 // AUTO-REMOVED #include <protocols/rosetta_scripts/util.hh>
52 
54 // AUTO-REMOVED #include <core/conformation/symmetry/util.hh>
55 
57 
58 #include <protocols/loops/util.hh>
59 #include <basic/Tracer.hh> // tracer output
60 
61 //Utility and numeric Headers
62 #include <numeric/random/random.hh>
63 // AUTO-REMOVED #include <utility/tag/Tag.hh>
64 
65 // C++ Headers
66 #include <iostream>
67 #include <map>
68 #include <string>
69 
70 // option key includes
71 
72 // AUTO-REMOVED #include <basic/options/keys/MonteCarlo.OptionKeys.gen.hh>
73 #include <basic/options/keys/loops.OptionKeys.gen.hh>
74 
75 #include <core/pose/util.hh>
76 #include <utility/vector0.hh>
77 #include <utility/vector1.hh>
78 #include <ObjexxFCL/format.hh>
79 #include <fstream>
80 
81 //Auto Headers
82 
83 
84 //Auto using namespaces
85 namespace ObjexxFCL { namespace fmt { } } using namespace ObjexxFCL::fmt; // AUTO USING NS
86 //Auto using namespaces end
87 
88 namespace protocols {
89 namespace loops {
90 namespace loop_mover {
91 namespace perturb {
92 
93 ///////////////////////////////////////////////////////////////////////////////
94 using namespace core;
95 
96 static numeric::random::RandomGenerator RG(42478);
97 static basic::Tracer TR("protocols.loops.loop_mover.perturb.LoopMover_Perturb_CCD");
98 
99 //constructors
100 LoopMover_Perturb_CCD::LoopMover_Perturb_CCD() :
102 {
104 
105  protocols::moves::Mover::type("LoopMover_Perturb_CCD");
107 }
108 
109 
112 ) : IndependentLoopMover( loops_in )
113 {
115  protocols::moves::Mover::type("LoopMover_Perturb_CCD");
117 }
118 
119 
120 
122  protocols::loops::LoopsOP loops_in,
124 ) : IndependentLoopMover( loops_in )
125 {
126  if ( scorefxn ) {
127  set_scorefxn( scorefxn );
128  } else {
130  }
131 
132  protocols::moves::Mover::type("LoopMover_Perturb_CCD");
134 }
135 
136 
138  protocols::loops::LoopsOP loops_in,
141 ) : IndependentLoopMover( loops_in )
142 {
143  if ( scorefxn ) {
144  set_scorefxn( scorefxn );
145  } else {
147  }
148 
149  protocols::moves::Mover::type("LoopMover_Perturb_CCD");
151 
152  add_fragments( fragset );
153 }
154 
155 //destructor
157 
160  return "LoopMover_Perturb_CCD";
161 }
162 
163 //clone
165  return new LoopMover_Perturb_CCD(*this);
166  }
167 
169  core::pose::Pose & pose,
170  protocols::loops::Loop const & loop
171 ) {
172  using namespace scoring;
173  using namespace optimization;
174  using namespace basic::options;
175  using namespace core::kinematics;
176  using namespace protocols::simple_moves;
177 
178  bool const verbose( true );
179  bool const local_debug( false );
180 
181  // store starting fold tree and cut pose
182  kinematics::FoldTree f_orig=pose.fold_tree();
183  set_single_loop_fold_tree( pose, loop );
184 
185  /// prepare fragment movers
186  MoveMapOP movemap = new MoveMap();
187  movemap->set_bb_true_range( loop.start(), loop.stop() );
188 
189  Loops one_loop_loops;
190  one_loop_loops.add_loop( loop );
191 
192  std::vector< FragmentMoverOP > fragmover;
193  for ( std::vector< core::fragment::FragSetOP >::const_iterator
194  it = frag_libs_.begin(), it_end = frag_libs_.end();
195  it != it_end; it++ ) {
196  ClassicFragmentMoverOP cfm = new ClassicFragmentMover( *it, movemap );
197  cfm->set_check_ss( false );
198  cfm->enable_end_bias_check( false );
199  fragmover.push_back( cfm );
200  }
201 
202 
203  core::pose::Pose native_pose;
204  if ( get_native_pose() ) {
205  native_pose = *get_native_pose();
206  }else{
207  native_pose = pose;
208  }
209 
210  Size const loop_begin( loop.start() ), loop_end( loop.stop() ), loop_cut( loop.cut() );
211  Size const loop_size( loop_end - loop_begin + 1 );
212  runtime_assert( !loop.is_terminal( pose ) || pose.fold_tree().is_cutpoint( loop_cut ) );
213 
214  // see if we should skip large frags. Don't if that would mean no fragment insertions:
215  // mt temporary removed this.
216  //// bool skip_long_frags( true ); // PBHACK DONT CHECKIN if false
217  //// {
218  //// bool found_any_frags( false );
219  //// frag_libs;
220  //// for ( std::vector< core::fragment::ConstantLengthFragSetOP >::const_reverse_iterator
221  //// it = frag_libs.rbegin(), it_end = frag_libs.rend(); it != it_end; ++it ) {
222  //// Size const frag_size( );
223  //// if ( loop_size >= frag_size * 2 + 1 ) found_any_frags = true;
224  //// }
225  //// if ( !found_any_frags ) skip_long_frags = false;
226  //// }
227 
228  tr() << "perturb_one_loop_with_ccd: " << loop_begin << ' ' << loop_size << std::endl;
229 
230  Real const init_phi ( -150.0 );
231  Real const init_psi ( 150.0 );
232  Real const init_omega( 180.0 );
233 
234  if ( !loop.is_terminal( pose ) ) {
235  // set cutpoint variant for chainbreak scoring.
238  }
239 
240  pose::Pose start_pose;
241  start_pose = pose;
242 
243  if (local_debug) {
244  std::ofstream out("score.tmp_input_cen");
245  out << "scoring before cen_perturb: " << ( *scorefxn() )(pose) << std::endl;
246  /// Now handled automatically. scorefxn_->accumulate_residue_total_energies(pose);
247  scorefxn()->show( out );
248  out << pose.energies().total_energies().weighted_string_of( scorefxn()->weights() ) << std::endl;
249  tr() << "before cen_perturb: "
250  << pose.energies().total_energies().weighted_string_of( scorefxn()->weights() ) << std::endl;
251  out << pose.energies();
252  }
253 
254  kinematics::MoveMap mm_one_loop;
255  utility::vector1<bool> allow_sc_move( pose.total_residue(), false );
256  loops_set_move_map( one_loop_loops, allow_sc_move, mm_one_loop);
257 
258  tr() << "loop rmsd before initial fragment perturbation:" << loop_rmsd( pose, native_pose, one_loop_loops ) << std::endl;
259  if ( loop.is_extended() ) {
260  if (local_debug) {
261  pose.dump_pdb("tmp_cen_preidl.pdb");
262  ( *scorefxn() )(pose);
263  tr() << "preidl: "
264  << pose.energies().total_energies().weighted_string_of( scorefxn()->weights() ) << std::endl;
265  }
266 
267  // avoid potential problems at the ends:
268  if ( loop_begin > 1 && !pose.fold_tree().is_cutpoint( loop_begin-1 ) &&
269  pose.residue( loop_begin ).is_bonded( loop_begin-1 ) ) {
271  pose.set_omega( loop_begin - 1, init_omega );
272  }
273  if ( loop_end < pose.total_residue() && !pose.fold_tree().is_cutpoint( loop_end ) &&
274  pose.residue( loop_end ).is_bonded( loop_end+1 ) ) {
276  }
277 
278  if (local_debug) {
279  pose.dump_pdb("tmp_cen_endidl.pdb");
280  ( *scorefxn() )(pose);
281  tr() << "endidl: "
282  << pose.energies().total_energies().weighted_string_of( scorefxn()->weights() ) << std::endl;
283  }
284 
285  for ( Size i= loop_begin; i<= loop_end; ++i ) {
287  }
288 
289  if (local_debug) {
290  pose.dump_pdb("tmp_cen_postidl.pdb");
291  ( *scorefxn() )(pose);
292  tr() << "postidl: "
293  << pose.energies().total_energies().weighted_string_of( scorefxn()->weights() ) << std::endl;
294  }
295 
296 
297  for ( Size i = loop_begin; i <= loop_end; ++ i ) {
298  pose.set_phi ( i, init_phi );
299  pose.set_psi ( i, init_psi );
300  pose.set_omega( i, init_omega );
301  }
302 
303  if (local_debug) {
304  pose.dump_pdb("tmp_cen_init.pdb");
305  ( *scorefxn() )(pose);
306  tr() << "extended: "
307  << pose.energies().total_energies().weighted_string_of( scorefxn()->weights() ) << std::endl;
308  }
309 
310  for ( core::Size i = loop.start(); i <= loop.stop(); ++i ) {
311  for ( std::vector< FragmentMoverOP >::const_iterator
312  it = fragmover.begin(),it_end = fragmover.end(); it != it_end; it++ ) {
313  (*it)->apply( pose );
314  }
315  }
316 
317 
318  if (local_debug) {
319  pose.dump_pdb("tmp_cen_ran.pdb");
320  ( *scorefxn() )(pose);
321  tr() << "random frags: "
322  << pose.energies().total_energies().weighted_string_of( scorefxn()->weights() ) << std::endl;
323  }
324  }
325  tr() << "loop rmsd after initial fragment perturbation:" << loop_rmsd( pose, native_pose, one_loop_loops ) << std::endl;
326 
327  // scheduler
328  bool const fast = option[OptionKeys::loops::fast];
329  int outer_cycles( 3 );
330  int inner_cycles( fast ? std::min( Size(250), loop_size*5 ) : std::min( Size(1000), loop_size*20 ) );
331 
332  if ( option[OptionKeys::loops::debug] ) inner_cycles = 10;
333 
334  // Monte Carlo
335  float const init_temp( 2.0 ), final_temp( 1.0 );
336  float const gamma = std::pow( (final_temp/init_temp), (1.0f/(outer_cycles*inner_cycles)) );
337  float temperature = init_temp;
338  if ( local_debug ) { // hacking
339  ( *scorefxn() )(pose);
340  tr() << "before mc ctor: "
341  << pose.energies().total_energies().weighted_string_of( scorefxn()->weights() ) << std::endl;
342  }
343 
344  protocols::moves::MonteCarlo mc( pose, *scorefxn(), temperature);
345 
346  // minimizer
347  AtomTreeMinimizerOP minimizer;
348  float const dummy_tol( 0.001 ); // linmin sets tol internally
349  bool const use_nblist( false ), deriv_check( false ); // true ); // false );
350  if ( core::pose::symmetry::is_symmetric( pose ) ) {
351  minimizer = dynamic_cast<AtomTreeMinimizer*> (new core::optimization::symmetry::SymAtomTreeMinimizer);
352  } else {
354  }
355 
356  MinimizerOptions options( "linmin", dummy_tol, use_nblist, deriv_check);
357 
358  mc.show_scores();
359 
360  for( int i=1; i<=outer_cycles; ++i ) {
361  // recover low
362  if ( local_debug) { // debug
363  ( *scorefxn() )( pose );
364  tr() << "befor rLOW: " << pose.energies().total_energies().weighted_string_of( scorefxn()->weights() ) <<
365  " rmsd: " << F(9,3,loop_rmsd( pose, native_pose, one_loop_loops )) << std::endl;
366  }
367 
368  mc.recover_low(pose);
369 
370  if ( local_debug) { // debug
371  ( *scorefxn() )( pose );
372  tr() << "after rLOW: " << pose.energies().total_energies().weighted_string_of( scorefxn()->weights() ) <<
373  " rmsd: " << F(9,3,loop_rmsd( pose, native_pose, one_loop_loops )) << std::endl;
374  }
375 
376  for( int j=1; j<=inner_cycles; ++j ) {
377  // change temperature
378  temperature *= gamma;
379  mc.set_temperature( temperature );
380  // use rbegin and rend to iterate from larger size to smaller size
381  //for ( std::map< Size, protocols::frags::TorsionFragmentLibraryOP >::const_reverse_iterator
382  // it = frag_libs.rbegin(), it_end = frag_libs.rend(); it != it_end; ++it ) {
383  for ( std::vector< FragmentMoverOP >::const_iterator
384  it = fragmover.begin(),it_end = fragmover.end(); it != it_end; it++ ) {
385 
386  // skip if the loop is too short
387  //Size const frag_size( it->first );
388 
389  //if ( loop_size < frag_size || ( skip_long_frags && loop_size < frag_size * 2 + 1 ) ) continue;
390  // monte carlo fragment ccd minimization
391  if ( verbose ) tr() << "perturb out/in/frag: "
392  << i << "/" << outer_cycles << " "
393  << j << "/" << inner_cycles << std::endl;
394 
395  if ( local_debug) { // debug
396  ( *scorefxn() )( pose );
397  tr() << "befor frag: " << pose.energies().total_energies().weighted_string_of( scorefxn()->weights() ) <<
398  " rmsd: " << F(9,3,loop_rmsd( pose, native_pose, one_loop_loops )) << std::endl;
399  }
400 
401  //insert_fragment( loop_begin, loop_end, pose, it->second );
402  (*it)->apply( pose );
403 
404  if ( local_debug) { // debug
405  ( *scorefxn() )( pose );
406  tr() << "after frag: " << pose.energies().total_energies().weighted_string_of( scorefxn()->weights() ) <<
407  " rmsd: " << F(9,3,loop_rmsd( pose, native_pose, one_loop_loops )) << std::endl;
408  }
409 
410  if ( !loop.is_terminal( pose ) ) ccd_close_loops( pose, one_loop_loops, mm_one_loop);
411 
412  if ( local_debug) { // debug
413  ( *scorefxn() )( pose );
414  tr() << "after ccd: " << pose.energies().total_energies().weighted_string_of( scorefxn()->weights() ) <<
415  " rmsd: " << F(9,3,loop_rmsd( pose, native_pose, one_loop_loops )) << std::endl;
416  }
417 
418  minimizer->run( pose, mm_one_loop, *scorefxn(), options );
419 
420  if ( local_debug) { // debug
421  ( *scorefxn() )( pose );
422  tr() << "after min: " << pose.energies().total_energies().weighted_string_of( scorefxn()->weights() ) <<
423  " rmsd: " << F(9,3,loop_rmsd( pose, native_pose, one_loop_loops )) << std::endl;
424  }
425 
426  std::string move_type = "frag_ccd_min";
427  mc.boltzmann( pose, move_type );
428  mc.show_scores();
429  } // for each fragment size
430  } // inner_cycles
431  } // outer_cycles
432  pose = mc.lowest_score_pose();
433 
434  if (local_debug) {
435  std::ofstream out("score.tmp_perturb_cen");
436  out << "scoring after cen_perturb: " << ( *scorefxn() )(pose) << std::endl;
437  /// Now handled automatically. scorefxn_->accumulate_residue_total_energies(pose);
438  scorefxn()->show( out );
439  out << pose.energies();
440  }
441 
442  // return to original fold tree
443  pose.fold_tree( f_orig );
444  return loop_mover::Success;
445 
446 }
447 
449  return loops();
450 }
451 
453  return scorefxn();
454 }
455 
456 basic::Tracer & LoopMover_Perturb_CCD::tr() const
457 {
458  return TR;
459 }
460 
462 
464  return new LoopMover_Perturb_CCD();
465 }
466 
468  return "LoopMover_Perturb_CCD";
469 }
470 
471 std::ostream &operator<< ( std::ostream &os, LoopMover_Perturb_CCD const &mover )
472 {
473  moves::operator<<(os, mover);
474  os << "Loops:\n" << *mover.get_loops();
475  os << "Scorefunction: " << mover.get_scorefxn()->get_name() << std::endl;
476  return os;
477 }
478 
479 } // namespace perturb
480 } // namespace loop_mover
481 } // namespace loops
482 } // namespace protocols