31 #include <basic/Tracer.hh>
34 #include <numeric/random/random.hh>
37 #include <utility/exit.hh>
48 #include <utility/vector1.hh>
57 static numeric::random::RandomGenerator
RG( 2557316 );
62 static basic::Tracer
TR(
"protocols.forge.methods.fold_tree_functions" );
69 int const tmp = e.
stop();
104 std::vector< Size > peptide_vertices;
106 for ( FoldTree::const_iterator e = ft.
begin(), ee = ft.
end(); e != ee; ++e ) {
107 if ( e->label() == Edge::PEPTIDE ) {
108 peptide_vertices.push_back( e->start() );
109 peptide_vertices.push_back( e->stop() );
115 std::sort( peptide_vertices.begin(), peptide_vertices.end() );
116 std::unique( peptide_vertices.begin(), peptide_vertices.end() );
117 for ( std::vector< Size >::const_iterator i = peptide_vertices.begin(), ie = peptide_vertices.end(); i != ie; ++i ) {
148 std::vector< Size > peptide_vertices;
150 for ( FoldTree::const_iterator e = ft.
begin(), ee = ft.
end(); e != ee; ++e ) {
151 if ( e->label() == Edge::PEPTIDE ) {
152 peptide_vertices.push_back( e->start() );
153 peptide_vertices.push_back( e->stop() );
159 std::sort( peptide_vertices.begin(), peptide_vertices.end() );
160 std::unique( peptide_vertices.begin(), peptide_vertices.end() );
161 for ( std::vector< Size >::const_reverse_iterator i = peptide_vertices.rbegin(), ie = peptide_vertices.rend(); i != ie; ++i ) {
184 for ( FoldTree::const_iterator e = ft.
begin(), ee = ft.
end(); e != ee; ++e ) {
185 if ( static_cast< Size >( e->start() ) == v || static_cast< Size >( e->stop() ) == v ) {
211 for ( FoldTree::const_iterator e = ft.
begin(), ee = ft.
end(); e != ee; ++e ) {
212 if ( e->label() > 0 && (
static_cast< Size >( e->start() ) == pos || static_cast< Size >( e->stop() ) == pos ) ) {
213 jump_edges.push_back( *e );
239 for ( FoldTree::const_iterator e = ft.
begin(), ee = ft.
end(); e != ee; ++e ) {
243 if ( e->label() < 0 ) {
249 Size const root_u = uf.ds_find( u );
250 Size const root_v = uf.ds_find( v );
255 Size const root_start = uf.ds_find( e.start() );
256 Size const root_stop = uf.ds_find( e.stop() );
257 if ( ( root_start == root_u && root_stop == root_v ) || ( root_start == root_v && root_stop == root_u ) ) {
291 for ( FoldTree::const_iterator e = static_cast< FoldTree const & >( ft ).begin(), ee =
static_cast< FoldTree
const &
>( ft ).
end(); e != ee; ++e ) {
295 if ( e->label() > 0 ) {
296 jump_edges.push_back( edge );
303 Size const left_root = uf.ds_find( v );
304 Size const right_root = uf.ds_find( v + 1 );
309 EdgeList::const_iterator j = jump_edges.begin(), je = jump_edges.end();
312 uf.ds_find( j->start() ) != left_root &&
313 uf.ds_find( j->stop() ) != right_root
351 for ( FoldTree::const_iterator e = static_cast< FoldTree const & >( ft ).begin(), ee =
static_cast< FoldTree
const &
>( ft ).
end(); e != ee; ++e ) {
355 if ( e->label() > 0 ) {
356 jump_edges.push_back( edge );
366 Size const left_root = uf.ds_find( v );
367 Size const right_root = uf.ds_find( v + 1 );
372 EdgeList::const_iterator j = jump_edges.begin(), je = jump_edges.end();
375 uf.ds_find( j->start() ) != left_root &&
376 uf.ds_find( j->stop() ) != right_root
387 uf.ds_union( left_root, right_root );
415 typedef std::map< Size, Size > Root2Jump;
416 typedef std::map< Size, NodeList > Root2Nodes;
420 EdgeList regular_edges;
424 for ( FoldTree::const_iterator e = ft.
begin(), ee = ft.
end(); e != ee; ++e ) {
425 if ( e->label() > 0 ) {
428 order( jump_edges.back() );
432 regular_edges.push_back( *e );
433 order( regular_edges.back() );
434 union_interval( regular_edges.back().start(), regular_edges.back().start(), regular_edges.back().stop(), uf );
441 Root2Nodes r2n = uf.sets();
442 for ( Root2Nodes::iterator i = r2n.begin(), ie = r2n.end(); i != ie; ++i ) {
443 NodeList & nodes = i->second;
447 for ( NodeList::const_iterator j = nodes.begin(), je = nodes.end(); j != je; ++j ) {
449 fixed.push_back( *j );
454 if ( !fixed.empty() ) {
455 r2j[ i->first ] = fixed[
RG.random_range( 1, fixed.size() ) ];
460 for ( EdgeList::iterator e = jump_edges.
begin(), ee = jump_edges.
end(); e != ee; ++e ) {
461 Root2Jump::const_iterator new_start = r2j.find( uf.ds_find( e->start() ) );
462 Root2Jump::const_iterator new_stop = r2j.find( uf.ds_find( e->stop() ) );
465 if ( new_start != r2j.end() ) {
466 e->start() = new_start->second;
470 if ( new_stop != r2j.end() ) {
471 e->stop() = new_stop->second;
480 for ( EdgeList::const_iterator e = regular_edges.begin(), ee = regular_edges.end(); e != ee; ++e ) {
485 for ( EdgeList::const_iterator e = jump_edges.
begin(), ee = jump_edges.
end(); e != ee; ++e ) {
490 aft.reorder( ft.
root() );
521 typedef std::map< Size, Nodes > Root2Nodes;
539 for (
Size r = chain_begin; r <= chain_end; ++r ) {
547 if ( prior_polymer_r > 0 && r == prior_polymer_r + 1 ) {
548 uf.ds_union( r, prior_polymer_r );
559 assert( static_cast< Size >( res.
chain() ) == i );
561 if ( r < cr && res.
chain() == cres.
chain() ) {
572 uf.ds_union( cr, r );
581 Root2Nodes r2n = uf.sets();
585 for ( Root2Nodes::iterator i = r2n.begin(), ie = r2n.end(); i != ie; ++i ) {
586 Nodes & nodes = i->second;
587 std::sort( nodes.begin(), nodes.end() );
588 bool const component_contains_ft_root = std::find( nodes.begin(), nodes.end(), ft_root ) != nodes.end();
590 if ( nodes.size() > 1 ) {
594 Nodes polymer_vertices;
595 for ( Nodes::const_iterator v = nodes.begin(), ve = nodes.end(); v != ve; ++v ) {
597 polymer_vertices.push_back( *v );
601 if ( polymer_vertices.empty() ) {
604 if ( !component_contains_ft_root ) {
605 Size const jump_point =
RG.random_range( *nodes.begin(), *nodes.rbegin() );
606 ft.add_edge(
Edge( ft_root, jump_point, ++jump_count ) );
607 uf.ds_union( jump_point, ft_root );
610 }
else if ( polymer_vertices.size() == 1 ) {
613 if ( !component_contains_ft_root ) {
614 ft.add_edge(
Edge( ft_root, *polymer_vertices.begin(), ++jump_count ) );
615 uf.ds_union( *polymer_vertices.begin(), ft_root );
622 for (
Size j = 1, je = polymer_vertices.size(); j < je; ++j ) {
623 if ( polymer_vertices[ j ] + 1 == polymer_vertices[ j+1 ] ) {
630 Root2Nodes indexed_r2n = indexed_uf.sets();
631 for ( Root2Nodes::iterator j = indexed_r2n.begin(), je = indexed_r2n.end(); j != je; ++j ) {
632 Nodes subsection = j->second;
633 std::sort( subsection.begin(), subsection.end() );
634 Size const ss_begin = polymer_vertices[ *subsection.begin() ];
635 Size const ss_end = polymer_vertices[ *subsection.rbegin() ];
636 bool const subsection_contains_ft_root = ss_begin <= ft_root && ft_root <= ss_end;
640 for (
Size k = ss_begin; k <= ss_end; ++k ) {
642 fixed.push_back( k );
647 Size jump_point = ft_root;
648 if ( !subsection_contains_ft_root ) {
649 if ( fixed.empty() ) {
650 jump_point =
RG.random_range( ss_begin, ss_end );
652 jump_point = fixed[
RG.random_range( 1, fixed.size() ) ];
657 std::set< Size > vertices;
658 vertices.insert( ss_begin );
659 vertices.insert( ss_end );
660 vertices.insert( jump_point );
663 switch ( vertices.size() ) {
665 ft.add_edge(
Edge( *vertices.begin(), *( ++vertices.begin() ), Edge::PEPTIDE ) );
666 ft.add_edge(
Edge( *( ++vertices.begin() ), *( ++( ++vertices.begin() ) ), Edge::PEPTIDE ) );
669 ft.add_edge(
Edge( *vertices.begin(), *( ++vertices.begin() ), Edge::PEPTIDE ) );
675 TR.Fatal <<
"FATAL: fold_tree_from_pose() : vertices.size() not in [1, 3]" << std::endl;
676 utility_exit_with_message(
"should not be here" );
681 if ( !subsection_contains_ft_root ) {
682 ft.add_edge(
Edge( ft_root, jump_point, ++jump_count ) );
683 uf.ds_union( jump_point, ft_root );
692 if ( !component_contains_ft_root ) {
693 ft.add_edge(
Edge( ft_root, *nodes.begin(), ++jump_count ) );
694 uf.ds_union( *nodes.begin(), ft_root );
699 assert( uf.n_disjoint_sets() == 1 );
702 bool const success = ft.reorder( ft_root );
704 TR.Fatal <<
"FATAL: fold_tree_from_pose(): " << ft << std::endl;
705 utility_exit_with_message(
"bad fold tree topology" );
781 bool const keep_stub_in_residue
788 assert( left_position <= left_tree.
nres() );
789 assert( right_position <= right_tree.
nres() );
791 FoldTree new_ft = left_tree;
794 for ( FoldTree::const_iterator r = right_tree.
begin(), re = right_tree.
end(); r != re; ++r ) {
796 new_edge.start() += left_tree.
nres();
797 new_edge.stop() += left_tree.
nres();
798 if ( new_edge.label() > 0 ) {
799 new_edge.label() += left_tree.
num_jump();
801 new_ft.add_edge( new_edge );
805 Size const jleft = left_position;
806 Size const jright = right_position + left_tree.
nres();
812 static_cast< FoldTree const & >( new_ft ).begin(),
813 static_cast< FoldTree const & >( new_ft ).
end(),
816 assert( f != static_cast< FoldTree const & >( new_ft ).
end() );
818 Edge const base = *f;
819 new_ft.delete_edge( base );
820 new_ft.add_edge( base.start(), jleft, base.label() );
821 new_ft.add_edge( jleft, base.stop(), base.label() );
828 static_cast< FoldTree const & >( new_ft ).begin(),
829 static_cast< FoldTree const & >( new_ft ).
end(),
832 assert( f != static_cast< FoldTree const & >( new_ft ).
end() );
834 Edge const base = *f;
835 new_ft.delete_edge( base );
836 new_ft.add_edge( base.start(), jright, base.label() );
837 new_ft.add_edge( jright, base.stop(), base.label() );
845 left_jump_atom, right_jump_atom,
851 new_ft.reorder( left_tree.
root() );
874 int const replace_begin,
875 int const replace_end,
888 typedef std::map< Size, NodeList > Root2Nodes;
890 assert( replace_begin <= replace_end );
891 assert( original_tree.
root() < replace_begin || original_tree.
root() > replace_end );
893 Size const replace_length = replace_end - replace_begin + 1;
894 Size const final_nres = original_tree.
nres() - replace_length + replacement_tree.
nres();
895 Size const final_ft_root = original_tree.
root() < replace_begin ?
896 original_tree.
root() :
897 original_tree.
root() - replace_length + replacement_tree.
nres();
900 FoldTree aft = original_tree;
901 for (
int r = replace_begin; r <= replace_end; ++r ) {
905 TR.Debug <<
"original_tree: " << original_tree << std::endl;
906 TR.Debug <<
"aft: " << aft << std::endl;
909 FoldTree tracking_ft = aft;
913 for ( FoldTree::const_iterator e = static_cast< FoldTree const & >( aft ).begin(),
914 ee = static_cast< FoldTree const & >( aft ).
end(); e != ee; ++e )
916 if ( e->label() < 0 && e->start() < replace_begin && e->stop() < replace_begin ) {
920 new_ft.add_edge( new_edge );
921 tracking_ft.delete_edge( *e );
923 union_interval( new_edge.start(), new_edge.start(), new_edge.stop(), uf );
927 TR.Debug <<
"new_ft after left: " << new_ft << std::endl;
930 for ( FoldTree::const_iterator e = static_cast< FoldTree const & >( aft ).begin(),
931 ee =
static_cast< FoldTree
const &
>( aft ).
end(); e != ee; ++e )
933 if ( e->label() < 0 && e->start() >= replace_begin && e->stop() >= replace_begin ) {
936 new_edge.start() += replacement_tree.
nres();
937 new_edge.stop() += replacement_tree.
nres();
939 new_ft.add_edge( new_edge );
940 tracking_ft.delete_edge( *e );
942 union_interval( new_edge.start(), new_edge.start(), new_edge.stop(), uf );
946 TR.Debug <<
"new_ft after right: " << new_ft << std::endl;
949 for ( FoldTree::const_iterator e = static_cast< FoldTree const & >( aft ).begin(),
950 ee =
static_cast< FoldTree
const &
>( aft ).
end(); e != ee; ++e )
952 if ( e->label() > 0 ) {
955 if ( new_edge.start() >= replace_begin ) {
956 new_edge.start() += replacement_tree.
nres();
959 if ( new_edge.stop() >= replace_begin ) {
960 new_edge.stop() += replacement_tree.
nres();
963 new_ft.add_edge( new_edge );
964 tracking_ft.delete_edge( *e );
966 uf.
ds_union( new_edge.start(), new_edge.stop() );
970 assert( tracking_ft.size() <= 2 );
972 TR.Debug <<
"new_ft after jump: " << new_ft << std::endl;
975 for ( FoldTree::const_iterator e = static_cast< FoldTree const & >( tracking_ft ).begin(),
976 ee =
static_cast< FoldTree
const &
>( tracking_ft ).
end(); e != ee; ++e )
981 if ( edge.stop() == replace_begin ) {
982 Edge new_edge = edge;
985 new_ft.add_edge( new_edge );
987 union_interval( new_edge.start(), new_edge.start(), new_edge.stop(), uf );
989 }
else if ( edge.start() == replace_begin ) {
990 Edge new_edge = edge;
991 new_edge.start() += replacement_tree.
nres();
992 new_edge.stop() += replacement_tree.
nres();
994 new_ft.add_edge( new_edge );
996 union_interval( new_edge.start(), new_edge.start(), new_edge.stop(), uf );
998 }
else if ( edge.start() < replace_begin ) {
999 Edge left_edge = edge;
1000 left_edge.stop() = replace_begin - 1;
1002 Edge right_edge = edge;
1003 right_edge.start() = replace_begin + replacement_tree.
nres();
1004 right_edge.stop() += replacement_tree.
nres();
1006 new_ft.add_edge( left_edge );
1007 new_ft.add_edge( right_edge );
1009 union_interval( left_edge.start(), left_edge.start(), left_edge.stop(), uf );
1010 union_interval( right_edge.start(), right_edge.start(), right_edge.stop(), uf );
1015 new_ft.delete_self_edges();
1017 TR.Debug <<
"new_ft after remaining: " << new_ft << std::endl;
1020 Size const rshift = replace_begin - 1;
1021 Size const jshift = new_ft.num_jump();
1024 for ( FoldTree::const_iterator e = replacement_tree.
begin(), ee = replacement_tree.
end(); e != ee; ++e ) {
1026 new_edge.start() += rshift;
1027 new_edge.stop() += rshift;
1028 if ( new_edge.label() > 0 ) {
1029 new_edge.label() += jshift;
1032 new_ft.add_edge( new_edge );
1034 if ( new_edge.label() > 0 ) {
1035 uf.
ds_union( new_edge.start(), new_edge.stop() );
1038 union_interval( new_edge.start(), new_edge.start(), new_edge.stop(), uf );
1043 new_ft.add_edge( final_ft_root, replacement_tree.
root() + rshift, new_ft.num_jump() + 1 );
1044 uf.
ds_union( final_ft_root, replacement_tree.
root() + rshift );
1046 TR.Debug <<
"new_ft after replacement: " << new_ft << std::endl;
1050 mm.set_bb_true_range( 1, final_nres );
1051 for (
Size i = 1, ie = original_tree.
nres(); i <= ie; ++i ) {
1052 if ( i < static_cast< Size >( replace_begin ) ) {
1053 mm.set_bb( i, movemap.
get_bb( i ) );
1054 }
else if ( static_cast< Size >( replace_end ) < i ) {
1055 mm.set_bb( i - replace_length + replacement_tree.
nres(), movemap.
get_bb( i ) );
1061 Root2Nodes r2n = uf.
sets();
1062 for ( Root2Nodes::iterator i = r2n.begin(), ie = r2n.end(); i != ie; ++i ) {
1063 if ( i->first != uf.
ds_find( final_ft_root ) ) {
1064 NodeList & nodes = i->second;
1068 for ( NodeList::const_iterator j = nodes.begin(), je = nodes.end(); j != je; ++j ) {
1069 if ( !mm.get_bb( *j ) ) {
1070 fixed.push_back( *j );
1076 new_edge.start() = final_ft_root;
1077 new_edge.label() = new_ft.num_jump() + 1;
1080 if ( fixed.empty() ) {
1084 std::sort( nodes.begin(), nodes.end() );
1085 if ( nodes.size() % 2 == 1 ) {
1086 new_edge.stop() = nodes[ ( nodes.size() + 1 ) / 2 ];
1088 new_edge.stop() = nodes[ nodes.size() / 2 ];
1092 new_edge.stop() = fixed[
RG.random_range( 1, fixed.size() ) ];
1098 static_cast< FoldTree
const &
>( new_ft ).begin(),
1099 static_cast< FoldTree
const &
>( new_ft ).
end(),
1102 if ( f_connecting != static_cast< FoldTree const & >( new_ft ).end() ) {
1103 Edge const connecting_edge = *f_connecting;
1104 new_ft.delete_edge( connecting_edge );
1105 new_ft.add_edge( connecting_edge.start(), new_edge.stop(), connecting_edge.label() );
1106 new_ft.add_edge( connecting_edge.stop(), new_edge.stop(), connecting_edge.label() );
1110 new_ft.add_edge( new_edge );
1113 uf.
ds_union( new_edge.start(), new_edge.stop() );
1120 TR.Debug <<
"new_ft after disconnected: " << new_ft << std::endl;
1123 bool const success = new_ft.reorder( final_ft_root );
1124 runtime_assert( success );
1134 using namespace core::chemical;
1135 using namespace core::kinematics;
1140 core::Size prev_cut = 0, this_cut, out_midpt;
1149 if ( loop_start == 1)
continue;
1150 if ( loop_end == nres)
continue;
1153 if ( start_is_cut && !end_is_cut && prev_cut == loop_start-1 )
1155 if ( start_is_cut && end_is_cut && prev_cut != loop_start-1 ) {
1157 this_cut = loop_start-1;
1159 out_midpt = prev_cut +1;
1160 newF.add_edge( nres+1, out_midpt, njump );
1161 if (out_midpt != prev_cut+1)
1162 newF.add_edge( out_midpt, prev_cut+1, Edge::PEPTIDE );
1163 if (out_midpt != this_cut)
1164 newF.add_edge( out_midpt, this_cut , Edge::PEPTIDE );
1165 prev_cut = this_cut;
1170 if ( start_is_cut && !end_is_cut && prev_cut != loop_start-1 )
1171 this_cut = loop_start-1;
1172 else if ( end_is_cut )
1173 this_cut = loop_end;
1175 this_cut = loops[i].cut();
1178 out_midpt = prev_cut + 1;
1180 if ( !start_is_cut && !end_is_cut ) {
1184 newF.add_edge( nres+1, out_midpt, njump );
1185 if (out_midpt != prev_cut+1)
1186 newF.add_edge( out_midpt, prev_cut+1, Edge::PEPTIDE );
1187 if (out_midpt != this_cut)
1188 newF.add_edge( out_midpt, this_cut , Edge::PEPTIDE );
1189 TR <<
"add edge " << njump <<
" : " << prev_cut+1 <<
"..." << out_midpt <<
"..." << this_cut << std::endl;
1192 prev_cut = this_cut;
1196 if (prev_cut != nres) {
1197 out_midpt = (prev_cut + nres+1)/2;
1198 newF.add_edge( prev_cut+1, nres+1, njump );
1199 newF.add_edge( prev_cut+1, nres , Edge::PEPTIDE );
1200 TR <<
"add edge " << njump <<
" : " << prev_cut+1 <<
"..." << out_midpt <<
"..." << nres << std::endl;
1203 newF.reorder( nres+1 );
1204 TR << newF << std::endl;
1215 jumps.push_back( std::pair<int,int>( down, up ) );