35 #include <numeric/MultiDimensionalHistogram.fwd.hh>
38 #include <basic/Tracer.hh>
40 #include <numeric/angle.functions.hh>
41 #include <numeric/constants.hh>
42 #include <numeric/conversions.hh>
43 #include <numeric/random/random.hh>
44 #include <utility/exit.hh>
45 #include <utility/io/ozstream.hh>
46 #include <utility/string_util.hh>
47 #include <utility/tag/Tag.hh>
52 #include <utility/vector0.hh>
53 #include <utility/vector1.hh>
54 #include <numeric/MultiDimensionalHistogram.hh>
57 #include <utility/excn/Exceptions.hh>
66 static basic::Tracer
TR(
"protocols.backrub.BackrubSidechainMover" );
67 static numeric::random::RandomGenerator
RG(2772);
84 return "BackrubSidechain";
89 protocols::canonical_sampling::ThermodynamicMover(),
91 sidechain_mover_(new protocols::simple_moves::sidechain_moves::SidechainMover),
92 record_statistics_(false),
93 statistics_filename_(
"brsc_stats.txt")
103 protocols::canonical_sampling::ThermodynamicMover(mover),
104 valid_segments_(mover.valid_segments_),
105 last_valid_segment_index_(mover.last_valid_segment_index_),
106 last_chi1_pre_(mover.last_chi1_pre_),
107 last_chi1_post_(mover.last_chi1_post_),
108 record_statistics_(mover.record_statistics_),
109 statistics_filename_(mover.statistics_filename_),
110 proposal_hists_(mover.proposal_hists_),
111 accept_hists_(mover.accept_hists_)
140 return "BackrubSidechainMover";
152 if ( tag->hasOption(
"pivot_residues") ) {
158 if ( tag->hasOption(
"task_operations") ) {
162 StringVec
const t_o_keys( utility::string_split( t_o_val,
',' ) );
163 for ( StringVec::const_iterator t_o_key( t_o_keys.begin() ),
end( t_o_keys.end() );
164 t_o_key !=
end; ++t_o_key ) {
165 if ( data.
has(
"task_operations", *t_o_key ) ) {
168 throw utility::excn::EXCN_RosettaScriptsOption(
"TaskOperation " + *t_o_key +
" not found in protocols::moves::DataMap.");
177 set_task_factory(new_task_factory);
179 set_prob_uniform( tag->getOption<
core::Real>(
"prob_uniform", prob_uniform() ) );
180 set_prob_withinrot( tag->getOption<
core::Real>(
"prob_withinrot", prob_withinrot() ) );
181 set_prob_random_pert_current( tag->getOption<
core::Real>(
"prob_random_pert_current", prob_random_pert_current() ) );
182 set_preserve_detailed_balance( tag->getOption<
bool>(
"preserve_detailed_balance", preserve_detailed_balance() ) );
183 set_require_mm_bend( tag->getOption<
bool>(
"require_mm_bend", require_mm_bend() ) );
184 set_record_statistics( tag->getOption<
bool>(
"record_statistics", record_statistics() ) );
185 set_statistics_filename( tag->getOption<
std::string>(
"statistics_filename", statistics_filename() ) );
187 update_segments(pose);
195 if (!(backrub_mover_->get_input_pose() && backrub_mover_->get_input_pose()->fold_tree() == pose.
fold_tree())) {
200 backrub_mover_->clear_segments();
201 backrub_mover_->add_mainchain_segments();
203 sidechain_mover_->init_task(pose);
205 valid_segments_.clear();
207 for (
core::Size i = 1; i <= backrub_mover_->num_segments(); ++i) {
209 if (pose.
residue(segment.start_atomid().rsd()).atom_name(segment.start_atomid().atomno()) ==
" CA " &&
210 pose.
residue(segment.end_atomid().rsd()).atom_name(segment.end_atomid().atomno()) ==
" CA " &&
211 segment.size() == 7) {
212 core::Size middle_rsd = (segment.start_atomid().rsd() + segment.end_atomid().rsd())/2;
213 if (sidechain_mover_->residue_packed()[middle_rsd]) {
216 valid_segments_.push_back(i);
221 if (record_statistics_) reset_statistics();
231 if (!(valid_segments_.size() && backrub_mover_->get_input_pose() && backrub_mover_->get_input_pose()->fold_tree() == pose.
fold_tree())) {
232 update_segments(pose);
236 backrub_mover_->initialize_simulation(pose, metropolis_hastings_mover,cycle);
237 sidechain_mover_->initialize_simulation(pose, metropolis_hastings_mover,cycle);
239 if (record_statistics_) reset_statistics();
247 if (!(valid_segments_.size() && backrub_mover_->get_input_pose() && backrub_mover_->get_input_pose()->fold_tree() == pose.
fold_tree())) {
248 update_segments(pose);
251 last_valid_segment_index_ =
RG.random_range(1, valid_segments_.size());
252 BackrubSegment const & segment(backrub_mover_->segment(valid_segments_[last_valid_segment_index_]));
253 core::Size middle_rsd = (segment.start_atomid().rsd() + segment.end_atomid().rsd())/2;
255 last_chi1_pre_ = numeric::conversions::radians(pose.
chi(1, middle_rsd));
257 sidechain_mover_->next_resnum(middle_rsd);
258 sidechain_mover_->apply(pose);
260 last_chi1_post_ = numeric::conversions::radians(pose.
chi(1, middle_rsd));
262 backrub_mover_->set_next_segment_id(valid_segments_[last_valid_segment_index_]);
263 backrub_mover_->apply(pose);
273 if (record_statistics_) record_histograms(metropolis_hastings_mover.
monte_carlo()->mc_accepted());
282 if (record_statistics_) {
285 if (metropolis_hastings_mover.
output_name() !=
"") {
286 filename << metropolis_hastings_mover.
output_name() <<
"_";
288 filename << statistics_filename();
290 utility::io::ozstream statistics_stream(filename.str());
291 output_statistics(statistics_stream);
292 statistics_stream.close();
299 return backrub_mover_->pivot_residues();
307 backrub_mover_->set_pivot_residues(pivot_residues);
313 return sidechain_mover_->task_factory();
322 sidechain_mover_->set_task_factory(task_factory);
328 return sidechain_mover_->prob_uniform();
336 sidechain_mover_->set_prob_uniform(prob_uniform);
342 return sidechain_mover_->prob_withinrot();
350 sidechain_mover_->set_prob_withinrot(prob_withinrot);
356 return sidechain_mover_->prob_random_pert_current();
364 sidechain_mover_->set_prob_random_pert_current(prob_pert);
370 return backrub_mover_->preserve_detailed_balance() && sidechain_mover_->preserve_detailed_balance();
375 bool preserve_detailed_balance
378 backrub_mover_->set_preserve_detailed_balance(preserve_detailed_balance);
379 sidechain_mover_->set_preserve_detailed_balance(preserve_detailed_balance);
385 return backrub_mover_->require_mm_bend();
393 backrub_mover_->set_require_mm_bend(require_mm_bend);
407 return record_statistics_;
412 bool record_statistics
415 bool const needs_reset(record_statistics_ != record_statistics);
416 record_statistics_ = record_statistics;
417 if (needs_reset) reset_statistics();
423 return statistics_filename_;
431 statistics_filename_ = statistics_filename;
445 for (
core::Size i = 1; i <= proposal_hists_.size(); ++i) {
446 out << proposal_hists_[i] << accept_hists_[i];
453 if (!(record_statistics_ && backrub_mover_->get_input_pose())) {
454 proposal_hists_.resize(0);
455 accept_hists_.resize(0);
461 core::Real max_angle_disp(ceil(numeric::conversions::degrees(backrub_mover_->max_angle_disp_7())));
462 core::Size const num_bins(static_cast<core::Size>(2*max_angle_disp));
463 numeric::conversions::to_radians(max_angle_disp);
465 proposal_hists_.resize(valid_segments_.size());
466 accept_hists_.resize(valid_segments_.size());
468 for (
core::Size i = 1; i <= valid_segments_.size(); ++i) {
470 core::Size res_num(backrub_mover_->segment(valid_segments_[i]).start_atomid().rsd()+1);
472 std::ostringstream res_label_stream;
473 res_label_stream << pose.residue(res_num).name3() <<
" "
474 << pose.pdb_info()->chain(res_num) <<
" "
475 << pose.pdb_info()->number(res_num);
477 std::ostringstream proposal_label_stream;
478 proposal_label_stream << res_label_stream.str() <<
" Proposal";
479 proposal_hists_[i].label(proposal_label_stream.str());
480 proposal_hists_[i].reset_counts();
481 proposal_hists_[i].num_dimensions(3);
482 proposal_hists_[i].set_dimension(1, num_bins, -max_angle_disp, max_angle_disp,
"backrub_disp");
483 proposal_hists_[i].set_dimension(2, 3, 0, numeric::constants::r::pi_2,
"chi1_pre");
484 proposal_hists_[i].set_dimension(3, 3, 0, numeric::constants::r::pi_2,
"chi1_post");
486 std::ostringstream accept_label_stream;
487 accept_label_stream << res_label_stream.str() <<
" Accept";
488 accept_hists_[i].label(accept_label_stream.str());
489 accept_hists_[i].reset_counts();
490 accept_hists_[i].num_dimensions(3);
491 accept_hists_[i].set_dimension(1, num_bins, -max_angle_disp, max_angle_disp,
"backrub_disp");
492 accept_hists_[i].set_dimension(2, 3, 0, numeric::constants::r::pi_2,
"chi1_pre");
493 accept_hists_[i].set_dimension(3, 3, 0, numeric::constants::r::pi_2,
"chi1_post");
502 if (proposal_hists_.size() == 0) setup_histograms();
513 values[1] = backrub_mover_->last_angle();
514 values[2] = numeric::nonnegative_principal_angle_radians(last_chi1_pre_);
515 values[3] = numeric::nonnegative_principal_angle_radians(last_chi1_post_);
517 proposal_hists_[last_valid_segment_index_].record(values);
518 if (accepted) accept_hists_[last_valid_segment_index_].record(values);
524 std::stringstream
mt;
526 char bin_letters[] = {
'p',
't',
'm'};
528 core::Size chi1_pre_bin(static_cast<core::Size>(floor(numeric::nonnegative_principal_angle_radians(last_chi1_pre_)/numeric::constants::r::pi_2_over_3)));
529 if (chi1_pre_bin == 3) chi1_pre_bin = 2;
530 core::Size chi1_post_bin(static_cast<core::Size>(floor(numeric::nonnegative_principal_angle_radians(last_chi1_post_)/numeric::constants::r::pi_2_over_3)));
531 if (chi1_post_bin == 3) chi1_post_bin = 2;
533 mt <<
"brsc_" << bin_letters[chi1_pre_bin] << bin_letters[chi1_post_bin] <<
"_"
534 << (sidechain_mover_->last_nchi() ? (sidechain_mover_->last_uniform() ?
"unif" : (sidechain_mover_->last_withinrot() ?
"withinrot" :
"rot")) :
"none");