28 #include <basic/database/open.hh>
41 #include <utility/io/izstream.hh>
44 #include <ObjexxFCL/FArray2A.hh>
46 #include <numeric/conversions.hh>
47 #include <numeric/xyzMatrix.hh>
49 #include <numeric/interpolation/periodic_range/full/interpolation.hh>
53 #include <basic/Tracer.hh>
56 #include <utility/vector1.hh>
57 #include <ObjexxFCL/format.hh>
60 static basic::Tracer
tr(
"core.scoring.rna.RNA_LowResolutionPotential" );
70 using namespace ObjexxFCL;
71 using namespace ObjexxFCL::fmt;
79 rna_basepair_radius_cutoff_( 8.0 ),
80 rna_basepair_stagger_cutoff_( 3.0 ),
81 rna_basepair_radius_cutoff2_( rna_basepair_radius_cutoff_ * rna_basepair_radius_cutoff_) ,
82 basepair_xy_bin_width_( 2.0 ),
83 basepair_xy_num_bins_( 10 ),
84 basepair_xy_table_size_( 10 ),
85 basepair_xy_z_fade_zone_( 0.5 ),
87 base_stack_min_height_( 2.4 ),
88 base_stack_max_height_( 6.0 ),
89 base_stack_radius_( 4.0 ),
90 base_stack_radius2_( base_stack_radius_ * base_stack_radius_ ),
91 base_stack_z_fade_zone_( 0.5 ),
92 base_stack_rho_fade_zone_( 0.5 ),
94 axis_bin_width_( 0.2 ),
95 axis_num_bins_ ( 11 ),
97 stagger_num_bins_( 11 ),
98 stagger_bin_width_( 0.4 ),
99 stagger_distance_cutoff_( 2.0 ),
101 base_backbone_bin_width_( 1.0 ),
102 base_backbone_num_bins_( 16 ),
103 base_backbone_table_size_( 8 ),
104 base_backbone_distance_cutoff_ ( 12.0 ),
105 base_backbone_z_cutoff_ ( 2.0 ),
106 base_backbone_rho_cutoff_( 8.0 ),
107 base_backbone_atom_dist_cutoff_( 4.0 ),
108 base_backbone_z_fade_zone_( 0.25 ),
109 base_backbone_rho_fade_zone_( 0.5 ),
110 base_backbone_check_atom_neighbor_( false ),
112 backbone_backbone_bin_width_( 0.25 ),
113 backbone_backbone_distance_cutoff_ ( 6.0 ),
114 backbone_backbone_num_bins_ ( 20 ),
116 rna_repulsive_max_penalty_( 8.0 ),
117 rna_repulsive_screen_scale_( 2.5 ),
118 rna_repulsive_distance_cutoff_( 8.0 ),
119 rna_repulse_all_( true ),
120 num_RNA_base_pair_orientations_( 2 ),
121 num_RNA_backbone_oxygen_atoms_( 6 ),
122 num_RNA_res_types_( 4 ),
123 o2star_index_within_special_backbone_atoms_( 6 ),
124 o2p_index_within_special_backbone_atoms_( 2 ),
125 interpolate_( true ),
127 rna_verbose_( false ),
128 more_precise_base_pair_classification_( false )
170 utility::io::izstream data_stream( basic::database::full_name( filename ) );
172 if ( !data_stream ) {
173 std::cerr <<
"Can't find specified basepair potential file: " << filename << std::endl;
174 utility::exit( EXIT_FAILURE, __FILE__, __LINE__);
178 std::cout <<
"Reading basepair x-y potential file: " << filename << std::endl;;
180 Size res1, res2, xbin, ybin, direction;
182 while ( data_stream >> xbin ) {
183 data_stream >> ybin >> res1 >> res2 >> direction >> potential >> skip ;
187 std::cout <<
"Finished reading basepair x-y potential file: " << filename << std::endl;;
257 utility::io::izstream data_stream( basic::database::full_name( filename ) );
259 if ( !data_stream ) {
260 std::cerr <<
"Can't find specified non-base-base potential file: " << filename << std::endl;
261 utility::exit( EXIT_FAILURE, __FILE__, __LINE__);
265 std::cout <<
"Reading non-base-base x-y potential file: " << filename << std::endl;;
267 Size res1, xbin, ybin, atomindex;
269 while ( data_stream >> xbin ) {
270 data_stream >> ybin >> res1 >> atomindex >> potential >> skip ;
298 utility::io::izstream data_stream( basic::database::full_name( filename ) );
300 if ( !data_stream ) {
301 std::cerr <<
"Can't find specified RNA backbone-backbone potential file: " << filename << std::endl;
302 utility::exit( EXIT_FAILURE, __FILE__, __LINE__);
306 std::cout <<
"Reading RNA backbone backbone potential file: " << filename << std::endl;;
309 Real r1,r2,potential;
310 while ( data_stream >> r1 ) {
311 data_stream >> r2 >> rbin >> potential >> skip ;
342 Real const cos_theta,
345 bool const update_deriv ,
348 Real & deriv_z )
const
350 Size const theta_bin = (cos_theta < 0) ? 1 : 2;
358 assert( res_i_bin > 0);
359 assert( res_j_bin > 0);
367 Real interpolate_value( 0.0 );
369 ObjexxFCL::FArray2A< Real >
const rna_basepair_xy_for_res_res(
rna_basepair_xy_( 1, 1, theta_bin, res_i_bin, res_j_bin ), zero_index, zero_index );
370 using namespace numeric::interpolation::periodic_range::full;
372 if ( update_deriv ) {
373 interpolate_value = bilinearly_interpolated(
378 rna_basepair_xy_for_res_res,
381 interpolate_value = bilinearly_interpolated(
386 rna_basepair_xy_for_res_res );
390 value = interpolate_value;
398 if (x_bin < 1 ) x_bin = 1;
399 if (y_bin < 1 ) y_bin = 1;
408 Real fade_value( 1.0 ), fade_deriv( 0.0 );
416 deriv_x = deriv_x * fade_value;
417 deriv_y = deriv_y * fade_value;
418 deriv_z = value * fade_deriv;
422 Distance const rho = std::sqrt( x*x + y*y );
429 deriv_x = fade_value * deriv_x + value * fade_deriv * ( x / rho ) ;
430 deriv_y = fade_value * deriv_y + value * fade_deriv * ( y / rho );
431 deriv_z *= fade_value;
452 Real & deriv_z )
const
462 Real fade_value( 1.0 ), fade_deriv( 0.0 );
471 deriv_z = value * fade_deriv;
475 Distance const rho = std::sqrt( x*x + y*y );
479 deriv_x = value * fade_deriv * ( x / rho ) ;
480 deriv_y = value * fade_deriv * ( y / rho );
481 deriv_z *= fade_value;
496 Real const cos_theta,
497 Real & deriv )
const{
503 cos_theta_bin =
static_cast<int> ( ( cos_theta + 1.1f)/
axis_bin_width_ ) + 1;
508 Real interpolate_value( 0.0 );
511 value = interpolate_value;
559 Size const & atom_num_j_bin,
560 bool const update_deriv ,
563 Real & deriv_z )
const
573 assert( res_i_bin > 0);
574 assert( atom_num_j_bin > 0);
579 ObjexxFCL::FArray2A< Real >
const rna_base_backbone_xy_for_res_atom(
rna_base_backbone_xy_( 1, 1, res_i_bin, atom_num_j_bin ), zero_index, zero_index );
580 using namespace numeric::interpolation::periodic_range::full;
582 if ( update_deriv ||
true ) {
583 value = bilinearly_interpolated(
588 rna_base_backbone_xy_for_res_atom,
591 value = bilinearly_interpolated(
596 rna_base_backbone_xy_for_res_atom );
604 if (x_bin < 1 ) x_bin = 1;
605 if (y_bin < 1 ) y_bin = 1;
614 Real fade_value( 1.0 ), fade_deriv( 0.0 );
620 deriv_x = deriv_x * fade_value;
621 deriv_y = deriv_y * fade_value;
622 deriv_z = value * fade_deriv;
628 Distance const rho = std::sqrt( x*x + y*y );
633 deriv_x = fade_value * deriv_x + value * fade_deriv * ( x / rho ) ;
634 deriv_y = fade_value * deriv_y + value * fade_deriv * ( y / rho );
635 deriv_z *= fade_value;
653 Size const & atom_num_j_bin,
683 Size const & atom_num_j_bin,
691 static Real offset = rna_repulsive_max_penalty_ * exp( -1.0 * rna_repulsive_distance_cutoff_ / rna_repulsive_screen_scale_ );
694 if (r < rna_repulsive_distance_cutoff_ ){
695 Real potential = rna_repulsive_max_penalty_ * exp( -1.0 * r/ rna_repulsive_screen_scale_ ) - offset;
697 exp( -1.0 * r/ rna_repulsive_screen_scale_ );
719 rna_centroid_info.
update( pose );
736 rna_centroid_info.
update( pose );
747 rna_raw_base_base_info.
resize( total_residue );
750 ObjexxFCL::FArray3D< Real > & base_pair_array( rna_raw_base_base_info.base_pair_array() );
751 ObjexxFCL::FArray3D< Real > & base_axis_array( rna_raw_base_base_info.base_axis_array() );
752 ObjexxFCL::FArray3D< Real > & base_stagger_array( rna_raw_base_base_info.base_stagger_array() );
753 ObjexxFCL::FArray2D< Real > & base_stack_array( rna_raw_base_base_info.base_stack_array() );
754 ObjexxFCL::FArray2D< Real > & base_stack_axis_array( rna_raw_base_base_info.base_stack_axis_array() );
755 ObjexxFCL::FArray2D< Real > & base_geometry_orientation_array( rna_raw_base_base_info.base_geometry_orientation_array() );
756 ObjexxFCL::FArray2D< Real > & base_geometry_height_array( rna_raw_base_base_info.base_geometry_height_array() );
761 base_pair_array = 0.0;
762 base_stagger_array = 0.0;
763 base_axis_array = 0.0;
764 base_stack_array = 0.0;
765 base_stack_axis_array = 0.0;
766 base_geometry_orientation_array = 0.0;
767 base_geometry_height_array = 0.0;
774 for (
Size i = 1; i <= total_residue; i++ ){
777 if ( !res_i.is_RNA() )
continue;
780 Vector const & centroid_i( base_centroids[i] );
782 Matrix const & M_i( stub_i.
M );
783 Vector const & x_i = M_i.col_x();
784 Vector const & y_i = M_i.col_y();
785 Vector const & z_i = M_i.col_z();
788 iter = energy_graph.get_node( i )->const_edge_list_begin();
792 Size j( (*iter)->get_other_ind( i ) );
797 if ( !res_j.is_RNA())
continue;
799 Vector const & centroid_j( base_centroids[j] );
802 Vector d_ij = centroid_j - centroid_i;
803 Real const dist_x = dot_product( d_ij, x_i );
804 Real const dist_y = dot_product( d_ij, y_i );
805 Real const dist_z = dot_product( d_ij, z_i );
806 Real const rho2 = dist_x*dist_x + dist_y*dist_y;
809 Matrix const & M_j( stub_j.
M );
812 Vector const & z_j = M_j.col_z();
813 Real const cos_theta = dot_product( z_i, z_j );
823 Real temp_rna_bp_score( 0.0 );
830 temp_rna_bp_score -= 0.0001;
832 Real zeta_hoogsteen_cutoff( 60.0 ), zeta_sugar_cutoff( -60.0 );
835 Real const zeta = numeric::conversions::degrees( std::atan2( dist_y, dist_x) );
836 if ( zeta < zeta_hoogsteen_cutoff && zeta > zeta_sugar_cutoff ) edge_bin =
WATSON_CRICK;
837 else if ( zeta > zeta_hoogsteen_cutoff ) edge_bin =
HOOGSTEEN;
838 else edge_bin =
SUGAR;
841 Real const theta = numeric::conversions::degrees( numeric::arccos( cos_theta ) );
842 std::cout <<
" Possible base pair: "
843 << res_i.name3() << I(3,i) <<
"-"
844 << res_j.name3() << I(3,j)
845 <<
" edge: " << I(1,edge_bin)
846 <<
" dists " << F(4,2,dist_x)
847 <<
" " << F(4,2,dist_y)
848 <<
" " << F(4,2,dist_z)
849 <<
" theta " << F(5,1, theta)
850 <<
"; rho " << F(4,2, std::sqrt( rho2) )
851 <<
"; zeta " << F(4,2, zeta )
852 <<
"; zeta_cut " << F(4,2, zeta_hoogsteen_cutoff )
853 <<
" : SCORE " << F(6,4,temp_rna_bp_score)
858 base_pair_array ( i, j, edge_bin ) = temp_rna_bp_score;
873 base_geometry_orientation_array ( i, j ) = cos_theta;
874 base_geometry_height_array ( i, j ) = dist_z;
888 using namespace core::scoring::rna;
928 using namespace core::chemical;
929 using namespace core::conformation;
935 Vector const & centroid_i = rna_centroid_info.get_base_centroid( *rsd );
936 kinematics::Stub const & stub_i = rna_centroid_info.get_base_coordinate_system( *rsd, centroid_i );
937 Matrix const & M_i( stub_i.M );
938 Vector const & x_i = M_i.col_x();
939 Vector const & y_i = M_i.col_y();
943 Real dist_x( 0.0 ), dist_y( 0.0 ), zeta( 0.0 );
945 Vector d_ij_hoogsteen = rsd->xyz( hoogsteen_cutoff_atom ) - centroid_i;
946 dist_x = dot_product( d_ij_hoogsteen, x_i );
947 dist_y = dot_product( d_ij_hoogsteen, y_i );
948 zeta = numeric::conversions::degrees( std::atan2( dist_y, dist_x ) );
952 Vector d_ij_sugar = rsd->xyz( sugar_cutoff_atom ) - centroid_i;
953 dist_x = dot_product( d_ij_sugar, x_i );
954 dist_y = dot_product( d_ij_sugar, y_i );
955 zeta = numeric::conversions::degrees( std::atan2( dist_y, dist_x ) );
972 using namespace core::chemical;
989 Real & zeta_hoogsteen_cutoff,
990 Real & zeta_sugar_cutoff
998 zeta_hoogsteen_cutoff = 60.0;
999 zeta_sugar_cutoff = -60.0;
1010 Vector const & centroid_i,
1011 Vector const & centroid_j,
1017 if ( !res_i.
is_RNA() )
return;
1018 if ( !res_j.
is_RNA() )
return;
1023 rna_raw_base_base_info.
resize( total_residue );
1025 ObjexxFCL::FArray3D< Real > & base_pair_array( rna_raw_base_base_info.
base_pair_array() );
1026 ObjexxFCL::FArray3D< Real > & base_axis_array( rna_raw_base_base_info.
base_axis_array() );
1027 ObjexxFCL::FArray3D< Real > & base_stagger_array( rna_raw_base_base_info.
base_stagger_array() );
1028 ObjexxFCL::FArray2D< Real > & base_stack_array( rna_raw_base_base_info.
base_stack_array() );
1029 ObjexxFCL::FArray2D< Real > & base_stack_axis_array( rna_raw_base_base_info.
base_stack_axis_array() );
1038 base_pair_array( i, j, k ) = 0.0;
1039 base_axis_array( i, j, k ) = 0.0;
1040 base_stagger_array( i, j, k ) = 0.0;
1042 base_stack_array( i, j ) = 0.0;
1043 base_stack_axis_array( i, j ) = 0.0;
1044 base_geometry_orientation_array( i, j ) = 0.0;
1045 base_geometry_height_array( i, j ) = 0.0;
1047 Matrix const & M_i( stub_i.
M );
1048 Vector const & x_i = M_i.col_x();
1049 Vector const & y_i = M_i.col_y();
1050 Vector const & z_i = M_i.col_z();
1052 Vector d_ij = centroid_j - centroid_i;
1053 Real const dist_x = dot_product( d_ij, x_i );
1054 Real const dist_y = dot_product( d_ij, y_i );
1055 Real const dist_z = dot_product( d_ij, z_i );
1056 Real const rho2 = dist_x*dist_x + dist_y*dist_y;
1059 Matrix const & M_j( stub_j.
M );
1062 Vector const & z_j = M_j.col_z();
1063 Real const cos_theta = dot_product( z_i, z_j );
1073 Real temp_rna_bp_score( 0.0 );
1080 temp_rna_bp_score -= 0.0001;
1082 Real zeta_hoogsteen_cutoff( 60.0 ), zeta_sugar_cutoff( -60.0 );
1085 Real const zeta = numeric::conversions::degrees( std::atan2( dist_y, dist_x) );
1086 if ( zeta < zeta_hoogsteen_cutoff && zeta > zeta_sugar_cutoff ) edge_bin =
WATSON_CRICK;
1087 else if ( zeta > zeta_hoogsteen_cutoff ) edge_bin =
HOOGSTEEN;
1088 else edge_bin =
SUGAR;
1091 Real const theta = numeric::conversions::degrees( numeric::arccos( cos_theta ) );
1092 std::cout <<
" Possible base pair: "
1093 << res_i.
name3() << I(3,i) <<
"-"
1094 << res_j.
name3() << I(3,j)
1095 <<
" edge: " << I(1,edge_bin)
1096 <<
" dists " << F(4,2,dist_x)
1097 <<
" " << F(4,2,dist_y)
1098 <<
" " << F(4,2,dist_z)
1099 <<
" Centroid " << centroid_i(1) <<
" " << centroid_i(2) <<
" " << centroid_i(3)
1100 <<
" CENTROID " << centroid_j(1) <<
" " << centroid_j(2) <<
" " << centroid_j(3)
1101 <<
" theta " << F(5,1, theta)
1102 <<
"; rho " << F(4,2, std::sqrt( rho2) )
1103 <<
" : SCORE " << F(6,4,temp_rna_bp_score)
1108 base_pair_array ( i, j, edge_bin ) = temp_rna_bp_score;
1123 base_geometry_orientation_array ( i, j ) = cos_theta;
1124 base_geometry_height_array ( i, j ) = dist_z;
1139 Size const & i = atom_id.
rsd();
1143 if ( !res_i.is_RNA() )
return;
1158 assert( rna_filtered_base_base_info.scale_axis_stagger() );
1161 ObjexxFCL::FArray2D< Real >
const & filtered_base_pair_array ( rna_filtered_base_base_info.filtered_base_pair_array() );
1162 ObjexxFCL::FArray2D< Real >
const & filtered_base_axis_array ( rna_filtered_base_base_info.filtered_base_axis_array() );
1163 ObjexxFCL::FArray2D< Real >
const & filtered_base_stagger_array( rna_filtered_base_base_info.filtered_base_stagger_array() );
1164 ObjexxFCL::FArray2D< Real >
const & filtered_base_stack_array( rna_filtered_base_base_info.filtered_base_stack_array() );
1165 ObjexxFCL::FArray2D< Real >
const & filtered_base_stack_axis_array( rna_filtered_base_base_info.filtered_base_stack_axis_array() );
1174 Vector const & centroid_i( base_centroids[i] );
1176 Matrix const & M_i( stub_i.
M );
1177 Vector const & x_i = M_i.col_x();
1178 Vector const & y_i = M_i.col_y();
1179 Vector const & z_i = M_i.col_z();
1184 iter = energy_graph.get_node( i )->const_edge_list_begin();
1188 Size j( (*iter)->get_other_ind( i ) );
1192 Vector const & centroid_j( base_centroids[j] );
1195 Matrix const & M_j( stub_j.
M );
1196 Vector const & x_j = M_j.col_x();
1197 Vector const & y_j = M_j.col_y();
1198 Vector const & z_j = M_j.col_z();
1199 Real const cos_theta = dot_product( z_i, z_j );
1204 if ( filtered_base_pair_array( i, j) < 0.0 ) {
1206 Real const base_axis_score_unscaled = filtered_base_axis_array(i,j)/filtered_base_pair_array(i,j);
1207 Real const base_stagger_score_unscaled = filtered_base_stagger_array(i,j)/filtered_base_pair_array(i,j);
1208 Real bp_deriv_x( 0.0 ), bp_deriv_y( 0.0 ), bp_deriv_z( 0.0 ), axis_deriv( 0.0 ), stagger_deriv( 0.0 );
1209 Real const & basepair_axis_stagger_scaling( rna_filtered_base_base_info.basepair_axis_stagger_scaling() );
1213 Vector d_ij = centroid_j - centroid_i;
1214 Real const dist_x = dot_product( d_ij, x_i );
1215 Real const dist_y = dot_product( d_ij, y_i );
1216 Real const dist_z = dot_product( d_ij, z_i );
1220 true , bp_deriv_x, bp_deriv_y, bp_deriv_z );
1228 ( x_i * bp_deriv_x + y_i * bp_deriv_y + z_i * bp_deriv_z )
1232 - z_i * basepair_axis_stagger_scaling * filtered_base_pair_array(i,j) * weights[
rna_base_stagger ] * stagger_deriv;
1234 Vector const f1 = cross( f2, centroid_j )
1235 - basepair_axis_stagger_scaling * filtered_base_pair_array(i,j) * weights[
rna_base_axis ] * axis_deriv * cross( z_i, z_j );
1244 Vector d_ji = centroid_i - centroid_j;
1245 Real const dist_x = dot_product( d_ji, x_j );
1246 Real const dist_y = dot_product( d_ji, y_j );
1247 Real const dist_z = dot_product( d_ji, z_j );
1251 true , bp_deriv_x, bp_deriv_y, bp_deriv_z );
1258 ( x_j * bp_deriv_x + y_j * bp_deriv_y + z_j * bp_deriv_z )
1262 - z_j * basepair_axis_stagger_scaling * filtered_base_pair_array(j,i) * weights[
rna_base_stagger ] * stagger_deriv;
1264 Vector const f1 = cross( f2, centroid_i )
1265 - basepair_axis_stagger_scaling * filtered_base_pair_array(j,i) * weights[
rna_base_axis ] * axis_deriv * cross( z_j, z_i );
1273 }
else if ( filtered_base_stack_array( i, j) < 0.0 ) {
1276 Real const base_stack_axis_score_unscaled = filtered_base_stack_axis_array(i,j)/filtered_base_stack_array(i,j);
1277 Real bs_deriv_x( 0.0 ), bs_deriv_y( 0.0 ), bs_deriv_z( 0.0 ), axis_deriv( 0.0 );
1278 Real const & basestack_axis_scaling( rna_filtered_base_base_info.basestack_axis_scaling() );
1281 Vector d_ij = centroid_j - centroid_i;
1282 Real const dist_x = dot_product( d_ij, x_i );
1283 Real const dist_y = dot_product( d_ij, y_i );
1284 Real const dist_z = dot_product( d_ij, z_i );
1291 ( x_i * bs_deriv_x + y_i * bs_deriv_y + z_i * bs_deriv_z ) *
1294 Vector const f1 = cross( f2, centroid_j )
1295 - basestack_axis_scaling * weights[
rna_base_stack_axis ] * filtered_base_stack_array(i,j) * axis_deriv * cross( z_i, z_j );
1303 Vector d_ji = centroid_i - centroid_j;
1304 Real const dist_x = dot_product( d_ji, x_j );
1305 Real const dist_y = dot_product( d_ji, y_j );
1306 Real const dist_z = dot_product( d_ji, z_j );
1315 ( x_j * bs_deriv_x + y_j * bs_deriv_y + z_j * bs_deriv_z ) *
1318 Vector const f1 = cross( f2, centroid_i )
1319 - basestack_axis_scaling * weights[
rna_base_stack_axis ] * filtered_base_stack_array(j,i) * axis_deriv * cross( z_j, z_i );
1342 Vector const & heavy_atom_j,
1343 Real & atom_cutoff_weight)
const
1346 atom_cutoff_weight = 1.0;
1352 bool found_a_neighbor =
false;
1353 Real min_nbr_dist2( 1000.0 );
1355 Vector const & base_heavy_atom_i( rsd1.
xyz( atom_num_i ) );
1356 Real const nbr_dist2 = (heavy_atom_j - base_heavy_atom_i ).length_squared();
1357 if ( nbr_dist2 < min_nbr_dist2 ){
1358 min_nbr_dist2 = nbr_dist2;
1363 Real const min_nbr_dist = std::sqrt( min_nbr_dist2 );
1366 Real deriv_currently_ignored( 0.0 );
1367 if (found_a_neighbor) {
1373 deriv_currently_ignored );
1377 return found_a_neighbor;
1385 Vector const & centroid1,
1386 Vector const & centroid2,
1400 Vector const & centroid_i,
1407 if ( !rsd1.
is_RNA() )
return 0.0;
1408 if ( !rsd2.
is_RNA() )
return 0.0;
1416 if ( abs( static_cast<int> (i - j) ) < 2 )
return 0.0;
1426 Matrix const & M_i( stub_i.
M );
1427 Vector const & x_i = M_i.col_x();
1428 Vector const & y_i = M_i.col_y();
1429 Vector const & z_i = M_i.col_z();
1443 Vector const heavy_atom_j( rsd2.
xyz( atom_num_j ) );
1445 Vector const d_ij = heavy_atom_j - centroid_i;
1447 Real const dist_ij = d_ij.length();
1451 Real const dist_x = dot_product( d_ij, x_i );
1452 Real const dist_y = dot_product( d_ij, y_i );
1453 Real const dist_z = dot_product( d_ij, z_i );
1455 Real const rho = std::sqrt( dist_x * dist_x + dist_y * dist_y);
1462 Real atom_cutoff_weight( 1.0 );
1465 Real const score_contribution =
1468 total_score += score_contribution;
1477 " [" << F(4,2,rho) <<
", " << F(4,2,dist_z) <<
"]: " <<
1478 F(6,2,score_contribution) <<
1503 Size const & i = atom_id.
rsd();
1510 if ( !rsd1.is_RNA() )
return;
1529 Vector const & centroid_i( base_centroids[i] );
1531 Matrix const & M_i( stub_i.
M );
1532 Vector const & x_i = M_i.col_x();
1533 Vector const & y_i = M_i.col_y();
1534 Vector const & z_i = M_i.col_z();
1540 iter = energy_graph.get_node( i )->const_edge_list_begin();
1544 Size j( (*iter)->get_other_ind( i ) );
1546 if ( abs( static_cast<int>(i - j) ) < 2 )
continue;
1549 if ( !rsd2.is_RNA() )
continue;
1557 Vector const heavy_atom_j( rsd2.xyz( atom_num_j ) );
1559 Vector const d_ij = heavy_atom_j - centroid_i;
1561 Real const dist_ij = d_ij.length();
1565 Real const dist_x = dot_product( d_ij, x_i );
1566 Real const dist_y = dot_product( d_ij, y_i );
1567 Real const dist_z = dot_product( d_ij, z_i );
1569 Real const rho = std::sqrt( dist_x * dist_x + dist_y * dist_y);
1576 Real atom_cutoff_weight( 1.0 );
1579 Real deriv_x( 0.0 ), deriv_y( 0.0 ), deriv_z( 0.0 );
1582 Vector const f2 = -1.0 * ( x_i * deriv_x + y_i * deriv_y + z_i * deriv_z);
1583 Vector const f1 = cross( f2, heavy_atom_j );
1596 Vector const heavy_atom_i( rsd1.xyz( atom_num_i ) );
1601 iter = energy_graph.get_node( i )->const_edge_list_begin();
1605 Size j( (*iter)->get_other_ind( i ) );
1607 if ( abs( static_cast<int>(i - j) ) < 2 )
continue;
1610 if ( !rsd2.is_RNA() )
continue;
1612 Vector const & centroid_j( base_centroids[j] );
1614 Matrix const & M_j( stub_j.
M );
1615 Vector const & x_j = M_j.col_x();
1616 Vector const & y_j = M_j.col_y();
1617 Vector const & z_j = M_j.col_z();
1619 Vector const d_ij = heavy_atom_i - centroid_j;
1621 Real const dist_ij = d_ij.length();
1625 Real const dist_x = dot_product( d_ij, x_j );
1626 Real const dist_y = dot_product( d_ij, y_j );
1627 Real const dist_z = dot_product( d_ij, z_j );
1629 Real const rho = std::sqrt( dist_x * dist_x + dist_y * dist_y);
1636 Real atom_cutoff_weight( 1.0 );
1639 Real deriv_x( 0.0 ), deriv_y( 0.0 ), deriv_z( 0.0 );
1643 Vector const f2 = x_j * deriv_x + y_j * deriv_y + z_j * deriv_z;
1644 Vector const f1 = cross( f2, heavy_atom_i );
1679 if ( !rsd1.
is_RNA() )
return 0.0;
1680 if ( !rsd2.
is_RNA() )
return 0.0;
1685 Real rna_backbone_backbone_score = 0.0;
1694 if ( abs( static_cast<int>(i - j) ) <= 2 )
return 0.0;
1702 Vector const & heavy_atom_i = rsd1.
xyz( atom_num_i );
1712 if ( atom_num_j == atom_num_i && j < i)
continue;
1714 Vector const & heavy_atom_j = rsd2.
xyz( atom_num_j );
1715 Vector const d_ij = heavy_atom_j - heavy_atom_i;
1716 Distance const dist_ij = d_ij.length();
1721 rna_backbone_backbone_score += score_contribution;
1726 "BACKBONE_BACKBONE " <<
1730 " " << rsd1.
xyz( atom_num_i )[1] <<
1735 " " << rsd2.
xyz( atom_num_j )[1] <<
1736 F(6,2,score_contribution) <<
" [" << dist_ij <<
"]" <<
1742 return rna_backbone_backbone_score;
1749 ObjexxFCL::FArray2D< Size >
const & atom_numbers_for_backbone_score_calculations,
1751 Size const & atom_num_i )
const
1755 bool is_backbone_oxygen_atom(
false );
1758 if ( atom_numbers_for_backbone_score_calculations(i, n) == atom_num_i ) {
1759 is_backbone_oxygen_atom =
true;
break;
1762 if (!is_backbone_oxygen_atom)
return 0;
1771 Size const & atom_num_i )
const
1775 bool is_backbone_oxygen_atom(
false );
1779 is_backbone_oxygen_atom =
true;
break;
1782 if (!is_backbone_oxygen_atom)
return 0;
1800 Size const & i = atom_id.
rsd();
1807 if ( !rsd1.is_RNA() )
return;
1821 if ( atom_num_i == atom_num_o2star ) {
1824 Vector const & heavy_atom_i = rsd1.xyz( atom_num_i );
1827 iter = energy_graph.get_node( i )->const_edge_list_begin();
1831 Size j( (*iter)->get_other_ind( i ) );
1833 if ( abs( static_cast<int>(i - j) ) <= 2 )
continue;
1836 if ( !rsd2.is_RNA() )
continue;
1848 Vector const & heavy_atom_j = rsd2.xyz( atom_num_j );
1849 Vector const d_ij = heavy_atom_j - heavy_atom_i;
1850 Distance const dist_ij = d_ij.length();
1857 Vector const f2( -1.0 * deriv * d_ij/ dist_ij );
1858 Vector const f1( 1.0 * cross( f2, heavy_atom_j ) );
1873 Vector const heavy_atom_i = rsd1.xyz( atom_num_i );
1876 iter = energy_graph.get_node( i )->const_edge_list_begin();
1880 Size j( (*iter)->get_other_ind( i ) );
1882 if ( abs ( static_cast<int>(i - j) ) <= 2 )
continue;
1890 Vector const & heavy_atom_j = rsd2.xyz( atom_num_j );
1891 Vector const d_ij = heavy_atom_j - heavy_atom_i;
1892 Distance const dist_ij = d_ij.length();
1899 Vector const f2( -1.0 * deriv * d_ij/ dist_ij );
1900 Vector const f1( 1.0 * cross( f2, heavy_atom_j ) );
1935 if ( !rsd1.
is_RNA() )
return 0.0;
1936 if ( !rsd2.
is_RNA() )
return 0.0;
1943 Real rna_repulsive_score( 0.0 );
1956 Vector const heavy_atom_i = rsd1.
xyz( atom_num_i );
1958 if ( abs( static_cast<int>( i - j ) ) <= 2 )
return 0.0;
1971 if (atom_num_j == atom_num_i && j < i)
continue;
1973 Vector const heavy_atom_j( rsd2.
xyz( atom_num_j ) );
1975 Vector const d_ij = heavy_atom_j - heavy_atom_i;
1977 Real const dist_ij = d_ij.length();
1982 rna_repulsive_score += score_contribution;
1993 F(6,2,score_contribution) <<
" [" << dist_ij <<
"]" <<
1999 return rna_repulsive_score;
2015 Size const & i = atom_id.
rsd();
2022 if ( !rsd1.is_RNA() )
return;
2036 if ( atom_num_i == atom_num_o2p ) {
2039 Vector const heavy_atom_i = rsd1.xyz( atom_num_i );
2042 iter = energy_graph.get_node( i )->const_edge_list_begin();
2046 Size j( (*iter)->get_other_ind( i ) );
2048 if ( abs( static_cast<int>(i - j) ) <= 2 )
continue;
2051 if ( !rsd2.is_RNA() )
continue;
2066 Vector const heavy_atom_j( rsd2.xyz( atom_num_j ) );
2068 Vector const d_ij = heavy_atom_j - heavy_atom_i;
2070 Real const dist_ij = d_ij.length();
2077 Vector const f2( -1.0 * deriv * d_ij/ dist_ij );
2078 Vector const f1( 1.0 * cross( f2, heavy_atom_j ) );
2095 Vector const heavy_atom_i = rsd1.xyz( atom_num_i );
2098 iter = energy_graph.get_node( i )->const_edge_list_begin();
2102 Size j( (*iter)->get_second_node_ind() );
2105 if (i == j) j = (*iter)->get_first_node_ind();
2107 if ( abs( static_cast<int>(i - j) ) <= 2 )
continue;
2110 if ( !rsd2.is_RNA() )
continue;
2122 Vector const heavy_atom_j( rsd2.xyz( atom_num_j ) );
2124 Vector const d_ij = heavy_atom_j - heavy_atom_i;
2126 Real const dist_ij = d_ij.length();
2133 Vector const f2( -1.0 * deriv * d_ij/ dist_ij );
2134 Vector const f1( cross( f2, heavy_atom_j ) );
2158 using namespace core::chemical;
2179 using namespace core::chemical;
2194 using namespace core::chemical;
2264 rna_centroid_info.
update( pose );
2275 if ( !res_i.is_RNA() )
return true;
2278 Vector const & centroid_i( base_centroids[i] );
2280 Matrix const & M_i( stub_i.
M );
2281 Vector const & x_i = M_i.col_x();
2282 Vector const & y_i = M_i.col_y();
2283 Vector const & z_i = M_i.col_z();
2290 for (
Size m = 1; m <= res_j.natoms(); m++ ) {
2292 Vector const & atom_j( res_j.xyz( m ) );
2294 Vector d_ij = atom_j - centroid_i;
2295 Real const dist_x = dot_product( d_ij, x_i );
2296 Real const dist_y = dot_product( d_ij, y_i );
2297 Real const dist_z = dot_product( d_ij, z_i );
2298 Real const rho2 = dist_x*dist_x + dist_y*dist_y;
2305 tr <<
"Found stacking atom on base " << i <<
": " << j <<
" " << res_j.atom_name( m ) << std::endl;
2328 rna_centroid_info.
update( pose );
2340 if ( !res_i.is_RNA() )
return false;
2341 if ( !res_j.is_RNA() )
return false;
2343 if (i==j)
return false;
2346 Vector const & centroid_i( base_centroids[i] );
2348 Matrix const & M_i( stub_i.
M );
2349 Vector const & x_i = M_i.col_x();
2350 Vector const & y_i = M_i.col_y();
2351 Vector const & z_i = M_i.col_z();
2353 Vector const & centroid_j( base_centroids[j] );
2362 Vector d_ij = centroid_j - centroid_i;
2363 Real const dist_x = dot_product( d_ij, x_i );
2364 Real const dist_y = dot_product( d_ij, y_i );
2365 Real const dist_z = dot_product( d_ij, z_i );
2366 Real const rho2 = dist_x*dist_x + dist_y*dist_y;