28 #include <basic/options/option.hh>
29 #include <basic/Tracer.hh>
31 #include <utility/exit.hh>
32 #include <numeric/random/random.hh>
36 #include <basic/options/keys/loops.OptionKeys.gen.hh>
39 #include <utility/vector1.hh>
52 static basic::Tracer
TR(
"protocols.loops.loop_closure.kinematic_closure.KinematicWrapper" );
53 static numeric::random::RandomGenerator
RG(171528);
57 namespace loop_closure {
58 namespace kinematic_closure {
66 core::Size alc_start(0), alc_middle(0), alc_end(0);
67 core::Size alc_end_in_vec(0), alc_start_in_vec(0);
70 runtime_assert(!(npos < 3));
72 for( ; counter<=
limit_; ++counter){
76 if ( basic::options::option[ basic::options::OptionKeys::loops::legacy_kic ]() || counter % 2 == 0 ) {
77 alc_start_in_vec =
RG.random_range(1,npos-2);
79 alc_end_in_vec =
RG.random_range(alc_start_in_vec+2, npos);
82 alc_end_in_vec =
RG.random_range(3, npos);
84 alc_start_in_vec =
RG.random_range(1,alc_end_in_vec-2);
87 core::Size middle_offset = (alc_end - alc_start) / 2;
88 alc_middle = alc_start + middle_offset;
94 for( ; i<alc_end_in_vec; ++i){
115 kinmover_->set_pivots(alc_start, alc_middle, alc_end);
117 if (
kinmover_->last_move_succeeded() )
break;
121 TR <<
"KinematicMover closed in " << counter <<
" cycles; loop was begin/middle/end "
122 << alc_start <<
'/' << alc_middle <<
'/' << alc_end << std::endl;
125 else if( counter >
limit_ ){
126 TR <<
"KinematicMover failed to close in " <<
limit_ <<
" cycles" << std::endl;
129 else {utility_exit_with_message(
"How did we get here? - KinematicWrapper");}
136 return "KinematicWrapper";
146 if(mm->get_bb(*i)) ++i;
150 TR <<
"respect_this_movemap has restricted loop pivots to these positions:";
157 using namespace basic::options;
163 ) : Mover(), kinmover_(kinmover_in), loop_begin_(loop_in.
start()), loop_end_(loop_in.
stop()),
164 limit_( (cycles == 0) ? option[OptionKeys::loops::kinematic_wrapper_cycles].value() : cycles)
175 ) : Mover(), kinmover_(kinmover_in), loop_begin_(loop_begin), loop_end_(loop_end),
176 limit_( (cycles == 0) ? option[OptionKeys::loops::kinematic_wrapper_cycles].value() : cycles)
183 Mover::type(
"KinematicWrapper" );