38 #include <basic/options/option.hh>
42 #include <utility/excn/Exceptions.hh>
43 #include <basic/Tracer.hh>
44 #include <numeric/random/random.hh>
45 #include <numeric/numeric.functions.hh>
46 #include <numeric/xyz.functions.hh>
47 #include <basic/options/keys/loops.OptionKeys.gen.hh>
53 #include <utility/vector1.hh>
62 static basic::Tracer
tr(
"protocols.topo_broker", basic::t_info);
63 static numeric::random::RandomGenerator
RG(188428234);
66 namespace topology_broker {
73 using namespace basic::options;
85 : bExclusive_( true ),
86 bAllowAdjacentJumps_( false ),
87 bUseInputPose_( true ),
88 bRigidInRelax_( false ) {}
91 input_pose_( input_pose ),
92 centroid_input_pose_( input_pose ),
95 bAllowAdjacentJumps_( false ),
96 bUseInputPose_( true ),
97 bRigidInRelax_( false )
108 using namespace basic::options;
131 if ( tag ==
"pdb" || tag ==
"PDB" || tag ==
"pdb:" || tag ==
"PDB_FILE" ) {
138 }
else if ( tag ==
"REGION" ) {
141 }
else if ( tag ==
"region_file" || tag ==
"REGION_FILE" ) {
144 std::ifstream infile( file.c_str() );
146 if (!infile.good()) {
147 utility_exit_with_message(
"[ERROR] Error opening RBSeg file '" + file +
"'" );
151 }
else if ( tag ==
"loop_file" || tag ==
"LOOP_FILE" ) {
154 std::ifstream infile( file.c_str() );
156 if (!infile.good()) {
157 utility_exit_with_message(
"[ERROR] Error opening RBSeg file '" + file +
"'" );
164 }
else if ( tag ==
"NO_USE_INPUT_POSE" ) {
166 }
else if ( tag ==
"USE_THREADING_LOOPS" ) {
168 }
else if ( tag ==
"MIN_LOOP_SIZE" ) {
170 }
else if ( tag ==
"KEEP_FLEXIBLE" ) {
171 runtime_assert(
false );
177 }
else if ( tag ==
"RANDOM_GROW_LOOP_BY" ) {
179 }
else if ( tag ==
"RIGID_IN_RELAX" ) {
200 if (
RG.uniform() >= it->skip_rate() ) {
212 tr.Info <<
"Enlarged loops: " << std::endl;
213 tr.Info << loops << std::endl;
221 using namespace loops;
222 tr.Trace <<
"rigid chunk -- generate claim " << std::endl;
229 for (
Size pos = loop_it->start(); pos <= loop_it->stop(); ++pos ) {
243 tr.Debug <<
"New decoy:" << std::endl;
251 using namespace protocols::jd2;
254 tr.Debug <<
"------------------found ThreadingJob ... get loops " << std::endl;
258 tr.Debug <<
"RigidChunk defined for " <<
rigid_core_ << std::endl;
264 if ( foreign_claim.
owner() == this )
return true;
292 if (foreign_claim.
pos( 1 ) >= region->start() && foreign_claim.
pos( 1 ) < region->stop() )
300 tr.Warning <<
"[WARNING] RigidChunkClaimer couldn't get " << was_declined << std::endl;
307 std::copy( extra_jumps.begin(), extra_jumps.end(), std::back_inserter(
current_jumps_ ) );
322 if ( has_par1 && ref_has_par1 ) {
327 tr.Warning <<
"cannot fix internal coords of " << atom <<
" in RigidChunk because 1st parent is missing " << std::endl;
334 if ( has_par2 && ref_has_par2 ) {
339 tr.Warning <<
"cannot fix internal coords of " << atom <<
" in RigidChunk because 2nd parent is missing " << std::endl;
347 core::Real angle( numeric::angle_radians( ref_pose.
xyz( ref_atom ), ref_pose.
xyz( ref_par1O ), ref_pose.
xyz( ref_par2O ) ) );
348 tr.Trace <<
"ref angle direct: " << angle << std::endl;
360 core::Size const nbb_prev( prev_rsd.n_mainchain_atoms() );
361 core::id::AtomID bbM1 ( prev_rsd.mainchain_atom( nbb_prev-2 ), upper_residue-1 );
362 core::id::AtomID bb0 ( prev_rsd.mainchain_atom( nbb_prev-1 ), upper_residue-1 );
363 core::id::AtomID bb1 ( prev_rsd.mainchain_atom( nbb_prev ), upper_residue-1 );
369 tr.Trace <<
"mainchain torsion: ref: " << ref_resi.mainchain_torsion( 1 ) <<
" atom-tree: "
373 tr.Trace <<
"mainchain torsion (before): conf: " << resi.
mainchain_torsion( 1 ) <<
" atom-tree: "
384 tr.Trace <<
"mainchain torsion (after): conf: " << new_resi.
mainchain_torsion( 1 ) <<
" atom-tree: "
387 if ( prev_rsd.has(
"O" ) ) {
392 if ( rsd.has(
"H" ) ) {
395 runtime_assert( new_resi.
has(
"H" ) );
399 if (
tr.Trace.visible() ) {
402 tr.Warning <<
" pose in RigidChunkClaimer is not ideal at position " << upper_residue <<
" although template pose was ideal there " << std::endl;
407 tr.Warning <<
" pose in RigidChunkClaimer is not ideal at position " << upper_residue-1 <<
" although template pose was ideal there " << std::endl;
416 for (
Size i=region->start(); i<=region->stop(); ++i) {
422 if (
tr.Trace.visible() ) {
430 Size loop_start = region->start();
431 Size loop_stop = region->stop();
433 bool lower_connect = ( loop_start > 1
440 if ( lower_connect ) {
441 tr.Trace <<
"fixing lower connection for " << loop_start << std::endl;
444 tr.Trace <<
"NOT fixing lower connection for " << loop_start << std::endl;
447 if ( upper_connect ) {
448 tr.Trace <<
"fixing upper connection for " << loop_stop << std::endl;
451 tr.Trace <<
"NOT fixing upper connection for " << loop_stop << std::endl;
488 lastChunk = std::max( lastChunk , it->stop() );
491 bool missing_density(
false );
494 for (
Size pos = it->start(); pos <=it->stop(); ++pos ) {
500 if ( ( n_pos - ca_pos).length() > 20 || ( ( n_pos - o_pos ).length() > 20 ) ) {
501 tr.Error <<
"missing backbone in rigid-chunk at " << pos << std::endl;
502 missing_density =
true;
506 if ( missing_density )
throw utility::excn::EXCN_BadInput(
" missing density in backbone of rigid-chunk... check your LOOP definition");
523 tr.Debug <<
"copy side chains for residues with * / missing density residues with - ";
525 for (
Size pos = it->start(); pos <=it->stop(); ++pos ) {
526 bNeedToRepack[ pos ] =
false;
532 tr.Debug <<
"-" << pos <<
" ";
533 bNeedToRepack[ pos ] =
true;
538 if ( !bNeedToRepack[ pos ] ) {
539 tr.Debug <<
"*" << pos <<
" ";
549 tr.Debug <<
" that have not moved from start-structure" << std::endl;
558 visited_( rigid.
size(), 0 ),
570 if ( !in1 && ( up1 && down1 ) )
return false;
571 if ( !in2 && ( up2 && down2 ) )
return false;
578 return rigid1 && rigid2;
582 tr.Trace <<
"RigidChunk::irrelavant jumps " << pos1 <<
" " << pos2 << std::endl;
599 Size up_loop( rigid_.loop_index_of_residue( up ) );
600 Size down_loop( rigid_.loop_index_of_residue( down ) );
606 runtime_assert( up_loop && down_loop );
609 if ( up_loop == down_loop )
return false;
613 runtime_assert( visited_.size() >= up_loop );
614 runtime_assert( visited_.size() >= down_loop );
616 if ( !visited_[ up_loop ] || !visited_[ down_loop ] || ( visited_[ up_loop ] != visited_[ down_loop ] ) ) {
620 Size visit_nr = new_nr_++;
622 if ( visited_[ up_loop ] && visited_[ down_loop ] ) {
623 Size old_visit_nr = visited_[ down_loop ];
624 visit_nr = visited_[ up_loop ];
625 for (
Size i=1; i<=visited_.size(); i++ ) {
626 if ( visited_[ i ] == old_visit_nr ) visited_[ i ] = visit_nr;
628 }
else if ( visited_[ up_loop ] || visited_[ down_loop ]) {
630 visit_nr = visited_[ up_loop ] + visited_[ down_loop ];
632 visited_[ up_loop ] = visit_nr;
633 visited_[ down_loop ] = visit_nr;
642 if( visited_.size() == 0 ){
649 for (
Size region = 1; region <= visited_.size(); region++ ) {
650 if ( visited_[ region ] ) {
657 if ( root_reg == 0 ) {
659 runtime_assert( visited_.size() > 0 );
660 visited_[ root_reg ] = 1;
666 Size const anchor( static_cast< Size >( 0.5*(rigid_loops[ root_reg ].
stop()
667 - rigid_loops[ root_reg ].
start()) ) + rigid_loops[ root_reg ].
start() );
669 for (
Size region = 1; region <= visited_.size(); region++ ) {
670 Size old_visited = visited_[ region ];
671 if ( visited_[ region ] != visited_[ root_reg ] ) {
672 Size target_pos ( rigid_loops[ region ].
start()
673 + static_cast< Size >( 0.5*( rigid_loops[ region ].
stop()-rigid_loops[ region ].
start() ) ) );
675 visited_[ region ] = visited_[ root_reg ];
678 for (
Size i=1; i<=visited_.size(); i++ ) {
679 if ( visited_[ i ] == old_visited ) visited_[ i ] = visited_[ root_reg ];