33 #include <basic/Tracer.hh>
34 #include <basic/options/option.hh>
37 #include <numeric/random/random.hh>
38 #include <numeric/random/random_permutation.hh>
39 #include <numeric/conversions.hh>
42 #include <basic/options/keys/loops.OptionKeys.gen.hh>
45 #include <utility/vector1.hh>
53 namespace loop_closure {
54 namespace kinematic_closure {
56 static numeric::random::RandomGenerator
RG(43134);
57 static basic::Tracer
TR(
"protocols.loops.loop_closure.kinematic_closure.KinematicPerturber");
60 : max_sample_iterations_( basic::options::option[ basic::options::OptionKeys::loops::max_kic_perturber_samples ]() )
82 bool also_copy_omega = ( basic::options::option[ basic::options::OptionKeys::loops::sample_omega_at_pre_prolines ]() || basic::options::option[ basic::options::OptionKeys::loops::kic_omega_sampling ]() ) || ( basic::options::option[ basic::options::OptionKeys::loops::restrict_kic_sampling_to_torsion_string ].user() || basic::options::option[ basic::options::OptionKeys::loops::derive_torsion_string_from_native_pose ]() ) ;
86 pose.
set_phi(
start + res, torsions[ (3*(res+1)) + 1 ] );
87 pose.
set_psi(
start + res, torsions[ (3*(res+1)) + 2 ] );
88 if ( also_copy_omega ) pose.
set_omega(
start + res, torsions[ (3*(res+1)) + 3 ] );
99 vary_ca_bond_angles_(false),
100 sample_omega_for_pre_prolines_( basic::options::option[ basic::options::OptionKeys::loops::sample_omega_at_pre_prolines ]() ),
101 rama_( core::scoring::
ScoringManager::get_instance()->get_Ramachandran() )
125 for(
Size i = 5; i <= pvatom3; i+=3 ) {
126 bond_ang[ i ] = bangle_min +
RG.uniform() * bangle_sd;
137 if(!mm || mm->get_bb(cur_res)){
143 torsions[i++]=rama_phi;
144 torsions[i++]=rama_psi;
167 torsions[i++] = (
static_cast<int>(
RG.uniform()*2 ) ? OMEGA_MEAN : 0.0 );
173 }
else if ( basic::options::option[ basic::options::OptionKeys::loops::kic_omega_sampling ]() ) {
180 static const core::Real cis_prob_threshold = 0.0001;
187 trans_prob =
RG.uniform();
189 if ( trans_prob < cis_prob_threshold ) {
192 torsions[i++] = OMEGA_MEAN +
RG.gaussian() * OMEGA_STDDEV;
205 bool closure_successful
221 numeric::conversions::radians(180 - bond_ang[atom]));
234 vary_ca_bond_angles_(false),
235 degree_vicinity_( basic::options::option[ basic::options::OptionKeys::loops::vicinity_degree ]() ),
236 sample_omega_for_pre_prolines_( basic::options::option[ basic::options::OptionKeys::loops::sample_omega_at_pre_prolines ]() )
260 for(
Size i = 5; i <= pvatom3; i+=3 ) {
261 bond_ang[ i ] = bangle_min +
RG.uniform() * bangle_sd;
272 if(!mm || mm->get_bb(cur_res)){
279 torsions[i++]=rama_phi;
280 torsions[i++]=rama_psi;
301 bool closure_successful
317 numeric::conversions::radians(180 - bond_ang[atom]));
375 utility_exit_with_message(
"TorsionSweepingKinematicPerturber asked to perturb chain even though sweep iterator is at end."); }
395 vary_ca_bond_angles_(false),
396 sample_omega_for_pre_prolines_( basic::options::option[ basic::options::OptionKeys::loops::sample_omega_at_pre_prolines ]() ),
397 rama_( core::scoring::
ScoringManager::get_instance()->get_Ramachandran2B() )
420 for(
Size i = 5; i <= pvatom3; i+=3 ) {
421 bond_ang[ i ] = bangle_min +
RG.uniform() * bangle_sd;
432 if(!mm || mm->get_bb(cur_res)){
442 torsions[i++]=rama_phi;
443 torsions[i++]=rama_psi;
462 core::Real rand_omega = (
static_cast<int>(
RG.uniform()*2 ) ? OMEGA_MEAN : 0.0 );
466 torsions[i++] = rand_omega;
486 bool closure_successful
502 numeric::conversions::radians(180 - bond_ang[atom]));
519 vary_ca_bond_angles_(false),
520 sample_omega_for_pre_prolines_( true ),
521 rama_( core::scoring::
ScoringManager::get_instance()->get_Ramachandran() )
547 for(
Size i = 5; i <= pvatom3; i+=3 ) {
548 bond_ang[ i ] = bangle_min +
RG.uniform() * bangle_sd;
560 if(!mm || mm->get_bb(cur_res)){
566 torsions[i++]=rama_phi;
567 torsions[i++]=rama_psi;
578 static const core::Real OLD_OMEGA_MEAN( 179.8 );
586 if ( basic::options::option[ basic::options::OptionKeys::loops::kic_omega_sampling ]() || pose.
aa( cur_res+1 ) ==
core::chemical::aa_pro) {
587 rand_omega = OLD_OMEGA_MEAN;
594 if ( basic::options::option[ basic::options::OptionKeys::loops::kic_omega_sampling ]() ) {
595 rand_omega = OMEGA_MEAN +
RG.gaussian() * OMEGA_STDDEV;
600 torsions[i++] = rand_omega;
616 bool closure_successful
632 numeric::conversions::radians(180 - bond_ang[atom]));
649 vary_ca_bond_angles_(false),
650 sample_omega_for_pre_prolines_( basic::options::option[ basic::options::OptionKeys::loops::sample_omega_at_pre_prolines ]() ),
651 num_strings_(100000),
652 rama_( core::scoring::
ScoringManager::get_instance()->get_Ramachandran() )
664 torsion_bins_per_position.resize(loop_sequence.size());
666 for (
core::Size i = 1; i <= loop_sequence.size(); i++) {
667 std::map< char, core::Size > entries_per_torsion_bin;
671 for (std::map< char, core::Size >::const_iterator mcs_i = entries_per_torsion_bin.begin();
672 mcs_i != entries_per_torsion_bin.end(); mcs_i++) {
673 if (mcs_i->first ==
'X')
675 ideal_freq =
core::Real(mcs_i->second)/entries_per_torsion_bin[
'X'];
676 current_freq =
kinmover_->frequency_in_taboo_map( i-1, mcs_i->first );
680 if (current_freq > 0)
681 ideal_freq /= current_freq;
683 torsion_bins_for_pos += this_bin;
686 torsion_bins_for_pos +=
"X";
688 numeric::random::random_permutation(torsion_bins_for_pos.begin(), torsion_bins_for_pos.end(),
numeric::random::RG);
689 torsion_bins_per_position[i] = torsion_bins_for_pos;
697 for (
core::Size i = 1; i <= loop_sequence.size(); i++) {
698 new_torsion_string += torsion_bins_per_position[i][j];
701 if ( !(
kinmover_->is_in_taboo_map(new_torsion_string) ) )
773 for(
Size i = 5; i <= pvatom3; i+=3 ) {
774 bond_ang[ i ] = bangle_min +
RG.uniform() * bangle_sd;
789 if(!mm || mm->get_bb(cur_res)){
795 torsions[i++]=rama_phi;
796 torsions[i++]=rama_psi;
815 core::Real rand_omega = (
static_cast<int>(
RG.uniform()*2 ) ? OMEGA_MEAN : 0.0 );
827 torsions[i++] = rand_omega;
834 }
else if ( basic::options::option[ basic::options::OptionKeys::loops::kic_omega_sampling ]() ) {
841 static const core::Real cis_prob_threshold = 0.0001;
848 trans_prob =
RG.uniform();
850 if ( trans_prob < cis_prob_threshold ) {
853 torsions[i++] = OMEGA_MEAN +
RG.gaussian() * OMEGA_STDDEV;
869 bool closure_successful
885 numeric::conversions::radians(180 - bond_ang[atom]));
903 vary_ca_bond_angles_(false),
904 sample_omega_for_pre_prolines_( basic::options::option[ basic::options::OptionKeys::loops::sample_omega_at_pre_prolines ]() ),
906 rama_( core::scoring::
ScoringManager::get_instance()->get_Ramachandran2B() )
917 torsion_bins_per_position.resize(loop_sequence.size());
919 for (
core::Size i = 1; i <= loop_sequence.size(); i++) {
920 std::map< char, core::Size > entries_per_torsion_bin;
925 else if (i == loop_sequence.size())
929 std::map< char, core::Size > left_tb, right_tb;
933 for (std::map< char, core::Size >::const_iterator mcs_i = left_tb.begin(); mcs_i != left_tb.end(); mcs_i++) {
934 entries_per_torsion_bin[mcs_i->first] = std::min(left_tb[mcs_i->first], right_tb[mcs_i->first]);
941 for (std::map< char, core::Size >::const_iterator mcs_i = entries_per_torsion_bin.begin();
942 mcs_i != entries_per_torsion_bin.end(); mcs_i++) {
943 if (mcs_i->first ==
'X')
945 ideal_freq =
core::Real(mcs_i->second)/entries_per_torsion_bin[
'X'];
946 current_freq =
kinmover_->frequency_in_taboo_map( i-1, mcs_i->first );
950 if (current_freq > 0)
951 ideal_freq /= current_freq;
953 torsion_bins_for_pos += this_bin;
956 torsion_bins_for_pos +=
"X";
958 numeric::random::random_permutation(torsion_bins_for_pos.begin(), torsion_bins_for_pos.end(),
numeric::random::RG);
959 torsion_bins_per_position[i] = torsion_bins_for_pos;
965 for (
core::Size i = 1; i <= loop_sequence.size(); i++) {
966 new_torsion_string += torsion_bins_per_position[i][j];
969 if ( !(
kinmover_->is_in_taboo_map(new_torsion_string) ) )
1026 for(
Size i = 5; i <= pvatom3; i+=3 ) {
1027 bond_ang[ i ] = bangle_min +
RG.uniform() * bangle_sd;
1042 if(!mm || mm->get_bb(cur_res)){
1050 if ( cur_res ==
kinmover_->loop_begin() )
1052 else if ( cur_res ==
kinmover_->loop_end() )
1057 torsions[i++]=rama_phi;
1058 torsions[i++]=rama_psi;
1077 core::Real rand_omega = (
static_cast<int>(
RG.uniform()*2 ) ? OMEGA_MEAN : 0.0 );
1081 torsions[i++] = rand_omega;
1088 }
else if ( basic::options::option[ basic::options::OptionKeys::loops::kic_omega_sampling ]() ) {
1095 static const core::Real cis_prob_threshold = 0.0001;
1102 trans_prob =
RG.uniform();
1104 if ( trans_prob < cis_prob_threshold ) {
1107 torsions[i++] = OMEGA_MEAN +
RG.gaussian() * OMEGA_STDDEV;
1123 bool closure_successful
1139 numeric::conversions::radians(180 - bond_ang[atom]));