41 #include <basic/options/option.hh>
57 #include <basic/Tracer.hh>
60 #include <numeric/random/random.hh>
69 #include <basic/options/keys/out.OptionKeys.gen.hh>
70 #include <basic/options/keys/loops.OptionKeys.gen.hh>
71 #include <basic/options/keys/packing.OptionKeys.gen.hh>
72 #include <basic/options/keys/run.OptionKeys.gen.hh>
76 #include <utility/vector0.hh>
77 #include <utility/vector1.hh>
85 namespace ObjexxFCL { }
using namespace ObjexxFCL;
91 namespace loop_mover {
97 static numeric::random::RandomGenerator
RG(84888);
98 static basic::Tracer
TR(
"protocols.loops.loop_mover.refine.LoopMover_Refine_KIC");
100 LoopMover_Refine_KIC::LoopMover_Refine_KIC() :
LoopMover()
136 using namespace core;
137 using namespace basic::options;
139 fix_natsc_ = option[OptionKeys::loops::fix_natsc];
143 max_seglen_ = option[ OptionKeys::loops::kic_max_seglen ];
144 recover_low_ = ( ! option[ OptionKeys::loops::kic_recover_last ] );
147 option[ OptionKeys::loops::optimize_only_kic_region_sidechains_after_move ];
168 static int cur_struct=0;
173 using namespace core;
174 using namespace optimization;
175 using namespace scoring;
176 using namespace basic::options;
187 bool const verbose(
true );
189 bool const local_movie(
false );
190 std::ofstream loop_outfile;
194 std::string outname_base = option[ OptionKeys::loops::output_pdb ]().
name();
195 std::string outname_prefix = option[ OptionKeys::out::prefix ];
196 std::string outname = outname_prefix + outname_base +
"_fullatom_movie_" +
197 right_string_of(cur_struct,4,
'0') +
".pdb";
198 loop_outfile.open(outname.c_str(), std::ios::out | std::ios::binary);
206 it != it_end; ++it ) {
207 for (
Size i= it->start(); i<= it->stop(); ++i ) {
210 Size const loop_cut(it->cut());
212 if ( loop_cut != nres ) {
221 int const fast = option[OptionKeys::loops::fast];
223 if ( option[ OptionKeys::loops::outer_cycles ].user() ) {
224 outer_cycles = option[ OptionKeys::loops::outer_cycles ]();
226 if ( option[ OptionKeys::run::test_cycles ]() ) {
229 int max_inner_cycles( 200 );
230 if ( option[ OptionKeys::loops::max_inner_cycles ].user() ) {
231 max_inner_cycles = option[ OptionKeys::loops::max_inner_cycles ]();
233 if ( option[ OptionKeys::run::test_cycles ]() ) {
234 max_inner_cycles = 3;
237 int const inner_cycles = std::min(
Size(max_inner_cycles), fast ? (
int)
loops()->loop_size() : 10 * (
Size)(
loops()->loop_size() ) );
238 int repack_period = 20;
239 if ( option[ OptionKeys::loops::repack_period ].user() ) {
240 repack_period = option[ OptionKeys::loops::repack_period ]();
252 min_scorefxn = local_scorefxn->clone();
268 if ( option[ OptionKeys::loops::kic_rama2b ]() ) {
269 min_scorefxn->set_weight(
rama2b, min_scorefxn->get_weight(
rama ) );
270 min_scorefxn->set_weight(
rama, 0);
272 local_scorefxn->set_weight(
rama2b, local_scorefxn->get_weight(
rama ) );
273 local_scorefxn->set_weight(
rama, 0);
278 float const init_temp( option[ OptionKeys::loops::refine_init_temp ]() );
279 float const final_temp( option[ OptionKeys::loops::refine_final_temp ]() );
280 float const gamma = std::pow( (final_temp/init_temp), 1.0f/(outer_cycles*inner_cycles) );
281 float temperature = init_temp;
286 MinimizerOptions options(
"dfpmin", 0.001,
true ,
false );
294 tr() <<
"refine init temp: " << init_temp << std::endl;
295 tr() <<
"refine final temp: " << final_temp << std::endl;
298 using namespace pack::task;
303 task_factory->push_back(
new operation::InitializeFromCommandline );
304 task_factory->push_back(
new operation::IncludeCurrent );
305 if ( option[ OptionKeys::packing::resfile ].user() ) {
313 repack_packer_task->set_bump_check(
true );
315 if ( !option[ OptionKeys::packing::resfile ].user() && !
redesign_loop_ ) {
317 repack_packer_task->restrict_to_repacking();
318 tr() <<
"Not designing" << std::endl;
320 else tr() <<
"Activating design" << std::endl;
323 if(
redesign_loop_ && !option[ OptionKeys::packing::resfile ].user() ) {
324 tr() <<
"Auto-setting loop design for residues:";
326 if( !is_loop[i] ) repack_packer_task->nonconst_residue_task( i ).restrict_to_repacking();
327 else tr() <<
" " << i;
338 if (option[ OptionKeys::loops::vicinity_sampling ]()) {
341 perturber->set_vary_ca_bond_angles( ! option[OptionKeys::loops::fix_ca_bond_angles ]() );
342 myKinematicMover.set_perturber( perturber );
343 perturber->set_degree_vicinity( option[ OptionKeys::loops::vicinity_degree ]() );
344 }
else if ( basic::options::option[ basic::options::OptionKeys::loops::restrict_kic_sampling_to_torsion_string ].user() || basic::options::option[ basic::options::OptionKeys::loops::derive_torsion_string_from_native_pose ]() ) {
345 std::string torsion_bins = basic::options::option[ basic::options::OptionKeys::loops::restrict_kic_sampling_to_torsion_string ]();
348 if ( basic::options::option[ basic::options::OptionKeys::loops::derive_torsion_string_from_native_pose ]() )
353 perturber->set_vary_ca_bond_angles( ! option[ OptionKeys::loops::fix_ca_bond_angles ]() );
354 myKinematicMover.set_perturber( perturber );
355 }
else if ( basic::options::option[ basic::options::OptionKeys::loops::kic_rama2b ]() ) {
359 perturber->set_vary_ca_bond_angles( ! option[ OptionKeys::loops::fix_ca_bond_angles ]() );
360 myKinematicMover.set_perturber( perturber );
364 perturber->set_vary_ca_bond_angles( ! option[OptionKeys::loops::fix_ca_bond_angles ]() );
365 myKinematicMover.set_perturber( perturber );
368 myKinematicMover.set_vary_bondangles(
true );
369 myKinematicMover.set_sample_nonpivot_torsions( option[ OptionKeys::loops::nonpivot_torsion_sampling ]());
370 myKinematicMover.set_rama_check(
true );
371 Size kic_start, kic_middle, kic_end;
374 core::Size num_rot_trials =
Size( option[ OptionKeys::loops::kic_num_rotamer_trials ]() );
380 core::Real orig_local_rama_weight = local_scorefxn->get_weight(
rama );
381 core::Real orig_min_rama_weight = min_scorefxn->get_weight(
rama );
386 if ( basic::options::option [ basic::options::OptionKeys::loops::ramp_fa_rep ]() ) {
387 local_scorefxn->set_weight(
fa_rep, orig_local_fa_rep_weight/(outer_cycles + 1) );
388 min_scorefxn->set_weight(
fa_rep, orig_min_fa_rep_weight/(outer_cycles + 1) );
391 if ( basic::options::option [ basic::options::OptionKeys::loops::ramp_rama ]() ) {
392 local_scorefxn->set_weight(
rama, orig_local_rama_weight/(outer_cycles + 1) );
393 min_scorefxn->set_weight(
rama, orig_min_rama_weight/(outer_cycles + 1) );
396 if (option[ OptionKeys::loops::kic_rama2b ]() ) {
398 local_scorefxn->set_weight(
rama2b, orig_local_rama2b_weight/(outer_cycles + 1) );
399 min_scorefxn->set_weight(
rama2b, orig_min_rama2b_weight/(outer_cycles + 1) );
407 (*local_scorefxn)(pose);
411 repack_packer_task->restrict_to_residues( allow_sc_move_all_loops );
415 rottrials_packer_task =
task_factory->create_task_and_apply_taskoperations( pose );
416 rottrials_packer_task->restrict_to_repacking();
417 rottrials_packer_task->set_bump_check(
true );
418 rottrials_packer_task->restrict_to_residues( allow_sc_move_all_loops );
426 minimizer->run( pose, mm_all_loops, *min_scorefxn, options );
430 tr() <<
"Sequence after design step: "
444 Size begin_loop=one_loop->start();
445 Size end_loop=one_loop->stop();
446 loop_outfile <<
"MODEL" << std::endl;
448 for (
Size i=begin_loop-1, j=1; i<=end_loop+1; i++, j++) {
451 pose.
dump_pdb(loop_outfile, indices,
"initial_repack");
452 loop_outfile <<
"ENDMDL" << std::endl;
456 for (
int i=1; i<=outer_cycles; ++i) {
465 if ( option [ OptionKeys::loops::ramp_fa_rep ]() ) {
467 local_scorefxn->set_weight(
fa_rep, orig_local_fa_rep_weight/(outer_cycles - i + 1) );
468 min_scorefxn->set_weight(
fa_rep, orig_min_fa_rep_weight/(outer_cycles - i + 1) );
471 if ( option [ OptionKeys::loops::ramp_rama ]() ) {
473 local_scorefxn->set_weight(
rama, orig_local_rama_weight/(outer_cycles - i + 1) );
474 min_scorefxn->set_weight(
rama, orig_min_rama_weight/(outer_cycles - i + 1) );
476 if (option[ OptionKeys::loops::kic_rama2b ]() ) {
478 local_scorefxn->set_weight(
rama2b, orig_local_rama2b_weight/(outer_cycles - i + 1) );
479 min_scorefxn->set_weight(
rama2b, orig_min_rama2b_weight/(outer_cycles - i + 1) );
493 if ( verbose )
tr() <<
"cycle: " << i <<
" " << (*local_scorefxn)(pose) << std::endl;
495 for (
int j=1; j<=inner_cycles; ++j ) {
496 temperature *= gamma;
498 if ( verbose )
tr() <<
"refinement cycle (outer/inner): "
499 << i <<
"/" << outer_cycles <<
" "
500 << j <<
"/" << inner_cycles <<
" "
510 Size begin_loop=one_loop.
begin()->start();
513 myKinematicMover.set_loop_begin_and_end( begin_loop, end_loop );
517 loop_sequence.resize(0);
518 for (
core::Size cur_res = begin_loop; cur_res <= end_loop; cur_res++) {
519 loop_sequence.push_back(pose.
aa(cur_res));
521 myKinematicMover.update_sequence( loop_sequence );
526 rottrials_packer_task->restrict_to_residues( cur_allow_sc_move );
533 for (
core::Size kinematic_trial = 1; kinematic_trial <= num_kinematic_trials; kinematic_trial++) {
535 if ( option[ OptionKeys::loops::legacy_kic ]() || j % 2 == 0 ) {
536 kic_start =
RG.random_range(begin_loop,end_loop-2);
538 kic_end =
RG.random_range(kic_start+2, std::min((kic_start+
max_seglen_ - 1), end_loop));
539 Size middle_offset = (kic_end - kic_start) / 2;
540 kic_middle = kic_start + middle_offset;
542 kic_end =
RG.random_range(begin_loop+2,end_loop);
543 kic_start =
RG.random_range(std::max((kic_end - std::min(
max_seglen_, kic_end) + 1), begin_loop), kic_end-2);
544 Size middle_offset = (kic_end - kic_start) / 2;
545 kic_middle = kic_start + middle_offset;
548 myKinematicMover.set_pivots(kic_start, kic_middle, kic_end);
549 myKinematicMover.set_temperature(temperature);
550 myKinematicMover.apply( pose );
552 if ( myKinematicMover.last_move_succeeded() ) {
569 if ( !option[ OptionKeys::loops::legacy_kic ]() && (j%repack_period)==0 ) {
584 repack_packer_task->restrict_to_residues( allow_sc_move_all_loops );
585 rottrials_packer_task->restrict_to_residues( allow_sc_move_all_loops );
587 if ( verbose )
tr() <<
"energy after design: " << (*local_scorefxn)(pose) << std::endl;
589 rottrials_packer_task =
task_factory->create_task_and_apply_taskoperations( pose );
590 rottrials_packer_task->restrict_to_repacking();
591 rottrials_packer_task->set_bump_check(
true );
592 rottrials_packer_task->restrict_to_residues( allow_sc_move_all_loops );
593 if ( verbose )
tr() <<
"energy after design repack: " << (*local_scorefxn)(pose) << std::endl;
604 minimizer->run( pose, mm_all_loops, *min_scorefxn, options );
606 minimizer->run( pose, mm_all_loops, *min_scorefxn, options );
612 else move_type =
"repack";
616 tr() <<
"Sequence after design step: "
619 if ( verbose )
tr() <<
"energy after repack: " << (*local_scorefxn)(pose) << std::endl;
623 for (
Size i = 1; i <= num_rot_trials; i++) {
635 minimizer->run( pose, cur_mm, *min_scorefxn, options );
638 minimizer->run( pose, cur_mm, *min_scorefxn, options );
642 std::stringstream k_trial;
643 k_trial << kinematic_trial;
644 std::string move_type =
"kic_refine_r" + k_trial.str();
645 bool accepted = mc.
boltzmann( pose, move_type );
647 tr() <<
"RMS to native after accepted kinematic round " << kinematic_trial <<
" move on loop "
648 <<
loops()->size() + 1 - loop_ind <<
": "
652 loop_outfile <<
"MODEL" << std::endl;
654 for (
Size i=begin_loop-1, j=1; i<=end_loop+1; i++, j++) {
657 pose.
dump_pdb(loop_outfile, indices,
"refine_r" + k_trial.str());
658 loop_outfile <<
"ENDMDL" << std::endl;
662 if ( verbose )
tr() <<
"energy after accepted move: " << (*local_scorefxn)(pose) << std::endl;
669 if ( ( option[ OptionKeys::loops::legacy_kic ]() && (j%repack_period)==0 ) || j==inner_cycles ) {
687 repack_packer_task->restrict_to_residues( allow_sc_move_all_loops );
688 rottrials_packer_task->restrict_to_residues( allow_sc_move_all_loops );
690 if ( verbose )
tr() <<
"energy after design: " << (*local_scorefxn)(pose) << std::endl;
692 rottrials_packer_task =
task_factory->create_task_and_apply_taskoperations( pose );
693 rottrials_packer_task->restrict_to_repacking();
694 rottrials_packer_task->set_bump_check(
true );
695 rottrials_packer_task->restrict_to_residues( allow_sc_move_all_loops );
696 if ( verbose )
tr() <<
"energy after design repack: " << (*local_scorefxn)(pose) << std::endl;
706 minimizer->run( pose, mm_all_loops, *min_scorefxn, options );
708 minimizer->run( pose, mm_all_loops, *min_scorefxn, options );
714 else move_type =
"repack";
718 tr() <<
"Sequence after design step: "
721 if ( verbose )
tr() <<
"energy after repack: " << (*local_scorefxn)(pose) << std::endl;
724 if ( verbose || local_debug )
tr() << std::flush;
738 Size begin_loop=one_loop->start();
739 Size end_loop=one_loop->stop();
740 loop_outfile <<
"MODEL" << std::endl;
742 for (
Size i=begin_loop-1, j=1; i<=end_loop+1; i++, j++) {
745 pose.
dump_pdb(loop_outfile, indices,
"final_refine");
746 loop_outfile <<
"ENDMDL" << std::endl;
754 return "LoopMover_Refine_KIC";
766 for(
Size i = 1; i <=
loops()->size(); i++ ) {
771 move_maps[ i ] = cur_mm;
784 for(
Size i = 1; i <=
loops()->size(); i++ ) {
789 allow_sc_vectors[ i ] = cur_allow_sc_move;
810 rottrials_packer_task->restrict_to_residues( to_trials );
827 kic_seg.
add_loop( kic_start, kic_end, kic_start );
843 return "LoopMover_Refine_KIC";