Rosetta
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
oop_design.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 
11 //kdrew: based on code from mini/src/apps/public/scenarios/doug_dock_design_min_mod2_cal_cal.cc
12 // and https://svn.rosettacommons.org/source/branches/releases/rosetta-3.1/manual/advanced/example_protocol.cc
13 
14 //Headers are generally organized by either what they do or where they come from. This organization is first core library headers, then protocols library, then utility stuff.
15 
16 
17 // Project Headers
18 #include <core/pose/Pose.hh>
19 #include <core/pose/util.hh>
20 #include <core/pose/ncbb/util.hh>
21 #include <core/import_pose/import_pose.hh>
22 #include <core/conformation/Conformation.hh>
23 
24 #include <core/pack/task/TaskFactory.hh>
25 #include <core/pack/task/PackerTask.hh>
26 #include <core/pack/task/operation/TaskOperation.hh>
27 #include <core/pack/task/operation/TaskOperations.hh>
28 
29 #include <core/scoring/ScoreFunction.hh>
30 #include <core/scoring/ScoreFunctionFactory.hh>
31 #include <core/scoring/Energies.hh>
32 #include <core/scoring/constraints/util.hh>
33 #include <core/scoring/ScoringManager.hh>
34 
35 #include <core/chemical/VariantType.hh>
36 
37 #include <core/kinematics/FoldTree.hh>
38 #include <core/kinematics/MoveMap.hh>
39 
41 #include <protocols/jd2/JobDistributor.hh>
42 #include <protocols/jd2/Job.hh>
43 
44 // Mover headers
45 #include <protocols/moves/MoverContainer.hh>
46 #include <protocols/moves/TrialMover.hh>
47 #include <protocols/moves/MonteCarlo.hh>
48 #include <protocols/moves/PyMolMover.hh>
49 #include <protocols/moves/RepeatMover.hh>
50 #include <protocols/simple_moves/MinMover.hh>
51 #include <protocols/simple_moves/PackRotamersMover.hh>
52 #include <protocols/simple_moves/RotamerTrialsMover.hh>
53 #include <protocols/simple_moves/TaskAwareMinMover.hh>
54 #include <protocols/simple_moves/BackboneMover.fwd.hh>
55 #include <protocols/simple_moves/BackboneMover.hh>
56 #include <protocols/simple_moves/oop/OopRandomPuckMover.hh>
57 #include <protocols/simple_moves/oop/OopRandomSmallMover.hh>
58 #include <protocols/simple_moves/oop/OopPatcher.hh>
59 #include <protocols/rigid/RigidBodyMover.hh>
60 #include <protocols/rigid/RB_geometry.hh>
61 
62 #include <protocols/ncbb/util.hh>
63 
64 // Filter headers
65 #include <basic/MetricValue.hh>
66 #include <core/pose/metrics/CalculatorFactory.hh>
67 //#include <core/pose/metrics/PoseMetricContainer.fwd.hh>
68 #include <core/pose/metrics/simple_calculators/SasaCalculatorLegacy.hh>
69 
70 #include <protocols/toolbox/pose_metric_calculators/NumberHBondsCalculator.hh>
71 #include <protocols/toolbox/pose_metric_calculators/BuriedUnsatisfiedPolarsCalculator.hh>
72 #include <protocols/toolbox/pose_metric_calculators/PackstatCalculator.hh>
73 
74 // Utility Headers
75 #include <devel/init.hh>
76 #include <basic/options/util.hh>
77 #include <basic/options/option.hh>
78 #include <basic/options/keys/out.OptionKeys.gen.hh>
79 #include <basic/options/keys/run.OptionKeys.gen.hh>
80 #include <basic/options/keys/in.OptionKeys.gen.hh>
81 #include <basic/Tracer.hh>
82 #include <utility/exit.hh>
84 
85 // C++ headers
86 #include <string>
87 #include <sstream>
88 
89 //The original author used a lot of using declarations here. This is a stylistic choice.
90 // Namespaces
91 using namespace core;
92 using namespace conformation;
93 using namespace chemical;
94 using namespace scoring;
95 using namespace pose;
96 using namespace protocols;
97 using namespace protocols::moves;
98 using namespace protocols::ncbb;
99 using namespace protocols::simple_moves;
100 using namespace protocols::simple_moves::oop;
101 using namespace protocols::rigid;
102 using namespace protocols::toolbox;
103 using namespace protocols::toolbox::pose_metric_calculators;
104 using namespace core::pack::task;
105 using namespace basic::options;
106 using namespace basic::options::OptionKeys;
107 using namespace core::id;
108 using basic::T;
109 using basic::Error;
110 using basic::Warning;
112 
113 
114 // tracer - used to replace cout
115 static THREAD_LOCAL basic::Tracer TR( "OopDesign" );
116 
117 // application specific options
118 namespace oop_design {
119 // pert options
120 
121 IntegerOptionKey const pert_num( "oop_design::pert_num" );
122 IntegerOptionKey const design_loop_num( "oop_design::design_loop_num" );
123 
124 IntegerVectorOptionKey const oop_design_positions( "oop_design::oop_design_positions" );
125 
126 }
127 
128 class OopDesignMover : public Mover {
129 
130 public:
131 
132  //default ctor
133  OopDesignMover(): Mover("OopDesignMover"){}
134 
135  //default dtor
136  virtual ~OopDesignMover(){}
137 
138  //methods
139  virtual void apply( core::pose::Pose & pose );
140  virtual std::string get_name() const { return "OopDesignMover"; }
141 
142 };
143 
144 typedef utility::pointer::shared_ptr< OopDesignMover > OopDesignMoverOP;
145 typedef utility::pointer::shared_ptr< OopDesignMover const > OopDesignMoverCOP;
146 
147 
148 int
149 main( int argc, char* argv[] )
150 {
151  try {
152 
153 
154  /*********************************************************************************************************************
155  Common Setup
156  **********************************************************************************************************************/
157 
158  // add application specific options to options system
159  // There are far more options here than you will realistically need for a program of this complexity - but this gives you an idea of how to fine-grain option-control everything
160 
161  option.add( oop_design::pert_num, "Number of iterations of perturbation loop per design" ).def(10);
162  option.add( oop_design::design_loop_num, "Number of iterations of pertubation and design" ).def(10);
163 
164  utility::vector1< core::Size > empty_vector(0);
165  option.add( oop_design::oop_design_positions, "Positions of oop to design" ).def( empty_vector );
166 
167  // init command line options
168  //you MUST HAVE THIS CALL near the top of your main function, or your code will crash when you first access the command line options
169  devel::init(argc, argv);
170 
171  //create mover instance
172  OopDesignMoverOP OD_mover( new OopDesignMover() );
173 
174  setup_filter_stats();
175 
176  //call job distributor
177  protocols::jd2::JobDistributor::get_instance()->go( OD_mover );
178 
179  } catch ( utility::excn::EXCN_Base const & e ) {
180  std::cout << "caught exception " << e.msg() << std::endl;
181  return -1;
182  }
183 
184 }//main
185 
186 void
189 )
190 {
191  // create score function
192  scoring::ScoreFunctionOP score_fxn( get_score_function() );
193  scoring::constraints::add_fa_constraints_from_cmdline_to_scorefxn(*score_fxn);
194 
195  scoring::constraints::add_fa_constraints_from_cmdline_to_pose(pose);
196 
197  // get a fold tree suitable for docking (local helper function)
198  setup_pert_foldtree( pose );
199 
200  // create a monte carlo object for the full cycle
201  moves::MonteCarloOP mc( new moves::MonteCarlo( pose, *score_fxn, 1.0 ) );
202 
203  // jump, rot_mag, trans_mag
204  rigid::RigidBodyPerturbMoverOP pert_dock_rbpm( new rigid::RigidBodyPerturbMover(1, 1.0, 0.5 ) );
205 
206  /*********************************************************
207  Oop Setup
208  **********************************************************/
209 
210  // get oop start and end positions
211  Size pep_start( pose.conformation().chain_begin( 2 ) ); Size pep_end( pose.total_residue() );
212  TR << "oop_start: " << pep_start << " oop_end: " << pep_end << std::endl;
213 
214  // create movemap for oop
215  kinematics::MoveMapOP pert_pep_mm( new kinematics::MoveMap() );
216  pert_pep_mm->set_bb_true_range(pep_start, pep_end);
217 
218  //kdrew: automatically find oop positions
219  utility::vector1< core::Size > oop_seq_positions = core::pose::ncbb::initialize_oops(pose);
220 
221  for ( Size i = 1; i <= oop_seq_positions.size(); i++ ) {
222  pert_pep_mm->set_bb( oop_seq_positions[i], false );
223 
224  if ( score_fxn->has_zero_weight( core::scoring::atom_pair_constraint ) ) {
225  score_fxn->set_weight( core::scoring::atom_pair_constraint, 1.0 );
226  }
227 
228  }
229 
230  // create small and shear movers
231  simple_moves::SmallMoverOP pert_pep_small( new simple_moves::SmallMover( pert_pep_mm, 0.8, 1 ) );
232 
233  // create random mover
234  moves::RandomMoverOP pert_pep_random( new moves::RandomMover() );
235  pert_pep_random->add_mover( pert_pep_small, 1 );
236 
237  // create repeat mover
238  moves::RepeatMoverOP pert_pep_repeat( new moves::RepeatMover( pert_pep_random, 20 ) ); //repeat 20 times
239 
240  /*********************************************************
241  OopPuck Setup
242  **********************************************************/
243 
244  oop::OopRandomSmallMoverOP opm_small( new oop::OopRandomSmallMover( oop_seq_positions, 2.0 ) );
245  oop::OopRandomPuckMoverOP opm_puck( new oop::OopRandomPuckMover( oop_seq_positions ) );
246 
247  /*********************************************************
248  Common Setup
249  **********************************************************/
250 
251  // create a random mover to hold the docking, and peptide pertubation movers
252  moves::RandomMoverOP pert_random( new moves::RandomMover() );
253  pert_random->add_mover( pert_dock_rbpm, 1 );
254  pert_random->add_mover( pert_pep_repeat, 0.5 );
255  pert_random->add_mover( opm_small, 0.5 );
256  pert_random->add_mover( opm_puck, 0.1 );
257 
258  // create a sequence move to hold random and rotamer trials movers
259  moves::SequenceMoverOP pert_sequence( new moves::SequenceMover() );
260  pert_sequence->add_mover( pert_random );
261 
262  // create a TrialMover for the pertubation
263  moves::TrialMoverOP pert_trial( new moves::TrialMover( pert_sequence, mc ) );
264 
265  /*********************************************************
266  Design Setup
267  **********************************************************/
268 
269  using core::pack::task::operation::TaskOperationCOP;
270  TaskFactoryOP desn_tf( new TaskFactory() );
271  desn_tf->push_back( TaskOperationCOP( new core::pack::task::operation::InitializeFromCommandline ) );
272 
273  /*********************************************************
274  Minimize Setup
275  **********************************************************/
276 
277  // create move map for minimization
278  kinematics::MoveMapOP desn_mm( new kinematics::MoveMap() );
279  //kdrew: set backbone of target false and backbone of oop true, decide whether to do this or not
280  desn_mm->set_bb( false );
281  desn_mm->set_bb_true_range( pep_start, pep_end );
282  desn_mm->set_chi( true );
283  desn_mm->set_jump( 1, true );
284 
285  // create minimization mover
286  simple_moves::MinMoverOP desn_min( new simple_moves::MinMover( desn_mm, score_fxn, option[ OptionKeys::run::min_type ].value(), 0.01, true ) );
287 
288  //definitely want sidechain minimization here
289  using protocols::simple_moves::TaskAwareMinMoverOP;
290  using protocols::simple_moves::TaskAwareMinMover;
291  TaskAwareMinMoverOP desn_ta_min( new TaskAwareMinMover( desn_min, desn_tf ) );
292 
293  /*********************************************************************************************************************
294  Main Loop
295  **********************************************************************************************************************/
296 
297  TR << "Main loop..." << std::endl;
298 
299  ncbb_design_main_loop( Size( option[ oop_design::design_loop_num ].value() ),
301  pose,
302  pert_trial,
304  pep_start,
305  pep_end,
306  desn_ta_min,
307  score_fxn,
308  mc
309  );
310 
311  protocols::jd2::JobOP curr_job( protocols::jd2::JobDistributor::get_instance()->current_job() );
312 
313  curr_job->add_string_real_pair( "ENERGY_FINAL ", (*score_fxn)(pose) );
314 
315  TR << "Ending main loop..." << std::endl;
316  TR << "Checking pose energy..." << std::endl;
317  calculate_statistics( curr_job, pose, score_fxn );
318 
319 }
#define THREAD_LOCAL
virtual std::string const msg() const
Definition: EXCN_Base.hh:70
Automatic hidden index key for integer options.
Non-owning access smart pointer – dispatch class.
void init(int argc, char *argv[])
Command line init() version.
Definition: init.cc:23
Size pep_end(0)
core::pose::Pose Pose
Definition: supercharge.cc:101
virtual void apply(core::pose::Pose &pose)
Definition: oop_design.cc:187
static THREAD_LOCAL basic::Tracer TR("OopDesign")
IntegerVectorOptionKey const oop_design_positions("oop_design::oop_design_positions")
File name class supporting Windows and UN*X/Linux format names.
Definition: FileName.hh:37
Tracer & T(std::string const &channel, TracerPriority priority)
T is special function for assign tracer property on the static object.
Definition: Tracer.cc:567
int main(int argc, char *argv[])
Definition: oop_design.cc:149
common derived classes for thrown exceptions
utility::pointer::shared_ptr< OopDesignMover > OopDesignMoverOP
Definition: oop_design.cc:144
virtual std::string get_name() const
Definition: oop_design.cc:140
member1 value
Definition: Tag.cc:296
Program exit functions and macros.
Tracer & Error(TracerPriority priority=t_error)
Predefined Error tracer.
Definition: Tracer.hh:395
Tracer IO system.
IntegerOptionKey const pert_num("oop_design::pert_num")
rule< Scanner, options_closure::context_t > options
Definition: Tag.cc:377
virtual ~OopDesignMover()
Definition: oop_design.cc:136
Tracer & Warning(TracerPriority priority=t_warning)
Predefined Warning tracer.
Definition: Tracer.hh:398
string min_type
Definition: loops_kic.py:76
IntegerOptionKey const design_loop_num("oop_design::design_loop_num")
ocstream cout(std::cout)
Wrapper around std::cout.
Definition: ocstream.hh:287
Class for handling user debug/warnings/errors. Use instance of this class instead of 'std::cout' for ...
Definition: Tracer.hh:134
Automatic hidden index key for integer options.
Program options global and initialization function.
platform::Size Size
Definition: random.fwd.hh:30
utility::pointer::shared_ptr< OopDesignMover const > OopDesignMoverCOP
Definition: oop_design.cc:145
rule< Scanner, option_closure::context_t > option
Definition: Tag.cc:378