42 #include <basic/options/option.hh>
58 #include <basic/Tracer.hh>
61 #include <numeric/random/random.hh>
70 #include <basic/options/keys/out.OptionKeys.gen.hh>
71 #include <basic/options/keys/loops.OptionKeys.gen.hh>
73 #include <basic/options/keys/run.OptionKeys.gen.hh>
77 #include <utility/vector0.hh>
78 #include <utility/vector1.hh>
79 #include <ObjexxFCL/format.hh>
86 namespace ObjexxFCL { }
using namespace ObjexxFCL;
87 namespace ObjexxFCL {
namespace fmt { } }
using namespace ObjexxFCL::fmt;
93 namespace loop_mover {
99 static numeric::random::RandomGenerator
RG(42444);
100 static basic::Tracer
TR(
"protocols.loops.loop_mover.perturb.LoopMover_Perturb_KIC");
102 LoopMover_Perturb_KIC::LoopMover_Perturb_KIC() :
150 if ( basic::options::option[ basic::options::OptionKeys::loops::strict_loops ].user() ) {
151 set_strict_loops( basic::options::option[ basic::options::OptionKeys::loops::strict_loops ]() );
154 max_seglen_ = basic::options::option[basic::options::OptionKeys::loops::kic_max_seglen];
155 recover_low_ = ( ! basic::options::option[basic::options::OptionKeys::loops::kic_recover_last] );
157 remodel_kic_attempts_ = basic::options::option[basic::options::OptionKeys::loops::remodel_kic_attempts];
178 static int cur_struct=0;
181 tr().Error <<
"[WARNING] KinematicMover cannot handle loops smaller than 3 residues. Doing nothing. " << std::endl;
186 Loops one_loop_loops;
189 using namespace scoring;
190 using namespace optimization;
191 using namespace basic::options;
194 bool const local_debug(
false );
195 bool const local_movie(
false );
204 Size const loop_begin( loop.
start() ), loop_end( loop.
stop() ), loop_cut( loop.
cut() );
205 Size const loop_size( loop_end - loop_begin + 1 );
207 std::ofstream loop_outfile;
209 tr() <<
"perturb_one_loop_with_KIC: " << loop_begin <<
' ' << loop_size << std::endl;
216 std::ofstream out(
"score.tmp_input_cen");
217 out <<
"scoring before cen_perturb: " << ( *
scorefxn() )(pose) << std::endl;
221 tr() <<
"before cen_perturb: "
235 bool const fast = option[OptionKeys::loops::fast];
236 int outer_cycles( 3 );
237 if ( option[ OptionKeys::loops::outer_cycles ].user() ) {
238 outer_cycles = option[ OptionKeys::loops::outer_cycles ]();
240 if ( option[ OptionKeys::run::test_cycles ]() ) {
243 int inner_cycles( fast ? std::min(
Size(250), loop_size*5 ) : std::min(
Size(1000), loop_size*20 ) );
244 if ( option[ OptionKeys::loops::max_inner_cycles ].user() ) {
245 inner_cycles = option[ OptionKeys::loops::max_inner_cycles ]();
247 if ( option[ OptionKeys::run::test_cycles ]() ) {
252 float const init_temp( option[ OptionKeys::loops::remodel_init_temp ]() );
253 float const final_temp( option[ OptionKeys::loops::remodel_final_temp ]() );
254 float const gamma = std::pow( (final_temp/init_temp), (1.0f/(outer_cycles*inner_cycles)) );
255 float temperature = init_temp;
258 tr() <<
"before mc ctor: "
264 float const dummy_tol( 0.001 );
265 bool const use_nblist(
false ), deriv_check(
false );
266 MinimizerOptions options(
"linmin", dummy_tol, use_nblist, deriv_check);
274 tr() <<
"remodel init temp: " << init_temp << std::endl;
275 tr() <<
"remodel final temp: " << final_temp << std::endl;
286 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 ]() ) {
287 std::string torsion_bins = basic::options::option[ basic::options::OptionKeys::loops::restrict_kic_sampling_to_torsion_string ]();
290 if ( basic::options::option[ basic::options::OptionKeys::loops::derive_torsion_string_from_native_pose ]() )
294 runtime_assert(torsion_bins.size() == loop_end - loop_begin + 1);
297 perturber->set_vary_ca_bond_angles( ! option[ OptionKeys::loops::fix_ca_bond_angles ]() );
298 myKinematicMover.set_perturber( perturber );
299 }
else if ( basic::options::option[ basic::options::OptionKeys::loops::kic_rama2b ]() && basic::options::option[ basic::options::OptionKeys::loops::taboo_sampling ]() ) {
303 perturber->set_vary_ca_bond_angles( ! option[ OptionKeys::loops::fix_ca_bond_angles ]() );
304 myKinematicMover.set_perturber( perturber );
305 }
else if ( basic::options::option[ basic::options::OptionKeys::loops::taboo_sampling ] ) {
308 perturber->set_vary_ca_bond_angles( ! option[ OptionKeys::loops::fix_ca_bond_angles ]() );
309 myKinematicMover.set_perturber( perturber );
310 }
else if ( basic::options::option[ basic::options::OptionKeys::loops::kic_rama2b ]() ) {
314 perturber->set_vary_ca_bond_angles( ! option[ OptionKeys::loops::fix_ca_bond_angles ]() );
315 myKinematicMover.set_perturber( perturber );
320 perturber->set_vary_ca_bond_angles( ! option[ OptionKeys::loops::fix_ca_bond_angles ]() );
321 myKinematicMover.set_perturber( perturber );
326 myKinematicMover.set_vary_bondangles(
true );
329 myKinematicMover.set_sample_nonpivot_torsions( option[ OptionKeys::loops::nonpivot_torsion_sampling ]());
330 myKinematicMover.set_rama_check(
true );
332 myKinematicMover.set_loop_begin_and_end( loop_begin, loop_end );
338 loop_sequence.resize(0);
339 for (
core::Size cur_res = loop_begin; cur_res <= loop_end; cur_res++) {
340 loop_sequence.push_back(pose.
aa(cur_res));
342 myKinematicMover.update_sequence( loop_sequence );
346 Size kic_start, kic_middle, kic_end;
347 kic_start = loop_begin;
349 Size middle_offset = (kic_end - kic_start) / 2;
350 kic_middle = kic_start + middle_offset;
351 tr() <<
"kinematic initial perturb with start_res: " << kic_start <<
" middle res: " << kic_middle <<
" end_res: "
352 << kic_end << std::endl;
353 myKinematicMover.set_pivots(kic_start, kic_middle, kic_end);
354 myKinematicMover.set_temperature(temperature);
357 tr() <<
"loop rmsd before initial kinematic perturbation:" <<
loop_rmsd( pose, native_pose, one_loop_loops ) << std::endl;
360 myKinematicMover.set_idealize_loop_first(
true );
363 core::Real previous_bump_overlap_factor=myKinematicMover.get_bump_overlap_factor();
364 if ( !option[ OptionKeys::loops::kic_bump_overlap_factor ].user() ) {
366 myKinematicMover.set_bump_overlap_factor(0.4);
369 tr() <<
"Attempting loop building: " << nits <<
" ... " << std::endl;
370 myKinematicMover.apply( pose );
371 if (myKinematicMover.last_move_succeeded()) {
373 tr() <<
"initial kinematic perturbation complete" << std::endl;
374 myKinematicMover.set_idealize_loop_first(
false );
379 if ( !option[ OptionKeys::loops::kic_bump_overlap_factor ].user() ) {
381 myKinematicMover.set_bump_overlap_factor(previous_bump_overlap_factor);
383 if (!myKinematicMover.last_move_succeeded()) {
384 tr().Error <<
"[WARNING] Failed to build loop with kinematic Mover during initial kinematic perturbation after " << nits <<
" trials: " << loop << std::endl;
390 minimizer->run( pose, mm_one_loop, *
scorefxn(), options );
391 tr() <<
"loop rmsd after initial kinematic perturbation:" <<
loop_rmsd( pose, native_pose, one_loop_loops ) << std::endl;
395 tr() <<
"not performing initial kinematic perturbation" << std::endl;
396 if (option[ OptionKeys::loops::vicinity_sampling ]()) {
400 v_perturber->set_vary_ca_bond_angles( ! option[ OptionKeys::loops::fix_ca_bond_angles ]() );
401 v_perturber->set_degree_vicinity( option[ OptionKeys::loops::vicinity_degree ]() );
402 myKinematicMover.set_perturber( v_perturber );
408 std::string outname_base = option[ OptionKeys::loops::output_pdb ]().
name();
409 std::string outname_prefix = option[ OptionKeys::out::prefix ];
410 std::string outname = outname_prefix + outname_base +
"_centroid_movie_" +
411 right_string_of(cur_struct,4,
'0') +
".pdb";
412 loop_outfile.open(outname.c_str(), std::ios::out | std::ios::binary);
413 loop_outfile <<
"MODEL" << std::endl;
415 for (
Size i=loop_begin-1, j=1; i<=loop_end+1; i++, j++) {
419 loop_outfile <<
"ENDMDL" << std::endl;
426 for(
int i=1; i<=outer_cycles; ++i ) {
430 " rmsd: " << F(9,3,
loop_rmsd( pose, native_pose, one_loop_loops )) << std::endl;
441 " rmsd: " << F(9,3,
loop_rmsd( pose, native_pose, one_loop_loops )) << std::endl;
444 for(
int j=1; j<=inner_cycles; ++j ) {
446 temperature *= gamma;
451 if (option[ OptionKeys::loops::always_remodel_full_loop ]()) {
452 kic_start = loop_begin;
454 kic_middle =
RG.random_range(kic_start+2, kic_end-2);
457 if ( option[ OptionKeys::loops::legacy_kic ]() || j % 2 == 0 ) {
458 kic_start =
RG.random_range(loop_begin,loop_end-2);
460 kic_end =
RG.random_range(kic_start+2, std::min((kic_start+
max_seglen_ - 1), loop_end));
461 Size middle_offset = (kic_end - kic_start) / 2;
462 kic_middle = kic_start + middle_offset;
465 kic_end =
RG.random_range(loop_begin+2,loop_end);
466 kic_start =
RG.random_range(std::max((kic_end - std::min(
max_seglen_, kic_end) + 1), loop_begin), kic_end-2);
467 Size middle_offset = (kic_end - kic_start) / 2;
468 kic_middle = kic_start + middle_offset;
471 myKinematicMover.set_pivots(kic_start, kic_middle, kic_end);
472 myKinematicMover.set_temperature(temperature);
473 myKinematicMover.apply( pose );
474 if (myKinematicMover.last_move_succeeded()) {
478 if (myKinematicMover.last_move_succeeded()) {
484 minimizer->run( pose, mm_one_loop, *
scorefxn(), options );
486 bool accepted = mc.
boltzmann( pose, move_type );
488 tr() <<
"new centroid perturb rmsd: " <<
loop_rmsd( pose, native_pose, one_loop_loops ) << std::endl;
490 loop_outfile <<
"MODEL" << std::endl;
492 for (
Size i=loop_begin-1, j=1; i<=loop_end+1; i++, j++) {
495 pose.
dump_pdb(loop_outfile, indices,
"init_perturb");
496 loop_outfile <<
"ENDMDL" << std::endl;
502 tr().Error <<
"[WARNING] Failed to build loop with kinematic Mover after " << nits <<
" trials: " << loop << std::endl;
519 loop_outfile <<
"MODEL" << std::endl;
521 for (
Size i=begin_loop-1, j=1; i<=end_loop+1; i++, j++) {
524 pose.
dump_pdb(loop_outfile, indices,
"final_perturb");
525 loop_outfile <<
"ENDMDL" << std::endl;
528 std::ofstream out(
"score.tmp_perturb_cen");
529 out <<
"scoring after cen_perturb: " << ( *
scorefxn() )(pose) << std::endl;
543 return "LoopMover_Perturb_KIC";
558 return "LoopMover_Perturb_KIC";