32 #include <numeric/random/random.hh>
34 #include <basic/Tracer.hh>
39 static numeric::random::RandomGenerator
RG(245099111);
49 static basic::Tracer
TR(
"protocols.swa.monte_carlo.rna_torsion_mover" ) ;
53 namespace monte_carlo {
65 RNA_TorsionMover::~RNA_TorsionMover()
73 default_sample_range_ = 10.0;
74 apply( pose, move_type, default_sample_range_ );
83 random_torsion_move( pose, moving_res_list, move_type, sample_range );
88 RNA_TorsionMover::random_torsion_move(
pose::Pose & pose,
91 Real const & sample_range ){
93 Size const random_idx =
int(
RG.uniform() * moving_res_list.size() ) + 1;
94 Size const i = moving_res_list[ random_idx ];
101 Size const nucleoside_num = i;
102 sample_near_nucleoside_torsion( pose, nucleoside_num, sample_range);
108 if (
RG.uniform() < 0.5) {
109 sample_near_suite_torsion( pose, suite_num, sample_range);
110 move_type +=
"-nuc-suite";
112 crankshaft_alpha_gamma( pose, suite_num, sample_range);
113 move_type +=
"-nuc-crank";
117 runtime_assert( moving_residue_case ==
INTERNAL );
120 Real const random_number =
RG.uniform();
122 if ( random_number < 0.6 ){
125 if (
RG.uniform() < 0.5) {
131 if (
RG.uniform() < 0.5) {
132 sample_near_suite_torsion( pose, suite_num, sample_range);
134 move_type +=
"-suite";
136 crankshaft_alpha_gamma( pose, suite_num, sample_range);
138 move_type +=
"-crank";
141 Size const nucleoside_num = i;
142 sample_near_nucleoside_torsion( pose, nucleoside_num, sample_range);
154 RNA_TorsionMover::get_name()
const {
155 return "RNA_TorsionMover";
165 torsion_list[1] +=
RG.gaussian() * stddev;
166 torsion_list[2] +=
RG.gaussian() * stddev;
167 torsion_list[3] +=
RG.gaussian() * stddev;
168 torsion_list[4] +=
RG.gaussian() * stddev;
169 torsion_list[5] +=
RG.gaussian() * stddev;
179 static const Real delta_north = rna_fitted_torsion_info_.ideal_delta_north();
180 static const Real delta_south = rna_fitted_torsion_info_.ideal_delta_south();
182 if (
RG.uniform() < 0.2) {
183 torsion_list[1] = (
RG.uniform() < 0.5) ? delta_south : delta_north;
186 torsion_list[2] +=
RG.gaussian() * stddev;
187 if (torsion_list[2] > 360) {
188 torsion_list[2] -= 360;
189 }
else if (torsion_list[2] <= 0) {
190 torsion_list[2] += 360;
199 Size const moving_res){
202 using namespace scoring::rna;
204 Real delta, nu2, nu1;
205 if (torsion_set[1] < 115) {
206 delta = rna_fitted_torsion_info_.ideal_delta_north();
207 nu2 = rna_fitted_torsion_info_.ideal_nu2_north();
208 nu1 = rna_fitted_torsion_info_.ideal_nu1_north();
210 delta = rna_fitted_torsion_info_.ideal_delta_south();
211 nu2 = rna_fitted_torsion_info_.ideal_nu2_south();
212 nu1 = rna_fitted_torsion_info_.ideal_nu1_south();
225 Size const moving_suite ){
228 using namespace scoring::rna;
241 RNA_TorsionMover::apply_random_nucleoside_torsion(
pose::Pose & pose,
242 Size const moving_res ){
246 bool north_pucker = (
RG.uniform() < 0.5) ?
true :
false;
248 Size chi_rotamer = 1;
253 torsion_set.push_back( rna_fitted_torsion_info_.ideal_delta_north() );
254 torsion_set.push_back( rna_fitted_torsion_info_.gaussian_parameter_set_chi_north()[chi_rotamer].center );
256 torsion_set.push_back( rna_fitted_torsion_info_.ideal_delta_south() );
257 torsion_set.push_back( rna_fitted_torsion_info_.gaussian_parameter_set_chi_south()[chi_rotamer].center );
260 apply_nucleoside_torsion( torsion_set, pose, moving_res );
266 RNA_TorsionMover::apply_random_suite_torsion(
pose::Pose & pose,
267 Size const moving_suite ){
271 bool north_pucker = ( pose.
delta( moving_suite ) < 115 );
272 Real const epsilon = ( north_pucker ) ? rna_fitted_torsion_info_.gaussian_parameter_set_epsilon_north()[1].center : rna_fitted_torsion_info_.gaussian_parameter_set_epsilon_south()[1].center;
273 torsion_set.push_back( epsilon );
275 Size const alpha_rotamer =
int( 3 *
RG.uniform() ) + 1;
276 Real const alpha = rna_fitted_torsion_info_.gaussian_parameter_set_alpha()[ alpha_rotamer ].center;
278 Size const zeta_rotamer =
int( 2 *
RG.uniform() ) + 1;
280 if ( alpha_rotamer == 1 ){
281 zeta = rna_fitted_torsion_info_.gaussian_parameter_set_zeta_alpha_sc_minus()[ zeta_rotamer ].center;
282 }
else if ( alpha_rotamer == 2 ){
283 zeta = rna_fitted_torsion_info_.gaussian_parameter_set_zeta_alpha_sc_plus()[ zeta_rotamer ].center;
285 zeta = rna_fitted_torsion_info_.gaussian_parameter_set_zeta_alpha_ap()[ zeta_rotamer ].center;
288 torsion_set.push_back( zeta );
289 torsion_set.push_back( alpha );
290 torsion_set.push_back( rna_fitted_torsion_info_.gaussian_parameter_set_beta()[1].center );
292 Size const gamma_rotamer =
int( 3 *
RG.uniform() ) + 1;
293 torsion_set.push_back( rna_fitted_torsion_info_.gaussian_parameter_set_gamma()[gamma_rotamer].center );
295 apply_suite_torsion( torsion_set, pose, moving_suite );
302 RNA_TorsionMover::apply_nucleoside_torsion_Aform(
304 Size const moving_res ){
307 ideal_A_form_torsions.push_back( rna_fitted_torsion_info_.ideal_delta_north() );
308 ideal_A_form_torsions.push_back( rna_fitted_torsion_info_.gaussian_parameter_set_chi_north()[1].center );
309 apply_nucleoside_torsion( ideal_A_form_torsions, pose, moving_res );
315 RNA_TorsionMover::apply_suite_torsion_Aform(
317 Size const moving_suite ){
320 ideal_A_form_torsions.push_back( rna_fitted_torsion_info_.gaussian_parameter_set_epsilon_north()[1].center );
321 ideal_A_form_torsions.push_back( rna_fitted_torsion_info_.gaussian_parameter_set_zeta_alpha_sc_minus()[1].center );
322 ideal_A_form_torsions.push_back( rna_fitted_torsion_info_.gaussian_parameter_set_alpha()[1].center );
323 ideal_A_form_torsions.push_back( rna_fitted_torsion_info_.gaussian_parameter_set_beta()[1].center );
324 ideal_A_form_torsions.push_back( rna_fitted_torsion_info_.gaussian_parameter_set_gamma()[1].center );
325 apply_suite_torsion( ideal_A_form_torsions, pose, moving_suite );
331 RNA_TorsionMover::get_suite_torsion(
pose::Pose const & pose,
Size const moving_suite ){
336 torsion_set.push_back( pose.
torsion( TorsionID( moving_suite,
id::BB, 5 ) ) );
337 torsion_set.push_back( pose.
torsion( TorsionID( moving_suite,
id::BB, 6 ) ) );
338 torsion_set.push_back( pose.
torsion( TorsionID( moving_suite+1,
id::BB, 1 ) ) );
339 torsion_set.push_back( pose.
torsion( TorsionID( moving_suite+1,
id::BB, 2 ) ) );
340 torsion_set.push_back( pose.
torsion( TorsionID( moving_suite+1,
id::BB, 3 ) ) );
347 RNA_TorsionMover::get_nucleoside_torsion(
pose::Pose const & pose,
Size const moving_nucleoside ){
352 torsion_set.push_back( pose.
torsion( TorsionID( moving_nucleoside,
id::BB, 4 ) ) );
353 torsion_set.push_back( pose.
torsion( TorsionID( moving_nucleoside,
id::CHI, 1 ) ) );
360 RNA_TorsionMover::sample_near_suite_torsion(
pose::Pose & pose,
Size const moving_suite,
Real const sample_range){
362 sample_near_suite_torsion( torsion_set, sample_range );
363 apply_suite_torsion( torsion_set, pose, moving_suite );
368 RNA_TorsionMover::sample_near_nucleoside_torsion(
pose::Pose & pose,
Size const moving_res,
Real const sample_range){
370 sample_near_nucleoside_torsion( torsion_set, sample_range);
371 apply_nucleoside_torsion( torsion_set, pose, moving_res );
375 RNA_TorsionMover::crankshaft_alpha_gamma(
pose::Pose & pose,
Size const moving_suite,
Real const sample_range){
379 TorsionID alpha_torsion_id( moving_suite+1,
id::BB, 1 );
380 TorsionID gamma_torsion_id( moving_suite+1,
id::BB, 3 );
384 Real const perturb =
RG.gaussian() * sample_range;