Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
DockingHighResLegacy.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 
10 /// @file DockingHighRes
11 /// @brief protocols that are specific to high resolution docking
12 /// @detailed
13 /// This contains the functions that create initial positions for docking
14 /// You can either randomize partner 1 or partner 2, spin partner 2, or
15 /// perform a simple perturbation.
16 /// Also contains docking mcm protocol
17 /// @author Monica Berrondo
18 /// @author Modified by Sergey Lyskov
19 /// @author Modified by Sid Chaudhury
20 /// @author Modified by Jacob Corn
21 
24 
25 // Rosetta Headers
27 
28 // AUTO-REMOVED #include <core/conformation/Interface.hh>
29 
30 #include <basic/options/option.hh>
31 
37 #include <core/conformation/Residue.hh> // for design() flag
39 // AUTO-REMOVED #include <core/pack/task/operation/OperateOnCertainResidues.hh>
40 // AUTO-REMOVED #include <core/pack/task/operation/ResLvlTaskOperations.hh> // PreventRepackingRLT
41 // AUTO-REMOVED #include <core/pack/task/operation/ResFilters.hh> // ResidueLacksProperty
44 
45 #include <core/pose/Pose.hh>
46 #include <core/pose/PDBInfo.hh>
47 // AUTO-REMOVED #include <core/conformation/Conformation.hh>
48 
50 // AUTO-REMOVED #include <core/scoring/ScoreFunctionFactory.hh>
51 
54 #include <protocols/moves/Mover.hh>
57 // AUTO-REMOVED #include <protocols/moves/OutputMovers.hh>
65 //for resfile reading
66 #include <basic/options/keys/packing.OptionKeys.gen.hh>
67 
69 #include <protocols/loops/Loops.hh>
74 
75 // ObjexxFCL Headers
76 #include <ObjexxFCL/string.functions.hh>
77 
78 // C++ Headers
79 #include <string>
80 
81 //Utility Headers
82 // AUTO-REMOVED #include <utility/tag/Tag.hh> // REQUIRED FOR WINDOWS
83 // AUTO-REMOVED #include <numeric/conversions.hh>
84 
85 #include <numeric/trig.functions.hh>
86 #include <numeric/xyzMatrix.fwd.hh>
87 
88 #include <basic/Tracer.hh>
89 
90 using basic::T;
91 
92 // option key includes
93 
94 #include <basic/options/keys/docking.OptionKeys.gen.hh>
95 
96 #include <core/kinematics/Jump.hh>
97 #include <utility/vector0.hh>
98 #include <utility/vector1.hh>
99 
100 
101 
102 using basic::Error;
103 using basic::Warning;
104 
105 static basic::Tracer TR("protocols.docking.DockingHighRes");
106 
107 // originally from dock_structure.cc Jeff Gray April 2001
108 
109 using namespace core;
110 
111 namespace protocols {
112 namespace docking {
113 
114 // default constructor
115 DockingHighResLegacy::DockingHighResLegacy() : DockingHighRes()
116 {
117  // The following three lines are done by the parent class's constructor
118  //movable_jumps_.push_back(1); // operate on the first jump
119  //scorefxn_ = core::scoring::ScoreFunctionFactory::create_score_function( "docking", "docking_min" ) ;
120  //scorefxn_pack() = core::scoring::ScoreFunctionFactory::create_score_function( "standard" ) ;
121  moves::Mover::type( "DockingHighResLegacy" );
122  init_task_factory_ = NULL;
123  design_ = false;
124 }
125 
126 // constructor with arguments
127 // only one movable jump
129  int rb_jump,
131 
132 ) : DockingHighRes( rb_jump, scorefxn )
133 {
134  //movable_jumps_.push_back( rb_jump_in );
135  moves::Mover::type( "DockingHighResLegacy" );
136  init_task_factory_ = NULL;
137  design_ = false;
138 }
139 
140 // constructor with arguments
141 // only one movable jump, scoring and packing defined
143  int rb_jump,
145  core::scoring::ScoreFunctionOP scorefxn_pack
146 ) : DockingHighRes( rb_jump, scorefxn, scorefxn_pack )
147 {
148  //movable_jumps_.push_back( rb_jump_in );
149  moves::Mover::type( "DockingHighResLegacy" );
150  init_task_factory_ = NULL;
151  design_ = false;
152 }
153 
154 // constructor with arguments
155 // only one movable jump, scoring and packing defined
157  DockJumps const movable_jumps,
159  core::scoring::ScoreFunctionOP scorefxn_pack
160 ) : DockingHighRes( movable_jumps, scorefxn, scorefxn_pack )
161 {
162  //movable_jumps_ = movable_jumps;
163  moves::Mover::type( "DockingHighResLegacy" );
164  init_task_factory_ = NULL;
165  design_ = false;
166 }
167 
168 //destructor
170 
171 //clone
173  return new DockingHighResLegacy(*this);
174 }
175 
176 void DockingHighResLegacy::set_min_type( std::string min_type_in ) { min_type_ = min_type_in;}
177 
178 void DockingHighResLegacy::set_repack( bool repack_switch){ repack_switch_ = repack_switch;}
179 
181 {
182  init_task_factory_ = task;
183 }
184 
186 
187 void DockingHighResLegacy::design( bool const des ) {
188  design_ = des;
189 }
190 
191 bool DockingHighResLegacy::design() const { return design_; }
192 
194  using namespace basic::options;
195  using namespace core::pack::task;
196  using namespace core::pack::task::operation;
197 
198 
199  // SETS UP the stuff in pose
200  (*scorefxn())( pose );
201 
202  trans_magnitude_ = option[ OptionKeys::docking::dock_mcm_trans_magnitude ]();
203  rot_magnitude_ = option[ OptionKeys::docking::dock_mcm_rot_magnitude ]();
204 
205  temperature_ = 0.8;
206  repack_switch_ = true;
207  repack_period_ = 8;
208 
209  //sets up MC object
210  mc_ = new moves::MonteCarlo( pose, *scorefxn(), temperature_ );
211 
212  //sets up default movemap
213  bb_ = false;
214  chi_ = false;
216  movemap_->set_chi( chi_ );
217  movemap_->set_bb( bb_ );
218  for( DockJumps::const_iterator it = movable_jumps().begin(); it != movable_jumps().end(); ++it ) {
219  movemap_->set_jump( *it, true );
220  }
221 
222  //sets up minimization parameters
223  min_tolerance_ = 0.01;
224  min_type_ = std::string( "dfpmin_armijo_nonmonotone" );
225  nb_list_ = true;
226 
227  setup_packing( pose );
228 
229  //set up docking protocol based on options
230  set_protocol( pose );
231 }
232 
233 
235 
237 {
238  using namespace basic::options;
239 
240  if ( option[ OptionKeys::docking::dock_min ]() ) {
242  } else if ( option[ OptionKeys::docking::dock_ppk ]() ){
243  //set_dock_ppk_protocol( pose );
244  utility::exit( "Danger Will Robinson! Prepacking is no longer performed within the DockingProtocol. Use the docking_prepack_protocol executable first, then use the output as the starting structure in docking.", 1 );
245  } else {
246  set_dock_mcm_protocol( pose );
247  }
248 }
249 
250 void DockingHighResLegacy::define_loops( pose::Pose const & pose, loops::LoopsOP loop_set, Real & interface_dist ) {
251  //runtime_assert( movable_jumps_.size() == 1 ); // CURRENTLY ONLY SUPPORTED WITH SIMPLE DOCKING
252  //core::Size const rb_jump = movable_jumps_[1];
253 
254  TR << "This method clears the loop set the is passed in. Before using this, please investigate it thoroughly." << std::endl;
255 
256  loop_set->clear();
257 
258  using namespace core::pack::task;
259  using namespace core::pack::task::operation;
260  using namespace protocols::toolbox::task_operations;
261  //RestrictTaskForDockingOP rtfd = new RestrictTaskForDocking( scorefxn_, rb_jump_, true, interface_dist );
263  //tf.push_back( rtfd );
264  //tf.push_back( new RestrictTaskForDocking( scorefxn_, rb_jump_, true, interface_dist ) );
265  tf.push_back( new RestrictToInterface( movable_jumps(), interface_dist ) );
266  pack::task::PackerTaskOP task = tf.create_task_and_apply_taskoperations( pose );
267 
268  // extend one residue beyond borders of repackable regions, don't allow 1-residue loops
269  core::Size const nres = pose.total_residue();
270  utility::vector1<bool> flexible_region( nres, false );
271  for ( Size i=2; i < nres; ++i ) {
272  int num_flexible(0);
273  if ( pose.pdb_info()->chain(i-1) == pose.pdb_info()->chain(i+1) ) {
274  if ( task->pack_residue(i-1) ) ++num_flexible;
275  if ( task->pack_residue(i) ) ++num_flexible;
276  if ( task->pack_residue(i+1) ) ++num_flexible;
277  }
278  if ( num_flexible > 1 ) {
279  flexible_region.at(i-1) = true;
280  flexible_region.at(i) = true;
281  flexible_region.at(i+1) = true;
282  }
283  }
284 
285  // if we have a single fixed residue between two loops, make this flexible
286  for ( Size i=2; i < nres; ++i ) {
287  if ( flexible_region.at(i-1) && flexible_region.at(i+1) ) flexible_region.at(i) = true;
288  }
289 
290  // jk For now, don't let the first or last two residues of a chain be flexible
291  flexible_region.at(1) = false;
292  flexible_region.at(2) = false;
293  for ( Size i=3; i < (nres-1); ++i ) {
294  if ( pose.pdb_info()->chain(i-1) != pose.pdb_info()->chain(i) ) {
295  flexible_region.at(i-2) = false;
296  flexible_region.at(i-1) = false;
297  flexible_region.at(i) = false;
298  flexible_region.at(i+1) = false;
299  }
300  }
301  flexible_region.at(nres-1) = false;
302  flexible_region.at(nres) = false;
303 
304  // disallow one-residue loops
305  for ( Size i=2; i < nres; ++i ) {
306  if ( ( ! flexible_region.at(i-1)) && ( ! flexible_region.at(i+1)) ) flexible_region.at(i) = false;
307  }
308  // disallow two-residue loops
309  for ( Size i=3; i < nres; ++i ) {
310  if ( ( ! flexible_region.at(i-2)) && ( ! flexible_region.at(i+1)) ) {
311  flexible_region.at(i-1) = false;
312  flexible_region.at(i) = false;
313  }
314  }
315 
316  // setup loops
317  core::Size loop_start=0;
318  core::Size loop_stop=0;
319  for ( Size i=1; i < nres; ++i ) {
320  if ( flexible_region.at(i) ) {
321  loop_start = i;
322  loop_stop = i;
323  for ( Size j=i+1; j <= nres; ++j ) {
324  // if j is on a different chain than i, break
325  if ( pose.pdb_info()->chain(j) != pose.pdb_info()->chain(i) ) {
326  break;
327  }
328  // if j is not flexible, break
329  if ( ( ! flexible_region.at(j) ) ) {
330  break;
331  }
332  loop_stop = j;
333  }
334  loop_set->add_loop( loop_start, loop_stop, 0 );
335  i = loop_stop;
336  }
337  }
338 
339  loop_set->choose_cutpoints( pose );
340 
341  return;
342 }
343 
344 
345 ////////////////////////////////////////////////////////////////////////////////
346 /// @begin docking high resolution apply function
347 /// @brief
348 /// @detailed
349 /// decides what to call according to options
351 {
352  using namespace scoring;
353  using namespace basic::options;
354 
355  TR << "in DockingHighRes.apply" << std::endl;
356 
357  // jec sanity check to avoid overwriting newly-set minimizers on every apply
358  // Need to call set_default to reset the cycle mover index in the case where a decoy fails the filters.
359  //if ( !mc_ ) {
360  set_default( pose );
361  //}
362 
363  mc_->reset( pose );
364 
365  docking_highres_protocol_mover_->apply( pose );
366 
367 // pose.dump_pdb("test.pdb"); // JQX: for testing purpose
368 // exit(-1); // JQX: testing
369 
370  if ( !option[ OptionKeys::docking::dock_ppk ]() ) mc_->recover_low( pose );
371 }
372 
373 ///////////////////////////////////////////////////////////////////////////////////
374 /// @begin minimize_trial
375 ///
376 /// @brief main entrance for normal rigid-body minimization
377 /// @detailed
378 /// retrieve the structure in the low array and do the normal minimization
379 /// by calling using a min_mover to optimize the score accourding to the
380 /// scorefunction that has been set
381 ///
382 /// @remarks
383 ///
384 /// @references docking_minimize_trial from docking_minimize.cc
385 /// pose_docking_minimize_trial from pose_docking.cc
386 ///
387 /// @authors Monica Berrondo June 14 2007
388 ///
389 /// @last_modified October 15 2007
390 /////////////////////////////////////////////////////////////////////////////////
392  using namespace moves;
393 
394  TR << "::::::::::::::::::DOCK_MIN:::::::::::::::::::" << std::endl;
395 
397  TrialMoverOP minimize_trial = new TrialMover( min_mover, mc_ );
399  docking_highres_protocol_mover_->add_mover( minimize_trial );
400 }
401 
402 ///////////////////////////////////////////////////////////////////////////////////
403 /// @begin dock_mcm_protocol
404 ///
405 /// @brief main entrance to do monte carlo minimization
406 /// @detailed
407 /// a total of 50 cycles of monte-carlo minimization will be
408 /// carried out if the minimized structure can pass the filter
409 /// after the first and fifth cycle. Then it is rigid-body minimized
410 /// to a stringent tolerance.
411 ///
412 /// @remarks
413 ///
414 /// @references docking_mcm_protocol from docking_minimize.cc
415 /// pose_docking_monte_carlo_minimize from pose_docking.cc
416 ///
417 /// @authors Sid Chaudhury May 28 2009
418 ///
419 /// @last_modified April 30 2008
420 /////////////////////////////////////////////////////////////////////////////////
422  using namespace moves;
423  using namespace basic::options;
424  using namespace core::pack::task;
425  using namespace core::pack::task::operation;
426  using namespace protocols::toolbox::task_operations;
427 
428  //set up minimizer movers
430 
431  //set up rigid body movers
433 
434  //set up sidechain movers for each movable jump
435 
436  TaskFactoryOP tf = new TaskFactory( *task_factory() );
437  tf->push_back( new RestrictToInterface( movable_jumps() ) );
438  set_task_factory( tf );
439  //RotamerTrialsMoverOP pack_rottrial = new protocols::simple_moves::RotamerTrialsMover( scorefxn_pack(), task_factory() );
440 
441  //need to explicitly convert to COP from OP in order for SidechainMinMover to work
442  //besides, need to use init_task_factory_, which is otherwise not used from task_factory()
444 
446  SequenceMoverOP interface_repack_and_move_loops = new moves::SequenceMover;
447 
448  std::string const flex_bb_docking_type = option[ OptionKeys::docking::flexible_bb_docking ]();
449  if ( flex_bb_docking_type == "fixedbb" ) {
450  // Call pack_rotamers, no backbone movement
452  //pack_interface_repack->task_factory( task_factory() );
453  pack_interface_repack->task_factory( ctf );
454  interface_repack_and_move_loops->add_mover( pack_interface_repack );
455  } else {
456 
457  // Call pack_rotamer before and after loop movement
459  //pack_interface_repack->task_factory( task_factory() );
460  pack_interface_repack->task_factory( ctf );
461  interface_repack_and_move_loops->add_mover( pack_interface_repack );
462 
463  if ( ( flex_bb_docking_type == "ccd" ) || ( flex_bb_docking_type == "kic" ) || ( flex_bb_docking_type == "backrub" ) ) {
464 
465  core::kinematics::FoldTree docking_fold_tree( pose.fold_tree() );
466  core::kinematics::FoldTree loop_fold_tree = docking_fold_tree;
467 
468  // jk Create a copy because we can't modify input pose, and we need energies and the docking fold tree
469  // Note: we need the docking fold tree so that we identify the correct "interface" when picking loops (ie. jump #1)
470  // jk For now, define loops based on the input structure
471  // (so that they're always the same, and we don't have to worry about relaxing a priori, akin to prepacking)
472  pose::Pose pose_for_loop_defn = *get_input_pose();
473  (*scorefxn_pack())(pose_for_loop_defn);
474  pose_for_loop_defn.fold_tree( docking_fold_tree );
475 
477  Real interface_dist = option[ OptionKeys::docking::flexible_bb_docking_interface_dist ];
478  define_loops( pose_for_loop_defn, loop_set, interface_dist );
479 
480  loops::loop_mover::LoopMoverOP loop_refine;
481  if ( flex_bb_docking_type == "ccd" ) {
482  // jk CCD loop refinement (fullatom only)
483  TR << "Setting up for ccd loop modeling" << std::endl;
484  protocols::loops::fold_tree_from_loops( pose, *loop_set, loop_fold_tree );
485  // need to pass a clone of the scorefxn because LoopMover requires a non-const scorefxn
486  loop_refine = new loops::loop_mover::refine::LoopMover_Refine_CCD( loop_set, scorefxn_pack()->clone() );
487  } else if ( flex_bb_docking_type == "kic" ) {
488  // jk KIC loop refinement (fullatom only)
489  TR << "Setting up for kinematic (kic) loop modeling" << std::endl;
490  protocols::loops::fold_tree_from_loops( pose, *loop_set, loop_fold_tree );
491  // need to pass a clone of the scorefxn because LoopMover requires a non-const scorefxn
492  loop_refine = new loops::loop_mover::refine::LoopMover_Refine_KIC( loop_set, scorefxn_pack()->clone() );
493  } else if ( flex_bb_docking_type == "backrub" ) {
494  // jk backrub loop refinement (fullatom only)
495  TR << "Setting up for backrub loop modeling" << std::endl;
496  // jk backrub can't use segments that span a jump residue, so use a simple fold tree here
497  // note: this assumes that the termini are not allowed to move (and in define_loops they aren't)
498  loop_fold_tree.simple_tree( pose.total_residue() );
499  // need to pass a clone of the scorefxn because LoopMover requires a non-const scorefxn
500  loop_refine = new loops::loop_mover::refine::LoopMover_Refine_Backrub( loop_set, scorefxn_pack()->clone() );
501  }
502 
503  moves::ChangeFoldTreeMoverOP get_loop_ft = new moves::ChangeFoldTreeMover( loop_fold_tree );
504  moves::ChangeFoldTreeMoverOP get_docking_ft = new moves::ChangeFoldTreeMover( docking_fold_tree );
505 
506  interface_repack_and_move_loops->add_mover( get_loop_ft );
507  interface_repack_and_move_loops->add_mover( loop_refine );
508  interface_repack_and_move_loops->add_mover( get_docking_ft );
509 
510  } else {
511  TR << "[ ERROR ] Unknown flexible_bb_docking type: " << flex_bb_docking_type << std::endl;
512  exit(1);
513  }
514 
515  interface_repack_and_move_loops->add_mover( pack_interface_repack );
516  }
517 
518 
519  TrialMoverOP pack_interface_and_move_loops_trial = new TrialMover( interface_repack_and_move_loops, mc_ );
520 
522  TrialMoverOP rtmin_trial = new TrialMover( rtmin, mc_ );
523 
524  //InterfaceSidechainMinMoverOP scmin_mover = new InterfaceSidechainMinMover(rb_jump_, scorefxn_pack() );
526  TrialMoverOP scmin_trial = new TrialMover( scmin_mover, mc_ );
527 
528  // the standard mcm cycle : rb perturbation->rotamer trials->minimization->MC accept
529  SequenceMoverOP rb_mover = new SequenceMover;
530  rb_mover->add_mover( rb_perturb );
531  if ( repack_switch_ ) rb_mover->add_mover( pack_rottrial );
532 
533  core::Real minimization_threshold = 15.0;
534  JumpOutMoverOP rb_mover_min = new JumpOutMover( rb_mover, min_mover, scorefxn(), minimization_threshold );
535  TrialMoverOP rb_mover_min_trial = new TrialMover( rb_mover_min, mc_ );
536 
537  //every step (rb_mover_min_trial): the standard mcm cycle
538  //every 8th step (repack_step): standard mcm cycle + repacking
539  //try moving loops too, if desired
540 
541  SequenceMoverOP repack_step = new SequenceMover;
542  repack_step->add_mover(rb_mover_min_trial);
543 
544  if ( repack_switch_ ){
545  repack_step->add_mover( pack_interface_and_move_loops_trial );
546  if ( rt_min() ) repack_step->add_mover(rtmin_trial);
547  if ( sc_min() ) repack_step->add_mover(scmin_trial);
548  }
549 
550  CycleMoverOP rb_mover_min_trial_repack = new CycleMover;
551  for ( Size i=1; i<repack_period_; ++i ) rb_mover_min_trial_repack->add_mover( rb_mover_min_trial );
552  rb_mover_min_trial_repack->add_mover( repack_step );
553 
554  //set up initial repack mover
555  SequenceMoverOP initial_repack = new SequenceMover;
556  initial_repack->add_mover(pack_interface_and_move_loops_trial);
557  if ( rt_min() ) initial_repack->add_mover(rtmin_trial);
558  if ( sc_min() ) initial_repack->add_mover(scmin_trial);
559 
560  //set up initial and final min_trial movers for docking
561  TrialMoverOP minimize_trial = new TrialMover( min_mover, mc_ );
562 
563  //set up mcm cycles and mcm_repack cycles
564  RepeatMoverOP mcm_four_cycles = new RepeatMover( rb_mover_min_trial, 4 );
565  RepeatMoverOP mcm_fortyfive_cycles = new RepeatMover( rb_mover_min_trial_repack, 45 );
566  //set up protocol mover
567  TR << "::::::::::::::::::DOCK_MCM:::::::::::::::::::" << std::endl;
568 
570  if (repack_switch_) docking_highres_protocol_mover_->add_mover( initial_repack );
571  docking_highres_protocol_mover_->add_mover( minimize_trial );
572  docking_highres_protocol_mover_->add_mover( mcm_four_cycles );
573  docking_highres_protocol_mover_->add_mover( mcm_fortyfive_cycles ); // JQX: tempoary comment out, doing test on mcm_four_cycles
574  docking_highres_protocol_mover_->add_mover( minimize_trial ); // JQX: tempoary comment out, doing test on mcm_four_cycles
575 }
576 ///////////////////////////////////////////////////////////////////////////////////
577 /// @begin dock_ppk_protocol
578 ///
579 /// @brief main entrance to prepacking for docking
580 /// @detailed
581 /// does a full repack of all sidechains for each partner after moving them
582 /// away by 500A, then it brings them back together
583 /// @remarks
584 ///
585 /// @references pose_docking_prepack_protocol from pose_docking.cc
586 ///
587 /// @authors Sid Chaudhury October 3 2008
588 ///
589 /// @last_modified October 3 2008
590 /////////////////////////////////////////////////////////////////////////////////
592  using namespace moves;
593  using namespace basic::options;
594  using namespace core::pack::task;
595  using namespace core::pack::task::operation;
596 
597  TR << "::::::::::::::::::DOCK_PPK:::::::::::::::::::" << std::endl;
598 
599  //set up translate-by-axis movers
600  Real trans_magnitude = 1000;
602  for( DockJumps::const_iterator it = movable_jumps().begin(); it != movable_jumps().end(); ++it ) {
603  core::Size const rb_jump = *it;
604  rigid::RigidBodyTransMoverOP translate_away ( new rigid::RigidBodyTransMover( pose, rb_jump ) );
605  translate_away->step_size( trans_magnitude );
606  trans_away_vec.push_back( translate_away );
607  }
608 
610  for( DockJumps::const_iterator it = movable_jumps().begin(); it != movable_jumps().end(); ++it ) {
611  core::Size const rb_jump = *it;
612  rigid::RigidBodyTransMoverOP translate_back ( new rigid::RigidBodyTransMover( pose, rb_jump ) );
613  translate_back->step_size( trans_magnitude );
614  translate_back->trans_axis().negate();
615  trans_back_vec.push_back( translate_back );
616  }
617 
618  PackerTaskOP task = task_factory()->create_task_and_apply_taskoperations( pose ); // does not include restrict to interface
619 
622  SidechainMinMoverOP scmin_mover = new SidechainMinMover(scorefxn_pack(), task);
623 
624  // set up protocol
626  if ( sc_min() ) docking_highres_protocol_mover_->add_mover( scmin_mover );
627  for( utility::vector1< rigid::RigidBodyTransMoverOP >::iterator it = trans_away_vec.begin(); it != trans_back_vec.end(); ++it ) {
628  docking_highres_protocol_mover_->add_mover( *it );
629  }
630  docking_highres_protocol_mover_->add_mover( prepack_full_repack );
631  if ( rt_min() ) docking_highres_protocol_mover_->add_mover( rtmin_mover );
632  if ( sc_min() ) docking_highres_protocol_mover_->add_mover( scmin_mover );
633  for( utility::vector1< rigid::RigidBodyTransMoverOP >::iterator it = trans_back_vec.begin(); it != trans_back_vec.end(); ++it ) {
634  docking_highres_protocol_mover_->add_mover( *it );
635  }
636 }
637 
638 // noncost pose for load_unboundrot csts
640  using namespace basic::options;
641  using namespace core::pack::task;
642  using namespace core::pack::task::operation;
643  //set upconstructor packer options
644  TaskFactoryOP local_tf = new TaskFactory;
645 
646  if ( init_task_factory_ ) {
647  TR << "Using user-defined TaskFactory." << std::endl;
648  local_tf = new TaskFactory( *init_task_factory_ );
649  }
650 
651  if( design_ ) {
652  TR << "Designing during docking" << std::endl;
653  DockJumps repack_chains;
654  for( int i = 1; i <= int(pose.num_jump()); ++i ) {
655  if( find(movable_jumps().begin(), movable_jumps().end(), i ) == movable_jumps().end() ) { // jump is not movable
656  core::Size const cutpoint = pose.fold_tree().cutpoint_by_jump( i );
657  core::Size const chain = pose.residue( cutpoint ).chain();
658  repack_chains.push_back( chain );
659  }
660  }
661  if( repack_chains.size() > 0 ) {
662  for( DockJumps::const_iterator it = repack_chains.begin(); it != repack_chains.end(); ++it ) {
663  TR << "Not designing chain " << *it << std::endl;
665  }
666  }
667  }
668  else { // default case -- restrict everything to repacking.
669  local_tf->push_back( new RestrictToRepacking );
670  }
671 // tf_->push_back( new OperateOnCertainResidues( new PreventRepackingRLT, new ResidueLacksProperty("PROTEIN") ) );
672  local_tf->push_back( new InitializeFromCommandline );
673  local_tf->push_back( new IncludeCurrent );
674  local_tf->push_back( new NoRepackDisulfides );
675  if( option[OptionKeys::packing::resfile].user() ) local_tf->push_back( new ReadResfile );
676 
677  // DockingNoRepack only works over the first rb_jump in movable_jumps
678  // In a 2-body case this separates 1 & 2 based on the only cutpoint
679  // In a multibody case, this separates 1 & 2 based on the first cutpoint
680  using namespace protocols::toolbox::task_operations;
681  if (option[ OptionKeys::docking::norepack1 ].user()) local_tf->push_back( new DockingNoRepack1( movable_jumps()[1] ) );
682  if (option[ OptionKeys::docking::norepack2 ].user()) local_tf->push_back( new DockingNoRepack2( movable_jumps()[1] ) );
683 
684  // incorporating Ian's UnboundRotamer operation.
685  // note that nothing happens if unboundrot option is inactive!
687  unboundrot->initialize_from_command_line();
688  operation::AppendRotamerSetOP unboundrot_operation = new operation::AppendRotamerSet( unboundrot );
689  local_tf->push_back( unboundrot_operation );
690  core::pack::dunbrack::load_unboundrot(pose); // adds scoring bonuses for the "unbound" rotamers, if any
691 
692  // note that RestrictToInterfaceOperation is added during set_dock_mcm_protocol
693 
695 }
696 
699  return "DockingHighResLegacy";
700 }
701 
702 
703 } // namespace docking
704 } // namespace protocols