38 #include <ObjexxFCL/format.hh>
41 #include <utility/vector1.fwd.hh>
42 #include <basic/Tracer.hh>
43 #include <numeric/random/random.hh>
47 #include <numeric/random/random_permutation.hh>
48 #include <numeric/xyz.functions.hh>
51 #include <utility/io/ozstream.hh>
53 #include <basic/options/option.hh>
54 #include <basic/options/keys/abinitio.OptionKeys.gen.hh>
55 #include <basic/options/keys/frags.OptionKeys.gen.hh>
56 #include <basic/options/keys/in.OptionKeys.gen.hh>
67 #include <utility/vector0.hh>
68 #include <utility/vector1.hh>
76 static basic::Tracer
tr(
"core.fragment");
77 static numeric::random::RandomGenerator
RG(125923489);
79 using namespace ObjexxFCL::fmt;
82 for (
FrameIterator i = fragments->begin(); i != fragments->end(); ++i) {
86 Frame new_frame(existing_frame->start(),
87 existing_frame->stop(),
88 existing_frame->length());
90 for (
core::Size j = 1; j <= std::min(k, existing_frame->nr_frags()); ++j)
93 *existing_frame = new_frame;
100 runtime_assert( len > 0 );
108 bool free_of_cut =
true;
111 if (cut >= pos && cut < pos+len-1 ) {
120 frame->steal( pose );
121 fragset.
add( frame );
128 Size const len( frag_type->size() );
129 runtime_assert( len > 0 );
134 frame =
new Frame( pos, frag_type );
135 frame->steal( pose );
136 fragset.
add( frame );
142 Size const len( frag_type->size() );
143 runtime_assert( len > 0 );
147 for (
Size pos = begin; pos <= end - len + 1; ++pos ) {
148 frame =
new Frame( pos, frag_type );
149 frame->steal( pose );
150 fragset.
add( frame );
158 std::set< core::Size >
const& selected_residues )
161 Size const len( frag_type->size() );
162 runtime_assert( len == 1 );
166 for ( std::set< core::Size >::const_iterator pos = selected_residues.begin();
167 pos != selected_residues.end(); ++pos ) {
168 frame =
new Frame( *pos, frag_type );
169 frame->steal( pose );
170 fragset.
add( frame );
178 runtime_assert( tlen < slen );
180 for (
Size pos = 1; pos <= source.
max_pos() - tlen + 1; pos++ ) {
181 dest_frames.push_back(
new Frame( pos, tlen ) );
185 for (
Size pos = fr.
start(); pos<= fr.
end() - tlen + 1; pos++ ) {
186 Frame& dest_fr( *dest_frames[ pos ] );
193 for ( FrameList::const_iterator it = dest_frames.begin(), eit = dest_frames.end(); it!=eit; ++it ) {
194 if ( (*it)->nr_frags() ) {
201 if ( nr_frags.size() < _frags.
max_pos() ) {
202 nr_frags.resize( _frags.
max_pos(), 0 );
207 runtime_assert( it->is_continuous() );
209 for (
Size i = it->start(); i<=it->stop(); i++ ) {
210 nr_frags[ i ] += it->nr_frags();
216 frag_ids.reserve( frag_ids.size() + frames.
flat_size() );
219 frag_ids.push_back( *it );
231 tr.Info <<
"fragment coverage:";
232 for (
Size pos = 1; pos <= nr_frags.size(); pos++ ) {
233 tr.Info <<
" " << pos <<
" " << nr_frags[ pos ];
235 tr.Info << std::endl;
237 for (
Size pos = 1; pos<=filling.
max_pos(); pos++ ) {
238 if ( nr_frags[ pos ] < min_nr_frags ) {
240 filling.
frames( pos, fill_frames );
241 Size nr_fill( min_nr_frags - nr_frags[ pos ] );
242 tr.Info << nr_frags[ pos ] <<
" fragments at pos " << pos <<
". required: " << min_nr_frags << std::endl;
243 tr.Info <<
"attempt to fill up with " << nr_fill <<
" frags at position " << pos <<
" ... ";
249 numeric::random::random_permutation( frag_ids,
RG );
250 numeric::random::random_permutation( frag_ids,
RG );
253 for ( FragID_List::iterator it = frag_ids.begin(), eit = frag_ids.end();
254 it != eit && nr_fill; ++it, --nr_fill ) {
255 merged_frags->add( *it );
257 runtime_assert( it->frame().is_continuous() );
258 for (
Size p = it->frame().start(); p<=it->frame().stop(); p++ ) nr_frags[ p ]++;
262 tr.Info << nr_fill <<
" fragments short " << std::endl;
264 tr.Info <<
"succeeded! " << std::endl;
282 frame.
apply( 1, pose );
292 frame.
apply( i, pose );
297 if( cur_score < best_score ){
299 best_score = cur_score;
304 frame.
apply( best_frag, pose );
315 Size const start_frag
321 Size model_count(1), atom_counter(0);
323 std::ofstream outfile( filename.c_str() );
324 outfile <<
"REMARK 666 Fragment set for outtag pose \n";
329 for(
Size frag = start_frag; frag <= (*frame_it)->nr_frags(); ++frag){
331 (*frame_it)->apply( frag, frame_pose );
333 outfile <<
"MODEL" << I(9, model_count) <<
"\n";
335 for(
Size rescount = (*frame_it)->start(); rescount <= (*frame_it)->end(); ++rescount ){
341 outfile <<
"ENDMDL\n";
371 Size frame_counter(1);
372 bool return_val(
true );
378 Size pdb_start_res( pose_it->pdb_info()->number( 1 ) );
379 Size pdb_stop_res( pose_it->pdb_info()->number( pose_it->total_residue() ) );
380 char pdb_res_chain( pose_it->pdb_info()->chain( 1 ) );
381 char pdb_start_res_icode( pose_it->pdb_info()->icode( 1 ) );
382 char pdb_stop_res_icode( pose_it->pdb_info()->icode( pose_it->total_residue() ) );
385 if( pose_it->pdb_info()->chain( pose_it->total_residue() ) != pdb_res_chain ){
386 utility_exit_with_message(
"PDB file containing fragments is corrupted, one model contains multiple chains");
389 Size frame_start = pose.
pdb_info()->pdb2pose( pdb_res_chain, pdb_start_res, pdb_start_res_icode );
390 Size frame_stop = pose.
pdb_info()->pdb2pose( pdb_res_chain, pdb_stop_res, pdb_stop_res_icode );
393 while( pose_it->total_residue() != template_frames[ frame_counter ]->length()
394 && frame_start != template_frames[ frame_counter ]->start()
395 && frame_stop != template_frames[ frame_counter]->stop() )
398 if ( frame_counter > template_frames.size() )
return false;
401 frag_pose.
copy_segment( template_frames[ frame_counter ]->length(), *pose_it, template_frames[ frame_counter ]->
start(), 1 );
402 template_frames[ frame_counter ]->steal( frag_pose );
412 using namespace basic::options;
413 using namespace basic::options::OptionKeys;
417 if (option[ in::file::frag9 ].user()) {
418 frag_large_file = option[ in::file::frag9 ]();
421 if (option[ in::file::frag3 ].user()) {
422 frag_small_file = option[ in::file::frag3 ]();
425 if ( frag_large_file !=
"NoFile" ) {
428 option[ OptionKeys::abinitio::number_9mer_frags ](),
429 option[ OptionKeys::frags::nr_large_copies ](),
430 option[ OptionKeys::frags::annotate ]()
434 if ( frag_small_file !=
"NoFile" ) {
436 option[ OptionKeys::abinitio::number_3mer_frags ],
438 option[ OptionKeys::frags::annotate ]
442 if ( option[ OptionKeys::abinitio::steal_3mers ]() || option[ OptionKeys::abinitio::steal_9mers ]() ) {
445 if ( option[ in::file::native ].user() ) {
449 utility_exit_with_message(
" can't steal natie fragments without in:file:native " );
451 tr.Info <<
" stealing fragments from native pose: ATTENTION: native pose has to be IDEALIZED!!! " << std::endl;
453 if ( option[ OptionKeys::abinitio::steal_9mers ]() ) {
457 if ( option[ OptionKeys::abinitio::steal_3mers ]() ) {
463 if ( fragset_small && option[ OptionKeys::abinitio::dump_frags ]() ) {
464 utility::io::ozstream dump_frag_small(
"fragset_small.dump" );
465 for (
FrameIterator it=fragset_small->begin(), eit=fragset_small->end(); it!=eit; ++it ) {
466 (*it)->show( dump_frag_small );
469 if ( fragset_large && option[ OptionKeys::abinitio::dump_frags ]() ) {
470 utility::io::ozstream dump_frag_large(
"fragset_large.dump" );
471 for (
FrameIterator it=fragset_large->begin(), eit=fragset_large->end(); it!=eit; ++it ) {
472 (*it)->show( dump_frag_large );
492 runtime_assert( frame.
nr_frags() >= 1 );
495 if (
typeid( *fragdata.get_residue( i ) ) ==
typeid(
UpJumpSRFD ) ) {
496 runtime_assert( i + 1 <= frame.
length() &&
typeid( *fragdata.get_residue( i + 1 ) ) ==
typeid(
DownJumpSRFD ) );
497 ups.push_back( frame.
seqpos( i ) );
498 downs.push_back( frame.
seqpos( i+1 ) );
501 runtime_assert( i >= 2 &&
typeid( *fragdata.get_residue( i ) ) !=
typeid(
DownJumpSRFD ) );
502 cuts.push_back( frame.
seqpos( i-1 ) );
508 ObjexxFCL::FArray2D_int jump_point( 2, ups.size(), 0 );
509 ObjexxFCL::FArray1D_int
cut_point( ups.size() );
510 for (
Size i = 1; i <= ups.size() ; ++i ){
511 jump_point( 1, i ) = ups[ i ];
512 jump_point( 2, i ) = downs[ i ];
520 Size const len( fragset->max_frag_length() );
524 assert( max_res >= min_res + len - 1);
526 for (
Size pos = min_res; pos <= max_res - len + 1 ; ++pos ) {
529 fragset->frames( pos, frames );
532 assert( frames.size() == 1 );
535 FrameOP frame_new =
new Frame( pos - min_res + 1, len );
537 for (
Size n = 1; n <= frame->nr_frags(); n++ ) {
538 frame_new->add_fragment( frame->fragment_ptr( n ) );
541 fragset_new->add( frame_new );
545 fragset = fragset_new;
557 for (
Size i = 1; i <= num_cutpoints; ++i) {
561 if (cutpoint >= pos && cutpoint < upper_cut)
562 upper_cut = cutpoint;
565 if (cutpoint < pos && cutpoint > lower_cut)
566 lower_cut = cutpoint;
570 *left = lower_cut + 1;
581 s.
M = alignVectorSets(m1-m2, m3-m2, f1-f2, f3-f2);
592 for (
core::Size ir = sres; ir <= eres; ++ir) {
610 Real const init_phi ( -150.0 );
611 Real const init_psi ( 150.0 );
612 Real const init_omega( 180.0 );
614 if( pos != 1 ) pose.
set_phi( pos, init_phi );
620 for (
Size i = 1; i <= frags.size(); ++i) {
622 frag->apply(pose, insert_pos, insert_pos + frag->size() - 1);
623 insert_pos += frag->size();
627 if (frags.size() == 1)
return;
632 for (
Size i = 1; i < frags.size(); ++i) {
635 Size midpoint_1 =
static_cast<Size>(ceil(frag_1->size() / 2.0)) + total_size;
636 total_size += frag_1->size();
637 Size midpoint_2 =
static_cast<Size>(ceil(frag_2->size() / 2.0)) + total_size + 1;
638 int jump_id = tree.new_jump(midpoint_1, midpoint_2, total_size);
639 tree.set_jump_atoms(jump_id,
"CA",
"CA");
648 for (
Size i = 1; i <= frags.size(); ++i) {
651 Size central_residue =
static_cast< Size >(ceil(frag->size() / 2.0));
658 Size midpoint_pose = central_residue + total_size;
659 total_size += frag->size();
670 xform_pose(pose, x, region_start, region_stop);