40 #include <basic/options/option.hh>
49 #include <ObjexxFCL/FArray1D.hh>
50 #include <ObjexxFCL/FArray2D.hh>
52 #include <ObjexxFCL/string.functions.hh>
55 #include <numeric/random/random.hh>
56 #include <utility/io/izstream.hh>
57 #include <utility/io/ozstream.hh>
58 #include <utility/io/util.hh>
59 #include <basic/Tracer.hh>
68 #include <basic/options/keys/loops.OptionKeys.gen.hh>
70 #include <utility/vector1.hh>
74 static basic::Tracer
tr(
"protocols.general_abinitio",basic::t_info);
75 static numeric::random::RandomGenerator
RG(1871221234);
86 return "LoopJumpFoldCst";
97 while (loops_out.
size() == 0 && ntries++ < 50) {
100 if (
RG.uniform() >= it->skip_rate() ) {
105 if ( loops_out.
size() == 0 ) {
115 movemap->set_jump(
true );
119 current_jumps = jump_def_->create_jump_sample();
120 }
while ( !current_jumps.
is_valid() && attempts-- );
123 utility_exit_with_message(
"not able to build valid fold-tree in JumpingFoldConstraints::setup_foldtree" );
126 tr.Debug <<
"current_jumps " << current_jumps << std::endl;
131 if ( coordinate_constraint_weight_ > 0 ) {
135 jump_frags = jump_def_->generate_jump_frags( current_jumps, *movemap );
137 jump_mover->type(
"JumpMoves" );
138 jump_mover->set_check_ss(
false );
139 jump_mover->enable_end_bias_check(
false );
142 current_kinematics->set_sampling_fold_tree( current_jumps.
fold_tree() );
143 current_kinematics->set_jump_mover( jump_mover );
146 current_kinematics->set_sampling_fold_tree( current_kinematics->final_fold_tree() );
161 using namespace basic::options;
162 using namespace basic::options::OptionKeys;
166 if ( loops_.size() > 0 ) {
167 select_loops( loops );
169 tr.Debug << loops << std::endl;
172 if ( loops.size() && coordinate_constraint_weight_ > 0.0 ) {
179 if( option[ OptionKeys::loops::mm_loop_file ].user() ) {
180 mmloops =
loops::Loops( option[ OptionKeys::loops::mm_loop_file ]() );
188 if ( jump_def_ ) movemap->set_jump(
true );
189 if ( mmloops.size() && coordinate_constraint_weight_ == 0.0 ) {
190 mmloops.switch_movemap( *movemap,
id::BB,
true );
191 loops.switch_movemap( *movemap,
id::BB,
true );
193 movemap->set_bb(
true );
197 bool success(
true );
198 current_kinematics->set_final_fold_tree( pose.
fold_tree() );
199 success = parse_jump_def( current_kinematics, movemap );
200 current_kinematics->set_movemap( movemap );
203 if ( loops.size() ) {
205 success &= add_rigidity_jumps( rigid_core, current_kinematics );
207 tr.Warning <<
"[WARNING] was not able to fix rigid regions with jumps...retry" << std::endl;
211 pose.
fold_tree( current_kinematics->sampling_fold_tree() );
213 if ( rigid_core.
size() ) {
214 success = add_coord_cst( rigid_core, pose );
216 return current_kinematics;
221 if ( coordinate_constraint_weight_ != 0.0 ) {
222 bool bWeightsIn = ( coordinate_constraint_weights_.size() >= pose.
total_residue() );
224 if ( dump_weights_file_ !=
"NO_DUMP" ) {
225 utility::io::write_vector( dump_weights_file_, coordinate_constraint_weights_ );
226 dump_weights_file_ =
"NO_DUMP";
231 if ( !bWeightsIn ) coordinate_constraint_weights_.clear();
238 ObjexxFCL::FArray1D_float
const& cut_probability( ss_def_->loop_fraction() );
253 for (
Size jump_nr = 1; jump_nr <= f.num_jump(); jump_nr++ ) {
254 Size const up( f.upstream_jump_residue( jump_nr ) );
255 Size const down( f.downstream_jump_residue( jump_nr ));
259 if ( up_loop != down_loop
260 && ( !visited[ up_loop ] || !visited[ down_loop ] || ( visited[ up_loop ] != visited[ down_loop ] ) ) ) {
264 Size visit_nr = jump_nr;
266 if ( visited[ up_loop ] && visited[ down_loop ] ) {
267 Size old_visit_nr = visited[ down_loop ];
268 visit_nr = visited[ up_loop ];
269 for (
Size i=1; i<=visited.size(); i++ ) {
270 if ( visited[ i ] == old_visit_nr ) visited[ i ] = visit_nr;
272 }
else if ( visited[ up_loop ] || visited[ down_loop ]) {
274 visit_nr = visited[ up_loop ] + visited[ down_loop ];
276 visited[ up_loop ] = visit_nr;
277 visited[ down_loop ] = visit_nr;
287 for (
Size region = 1; region <= visited.size(); region++ ) {
288 if ( visited[ region ] ) {
294 if ( root_reg == 0 ) {
296 visited[ root_reg ] = 1;
299 for ( jumping::JumpList::iterator it = rigid_jumps.begin(), eit = rigid_jumps.end(); it !=eit; ++it) {
300 tr.Debug <<
"Fix_jumps: " << it->start_<<
" " << it->end_ << std::endl;
302 tr.Debug <<
"now add more fix-jumps " << std::endl;
305 Size const anchor( static_cast< Size >( 0.5*(rigid_loops[ root_reg ].
stop() - rigid_loops[ root_reg ].
start()) ) + rigid_loops[ root_reg ].
start() );
306 for (
Size region = 1; region <= visited.size(); region++ ) {
307 Size old_visited = visited[ region ];
308 if ( visited[ region ] != visited[ root_reg ] ) {
310 rigid_loops[ region ].
start() + static_cast< Size >( 0.5*( rigid_loops[ region ].
stop()-rigid_loops[ region ].
start() ) ) ) );
311 visited[ region ] = visited[ root_reg ];
313 for (
Size i=1; i<=visited.size(); i++ ) {
314 if ( visited[ i ] == old_visited ) visited[ i ] = visited[ root_reg ];
321 ObjexxFCL::FArray1D_float new_cut_prob( cut_probability );
323 for (
Size pos = it->start(); pos <= it->stop(); pos++ ) {
324 new_cut_prob( pos ) = 0;
328 Size total_njump( rigid_jumps.size() + flex_jumps.size() );
329 ObjexxFCL::FArray2D_int jumps( 2, total_njump );
331 for ( jumping::JumpList::iterator it = rigid_jumps.begin(), eit = rigid_jumps.end(); it !=eit; ++it, ++ct ) {
332 jumps( 1, ct ) = it->start_;
333 jumps( 2, ct ) = it->end_;
334 tr.Debug <<
"Fix_jumps: " << it->start_<<
" " << it->end_ << std::endl;
336 for ( jumping::JumpList::iterator it = flex_jumps.begin(), eit = flex_jumps.end(); it !=eit; ++it, ++ct ) {
337 jumps( 1, ct ) = it->start_;
338 jumps( 2, ct ) = it->end_;
339 tr.Debug <<
"Flex_jumps: " << it->start_<<
" " << it->end_ << std::endl;
341 for (
Size i = 1; i<= current_kinematics->sampling_fold_tree().nres(); i++ ) {
342 tr.Trace <<
"cut_prob: " << i <<
" " << new_cut_prob( i ) << std::endl;
345 bool success = new_fold_tree.
random_tree_from_jump_points( current_kinematics->sampling_fold_tree().nres(), total_njump, jumps, new_cut_prob );
348 if ( rigid_jumps.size() ) {
351 success = new_fold_tree.
reorder( rigid_jumps.begin()->start_ );
353 tr.Warning <<
"[WARNING] failed to reorder fold-tree() ... retry"<<std::endl;
358 current_kinematics->set_sampling_fold_tree( new_fold_tree );
360 mm->set_jump(
false );
362 for ( jumping::JumpList::iterator it = flex_jumps.begin(), eit = flex_jumps.end(); it !=eit; ++it ) {
363 mm->set_jump( it->start_, it->end_,
true );
365 current_kinematics->set_movemap( mm );