16 #include <numeric/kinematic_closure/bridgeObjects.hh>
17 #include <numeric/kinematic_closure/kinematic_closure_helpers.hh>
30 #include <basic/options/option.hh>
43 #include <basic/Tracer.hh>
45 #include <numeric/random/random.hh>
46 #include <numeric/random/random_permutation.hh>
48 #include <numeric/xyzVector.hh>
51 #include <basic/options/keys/loops.OptionKeys.gen.hh>
58 #include <utility/vector1.hh>
59 #include <numeric/conversions.hh>
60 #include <boost/foreach.hpp>
63 #define foreach BOOST_FOREACH
64 static numeric::random::RandomGenerator
RG(43135);
65 static basic::Tracer
TR(
"protocols.loops.loop_closure.kinematic_closure.KinematicMover");
67 using namespace numeric::kinematic_closure;
69 using namespace core::kinematics;
70 using namespace core::scoring;
74 namespace loop_closure {
75 namespace kinematic_closure {
78 KinematicMover::KinematicMover() :
95 BANGLE_MIN_(BANGLE_MEAN_ - (0.5 * BANGLE_SD_)),
99 BANGLE_MAX_(118.9353622),
102 OMEGA_SCALE_FACTOR_(2.375),
106 vary_bond_angles_(false),
107 sample_nonpivot_torsions_(true),
108 sweep_nonpivot_torsion_(false),
109 idealize_loop_first_(false),
110 do_rama_check_(false),
111 do_hardsphere_bump_check_(true),
112 do_sfxn_eval_every_iteration_(false),
114 last_move_succeeded_ (false),
116 bump_overlap_factor_( basic::options::option[ basic::options::OptionKeys::loops::kic_bump_overlap_factor ]() ),
117 taboo_map_max_capacity_(0.95)
121 Mover::type(
"KinematicMover" );
136 runtime_assert(start_res != 0);
137 runtime_assert(middle_res != 0);
138 runtime_assert(end_res != 0);
139 runtime_assert(start_res != middle_res);
140 runtime_assert(middle_res != end_res);
141 runtime_assert(end_res != start_res);
270 if ( new_rama_score > old_rama_score ) {
272 Real const probability = std::exp(std::max(
Real(-40.0),boltz_factor) );
273 if (
RG.uniform() >= probability )
return(
false );
287 using numeric::conversions::radians;
288 using numeric::conversions::degrees;
310 atoms.resize((seg_len + 2) * 3);
333 for (
Size j=1; j<=3; j++) {
334 atoms[ind].resize(3);
362 Size ind=atoms.size()-2;
363 for (
Size j=1; j<=3; j++) {
364 atoms[ind].resize(3);
378 for (
Size j=1; j<=3; j++) {
379 atoms[ind].resize(3);
380 atoms[ind][1] =
static_cast<Real> (res.
xyz(j).x());
381 atoms[ind][2] =
static_cast<Real> (res.
xyz(j).y());
382 atoms[ind][3] =
static_cast<Real> (res.
xyz(j).z());
394 Size pvatom2=5 + (3 * middle_offset);
395 Size pvatom3=(3 * (seg_len+1)) - 1;
405 chainTORS(atoms.size(), atoms, dt_ang, db_ang, db_len, R0, Q0);
409 save_t_ang.resize(dt_ang.size());
410 save_b_ang.resize(db_ang.size());
411 save_b_len.resize(db_len.size());
412 for (
Size i=1; i<=dt_ang.size(); i++) {
413 save_t_ang[i] = dt_ang[i];
414 save_b_ang[i] = db_ang[i];
415 save_b_len[i] = db_len[i];
422 save_residues.resize(seg_len);
423 for (
Size seqpos=start_res_, i=1; seqpos<=
end_res_; seqpos++, i++) {
425 save_residues[i]=saveres;
431 for (
Size i=1; i<=atoms.size(); i+=3) {
433 if( db_ang.size() >= (i+1) ) db_ang[i+1]=
idl_N_CA_C_;
434 if( db_ang.size() >= (i+2) ) db_ang[i+2]=
idl_CA_C_N_;
435 if( db_len.size() >= (i) ) db_len[i]=
idl_N_CA_;
436 if( db_len.size() >= (i+1) ) db_len[i+1]=
idl_CA_C_;
437 if( db_len.size() >= (i+2) ) db_len[i+2]=
idl_C_N_;
438 if( dt_ang.size() >= (i+2) ) dt_ang[i+2]=
OMEGA_MEAN_;
451 for (
Size nits=1; nits <=
perturber_->max_sample_iterations(); ++nits ) {
454 if(
perturber_->perturber_exhausted() )
break;
456 perturber_->perturb_chain( pose, dt_ang, db_ang, db_len );
460 bridgeObjects(atoms, dt_ang, db_ang, db_len, pivots, order, t_ang, b_ang, b_len, nsol);
474 for (
int i=1; i<=nsol; i++) {
479 numeric::random::random_permutation(pos.begin(), pos.end(),
RG);
482 for (
Size i=nsol; i>=1; i--) {
485 if ( ! ( ( -360.0 <= t_ang[pos[i]][pivots[1]-1] ) && (t_ang[pos[i]][pivots[1]-1] <= 360.0) ) ||
486 ! ( ( -360.0 <= t_ang[pos[i]][pivots[1]] ) && (t_ang[pos[i]][pivots[1]] <= 360.0) ) ||
487 ! ( ( -360.0 <= t_ang[pos[i]][pivots[2]-1] ) && (t_ang[pos[i]][pivots[2]-1] <= 360.0) ) ||
488 ! ( ( -360.0 <= t_ang[pos[i]][pivots[2]] ) && (t_ang[pos[i]][pivots[2]] <= 360.0) ) ||
489 ! ( ( -360.0 <= t_ang[pos[i]][pivots[3]-1] ) && (t_ang[pos[i]][pivots[3]-1] <= 360.0) ) ||
490 ! ( ( -360.0 <= t_ang[pos[i]][pivots[3]] ) && (t_ang[pos[i]][pivots[3]] <= 360.0) ) ) {
491 TR <<
"solution " << i <<
" of " << nsol <<
" failed NaN / Inf check. Skipping..." << std::endl;
492 TR <<
"failed NaN t_ang matrix: " << std::endl;
504 perturber_->set_pose_after_closure( pose, t_ang[pos[i]], b_ang[pos[i]], b_len[pos[i]],
true );
518 bool all_filters_passed(
true );
520 if( ! filter->apply( pose ) ) {
521 all_filters_passed =
false;
525 if ( !all_filters_passed ){
543 perturber_->set_pose_after_closure( pose, save_t_ang, save_b_ang, save_b_len,
false );
547 for (
Size seqpos=start_res_, i=1; seqpos<=
end_res_; seqpos++, i++) {
559 return "KinematicMover";
610 Size const start_res,
615 Real old_phi, new_phi, old_psi, new_psi;
616 Real old_rama_score, new_rama_score;
618 for (
Size offset=0; offset<seg_len; offset++) {
620 new_phi = t_ang[pivots[1]+(3*offset)-1];
621 new_psi = t_ang[pivots[1]+(3*offset)];
623 if (new_rama_score == 20.0) {
627 old_psi = pose.
psi(start_res+offset);
628 old_phi = pose.
phi(start_res+offset);
630 if (!
check_rama(old_rama_score, new_rama_score)) {
646 Size const start_res,
647 Size const middle_res,
652 Real old_phi, new_phi, old_psi, new_psi;
653 Real old_rama_score, new_rama_score;
657 new_phi = t_ang[pivots[1]-1];
658 new_psi = t_ang[pivots[1]];
660 if (new_rama_score == 20.0) {
665 old_phi = pose.
phi(start_res);
666 old_psi = pose.
psi(start_res);
670 if (!
check_rama(old_rama_score, new_rama_score)) {
680 new_phi = t_ang[pivots[2]-1];
681 new_psi = t_ang[pivots[2]];
683 if (new_rama_score == 20.0) {
688 old_phi = pose.
phi(middle_res);
689 old_psi = pose.
psi(middle_res);
691 if (!
check_rama(old_rama_score, new_rama_score)) {
701 new_phi = t_ang[pivots[3]-1];
702 new_psi = t_ang[pivots[3]];
704 if (new_rama_score == 20.0) {
709 old_phi = pose.
phi(end_res);
710 old_psi = pose.
psi(end_res);
712 if (!
check_rama(old_rama_score, new_rama_score)) {
750 Size const start_res,
764 if ((j == i) || (j == i+1) || (j == i-1))
continue;
765 if ((j >= start_res) && (j <= i))
continue;
771 Real const nbrcutoff2 = nbrcutoff * nbrcutoff;
773 if ( (nbr_i - nbr_j).length_squared() > nbrcutoff2 )
continue;
777 for (
Size m=1; m<= max_res1_heavyatoms; m++) {
778 Size max_res2_heavyatoms;
781 for (
Size n=1; n<= max_res2_heavyatoms; n++) {
788 Real dist2 = ( atom_i - atom_j ).length_squared();
789 if ( dist2 < dist_cutoff2 ) {
833 using namespace core;
834 using namespace basic::options;
913 TR <<
"error -- position " << pos <<
" exceeds the current taboo map string" << std::endl;
916 for (std::map< std::string, bool >::const_iterator mi =
taboo_map_.begin(); mi !=
taboo_map_.end(); mi++) {
917 counter += ( (mi->first)[pos] == torsion_bin );