Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
BackrubDDMover.cc
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 // (C) 199x-27 University of Washington
10 // (C) 199x-27 University of California Santa Cruz
11 // (C) 199x-27 University of California San Francisco
12 // (C) 199x-27 Johns Hopkins University
13 // (C) 199x-27 University of North Carolina, Chapel Hill
14 // (C) 199x-27 Vanderbilt University
15 
16 /// @file protocols/protein_interface_design/movers/BackrubDDMover.cc
17 /// @brief
18 /// @author Sarel Fleishman (sarelf@u.washington.edu), Eva-Maria Strauch (evas01@u.washington.edu)
19 
20 // Unit headers
24 
25 // Package headers
30 
31 // Project Headers
32 #include <core/types.hh>
36 //#include <protocols/moves/ResidueMover.hh>
37 #include <protocols/moves/Mover.hh>
39 #include <core/pose/Pose.hh>
41 // AUTO-REMOVED #include <protocols/viewer/viewers.hh>
43 #include <basic/options/option.hh>
46 #include <core/pose/selection.hh>
47 
49 #include <core/kinematics/Edge.hh>
50 #include <basic/Tracer.hh>
51 
57 
58 // Utility Headers
59 #include <utility/vector1.hh>
60 #include <numeric/random/random.hh>
61 #include <utility/tag/Tag.hh>
63 #include <protocols/moves/Mover.fwd.hh> //Movers_map
64 //#include <protocols/simple_moves/BackboneMover.hh>
65 
66 #include <ObjexxFCL/FArray1D.hh>
67 #include <ObjexxFCL/FArray1D.fwd.hh>
68 
69 // C++ headers
70 #include <map>
71 #include <vector>
72 
73 // option key includes
74 
75 #include <basic/options/keys/packing.OptionKeys.gen.hh>
76 #include <basic/options/keys/backrub.OptionKeys.gen.hh>
77 #include <boost/foreach.hpp>
78 
80 #include <utility/vector0.hh>
81 #include <utility/keys/Key3Vector.hh>
82 
83 //Auto Headers
86 #define foreach BOOST_FOREACH
87 
88 namespace protocols {
89 namespace protein_interface_design {
90 namespace movers {
91 
92 static basic::Tracer TR( "protocols.protein_interface_design.BackrubDDMover" );
93 static numeric::random::RandomGenerator RG( 1581948 );
94 
95 typedef core::Real Real;
97 
100 {
102 }
103 
106  return new BackrubDDMover();
107 }
108 
111 {
112  return "BackrubDD";
113 }
114 
116  simple_moves::DesignRepackMover( "BackrubDD" ),
117  backrub_partner1_( false ),
118  backrub_partner2_( true ),
119  interface_distance_cutoff_( 8.0 ),
120  backrub_moves_( 1000 ),
121  mc_kt_( 0.6 ),
122  sidechain_move_prob_( 0.25 ),
123  small_move_prob_( 0.0 ),
124  bbg_move_prob_( 0.25 )
125 {
126  residues_.clear();
127 }
128 
129 using namespace protocols::protein_interface_design;
130 using namespace core;
131 using namespace pack::task;
132 using namespace std;
133 using namespace core::scoring;
134 using namespace protocols::moves;
135 
136 // all constants for the backrub mover were taken from Colin's backrub.cc application
138 ( ScoreFunctionCOP scorefxn,
139  bool const backrub_partner1,
140  bool const backrub_partner2,
141  core::Real const interface_distance_cutoff,
142  core::Size const backrub_moves,
143  core::Real const mc_kt,
144  core::Real const sidechain_move_prob,
145  std::vector<core::Size> const & residues
146 )
147  : simple_moves::DesignRepackMover( "Backrub" )
148 {
149  core::Real const mm_bend_weight( 1.0 );
150 
151  using namespace core::scoring;
152 
153  backrub_partner1_ = backrub_partner1;
154  backrub_partner2_ = backrub_partner2;
155  backrub_moves_ = backrub_moves;
156  mc_kt_ = mc_kt;
157  interface_distance_cutoff_ = interface_distance_cutoff;
158  sidechain_move_prob_ = sidechain_move_prob;
159 
160  runtime_assert( backrub_moves_ );
161  scorefxn_repack_ = new ScoreFunction( *scorefxn );
162  scorefxn_repack_->set_weight( mm_bend, mm_bend_weight );
163 
164  // pivot atoms default to "CA" so that non-protein atoms are not considered during backrub scoring
165  using namespace basic::options;
166  methods::EnergyMethodOptions emo( scorefxn_repack_->energy_method_options() );
167  emo.bond_angle_central_atoms_to_score( option[ OptionKeys::backrub::pivot_atoms ] );
168  scorefxn_repack_->set_energy_method_options( emo );
169 
170  residues_ = residues;
171 }
172 
174 
177  return( protocols::moves::MoverOP( new BackrubDDMover( *this ) ) );
178 }
179 
180 void
182 {
183  // following are the default values that Colin uses. Ugly way of setting it up, that should probably be replaced by
184  // commandline options
185  utility::vector1< std::string > const pivot_atoms( 1, "CA" );
186  core::Size const min_atoms( 3 );
187  core::Size const max_atoms( 34 );
188  //core::Real const mc_kt( .6 ); // now setable
189  core::Real const sc_prob_uniform( 0.1 );
190 
191  kinematics::FoldTree const saved_ft( pose.fold_tree() );
192  bool make_new_ft( false );
193  foreach( kinematics::Edge const edge, saved_ft ){
194  if( edge.start() > edge.stop() ){
195  make_new_ft = true;
196  break;
197  }
198  }
199 
200  if( make_new_ft )
202 
203  // backrub setup based on collin's backrub.cc
204 
205  // set up the BackrubMover
206  protocols::backrub::BackrubMover backrub_mover;
210 
211  smallmover.nmoves( 1 );
212  bbg8t3amover.factorA( 0.5 ); // values suggested by Yuan
213  bbg8t3amover.factorB( 10.0 );
214  // read known and unknown optimization parameters from the database
215  backrub_mover.branchopt().read_database();
216 
217  core::pose::PoseCOP pose_copy = new core::pose::Pose( pose );
218  backrub_mover.set_input_pose( pose_copy );
219  backrub_mover.set_native_pose( pose_copy );
220  sidechain_mover.set_input_pose( pose_copy );
221  sidechain_mover.set_native_pose( pose_copy );
222  smallmover.set_input_pose( pose_copy );
223  smallmover.set_native_pose( pose_copy );
224  bbg8t3amover.set_input_pose( pose_copy );
225  bbg8t3amover.set_native_pose( pose_copy );
226 
227  using namespace core::pack::task::operation;
228  using namespace protocols::toolbox::task_operations;
229  backrub_mover.clear_segments();
230  TaskFactoryOP main_task_factory;
231  TaskFactoryCOP ancestral_task( task_factory() );
232  if( ancestral_task )
233  main_task_factory = new TaskFactory( *ancestral_task );
234  else
235  main_task_factory = new TaskFactory;
236  //RestrictToInterfaceOperationOP rtio = new RestrictToInterfaceOperation;
237  //rtio->interface_cutoff( 8.0 );
238  if( prevent_repacking().size() ){
239  operation::OperateOnCertainResiduesOP prevent_repacking_on_certain_res = new operation::OperateOnCertainResidues;
240  prevent_repacking_on_certain_res->residue_indices( prevent_repacking() );
241  prevent_repacking_on_certain_res->op( new PreventRepackingRLT );
242  main_task_factory->push_back( prevent_repacking_on_certain_res );
243  }
244  main_task_factory->push_back( new InitializeFromCommandline );
245  main_task_factory->push_back( new IncludeCurrent );
246  //main_task_factory->push_back( rtio );
247  main_task_factory->push_back( new RestrictToRepacking );
248  main_task_factory->push_back( new NoRepackDisulfides );
249  if( !backrub_partner1_ )
250  main_task_factory->push_back( new PreventChainFromRepackingOperation( 1 ) );
251  if( !backrub_partner2_ )
252  main_task_factory->push_back( new PreventChainFromRepackingOperation( 2 ) );
253  if( basic::options::option[ basic::options::OptionKeys::packing::resfile ].user() )
254  {
255  main_task_factory->push_back( new ReadResfile );
256  }
257 
258  using ObjexxFCL::FArray1D_bool;
260  if( pose.conformation().num_chains() == 2 ){
261  Size const rb_jump( 1 );
262 
263  FArray1D_bool partner1( pose.total_residue() );
264  pose.fold_tree().partition_by_jump( rb_jump, partner1 ); // partner1 is true for all residues in partner1; false o/w
265  Size const begin2( pose.conformation().chain_begin( 2 ) ); // the starting residue of partner2
266 
267  protocols::scoring::Interface interface( rb_jump );
268  interface.distance( interface_distance_cutoff_ );
269  interface.calculate( pose );
270  // list of residues to backrub
271  if( !residues_.size() ) {
272  bool first( true ); bool last( false ); // mark all interface residues + 1 spanning residue on each side for backrub
273  for (Size i = 1; i <= pose.total_residue(); i++) {
274  if( !pose.residue( i ).is_protein() ) continue;
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 );
281  }
282  else {
283  if( last ) { resnums.push_back( i ); }
284  last = false; first = true;
285  }
286  }
287  }
288  else resnums = residues_;
289  }
290  else if ( !residues_.size() ) { // pose does not have 2 chains, backrub all (protein)
291  for ( core::Size i = 1; i <= pose.total_residue(); ++i ) {
292  if ( !pose.residue( i ).is_protein() ) continue;
293  resnums.push_back( i );
294  }
295  }
296  if( residues_.size() ){// add user-defined residues to the list of backrubbable residues
297  resnums.insert( resnums.begin(), residues_.begin(), residues_.end() );
298  std::sort( resnums.begin(), resnums.end() );
299  std::unique( resnums.begin(), resnums.end() );
300  }
301 
302 /// movemap is used by smallmoves
304  movemap->clear();
305  movemap->set_bb( false );
306  core::Size const sm_begin( backrub_partner1_ ? pose.conformation().chain_begin( 1 ) : pose.conformation().chain_begin( 2 ) );
307  core::Size const sm_end( backrub_partner2_ ? pose.conformation().chain_end( 2 ) : pose.conformation().chain_end( 1 ) );
308 
309  for( core::Size resi( sm_begin ); resi <= sm_end; ++resi )
310  movemap->set_bb( resi, true );
311  smallmover.movemap( movemap );
312  bbg8t3amover.movemap( movemap );
313 
314  //take out the residues from the resnum vector that are not allowed to be repacked
315  //as well as 1 before and 1 residue after that one
316  using namespace core::scoring;
317  for( utility::vector1< core::Size > ::const_iterator prev_rep = prevent_repacking_.begin(); prev_rep!=prevent_repacking_.end(); ++prev_rep ){
318  utility::vector1< core::Size >::iterator it = std::find( resnums.begin(), resnums.end(),*prev_rep );
319  if( it != resnums.end() )
320  {
321  resnums.erase( it );
322  utility::vector1< core::Size >::iterator it_next = std::find( resnums.begin(), resnums.end(),*prev_rep+1 );
323  if( it_next != resnums.end() ) resnums.erase( it_next );
324  utility::vector1< core::Size >::iterator it_previous = std::find( resnums.begin(), resnums.end(),*prev_rep-1 );
325  if( it_previous != resnums.end() ) resnums.erase( it_previous );
326  }
327  }
328 
329  // C-beta atoms should not be altered during packing because branching atoms are optimized
330  main_task_factory->push_back( new PreserveCBeta );
331 
332  // set up the SidechainMover
333  sidechain_mover.set_task_factory( main_task_factory );
334  sidechain_mover.set_prob_uniform( sc_prob_uniform );
335 
336  backrub_mover.add_mainchain_segments( resnums, pivot_atoms, min_atoms, max_atoms );
337 
338  core::Size const br_segments( backrub_mover.num_segments() );
339  TR << "Backrub Segments Added: " << br_segments <<"\n";
340  if( br_segments == 0 ){
341  TR<<"No segments to backrub. skipping backrub."<<std::endl;
342  return;
343  }
344 
345  TR << "Score After PDB Load:" << std::endl;
346  scorefxn_repack_->show(TR, pose);
347 
348  backrub_mover.optimize_branch_angles( pose );
349 // SJF It doesn't make sense to idealize sidechains in docking
350 // sidechain_mover.idealize_sidechains( pose );
351 
352  TR << "Score After Branch Angle Optimization/Side Chain Idealization:\n" ;
353  scorefxn_repack_->show( TR, pose );
354 
355  protocols::moves::MonteCarlo mc( pose, *scorefxn_repack_, mc_kt_ );
356 
357  mc.reset( pose );
358 
359  TR << "Running " << backrub_moves_ << " trials..." << std::endl;
360 
361  for ( Size i = 1; i <= backrub_moves_; ++i )
362  {
363  std::string move_type;
364 
365  // could use random mover for this...
366  core::Real const move_prob( RG.uniform() );
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();
376  }
377  else {
378  sidechain_mover.apply(pose);
379  move_type = sidechain_mover.type();
380  }
381 
382  mc.boltzmann( pose, move_type );
383  }
384 
385  mc.show_counters();
386 
387  TR << "Last Score:" << std::endl;
388  scorefxn_repack_->show(TR, pose);
389 
390  pose = mc.lowest_score_pose();
391 
392  TR << "Low Score:\n";
393  scorefxn_repack_->show(TR, pose);
394  TR.flush();
395  pose = mc.lowest_score_pose();
396  // write parameters for any sets of branching atoms for which there were not optimization coefficients
397  backrub_mover.branchopt().write_database();
398 
399  pose.fold_tree( saved_ft );
400 }
401 
405 }
406 
408  utility::tag::TagPtr const tag,
412  core::pose::Pose const & pose)
413 {
414  task_factory( protocols::rosetta_scripts::parse_task_operations( tag, data ));
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" ));
424  scorefxn_repack_ = new ScoreFunction( *data.get< ScoreFunction * >( "scorefxns", scorefxn) );
425  scorefxn_repack_->set_weight( mm_bend, 1.0 );
426  // pivot atoms default to "CA" so that non-protein atoms are not considered during backrub scoring
427  using namespace basic::options;
428  methods::EnergyMethodOptions emo( scorefxn_repack_->energy_method_options() );
429  emo.bond_angle_central_atoms_to_score( option[ OptionKeys::backrub::pivot_atoms ] );
430  scorefxn_repack_->set_energy_method_options( emo );
431 
432  utility::vector0< TagPtr > const backrub_tags( tag->getTags() );
433  for( utility::vector0< TagPtr >::const_iterator br_it=backrub_tags.begin(); br_it!=backrub_tags.end(); ++br_it ) {
434  TagPtr const br_tag_ptr = *br_it;
435  if( br_tag_ptr->getName() == "residue" ) {
436  core::Size const resnum( core::pose::get_resnum( br_tag_ptr, pose ) );
437  residues_.push_back( resnum );
438  }
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" ) );
442  core::Size const begin( core::pose::parse_resnum( begin_str, pose ) );
443  core::Size const end( core::pose::parse_resnum( end_str, pose ) );
444  runtime_assert( end > begin );
445  runtime_assert( begin>=1);
446  runtime_assert( end<=pose.total_residue() );
447  for( core::Size i=begin; i<=end; ++i ) residues_.push_back( i );
448  }
449  }
450  TR<<"backrub mover over residues: ";
451  for( std::vector< core::Size >::const_iterator it=residues_.begin() ; it!=residues_.end(); ++it )
452  TR<<*it<<" ";
453  TR<<std::endl;
454 }
455 
456 
457 } //movers
458 } //protein_interface_design
459 } //protocols