43 #include <basic/options/option.hh>
50 #include <basic/Tracer.hh>
59 #include <utility/vector1.hh>
60 #include <numeric/random/random.hh>
61 #include <utility/tag/Tag.hh>
66 #include <ObjexxFCL/FArray1D.hh>
67 #include <ObjexxFCL/FArray1D.fwd.hh>
75 #include <basic/options/keys/packing.OptionKeys.gen.hh>
76 #include <basic/options/keys/backrub.OptionKeys.gen.hh>
77 #include <boost/foreach.hpp>
80 #include <utility/vector0.hh>
81 #include <utility/keys/Key3Vector.hh>
86 #define foreach BOOST_FOREACH
89 namespace protein_interface_design {
92 static basic::Tracer
TR(
"protocols.protein_interface_design.BackrubDDMover" );
93 static numeric::random::RandomGenerator
RG( 1581948 );
116 simple_moves::DesignRepackMover(
"BackrubDD" ),
117 backrub_partner1_( false ),
118 backrub_partner2_( true ),
119 interface_distance_cutoff_( 8.0 ),
120 backrub_moves_( 1000 ),
122 sidechain_move_prob_( 0.25 ),
123 small_move_prob_( 0.0 ),
124 bbg_move_prob_( 0.25 )
129 using namespace protocols::protein_interface_design;
130 using namespace core;
131 using namespace pack::task;
133 using namespace core::scoring;
134 using namespace protocols::moves;
139 bool const backrub_partner1,
140 bool const backrub_partner2,
145 std::vector<core::Size>
const & residues
151 using namespace core::scoring;
153 backrub_partner1_ = backrub_partner1;
154 backrub_partner2_ = backrub_partner2;
155 backrub_moves_ = backrub_moves;
157 interface_distance_cutoff_ = interface_distance_cutoff;
158 sidechain_move_prob_ = sidechain_move_prob;
160 runtime_assert( backrub_moves_ );
162 scorefxn_repack_->set_weight(
mm_bend, mm_bend_weight );
165 using namespace basic::options;
168 scorefxn_repack_->set_energy_method_options( emo );
170 residues_ = residues;
192 bool make_new_ft(
false );
227 using namespace core::pack::task::operation;
228 using namespace protocols::toolbox::task_operations;
233 main_task_factory =
new TaskFactory( *ancestral_task );
238 if( prevent_repacking().
size() ){
240 prevent_repacking_on_certain_res->residue_indices( prevent_repacking() );
242 main_task_factory->push_back( prevent_repacking_on_certain_res );
249 if( !backrub_partner1_ )
251 if( !backrub_partner2_ )
253 if( basic::options::option[ basic::options::OptionKeys::packing::resfile ].user() )
258 using ObjexxFCL::FArray1D_bool;
261 Size const rb_jump( 1 );
268 interface.distance( interface_distance_cutoff_ );
269 interface.calculate( pose );
271 if( !residues_.size() ) {
272 bool first(
true );
bool last(
false );
275 if( (( partner1( i ) && backrub_partner1_ ) || ( !partner1(i) && backrub_partner2_ )) &&
276 interface.is_interface( i ) && (!( i==begin2-1 || i==begin2) || (backrub_partner1_ && backrub_partner2_))) {
277 if( first && i != 1 && (i!= begin2 || (backrub_partner1_ && backrub_partner2_) ) && pose.
residue( i-1 ).
is_protein() )
278 resnums.push_back( i - 1 );
279 first =
false; last =
true;
280 resnums.push_back( i );
283 if( last ) { resnums.push_back( i ); }
284 last =
false; first =
true;
288 else resnums = residues_;
290 else if ( !residues_.size() ) {
293 resnums.push_back( i );
296 if( residues_.size() ){
297 resnums.insert( resnums.begin(), residues_.begin(), residues_.end() );
298 std::sort( resnums.begin(), resnums.end() );
299 std::unique( resnums.begin(), resnums.end() );
305 movemap->set_bb(
false );
309 for(
core::Size resi( sm_begin ); resi <= sm_end; ++resi )
310 movemap->set_bb( resi,
true );
312 bbg8t3amover.
movemap( movemap );
316 using namespace core::scoring;
319 if( it != resnums.end() )
323 if( it_next != resnums.end() ) resnums.erase( it_next );
325 if( it_previous != resnums.end() ) resnums.erase( it_previous );
339 TR <<
"Backrub Segments Added: " << br_segments <<
"\n";
340 if( br_segments == 0 ){
341 TR<<
"No segments to backrub. skipping backrub."<<std::endl;
345 TR <<
"Score After PDB Load:" << std::endl;
346 scorefxn_repack_->show(TR, pose);
352 TR <<
"Score After Branch Angle Optimization/Side Chain Idealization:\n" ;
353 scorefxn_repack_->show( TR, pose );
359 TR <<
"Running " << backrub_moves_ <<
" trials..." << std::endl;
361 for (
Size i = 1; i <= backrub_moves_; ++i )
367 if ( move_prob > small_move_prob_ + bbg_move_prob_ + sidechain_move_prob_ ) {
368 backrub_mover.
apply( pose );
369 move_type = backrub_mover.
type();
370 }
else if( move_prob > sidechain_move_prob_ + bbg_move_prob_ ){
371 smallmover.
apply( pose );
372 move_type = smallmover.
type();
373 }
else if( move_prob > sidechain_move_prob_ ) {
374 bbg8t3amover.
apply( pose );
375 move_type = bbg8t3amover.
type();
378 sidechain_mover.
apply(pose);
379 move_type = sidechain_mover.
type();
387 TR <<
"Last Score:" << std::endl;
388 scorefxn_repack_->show(TR, pose);
392 TR <<
"Low Score:\n";
393 scorefxn_repack_->show(TR, pose);
415 backrub_partner1_ = tag->getOption<
bool>(
"partner1", 0 );
416 backrub_partner2_ = tag->getOption<
bool>(
"partner2", 1 );
417 interface_distance_cutoff_ = tag->getOption<
core::Real>(
"interface_distance_cutoff", 8.0 );
418 backrub_moves_ = tag->getOption<
core::Size>(
"moves", 1000 );
419 sidechain_move_prob_ = tag->getOption<
core::Real>(
"sc_move_probability", 0.25 );
420 small_move_prob_ = tag->getOption<
core::Real >(
"small_move_probability", 0.0 );
421 bbg_move_prob_ = tag->getOption<
core::Real >(
"bbg_move_probability", 0.25 );
422 runtime_assert( sidechain_move_prob_ + small_move_prob_ + bbg_move_prob_ <= 1.0 );
423 std::string const scorefxn( tag->getOption<
string>(
"scorefxn",
"score12" ));
425 scorefxn_repack_->set_weight(
mm_bend, 1.0 );
427 using namespace basic::options;
430 scorefxn_repack_->set_energy_method_options( emo );
434 TagPtr const br_tag_ptr = *br_it;
435 if( br_tag_ptr->getName() ==
"residue" ) {
437 residues_.push_back( resnum );
439 if( br_tag_ptr->getName() ==
"span" ) {
440 string const begin_str( br_tag_ptr->getOption<
string>(
"begin" ) );
441 string const end_str( br_tag_ptr->getOption<
string>(
"end" ) );
444 runtime_assert( end > begin );
445 runtime_assert( begin>=1);
447 for(
core::Size i=begin; i<=
end; ++i ) residues_.push_back( i );
450 TR<<
"backrub mover over residues: ";
451 for( std::vector< core::Size >::const_iterator it=residues_.begin() ; it!=residues_.end(); ++it )