57 #include <basic/Tracer.hh>
66 #include <utility/vector1.hh>
67 #include <ObjexxFCL/string.functions.hh>
74 using namespace kinematics;
77 static basic::Tracer
tr(
"protocols.jumping");
92 if ( !final_fold_tree_in.
nres() ) {
99 final_fold_tree = final_fold_tree_in;
102 runtime_assert( closure_protocol );
109 tr.Debug <<
"close chainbreaks until final fold-tree is reached\n";
116 Pose pose = open_pose;
118 Size close_count = 0;
122 std::list< std::pair< Size, Size > > cuts;
129 Size min_loop_begin ( cutpoint + 1 );
130 Size max_loop_end ( cutpoint );
134 && movemap.
get_bb( min_loop_begin - 1 )
139 && movemap.
get_bb( max_loop_end + 1)
141 if ( max_loop_end > min_loop_begin ) {
142 cuts.push_back( std::make_pair( max_loop_end - min_loop_begin, cutpoint ) );
148 if (
tr.Debug.visible() ) {
149 for ( std::list< std::pair< Size, Size > >::iterator it = cuts.begin(), eit = cuts.end();
151 tr.Debug <<
"cut " << it->second <<
" max_loop_size " << it->first << std::endl;
154 if ( cuts.size() == 0 ) {
158 Size const cutpoint( cuts.back().second );
159 tr.Info <<
"close chainbreak at position " << cutpoint <<
"..." << std::endl;
162 const bool checkpoint_foldtree=
true;
166 open_pose, NULL, decoy_tag,
"_lc_" + ObjexxFCL::string_of( close_count ),
false, checkpoint_foldtree ) ) {
167 if (
remove_cut( cutpoint, pose, final_fold_tree ) ) {
168 if (
tr.Debug.visible() ) {
169 tr.Debug <<
"current fold-trees " << std::endl;
172 tr.Debug << std::endl;
174 closure_protocol->set_loop( closure_protocol->determine_loop( open_pose, pose ) );
175 closure_protocol->apply( open_pose, pose );
176 if ( closure_protocol->bIdealLoopClosing() ) {
183 checkpoint.
checkpoint( open_pose, NULL, decoy_tag,
"_lc_" + ObjexxFCL::string_of( close_count ), checkpoint_foldtree );
195 FoldTree new_fold_tree = pose.
fold_tree();
196 bool success(
remove_cut( cutpoint, new_fold_tree, final_fold_tree ) );
199 tr.Debug <<
"set new fold-tree " << new_fold_tree << std::endl;
201 tr.Debug <<
"idealize positions " << std::endl;
209 remove_cut(
Size cutpoint, FoldTree &new_fold_tree, FoldTree
const& final_fold_tree )
211 tr.Info <<
"close-loops: remove cuts until fold-tree is : " << final_fold_tree << std::endl;
214 FoldTree old_fold_tree( new_fold_tree );
215 FoldTree
const& f ( old_fold_tree );
216 runtime_assert( f.is_cutpoint( cutpoint ) );
219 Size jump_pos1( cutpoint );
220 Size jump_pos2( cutpoint + 1 );
221 while ( jump_pos1 > 1 && !f.is_jump_point( jump_pos1 ) )
223 while ( jump_pos2 < f.nres() && !f.is_jump_point( jump_pos2 ) )
225 runtime_assert( jump_pos1 <= jump_pos2 );
227 tr.Info <<
"remove cutpoint: " << cutpoint <<
" between " << jump_pos1 <<
" " << jump_pos2 <<
" in " << std::endl;
228 new_fold_tree.reorder( 1 );
229 tr.Info << new_fold_tree << std::endl;
232 if ( jump_pos1 < cutpoint ) {
233 new_fold_tree.delete_unordered_edge( jump_pos1, cutpoint, -1);
235 if ( cutpoint+1 < jump_pos2 ) {
236 new_fold_tree.delete_unordered_edge( cutpoint+1, jump_pos2, -1);
238 new_fold_tree.add_edge( jump_pos1, jump_pos2, -1 );
241 for (
Size i=1; i<= f.num_jump(); ++i ) {
243 bool in_final(
false );
244 for (
Size nf = 1; !in_final && nf<= final_fold_tree.num_jump(); nf ++ ) {
245 in_final = ( final_fold_tree.jump_point(1, nf) == f.jump_point(1,i) && final_fold_tree.jump_point(2, nf) == f.jump_point(2,i) )
246 || ( final_fold_tree.jump_point(1, nf) == f.jump_point(2,i) && final_fold_tree.jump_point(2, nf) == f.jump_point(1,i) );
249 new_fold_tree.update_edge_label( f.jump_point(1,i), f.jump_point(2,i), i, 0 );
250 if ( new_fold_tree.connected() ) {
252 new_fold_tree.delete_unordered_edge( f.jump_point(1,i), f.jump_point(2,i), 0 );
255 new_fold_tree.update_edge_label( f.jump_point(1,i), f.jump_point(2,i), 0, i );
259 tr.Debug <<
"new_fold_tree: " << new_fold_tree << std::endl;
260 if ( new_fold_tree.connected() ) {
263 new_fold_tree.renumber_jumps();
264 tr.Debug <<
"new_fold_tree renumbered: " << new_fold_tree << std::endl;
267 new_fold_tree.delete_extra_vertices();
268 tr.Debug <<
"new_fold_tree deleted_extra_vertices: " << new_fold_tree << std::endl;
269 new_fold_tree.reorder( 1 );
270 tr.Debug <<
"new_fold_tree reordered to 1 " << new_fold_tree << std::endl;
273 if ( new_fold_tree.num_jump() > 0 ) {
274 new_root = new_fold_tree.jump_point( 1, 1 );
276 new_fold_tree.reorder( new_root );
277 tr.Debug <<
"new_fold_tree reordered to " << new_root <<
" " << new_fold_tree << std::endl;
287 Size const num_jump ( fold_tree.num_jump() );
290 for (
Size i = 1; i <= num_jump; ++i ) {
291 for (
Size j = 1; j <= 2; ++j ) {
292 Size const pos ( j==1 ? fold_tree.jump_edge( i ).start() : fold_tree.jump_edge( i ).stop() );
295 for (
Size k = std::max( (
Size) 1, pos-2 ), ke = std::min( nres, pos+2 );
307 using namespace core::fragment;
309 if ( length <= 1 || length > 4 ) utility_exit_with_message(
"called generate_jump_frame with inappropriate length argument");
311 if ( length == 4 ) frame->set_pos( pos++, startpos );
312 frame->set_pos( pos++, startpos );
313 frame->set_pos( pos++, endpos );
314 if ( length >=3 ) frame->set_pos( pos, endpos );
319 using namespace core::fragment;
321 if ( bWithTorsion ) {
323 frag_data->add_residue( start );
328 if ( bWithTorsion ) {
330 frag_data->add_residue( stop );
333 frame->add_fragment( frag_data );
344 PointList
const & ca1,
345 PointList
const & ca2,
356 Vector b1 = ca1[2] - ca1[1];
357 Vector b2 = ca1[2] - ca1[3];
386 for (
int i = -1 ; i<=1 ; i++ ) {
387 id::AtomID CA1( rt1.atom_index (
"CA") , res1+i );
388 id::AtomID CA2( rt2.atom_index (
"CA") , res2+i );
389 pCA1[ i+2 ] = pose.
xyz( CA1 );
390 pCA2[ i+2 ] = pose.
xyz( CA2 );
393 Vector dCaCa = pCA1[ 2 ] - pCA2[ 2 ];
394 if ( dCaCa.length() > 10.5 ) {
395 tr.Warning <<
"the CA-CA distance for pairing " << res1 <<
" " << res2 <<
" is " << dCaCa.length() << std::endl;
408 orientation = dot_product( a1, a2 );
414 Real const d1 = dot_product(ab1,c1);
415 Real const d2 = dot_product(ab2,c2);
419 if ( orientation < 0 ) {
447 Real forientation, pleating1, pleating2;
453 pleating = ( (pleating1+pleating2) < 0 ? 1 : 2 );
461 if ( forientation < 0 ) {
464 pleating = ( (pleating1+pleating2) < 0 ? 1 : 2 );
468 pleating = ( (pleating1+pleating2) < 0 ? 2 : 1 );
471 tr.Debug <<
" orientation " << forientation <<
" pleating " << pleating << std::endl;
472 orientation = forientation < 0 ? 1 : 2;