22 #include <ObjexxFCL/FArray1D.hh>
23 #include <ObjexxFCL/FArray2D.hh>
25 #include <ObjexxFCL/StaticIndexRange.hh>
27 #include <ObjexxFCL/format.hh>
29 #include <utility/io/izstream.hh>
30 #include <utility/exit.hh>
33 #include <numeric/xyzVector.hh>
42 #include <numeric/random/random.fwd.hh>
45 namespace ObjexxFCL {
namespace fmt { } }
using namespace ObjexxFCL::fmt;
59 TorsionSet::TorsionSet(
Size const size ){
61 torsion_source_name.dimension( SRange(0, size),
std::string( 4,
' ' ) );
62 secstruct.dimension( SRange(0, size),
'L' );
63 non_main_chain_sugar_coords_defined =
false;
69 TorsionSet::operator =(
70 TorsionSet
const & src
74 for (
Size offset = 0; offset < size_; offset++){
76 torsions( j, offset) = src.torsions( j, offset);
78 torsion_source_name( offset ) = src.torsion_source_name( offset );
79 secstruct( offset ) = src.secstruct( offset );
82 non_main_chain_sugar_coords_defined = src.non_main_chain_sugar_coords_defined;
84 if (non_main_chain_sugar_coords_defined) {
85 non_main_chain_sugar_coords.dimension( SRange(0,size_), 3, 3 );
86 for (
Size offset = 0; offset < size_; offset++){
87 for (
Size j = 1; j <= 3; j++ ) {
88 for (
Size k = 1; k <= 3; k++ ) {
89 non_main_chain_sugar_coords( offset, j, k ) =
90 src.non_main_chain_sugar_coords( offset, j, k );
102 Real FragmentLibrary::get_fragment_torsion(
Size const num_torsion,
Size const which_frag,
Size const offset ){
103 return align_torsions_[ which_frag - 1 ].torsions( num_torsion, offset) ;
107 TorsionSet
const FragmentLibrary::get_fragment_torsion_set(
Size const which_frag ){
108 return align_torsions_[ which_frag - 1 ];
112 void FragmentLibrary::add_torsion( TorsionSet
const torsion_set ){
113 align_torsions_.push_back( torsion_set );
117 void FragmentLibrary::add_torsion(
125 for (
Size offset = 0; offset <
size; offset++){
136 for (
Size j = 1; j <= 3; j++ ){
137 for (
Size k = 1; k <= 3; k++ ){
148 align_torsions_.push_back( torsion_set );
153 Size FragmentLibrary::get_align_depth() {
154 return align_torsions_.size();
167 std::string const RNA_secstruct_string = key.second;
169 Size const size = RNA_string.length();
171 runtime_assert( RNA_string.length() == RNA_secstruct_string.length() );
175 std::string vall_current_secstruct( RNA_secstruct_string );
177 for (
Size i = 1; i <= vall_size_ - size + 1; i++ ){
181 for (
Size offset = 0; offset <
size; offset++ ){
182 vall_current_sequence [offset] = vall_sequence_ ( i + offset );
183 vall_current_secstruct[offset] = vall_secstruct_( i + offset );
202 for (
Size i = 1; i <= vall_size_ - size + 1; i++ ){
206 for (
Size offset = 0; offset <
size; offset++ ){
207 vall_current_sequence [offset] = vall_sequence_ ( i + offset );
209 if ( !
compare_RNA_char( vall_current_sequence[offset], RNA_string[ offset ] ) ) {
223 std::cout <<
"Picked Fragment Library for sequence " << RNA_string <<
" " <<
224 " and sec. struct " << RNA_secstruct_string <<
" ... found " <<
225 fragment_library_p->
get_align_depth() <<
" potential fragments" << std::endl;
227 fragment_library_pointer_map[ key ] = fragment_library_p;
234 RNA_Fragments::pick_random_fragment(
244 if (! fragment_library_pointer_map.count( key ) ){
245 pick_fragment_library( key );
248 FragmentLibraryOP fragment_library_pointer = fragment_library_pointer_map[ key ];
250 Size const num_frags = fragment_library_pointer->get_align_depth();
252 if (num_frags == 0) {
253 std::cout <<
"Fragment Library: zero fragments found for " << RNA_string_local << std::endl;
254 std::cerr <<
"Fragment Library: zero fragments found for " << RNA_string_local << std::endl;
255 utility::exit( EXIT_FAILURE, __FILE__, __LINE__);
258 Size const which_frag = static_cast <
Size> ( numeric::random::uniform() * num_frags) + 1;
260 torsion_set = fragment_library_pointer->get_fragment_torsion_set( which_frag );
267 RNA_Fragments::pick_random_fragment(
275 std::string const & RNA_string = RNA_sequence.substr( position - 1, size );
281 std::string const & RNA_secstruct_string = RNA_secstruct.substr( position - 1, size );
283 pick_random_fragment( torsion_set, RNA_string, RNA_secstruct_string, type );
293 static bool init (
false );
309 vall_non_main_chain_sugar_coords_defined_ =
false;
313 std::cout <<
"Reading in vall_torsions file: " << filename << std::endl;
316 utility::io::izstream vall_in( filename.c_str() );
317 if ( vall_in.fail() ){
318 utility_exit_with_message(
"Bad vall torsions file? " + filename );
329 while ( getline( vall_in, line) ){
331 std::istringstream line_stream( line );
335 line_stream >> dummy_char;
336 vall_sequence.push_back( dummy_char );
340 line_stream >> dummy_real;
341 dummy_vec.push_back( dummy_real );
343 vall_torsions.push_back( dummy_vec );
345 line_stream >> dummy_char;
349 if ( dummy_char ==
'S' ) {
350 vall_non_main_chain_sugar_coords_defined_ =
true;
353 for (
Size n = 1; n <= 3; n++ ) {
354 line_stream >> x >> y >> z;
355 vecs.push_back(
Vector( x,y,z) );
357 vall_non_main_chain_sugar_coords.push_back( vecs );
358 line_stream >> dummy_char;
361 vall_secstruct.push_back( dummy_char );
365 line_stream >> dummy_bool;
366 dummy_vec2.push_back( dummy_bool );
368 vall_edge_is_base_pairing.push_back( dummy_vec2 );
371 line_stream >> dummy_bool;
372 vall_is_chainbreak.push_back( dummy_bool );
377 vall_name.push_back( I( 4, count ) );
385 std::cout <<
"Lines read from vall_torsions file: " << vall_size_ << std::endl;
390 vall_sequence_.dimension ( vall_size_ );
391 vall_secstruct_.dimension ( vall_size_ );
392 vall_is_chainbreak_.dimension ( vall_size_ );
394 vall_name_.dimension( vall_size_ );
396 if ( vall_non_main_chain_sugar_coords_defined_ ) vall_non_main_chain_sugar_coords_.dimension( vall_size_, 3, 3 );
398 for (
Size n = 1; n <= vall_size_; n++ ) {
401 vall_torsions_( i, n ) = vall_torsions[ n ][ i ];
404 if (vall_non_main_chain_sugar_coords_defined_) {
405 for (
Size i = 1; i <= 3; i++ ) {
406 vall_non_main_chain_sugar_coords_( n, i, 1 ) = vall_non_main_chain_sugar_coords[ n ][ i ].x();
407 vall_non_main_chain_sugar_coords_( n, i, 2 ) = vall_non_main_chain_sugar_coords[ n ][ i ].y();
408 vall_non_main_chain_sugar_coords_( n, i, 3 ) = vall_non_main_chain_sugar_coords[ n ][ i ].z();
412 vall_sequence_( n ) = vall_sequence[ n ];
413 vall_secstruct_( n ) = vall_secstruct[ n ];
414 vall_is_chainbreak_( n ) = vall_is_chainbreak[ n ];
416 vall_edge_is_base_pairing_( n , i) = vall_edge_is_base_pairing[ n ][ i ];
418 vall_name_( n ) = vall_name[ n ];
430 Size const size = RNA_string.length();
435 for (
Size i = 0; i <
size; i++) RNA_string_local[ i ] =
'n';
440 if (RNA_string[ i ] ==
'g' || RNA_string[ i ] ==
'a' ){
441 RNA_string_local[ i ] =
'r';
443 runtime_assert( RNA_string[ i ] ==
'u' || RNA_string[ i ] ==
'c' );
444 RNA_string_local[ i ] =
'y';
450 return RNA_string_local;
457 if (char1 == char2)
return true;
458 if (char1 ==
'n' || char2 ==
'n')
return true;
459 if (char1 ==
'r' && (char2 ==
'a' || char2 ==
'g'))
return true;
460 if (char1 ==
'y' && (char2 ==
'c' || char2 ==
'u'))
return true;
461 if (char2 ==
'r' && (char1 ==
'a' || char1 ==
'g'))
return true;
462 if (char2 ==
'y' && (char1 ==
'c' || char1 ==
'u'))
return true;
468 if (char1 == char2)
return true;
469 if (char1 ==
'X' || char2 ==
'X' )
return true;
470 if (char1 ==
'L' && ( char2 ==
'N' || char2 ==
'P') )
return true;
471 if (char2 ==
'L' && ( char1 ==
'N' || char1 ==
'P') )
return true;