30 #include <basic/Tracer.hh>
32 #include <numeric/numeric.functions.hh>
33 #include <numeric/random/random.hh>
35 #include <utility/tag/Tag.hh>
36 #include <utility/vector0.hh>
37 #include <utility/excn/Exceptions.hh>
38 #include <utility/vector1.hh>
43 namespace ligand_docking {
45 static numeric::random::RandomGenerator
RG(23459);
47 static basic::Tracer
transform_tracer(
"protocols.ligand_docking.ligand_options.transform", basic::t_debug);
76 ) : Mover(
"Transform"), transform_info_(),optimize_until_score_is_negative_(0.0)
115 if ( tag->getName() !=
"Transform" )
117 throw utility::excn::EXCN_RosettaScriptsOption(
"This should be impossible");
119 if ( ! tag->hasOption(
"chain") )
throw utility::excn::EXCN_RosettaScriptsOption(
"'Transform' mover requires chain tag");
120 if ( ! tag->hasOption(
"move_distance") )
throw utility::excn::EXCN_RosettaScriptsOption(
"'Transform' mover requires move_distance tag");
121 if (! tag->hasOption(
"box_size") )
throw utility::excn::EXCN_RosettaScriptsOption(
"'Transform' mover requires box_size tag");
122 if ( ! tag->hasOption(
"angle") )
throw utility::excn::EXCN_RosettaScriptsOption(
"'Transform' mover requires angle tag");
123 if ( ! tag->hasOption(
"cycles") )
throw utility::excn::EXCN_RosettaScriptsOption(
"'Transform' mover requires cycles tag");
124 if (!tag->hasOption(
"temperature"))
throw utility::excn::EXCN_RosettaScriptsOption(
"'Transform' mover requires temperature tag");
127 transform_info_.chain = tag->getOption<
std::string>(
"chain");
128 transform_info_.move_distance = tag->getOption<
core::Real>(
"move_distance");
129 transform_info_.box_size = tag->getOption<
core::Real>(
"box_size");
130 transform_info_.angle = tag->getOption<
core::Real>(
"angle");
131 transform_info_.cycles = tag->getOption<
core::Size>(
"cycles");
132 transform_info_.temperature = tag->getOption<
core::Real>(
"temperature");
133 transform_info_.repeats = tag->getOption<
core::Size>(
"repeats",1);
134 optimize_until_score_is_negative_ = tag->getOption<
bool>(
"optimize_until_score_is_negative",
false);
147 assert(grid_manager != 0);
160 last_jumps.push_back(std::make_pair(jump_number,pose.
jump(jump_number)));
184 pose = starting_pose;
185 last_score = 10000.0;
187 bool not_converged =
true;
199 not_converged=
false;
205 not_converged=
false;
214 if(
RG.uniform() >= 0.5)
234 revert_move(pose,new_move,new_conformer,begin,new_jumps);
241 core::Real const boltz_factor((last_score-current_score)/temperature);
242 core::Real const probability = std::exp( boltz_factor ) ;
243 core::Vector new_center(residue->xyz(residue->nbr_atom()));
247 revert_move(pose,last_move,last_conformer,begin,last_jumps);
250 }
else if(probability < 1 &&
RG.uniform() >= probability)
252 revert_move(pose,last_move,last_conformer,begin,last_jumps);
255 }
else if(probability < 1)
257 last_score = current_score;
258 last_jumps = new_jumps;
259 last_conformer = new_conformer;
260 last_move = new_move;
265 last_score = current_score;
266 last_jumps = new_jumps;
267 last_conformer = new_conformer;
268 last_move = new_move;
273 if(last_score < best_score)
275 best_score = last_score;
297 transform_tracer <<
"WARNING: angle and distance are both 0. Transform will do nothing" <<std::endl;
308 jump_archive.push_back(std::make_pair(jump_number,pose.
jump(jump_number)));
320 return index_to_select;
340 utility::vector1<std::pair<core::SSize,core::kinematics::Jump> >
const & jumps)
342 assert(jumps.size() == pose.
num_jump());
345 for(jump_it = jumps.begin();jump_it != jumps.end();++jump_it)
347 pose.
set_jump(jump_it->first,jump_it->second);
357 utility::vector1<std::pair<core::SSize,core::kinematics::Jump> >
const & jumps)