25 #define foreach BOOST_FOREACH
36 #include <basic/options/option.hh>
59 #include <basic/Tracer.hh>
62 #include <numeric/random/random.hh>
73 #include <basic/options/keys/loops.OptionKeys.gen.hh>
76 #include <utility/vector0.hh>
77 #include <utility/vector1.hh>
78 #include <ObjexxFCL/format.hh>
85 namespace ObjexxFCL {
namespace fmt { } }
using namespace ObjexxFCL::fmt;
90 namespace loop_mover {
96 static numeric::random::RandomGenerator
RG(42478);
97 static basic::Tracer
TR(
"protocols.loops.loop_mover.perturb.LoopMover_Perturb_CCD");
100 LoopMover_Perturb_CCD::LoopMover_Perturb_CCD() :
160 return "LoopMover_Perturb_CCD";
172 using namespace scoring;
173 using namespace optimization;
174 using namespace basic::options;
175 using namespace core::kinematics;
176 using namespace protocols::simple_moves;
178 bool const verbose(
true );
179 bool const local_debug(
false );
187 movemap->set_bb_true_range( loop.
start(), loop.
stop() );
189 Loops one_loop_loops;
192 std::vector< FragmentMoverOP > fragmover;
193 for ( std::vector< core::fragment::FragSetOP >::const_iterator
195 it != it_end; it++ ) {
197 cfm->set_check_ss(
false );
198 cfm->enable_end_bias_check(
false );
199 fragmover.push_back( cfm );
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 );
228 tr() <<
"perturb_one_loop_with_ccd: " << loop_begin <<
' ' << loop_size << std::endl;
230 Real const init_phi ( -150.0 );
231 Real const init_psi ( 150.0 );
232 Real const init_omega( 180.0 );
244 std::ofstream out(
"score.tmp_input_cen");
245 out <<
"scoring before cen_perturb: " << ( *
scorefxn() )(pose) << std::endl;
249 tr() <<
"before cen_perturb: "
258 tr() <<
"loop rmsd before initial fragment perturbation:" <<
loop_rmsd( pose, native_pose, one_loop_loops ) << std::endl;
261 pose.
dump_pdb(
"tmp_cen_preidl.pdb");
271 pose.
set_omega( loop_begin - 1, init_omega );
279 pose.
dump_pdb(
"tmp_cen_endidl.pdb");
285 for (
Size i= loop_begin; i<= loop_end; ++i ) {
290 pose.
dump_pdb(
"tmp_cen_postidl.pdb");
297 for (
Size i = loop_begin; i <= loop_end; ++ i ) {
311 for ( std::vector< FragmentMoverOP >::const_iterator
312 it = fragmover.begin(),it_end = fragmover.end(); it != it_end; it++ ) {
313 (*it)->apply( pose );
321 tr() <<
"random frags: "
325 tr() <<
"loop rmsd after initial fragment perturbation:" <<
loop_rmsd( pose, native_pose, one_loop_loops ) << std::endl;
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 ) );
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;
340 tr() <<
"before mc ctor: "
348 float const dummy_tol( 0.001 );
349 bool const use_nblist(
false ), deriv_check(
false );
356 MinimizerOptions options(
"linmin", dummy_tol, use_nblist, deriv_check);
360 for(
int i=1; i<=outer_cycles; ++i ) {
365 " rmsd: " << F(9,3,
loop_rmsd( pose, native_pose, one_loop_loops )) << std::endl;
373 " rmsd: " << F(9,3,
loop_rmsd( pose, native_pose, one_loop_loops )) << std::endl;
376 for(
int j=1; j<=inner_cycles; ++j ) {
378 temperature *= gamma;
383 for ( std::vector< FragmentMoverOP >::const_iterator
384 it = fragmover.begin(),it_end = fragmover.end(); it != it_end; it++ ) {
391 if ( verbose )
tr() <<
"perturb out/in/frag: "
392 << i <<
"/" << outer_cycles <<
" "
393 << j <<
"/" << inner_cycles << std::endl;
398 " rmsd: " << F(9,3,
loop_rmsd( pose, native_pose, one_loop_loops )) << std::endl;
402 (*it)->apply( pose );
407 " rmsd: " << F(9,3,
loop_rmsd( pose, native_pose, one_loop_loops )) << std::endl;
415 " rmsd: " << F(9,3,
loop_rmsd( pose, native_pose, one_loop_loops )) << std::endl;
418 minimizer->run( pose, mm_one_loop, *
scorefxn(), options );
423 " rmsd: " << F(9,3,
loop_rmsd( pose, native_pose, one_loop_loops )) << std::endl;
435 std::ofstream out(
"score.tmp_perturb_cen");
436 out <<
"scoring after cen_perturb: " << ( *
scorefxn() )(pose) << std::endl;
468 return "LoopMover_Perturb_CCD";
475 os <<
"Scorefunction: " << mover.
get_scorefxn()->get_name() << std::endl;