25 #include <basic/Tracer.hh>
33 #include <utility/vector1.hh>
34 #include <ObjexxFCL/FArray2D.hh>
36 #include <ObjexxFCL/format.hh>
38 using ObjexxFCL::fmt::I;
40 static basic::Tracer
tr(
"core.scoring.rna.RNA_VDW_Energy");
66 rna_atom_vdw_(
ScoringManager::get_instance()->get_RNA_AtomVDW() ),
67 vdw_scale_factor_( 0.8 )
130 if ( !rsd1.
is_RNA() && !is_magnesium[ pos1 ] )
return;
131 if ( !rsd2.
is_RNA() && !is_magnesium[ pos2 ])
return;
133 char const which_nucleotide1 = rsd1.
name1();
134 char const which_nucleotide2 = rsd2.
name1();
144 Size const num_vdw_atoms1( atom_numbers1.size() );
148 for (
Size m = 1; m <= num_vdw_atoms1; ++m ) {
150 Size const i = atom_numbers1[ m ];
156 Size const num_vdw_atoms2( atom_numbers2.size() );
158 for (
Size n = 1; n <= num_vdw_atoms2; ++n ) {
160 Size const j = atom_numbers2[ n ];
164 Real const clash( bump_dsq - i_xyz.distance_squared( rsd2.
xyz(j) ) );
168 score += ( clash * clash ) / bump_dsq;
187 Size const & i )
const
190 bool is_vdw_atom(
false );
192 for ( m = 1; m <= atom_numbers_for_vdw_calculation.size(); ++m ) {
193 if ( atom_numbers_for_vdw_calculation[ pos1 ][ m ] == i ){
194 is_vdw_atom =
true;
break;
198 if ( is_vdw_atom )
return m;
217 Size const pos1( atom_id.
rsd() );
224 if ( !rsd1.is_RNA() && !is_magnesium[ pos1 ] )
return;
226 char const which_nucleotide1 = rsd1.name1();
228 int const pos1_map( domain_map( pos1 ) );
229 bool const pos1_fixed( pos1_map != 0 );
231 Vector const & i_xyz( rsd1.xyz(i) );
234 atom_numbers_for_vdw_calculation( rna_scoring_info.atom_numbers_for_vdw_calculation() );
237 if ( m == 0 )
return;
243 EnergyGraph const & energy_graph( energies.energy_graph() );
247 iru = energy_graph.get_node( pos1 )->const_edge_list_begin(),
249 iru != irue; ++iru ) {
250 Size const pos2( (*iru)->get_other_ind( pos1 ) );
252 if ( pos1_fixed && pos1_map == domain_map( pos2 ) )
continue;
255 char const which_nucleotide2 = rsd2.
name1();
257 if ( !rsd2.is_RNA() && !is_magnesium[ pos2 ] )
continue;
259 runtime_assert( pos2 != pos1 );
263 for (
Size n = 1; n <= atom_numbers2.size(); ++n ) {
265 Size const j = atom_numbers2[ n ];
267 Vector const & j_xyz( rsd2.xyz(j) );
268 Vector const f2( i_xyz - j_xyz );
269 Real const dis2( f2.length_squared() );
272 if ( dis2 < bump_dsq ) {
274 Vector const f1( i_xyz.cross( j_xyz ) );
275 F1 += dE_dr_over_r * f1;
276 F2 += dE_dr_over_r * f2;
325 atom_numbers_for_vdw_calculation.resize( total_residue );
326 is_magnesium.resize( total_residue );
328 for (
Size i = 1; i <= total_residue; i++ ) {
331 is_magnesium[ i ] = ( rsd.name3() ==
" MG" );
332 atom_numbers_for_vdw_calculation[ i ].clear();
334 if ( rsd.is_RNA() || is_magnesium[ i ] ) {
336 char const which_nucleotide = rsd.name1();
339 for (
Size m = 1; m <= vdw_atom_list.size(); m++ ){
340 Size const vdw_atom_index = rsd.atom_index( vdw_atom_list[ m ] );
341 atom_numbers_for_vdw_calculation[ i ].push_back( vdw_atom_index);