Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SlidingWindowLoopClosure.cc
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file
11 /// @brief
12 /// @detailed
13 /// @author Oliver Lange
14 ///
15 
16 
17 // Unit Headers
19 
20 // Package Headers
21 #include <protocols/loops/Loops.hh>
27 
28 
30 // Project Headers
31 #include <core/pose/Pose.hh>
32 #include <core/pose/util.hh>
33 
36 
37 #include <core/scoring/Energies.hh>
39 #include <core/scoring/rms_util.hh>
41 
42 #include <core/fragment/Frame.hh>
46 #include <core/fragment/FragSet.hh>
47 #include <core/fragment/FragCache.hh> // for FragStore
48 
49 // AUTO-REMOVED
51 
52 //*only for debug structures
56 // AUTO-REMOVED #include <basic/options/keys/abinitio.OptionKeys.gen.hh>
57 
58 #include <basic/options/option.hh> // for quick-test from run:dry_run
59 #include <basic/options/keys/run.OptionKeys.gen.hh>
60 #include <basic/options/keys/out.OptionKeys.gen.hh>
61 #include <basic/options/keys/fast_loops.OptionKeys.gen.hh>
62 
63 // ObjexxFCL Headers
64 #include <ObjexxFCL/format.hh>
65 
66 // Utility headers
67 #include <basic/Tracer.hh>
68 // AUTO-REMOVED #include <numeric/random/random.hh>
69 #include <utility/io/ozstream.hh>
70 
71 //numeric headers
72 
76 #include <utility/vector1.hh>
77 
79 //Auto Headers
80 
81 
82 //Auto using namespaces
83 namespace ObjexxFCL { namespace fmt { } } using namespace ObjexxFCL::fmt; // AUTO USING NS
84 //Auto using namespaces end
85 
86 
87 
88 namespace protocols {
89 namespace loops {
90 namespace loop_closure {
91 namespace ccd {
92 
93 using namespace core;
94 using namespace pose;
95 
96 //static numeric::random::RandomGenerator RG(423489); // <- Magic number, do not change it!
97 static basic::Tracer tr("protocols.loops.loop_closure.ccd.SlidingWindowLoopClosure");
98 
99 std::string const VDW_FRAG_STORE( "closure_loop_vdw" );
100 std::string const SCORE_FRAG_STORE( "closure_loop_score" );
101 std::string const RMSD_FRAG_STORE( "closure_loop_rmsd" );
102 const Real REALLY_BAD_SCORE ( 1000000000.0 );
103 
104 SlidingWindowLoopClosure::SlidingWindowLoopClosure(
105  fragment::FragSetCOP fragset,
106  scoring::ScoreFunctionOP scorefxn,
107  kinematics::MoveMapCOP movemap
108 ) : scorefxn_( scorefxn ),
109  movemap_( movemap ),
110  fragset_( fragset ),
111  ss_info_( new core::fragment::SecondaryStructure( *fragset ) )
112 {
113  set_defaults();
114 }
115 
117  scorefxn_( NULL ),
118  movemap_( NULL ),
119  fragset_( NULL ),
120  ss_info_( NULL )
121 {
122  set_defaults();
123 }
124 
126 
127 //@brief sets the movemap
129  movemap_ = movemap;
130 }
131 
132 void
134  min_loop_size_ = 6;
135  max_loop_size_ = 12;
136  min_good_loops_ = 3;
138  vdw_delta_ = 0.5;
139  score_delta_ = 0.5;
140  vdw_score_type_ = scoring::vdw; //not used right now
141  bKeepFragments_ = false;
144  bQuickTest_ = basic::options::option[ basic::options::OptionKeys::run::dry_run ]();
145  bIdealLoopClosing_ = true;
146  chainbreak_max_ = 0.2;
147  tr.Info << "SlidingWindowLoopClosure::defaults " << std::endl;
148 }
149 
150 
152  using namespace core::io::silent;
153  using namespace basic::options;
154  if ( option[ basic::options::OptionKeys::out::file::silent ].user() ) {
155  std::string silent_file="_"+prefix;
156  if ( get_current_job() && get_current_job()->output_file_name() != "" ) {
157  silent_file = get_current_job()->output_file_name()+silent_file;
158  } else silent_file = option[ basic::options::OptionKeys::out::file::silent ]+silent_file;
159 
160  SilentFileData sfd;
161  //filename might have been changed -- e.g., to also have an MPI rank in there
162 
163  // ProteinSilentStruct pss;
164  io::silent::SilentStructOP pss = io::silent::SilentStructFactory::get_instance()->get_silent_struct_out();
165  pss->fill_struct( pose, get_current_tag() );
166 
167  sfd.write_silent_struct( *pss, silent_file, false /* bWriteScoresOnly */ );
168  } // if option[ out::file::silent ].user()
169 }
170 
171 
172 //called from apply to figure out which cut is removed, setup min-max loopsizes etc.
173 Loop
174 SlidingWindowLoopClosure::determine_loop( Pose const& more_cut, Pose& less_cut ) {
175  using namespace kinematics;
176  tr.Debug << " SlidingWindowLoopClosure init... " << std::endl;
177  FoldTree const& f_more( more_cut.fold_tree() );
178  FoldTree const& f_less( less_cut.fold_tree() );
179  if( f_more.num_cutpoint() != f_less.num_cutpoint() + 1 ){
180  utility_exit_with_message(" Failure in SlidingWindowLoopClosure.cc : more_cut should have one more cutpoint then less_cut. ");
181  }
182 
183  // which cut is missing ?
184  Size cutpoint( 0 );
185  for ( Size i = 1; i <= static_cast< Size >( f_more.num_cutpoint() ) && !cutpoint ; i++ ) {
186  Size const seqpos( f_more.cutpoint( i ) );
187  if ( !f_less.is_cutpoint( seqpos ) ) cutpoint = seqpos;
188  }
189  //runtime_assert( cutpoint );
190  if( cutpoint == 0){ utility_exit_with_message( "Failure in: SlidingWindowLoopClosure.cc: cutpoint seq num is 0 " ); }
191 
192  tr.Debug << " remove cutpoint: " << cutpoint << std::endl;
193  // find min - max loop
194  // figure out where the loop can safely start and stop
195  // don't want to have jump_points inside loop because it would create motion downstream of that jump
196  // Size min_loop_begin ( cutpoint + 1 );
197  // Size max_loop_end ( cutpoint );
198 
199  // compute max_loop_size...
200  // extend loop from cutpoint away until either a jump-residue or an unmovable bb-torsion is found
201  Size min_loop_begin ( cutpoint + 1 );
202  Size max_loop_end ( cutpoint );
203  while (
204  min_loop_begin > 1
205  && !f_more.is_jump_point( min_loop_begin - 1 )
206  && movemap().get_bb( min_loop_begin - 1 )
207  ) --min_loop_begin;
208  while (
209  max_loop_end < f_more.nres()
210  && !f_more.is_jump_point( max_loop_end + 1 )
211  && movemap().get_bb( max_loop_end + 1 )
212  ) ++max_loop_end;
213 
214  //Size const actual_max_loop_size( max_loop_end_ - min_loop_begin_ + 1 );
215  //runtime_assert( min_loop_begin <= max_loop_end );
216  if( min_loop_begin > max_loop_end ){ utility_exit_with_message(" Failure in SlidingWindowLoopClosure.cc : min_loop_begin > max_loop_end "); };
217 
218  return Loop( min_loop_begin, max_loop_end, cutpoint );
219 
220 }
221 
222 
223 void
225  using namespace scoring;
226  using namespace basic::options;
227  using namespace basic::options::OptionKeys;
228 // scorefxn.set_weight( vdw, 1.0 );
229 // scorefxn.set_weight( env, 1.0 );
230 // scorefxn.set_weight( pair, 1.0 );
231 // scorefxn.set_weight( linear_chainbreak, 1.0 );
232  ScoreFunctionOP score_tmp_;
233  tr.Debug << " get fragsample scorefunction... " << std::endl;
235  option[ OptionKeys::fast_loops::fragsample_score ]() /*default "loop_fragsample" );*/
236  );
237  if ( option[ OptionKeys::fast_loops::fragsample_patch ].user() ) {
238  score_tmp_->apply_patch_from_file( option[ OptionKeys::fast_loops::fragsample_patch ] );
239  }
240  scorefxn = *score_tmp_;
241 
242  tr.Debug << " get filter scorefunction... " << std::endl;
243  if ( option[ OptionKeys::fast_loops::overwrite_filter_scorefxn ].user() ) {
244  scorefxn_ = ScoreFunctionFactory::create_score_function( option[ OptionKeys::fast_loops::overwrite_filter_scorefxn ] );
245  }
246 
247  if ( !scorefxn_ ) {
249  scorefxn_->set_weight( linear_chainbreak, 1.0 );
250  scorefxn_->set_weight( overlap_chainbreak, 1.0 );
251  }
252  if ( option[ OptionKeys::fast_loops::patch_filter_scorefxn ].user() ) {
253  tr.Debug << " patch filter scorefunction... " << std::endl;
254  scorefxn_->apply_patch_from_file( option[ OptionKeys::fast_loops::patch_filter_scorefxn ] );
255  }
256  if ( scorefxn_->get_weight( linear_chainbreak ) == 0.0 ) {
257  scorefxn_->set_weight( linear_chainbreak, 1.0 ); //these have to be switched on...otherwise unclosed loops are invisible
258  }
259  if ( scorefxn_->get_weight( overlap_chainbreak ) == 0.0 ) {
260  scorefxn_->set_weight( overlap_chainbreak, 1.0 );
261  }
262  tr.Debug << " is there a filter_cst_ evaluator?.. " << std::endl;
263  if ( !filter_cst_ && option[ OptionKeys::fast_loops::filter_cst_file ].user() ) {
264  filter_cst_ = new constraints_additional::ConstraintEvaluator( "filter_loops", option[ OptionKeys::fast_loops::filter_cst_file ]() );
265  filter_cst_weight_ = option[ OptionKeys::fast_loops::filter_cst_weight ]();
266  }
267 }
268 
270  // call this only with non-ideal loop closing
271  // and with loop_ already set !
272  runtime_assert( !bIdealLoopClosing() );
273  apply( more_cut, more_cut ); //less_cut loop isn't really used if it is non-ideal loop closing
274 }
275 
278  return "SlidingWindowLoopClosure";
279 }
280 
281 
283  core::pose::setPoseExtraScores( pose, "loop_vdw_score", -1 );
284  core::pose::setPoseExtraScores( pose, "loop_chain_score", -1 );
285  core::pose::setPoseExtraScores( pose, "loop_total_score", -1 );
286  core::pose::setPoseExtraScores( pose, "loop_overlap_score", -1 );
287  core::pose::setPoseExtraScores( pose, "looprms", -1 );
288 }
289 
290 void
291 SlidingWindowLoopClosure::apply( Pose& more_cut, Pose& less_cut ) {
292  if ( closure_fragments() ) { //because we might leave the following block via Exception for some poses
293  setPoseExtraScores( more_cut );
294  }
295 
296 
297 
299  setup_frag_scorefxn( *frag_scorefxn );
300  tr.Debug << "Trying loop-sizes: " << loop_ << std::endl;
301  tr.Info << "---------------- LOOP SAMPLING based on this scorefunction: ----------------\n";
302  if ( tr.Info.visible() ) frag_scorefxn->show( tr.Info, more_cut );
303  tr.Info << std::endl;
304 
305  tr.Debug << "Trying loop-sizes: " << loop_ << std::endl;
306  tr.Info << "---------------- LOOP SELECTION based on this scorefunction: ----------------\n";
307  if ( tr.Info.visible() ) scorefxn_->show( tr.Info, more_cut );
308  tr.Info << std::endl;
309 
310  loops::remove_cutpoint_variants( more_cut, true );
312 
313  loops::remove_cutpoint_variants( less_cut, true );
315 
316  tr.Debug << "MOREFOLDTREE: " << more_cut.fold_tree();
317  tr.Debug << "LESSFOLDTREE: " << less_cut.fold_tree();
318  if ( evaluator_ && tr.Debug.visible() ) evaluate_pose( more_cut, *evaluator_, tr.Debug );
319  if ( evaluator_ && tr.Debug.visible() ) evaluate_pose( less_cut, *evaluator_, tr.Debug );
320 
321 
322 
323  sample_loops( more_cut, less_cut );
324  select_final_loop( more_cut, less_cut );
325  loops::remove_cutpoint_variants( more_cut, true );
326  loops::remove_cutpoint_variants( less_cut, true );
327 }
328 
329 void
331  if ( bQuickTest() ) return; //let's say we found a good loop
332 
333  if( basic::options::option[ basic::options::OptionKeys::run::test_cycles ]() ){
334  min_loop_size_ = 6;
335  max_loop_size_ = 7;
336  min_good_loops_ = 1;
339  vdw_delta_ = 200;
340  score_delta_ = 200;
341  chainbreak_max_ = 20.2;
342  }
343 
344 
346 
347  if ( bKeepFragments_ ) {
349  }
350 
351  Size attempt_count = 0;
352  Size const actual_max_loop_size( loop_.size() );
353  Size const min_breakout_good_loops( std::max( min_breakout_good_loops_, min_good_loops_ ) );
354 
355  tr.Debug << "Trying loop-sizes: "
356  << " " << std::min( actual_max_loop_size, min_loop_size_ )
357  << " " << " - "
358  << " " << std::min( actual_max_loop_size, max_loop_size_ )
359  << " " << std::min( actual_max_loop_size, max_loop_size_ ) - std::min( actual_max_loop_size, min_loop_size_ )
360  << " " << std::endl;
361 
362  tr.Debug << "LOOP: " << loop_ << std::endl;
363 
364  Size good_loop_count( 0 );
365 
366  { //take initial loop-conformation as closing candidate
367  using namespace fragment;
368  FrameOP closure_frame = new Frame( loop_.start(), new FragData( new BBTorsionSRFD, loop_.size() ) );
369  FrameList closure_frames;
370  closure_frame->steal( more_cut );
371 
372  CcdLoopClosureMover fast_ccd( loop_, movemap_ );
373  fast_ccd.apply( more_cut );
374  if ( fast_ccd.success() ) {
375  closure_frame->steal( more_cut );
376  }
377 
378  closure_frames.push_back( closure_frame );
379 
380  good_loop_count += process_fragments( closure_frames, more_cut, less_cut );
381  } //scope
382 
384  setup_frag_scorefxn( *frag_scorefxn );
385 
386  loops::remove_cutpoint_variants( more_cut, true );
388 
389  loops::remove_cutpoint_variants( less_cut, true );
391 
392  tr.Debug << "MOREFOLDTREE: " << more_cut.fold_tree();
393  tr.Debug << "LESSFOLDTREE: " << less_cut.fold_tree();
394  if ( evaluator_ && tr.Debug.visible() ) evaluate_pose( more_cut, *evaluator_, tr.Debug );
395  if ( evaluator_ && tr.Debug.visible() ) evaluate_pose( less_cut, *evaluator_, tr.Debug );
396 
397  // try different loop sizes
398  for ( Size loop_size = std::min( actual_max_loop_size, min_loop_size_ );
399  loop_size <= std::min( actual_max_loop_size, max_loop_size_ ); ++loop_size ) {
400  tr.Debug << "loop-size: " << loop_size << std::endl;
401  // try different sliding windows, sorted by loop_fraction in window
402  WindowList windows;
403  generate_window_list( loop_size, windows );
404  windows.sort();
405  windows.reverse();
406 
407  for ( WindowList::const_iterator it = windows.begin(),
408  eit = windows.end(); it != eit; ++it ) {
409 
410  attempt_count ++;
411 
412  // close this loop
413  Loop const current_loop = it->second;
414  tr.Debug << "attempt closure on " << current_loop << " # :" << attempt_count << std::endl;
415  fragment::FrameList closure_frames;
416 
417  tr.Info << "scored fragment sampling... " << current_loop << std::endl;
418  LoopClosure scored_closure( fragset_, frag_scorefxn, current_loop, movemap_ );
419  scored_closure.set_cycles( scored_frag_cycle_ratio_ );
420  scored_closure.ramp_chainbreak();
421 
422  // if ( bIdealLoopClosing() ){
423  // note this apply doesn't change the more_cut pose
424  if ( scored_closure.apply( more_cut ) ) closure_frames.push_back( scored_closure.closure_fragments() );
425 
426  if ( loop_size <= 10 ) {
427  tr.Info << "short loop: unscored fragment sampling... " << std::endl;
428  ShortLoopClosure short_closure( fragset_, current_loop, movemap_ );
429  short_closure.set_cycles( short_frag_cycle_ratio_ );
430  short_closure.ramp_chainbreak();
431  if ( short_closure.apply( more_cut ) ) closure_frames.push_back( short_closure.closure_fragments() );
432  }
433 
434  good_loop_count += process_fragments( closure_frames, more_cut, less_cut );
435  tr.Info << "process fragments... GoodLoops: " << good_loop_count << std::endl;
436  if ( good_loop_count >= min_breakout_good_loops ) break;
437 
438  } // windows
439  if ( good_loop_count >= min_good_loops_ && best_fragment_.is_valid() ) {
440  return;
441  }
442  } // loop_size
443  tr.Warning << "WARNING: no good loop found !" << std::endl;
444  throw( loops::EXCN_Loop_not_closed() );
445 } //apply
446 
447 
448 void
450  using namespace fragment;
451 
452  if( !best_fragment_.is_valid() ){
453  tr.Error << "Cannot apply best fragment because it is not valid or there is none." << std::endl;
454  core::pose::setPoseExtraScores( more_cut, "loop_vdw_score", 0 );
455  core::pose::setPoseExtraScores( more_cut, "loop_chain_score", 0);
456  core::pose::setPoseExtraScores( more_cut, "loop_total_score", 0 );
457  core::pose::setPoseExtraScores( more_cut, "loop_overlap_score", 0 );
458  core::pose::setPoseExtraScores( more_cut, "looprms", 0 );
459  return ;
460  }
461 
462  best_fragment_.apply( movemap(), less_cut );
463  best_fragment_.apply( movemap(), more_cut );
464 
465  FragStore< Real > vdw_store(VDW_FRAG_STORE);
466  FragStore< Real > score_store(SCORE_FRAG_STORE);
467  FragStore< Real > chainbreak_store("chainbreak");
468  FragStore< Real > overlap_store("overlap");
469  FragStore< Real > rms_store("loop_rms");
470  core::pose::setPoseExtraScores( more_cut, "loop_vdw_score", vdw_store.retrieve( best_fragment_ ));
471  core::pose::setPoseExtraScores( more_cut, "loop_chain_score", chainbreak_store.retrieve( best_fragment_ ));
472  core::pose::setPoseExtraScores( more_cut, "loop_total_score", score_store.retrieve( best_fragment_ ));
473  core::pose::setPoseExtraScores( more_cut, "loop_overlap_score", overlap_store.retrieve( best_fragment_ ));
474  core::pose::setPoseExtraScores( more_cut, "looprms", rms_store.retrieve( best_fragment_ ));
475 
476  if ( closure_fragments() ) {
477  std::string frag_file=basic::options::option[ basic::options::OptionKeys::out::file::silent ]()+"_best_frags";
478  utility::io::ozstream frag_stream;
479  frag_stream.open_append( frag_file );
480 
481  for ( FragID_Iterator it = closure_fragments()->begin(),
482  eit = closure_fragments()->end(); it != eit; ++it ) {
483  Real const size_fraction( 1.0*(*it).frame().length() / loop_.size());
484  frag_stream
485  << RJ( 10, vdw_store.retrieve( *it ) )<< " "
486  << RJ( 10, score_store.retrieve( *it ) )<< " "
487  << RJ( 10, chainbreak_store.retrieve( *it) )<< " "
488  << RJ( 10, overlap_store.retrieve( *it ) )<< " "
489  << RJ( 10, rms_store.retrieve( *it ) )<< " "
490  << RJ( 10, size_fraction ) << " "
491  << get_current_tag() << std::endl;
492  }
493  }
494 } //select_final_loop
495 
496 Real
498  Real score ( (*scorefxn_)( pose ) );
499  if ( filter_cst_ ) {
500  score+=filter_cst_weight_*filter_cst_->apply( pose );
501  }
502  return score;
503 }
504 
505 Size
507  fragment::FrameList& frame_in,
508  Pose const& more_cut,
509  Pose const& loop_pose
510 ) {
511  using namespace fragment;
512  FragStore< Real > vdw_store(VDW_FRAG_STORE);
513  FragStore< Real > score_store(SCORE_FRAG_STORE);
514  FragStore< Real > rmsd_store(RMSD_FRAG_STORE);
515  FragStore< Real > chainbreak_store("chainbreak");
516  FragStore< Real > overlap_store("overlap");
517  FragStore< Real > rms_store("loop_rms");
518 
519  Size good_loop_count( 0 );
520 
521  Loops loops;
522  loops.add_loop( loop_ ); //for looprms
523 
524  Pose orig_pose;
525  Pose work_pose;
526 
527  if ( bIdealLoopClosing() ) {
528  orig_pose = more_cut;
529  work_pose = loop_pose;
530  } else {
531  orig_pose = more_cut;
532  work_pose = more_cut;
533  }
534 
535  Size ct( 0 );
536 
537  Real const start_score ( filter_score( orig_pose ) );
538  Real const vdw_start_score ( orig_pose.energies().total_energies()[ vdw_score_type_ ] );
539  for ( FragID_Iterator it = frame_in.begin(),
540  eit = frame_in.end(); it != eit; ++it ) {
541  if ( !it->is_valid() ) continue;
542  if ( it->apply( movemap(), work_pose ) ) {
543  ct++;
544 
545  //check rmsd
546  if ( bIdealLoopClosing() && !basic::options::option[ basic::options::OptionKeys::run::test_cycles ]() ) {
547  it->apply( movemap(), orig_pose );
548  Real const check_rmsd( scoring::CA_rmsd( orig_pose, work_pose ) ); //, loop_.start(), loop_.stop() ) );
549  // Real sssscore = (*scorefxn_)( orig_pose );
550  // Real const lin_cb( orig_pose.energies().total_energies()[ scoring::linear_chainbreak ]);
551  // Real const ovp_cb( orig_pose.energies().total_energies()[ scoring::overlap_chainbreak ]);
552  // tr.Debug << "CHECK_LOOP: " << check_rmsd << " " << lin_cb << " " << ovp_cb << " " << sssscore << std::endl;
553  if ( check_rmsd > 0.1 ) {
554  tr.Debug << "skip loop: bad check_rms in loop building RMSD: "<< check_rmsd << std::endl;
555  //throw them out...
556  continue;
557  }
558  }
559 
560  Real const score( filter_score( work_pose ) );
561  Real const vdw_score( work_pose.energies().total_energies()[ vdw_score_type_ ]);
562  Real const chainbreak_scores( work_pose.energies().total_energies()[ scoring::linear_chainbreak ]
563  + work_pose.energies().total_energies()[ scoring::chainbreak ]
564  + work_pose.energies().total_energies()[ scoring::overlap_chainbreak ]
565  );
566  Real const loop_rmsd( get_native_pose() ? loops::loop_rmsd( *get_native_pose(), work_pose, loops, true /*CA*/ ) : -1.0 );
567  // scorefxn_->show( tr.Debug, work_pose ); tr.Trace<< std::endl;
568  bool const good_loop( ( vdw_score <= vdw_start_score + vdw_delta_ ) && chainbreak_scores <= chainbreak_max_ );
569  // bool const good_loop( score < start_score + score_delta_ );
570 
571 
572  if ( good_loop ) { //originally this was vdw_score < vdw_start_score... is this better?!
573  tr.Info << "good loop "<< ct << " " << score << " " << start_score << " vdw: " << vdw_score << " " << vdw_start_score << std::endl;
574  ++good_loop_count;
575  vdw_store.store( *it, vdw_score-vdw_start_score);
576  score_store.store( *it, score );
577  chainbreak_store.store( *it, chainbreak_scores );
578  overlap_store.store( *it, work_pose.energies().total_energies()[ scoring::overlap_chainbreak ] );
579  rms_store.store( *it, loop_rmsd );
580  //store good fragment if we are set up to do so
581  if ( closure_fragments_ ) {
582  // keep these data with the fragments
583  closure_fragments_->add( *it );
584  }
585 
586  if ( best_score_ > score ) { //CHANGED 3/12/09 before we would also take fragments as "best" if they are not "good"... seems stupid... tr.Debug << "improved loop score: " << score << " prev best: " << best_score_ << std::endl;
587  if ( !good_loop ) { //
588  tr.Debug << "...but on bad loop " << score << " " << start_score << " vdw: " << vdw_score << " " << vdw_start_score
589  << "chainbreak: " << chainbreak_scores << std::endl;
590  }
591  best_score_ = score;
592  best_fragment_ = *it;
593  }
594  tr.Debug << ct << " LoopScore: " << score << " Best: " << best_score_ << std::endl;
595  } else {
596  tr.Debug << ct << " discard loop-fragment ... score: " << score << " chainbreak_scores: " << chainbreak_scores << std::endl; // vdw < vdw_start_score_
597  }
598  } // an applicable fragment
599  } // FragID iteration
600  return good_loop_count;
601 }
602 
603 void
605  runtime_assert( ss_info_ );
606  for ( Size ii= std::max( 0, - (int) loop_.cut() + (int) loop_size ) ; ii<= loop_size; ++ii ) {
607  runtime_assert( (int) loop_.cut() - (int) loop_size + ii + 1 > 0 );
608  Size const loop_begin( loop_.cut() - loop_size + ii + 1);
609  Size const loop_end ( loop_.cut() + ii );
610  tr.Debug << "add-window: " << loop_begin << "-" << loop_end << std::endl;
611  runtime_assert( loop_begin <= loop_.cut()+1);
612  runtime_assert( loop_end >= loop_.cut() );
613  runtime_assert( loop_end == loop_begin + loop_size - 1 );
614  if ( loop_begin < loop_.start() || loop_end > loop_.stop() ) continue;
615  Real f(0);
616  for ( Size i = loop_begin; i <= loop_end; ++i ) {
617  f += ss_info_->loop_fraction(i);
618  }
619  window_list.push_back( std::make_pair( f/(1.0*loop_size)-loop_size*1.0, Loop( loop_begin, loop_end, loop_.cut() ) ) );
620  }
621 }
622 
623 } // namespace ccd
624 } // namespace loop_closure
625 } // namespace loops
626 } // namespace protocols