30 #include <ObjexxFCL/FArray3D.hh>
31 #include <ObjexxFCL/FArray2D.hh>
33 #include <utility/vector1.hh>
34 #include <ObjexxFCL/format.hh>
36 #include <basic/options/option.hh>
37 #include <basic/options/keys/score.OptionKeys.gen.hh>
51 using namespace ObjexxFCL::fmt;
54 total_base_pair_score_ ( 0.0 ),
55 total_base_axis_score_ ( 0.0 ),
56 total_base_stagger_score_ ( 0.0 ),
57 total_base_stack_score_ ( 0.0 ),
58 total_base_stack_axis_score_ ( 0.0 ),
59 scale_axis_stagger_( true ),
60 basepair_axis_stagger_scaling_( 0.1 ),
61 basestack_axis_scaling_( 1.0 ),
62 include_neighbor_base_stacks_( basic::options::option[ basic::options::OptionKeys::score::include_neighbor_base_stacks ]() ),
70 scale_axis_stagger_( src.scale_axis_stagger_ ),
71 basepair_axis_stagger_scaling_( src.basepair_axis_stagger_scaling_ ),
72 basestack_axis_scaling_( src.basestack_axis_scaling_ ),
73 include_neighbor_base_stacks_( src.include_neighbor_base_stacks_ )
115 Size const total_residue = raw_base_base_info.
size();
130 ObjexxFCL::FArray3D< Real > raw_base_pair_array( raw_base_base_info.
base_pair_array() );
131 ObjexxFCL::FArray3D< Real > raw_base_axis_array( raw_base_base_info.
base_axis_array() );
132 ObjexxFCL::FArray3D< Real > raw_base_stagger_array( raw_base_base_info.
base_stagger_array() );
149 Real const SCORE_CUTOFF = -0.001;
151 Size const total_residue = raw_base_base_info.
size();
152 ObjexxFCL::FArray2D_bool edge_is_base_pairing( total_residue,
NUM_EDGES,
false );
154 for (
Size i = 1; i <= total_residue; i++ ){
157 for (
Size j = i+1; j <= total_residue; j++ ){
159 if (raw_base_pair_array(i,j,k) < SCORE_CUTOFF ){
161 Size found_match( 0 );
162 Real tmp_energy = 0.0;
164 if (raw_base_pair_array(j,i,m) < tmp_energy){
166 tmp_energy = raw_base_pair_array(j, i, m);
169 if (found_match == 0)
continue;
171 Real const total_base_pair_energy =
172 raw_base_pair_array(i,j,k) + raw_base_pair_array(j,i,found_match);
179 base_pair.
edge2 = found_match;
182 assert( std::abs( raw_base_geometry_orientation_array( i, j ) - raw_base_geometry_orientation_array( j, i ) ) < 1.0e-2 );
183 base_pair.
orientation = ( raw_base_geometry_orientation_array( i, j ) + raw_base_geometry_orientation_array( j, i ) < 0.0 ? 1 : 2);
185 energy_base_pair_list.push_back( std::make_pair( total_base_pair_energy, base_pair ) );
193 energy_base_pair_list.sort();
197 for ( Energy_base_pair_list::const_iterator it = energy_base_pair_list.begin();
198 it != energy_base_pair_list.end(); ++it ){
199 Real const energy = it->first;
208 if (edge_is_base_pairing( i, k ))
continue;
209 if (edge_is_base_pairing( j, m ))
continue;
211 edge_is_base_pairing( i, k ) =
true;
212 edge_is_base_pairing( j, m ) =
true;
214 Real scalefactor ( 1.0f ) ;
217 Real const scaled_axis_energy = scalefactor * ( raw_base_axis_array(i,j,k) + raw_base_axis_array(j,i,m) );
218 Real const scaled_stagger_energy = scalefactor * ( raw_base_stagger_array(i,j,k) + raw_base_stagger_array(j,i,m) );
224 std::cout <<
"BASE PAIR: " << I(3,i) <<
" " << I(3,j) <<
" "
229 << F(5,3,raw_base_pair_array(i,j,k)) <<
" " << F(5,3,raw_base_pair_array(j,i,m)) <<
" "
260 ObjexxFCL::FArray2D< Real > raw_base_stack_array( raw_base_base_info.
base_stack_array() );
267 Size const total_residue = raw_base_base_info.
size();
277 for (
Size i = 1; i <= total_residue; i++ ){
278 for (
Size j = i+1; j <= total_residue; j++ ){
285 if ( raw_base_stack_array( i, j ) < 0.0 &&
286 raw_base_stack_array( j, i ) < 0.0 ){
287 if (
rna_verbose_) std::cout <<
"BASE STACK: " << i <<
" " << j << std::endl;
294 assert( std::abs( raw_base_geometry_orientation_array( i, j ) - raw_base_geometry_orientation_array( j, i ) ) < 1.0e-2 );
295 base_stack.
orientation = ( raw_base_geometry_orientation_array( i, j ) + raw_base_geometry_orientation_array( j, i ) ) < 0.0 ? 1 : 2;
298 base_stack.
which_side = ( raw_base_geometry_height_array( i, j ) > 0.0 ) ? 1 : 2;
300 Real const total_base_stack_energy = raw_base_stack_array( i, j ) + raw_base_stack_array( j, i);
311 Real total_base_stack_axis_energy = raw_base_stack_axis_array( i, j ) + raw_base_stack_axis_array( j, i) ;
329 Real rna_data_score( 0.0 );
333 for (
Size n = 1; n <= rna_data.size(); n++ ){
335 Size const seqpos( rna_data[n].position() );
349 }
else if ( j == seqpos ){
355 if ( k == rna_data[ n ].edge() ) {
356 rna_data_score += rna_data[n].weight();
362 return rna_data_score;