Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
VarLengthBuild.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 protocols/forge/components/VarLengthBuild.cc
11 /// @brief Component that performs a simplified version of a protocol for
12 /// variable length remodeling of protein backbone segments.
13 /// @author Yih-En Andrew Ban (yab@u.washington.edu)
14 
15 // unit headers
23 
24 // package headers
34 
35 // project headers
37 // AUTO-REMOVED #include <core/conformation/symmetry/util.hh>
39 #include <basic/options/option.hh>
40 #include <basic/options/keys/remodel.OptionKeys.gen.hh>
41 #include <basic/options/keys/in.OptionKeys.gen.hh>
42 #include <basic/options/keys/enzdes.OptionKeys.gen.hh>
43 #include <basic/options/keys/constraints.OptionKeys.gen.hh>
45 
47 #include <core/fragment/Frame.hh>
53 #include <core/pose/Pose.hh>
54 // AUTO-REMOVED #include <core/scoring/constraints/Constraint.hh>
55 #include <core/scoring/Energies.hh>
59 #include <basic/Tracer.hh>
61 #include <protocols/loops/Loops.hh>
64 
65 // utility headers
66 #include <utility/vector1.hh>
67 
70 
71 //Auto Headers
72 #ifdef WIN32
73 #include <core/fragment/FragID.hh>
74 #endif
75 
76 
77 namespace protocols {
78 namespace forge {
79 namespace components {
80 
81 
82 // Tracer instance for this file
83 // Named after the original location of this code
84 static basic::Tracer TR( "protocols.forge.components.VarLengthBuild" );
85 
86 
87 /// @brief default constructor
89  Super( "VLB" ),
90  sfx_( core::scoring::ScoreFunctionFactory::create_score_function( "remodel_cen" ) ),
91  recover_original_on_failure_( true ),
92  loop_mover_str_( "RemodelLoopMover" ),
93  cache_fragments_( true ),
94  vall_memory_usage_( VLB_VallMemoryUsage::KEEP_IN_MEMORY ),
95  num_fragpick_( 200 ),
96  use_fullmer_( false ),
97  max_linear_chainbreak_( 0.07 ),
98  fragments_picked_( false ),
99  user_provided_movers_apply_cycle_(3),
100  loop_mover_fold_tree_constant_(false),
101  restart_mode_( false ),
102  ignore_cmdline_enzdes_cstfile_(false)
103 {}
104 
105 
106 /// @brief BuildManager constructor
108  Super( "VLB" ),
109  manager_( manager ),
110  sfx_( core::scoring::ScoreFunctionFactory::create_score_function( "remodel_cen" ) ),
111  recover_original_on_failure_( true ),
112  loop_mover_str_( "RemodelLoopMover" ),
113  cache_fragments_( true ),
114  vall_memory_usage_( VLB_VallMemoryUsage::KEEP_IN_MEMORY ),
115  num_fragpick_( 200 ),
116  use_fullmer_( false ),
117  max_linear_chainbreak_( 0.07 ),
118  fragments_picked_( false ),
119  user_provided_movers_apply_cycle_(3),
120  loop_mover_fold_tree_constant_(false),
121  restart_mode_( false ),
122  ignore_cmdline_enzdes_cstfile_(false)
123 {}
124 
125 /// @brief BuildManager + remodelData constructor
126 VarLengthBuild::VarLengthBuild( BuildManager const & manager, RemodelData const & remodel_data ) :
127  Super( "VLB" ),
128  manager_( manager ),
129  sfx_( core::scoring::ScoreFunctionFactory::create_score_function( "remodel_cen" ) ),
130  remodel_data_( remodel_data ),
131  recover_original_on_failure_( true ),
132  loop_mover_str_( "RemodelLoopMover" ),
133  cache_fragments_( true ),
134  vall_memory_usage_( VLB_VallMemoryUsage::KEEP_IN_MEMORY ),
135  num_fragpick_( 200 ),
136  use_fullmer_( false ),
137  max_linear_chainbreak_( 0.07 ),
138  fragments_picked_( false ),
139  user_provided_movers_apply_cycle_(3),
140  loop_mover_fold_tree_constant_(false),
141  restart_mode_( false ),
142  ignore_cmdline_enzdes_cstfile_(false)
143 {}
144 
145 
146 /// @brief copy constructor
148  //utility::pointer::ReferenceCount(),
149  Super( rval ),
150  manager_( rval.manager_ ),
151  sfx_( rval.sfx_->clone() ),
152  recover_original_on_failure_( rval.recover_original_on_failure_ ),
153  loop_mover_str_( rval.loop_mover_str_ ),
154  cache_fragments_( rval.cache_fragments_ ),
155  vall_memory_usage_( rval.vall_memory_usage_ ),
156  num_fragpick_( rval.num_fragpick_ ),
157  use_fullmer_( rval.use_fullmer_ ),
158  original_sequence_( rval.original_sequence_ ),
159  new_secondary_structure_override_( rval.new_secondary_structure_override_ ),
160  new_sequence_override_( rval.new_sequence_override_ ),
161  max_linear_chainbreak_( rval.max_linear_chainbreak_ ),
162  abego_( rval.abego_ ),
163  rcgs_( rval.rcgs_ ),
164  setup_movers_(rval.setup_movers_),
165  user_provided_movers_(rval.user_provided_movers_),
166  user_provided_movers_apply_cycle_(rval.user_provided_movers_apply_cycle_),
167  loop_mover_fold_tree_constant_(rval.loop_mover_fold_tree_constant_),
168  restart_mode_( rval.restart_mode_ ),
169  ignore_cmdline_enzdes_cstfile_(rval.ignore_cmdline_enzdes_cstfile_)
170 {
171  // assign fragments only if caching is active
172  if ( cache_fragments_ ) {
174  fragfull_ = rval.fragfull_;
175  frag9_ = rval.frag9_;
176  frag3_ = rval.frag3_;
177  frag1_ = rval.frag1_;
178  } else {
179  fragments_picked_ = false;
180  }
181 }
182 
183 
184 /// @brief default destructor
186 
187 
188 /// @brief clone this object
190  return new VarLengthBuild( *this );
191 }
192 
193 
194 /// @brief create a new instance of this type of object
196  return new VarLengthBuild();
197 }
198 
199 
200 /// @brief set ScoreFunction used during build
202  sfx_ = sfx.clone();
203 }
204 
205 
206 /// @brief set ScoreFunction used during build
208  sfx_ = sfx->clone();
209 }
210 
211 
212 /// @brief set build manager; also clears any cached fragments
213 void VarLengthBuild::manager( BuildManager const & manager ) {
214  clear_fragments();
215  manager_ = manager;
216 }
217 
218 
219 /// @brief get rid of all rcgs
220 void
222  rcgs_.clear();
223 }
224 
225 
226 /// @brief adding an rcg. this will set the rcg internal vlb backpointer
227 void
229 {
230 
231  //we should probably also clone this
232  rcg->set_vlb( this );
233 
234  rcgs_.push_back( rcg );
235 }
236 
237 void
239  setup_movers_.clear();
240 }
241 
242 void
244 {
245  //maybe we should clone the mover?
246  setup_movers_.push_back( mover_in );
247 }
248 
249 void
251  user_provided_movers_.clear();
252 }
253 
254 void
256 {
257  //maybe we should clone the mover?
258  user_provided_movers_.push_back( mover_in );
259 }
260 
261 
262 /// @brief clear any currently cached fragments
264  fragments_picked_ = false;
265  fragfull_.reset_to_null();
266  frag9_.reset_to_null();
267  frag3_.reset_to_null();
268  frag1_.reset_to_null();
269 }
270 
271 
272 /// @brief run protocol on given Pose
273 /// @return if procedure successful, return Pose with modifications and a
274 /// sealed fold tree, otherwise return Pose with modifications and the
275 /// in-progress cut fold tree
276 /// @remarks Before invoking this function it's best to make sure
277 /// the secondary structure in the Pose is marked via the method
278 /// that you would prefer, e.g. by Dssp (protocols::jumping::Dssp),
279 /// by the old Rosetta++ binning method (core::pose::set_ss_from_phipsi)
280 /// or by external method such as reading in a file.
281 void VarLengthBuild::apply( Pose & pose ) {
286 
290 
291  // reset status flags
293 
294  // sanity check
295  if ( !manager_.empty() ) {
297  }
298 
299  // Cache name of the residue type set the BuildInstructions are
300  // using -- currently assume they are all equivalent, as this is
301  // enforced in the BuildInstruction compatibility check.
302  String bi_rts_name = ( **manager_.begin() ).residue_type_set().name();
303 
304  // make backup copy for e.g. side-chain transferal later
305  // REPEAT: also used for monomeric repeat
306  Pose archive_pose = pose;
307 
308  utility::vector1<Real> cached_phi, cached_psi, cached_omega;
309 
310  // alter pose
311  Original2Modified original2modified; // keep track of old -> new mapping
312  if ( get_last_move_status() == MS_SUCCESS ) {
313  // alter residue type set if necessary
314  if ( pose.residue( 1 ).residue_type_set().name() != bi_rts_name ) {
315  core::util::switch_to_residue_type_set( pose, bi_rts_name );
316  }
317 
318  // modify
319  if ( restart_mode_ ) { // assume Pose has already been modified by the manager somewhere
320 
321  //manager_.dummy_modify( pose.n_residue() );
322  //original2modified = manager_.original2modified();
323 
324  //since archive_pose is actually a copy of the modified version of the
325  //pose it will have 1-to-1 mapping to the pose. So need to make a fake
326  //original2modified map if running in restart_mode
328  for (Original2Modified::const_iterator it = dummy.begin(), end=dummy.end(); it != end; ++ it){
329  //TR << "idx restart mode " << it->second << std::endl;
330  if ( basic::options::option[basic::options::OptionKeys::remodel::repeat_structure].user() ){
331  if ((*it).second <= (remodel_data_.sequence.length()*2) ){
332  original2modified[(*it).second] = (*it).second;
333  }
334  } else {
335  original2modified[(*it).second] = (*it).second;
336  }
337  }
338 
339  } else {
340  original2modified = manager_.modify( pose );
341  }
342  }
343  if (basic::options::option[basic::options::OptionKeys::remodel::repeat_structure].user()) {
344 
345  Size len_start = remodel_data_.sequence.length();
346 
347  // length should honor the blueprint length, and subsequently if the input
348  // pose is longer than blueprint, allow copying of phi-psi beyond the last
349  // residue. only for repeats with matching blueprint and pdb lengths.
350  //cache the phi psi angles
351  //if (len_start < pose.total_residue() && len_start * (basic::options::option[basic::options::OptionKeys::remodel::repeat_structure]) == pose.total_residue() ){
352  if (len_start < pose.total_residue()){
353  for (Size i = len_start+1; i <= pose.total_residue(); i++){
354  cached_phi.push_back( pose.phi( i ) );
355  cached_psi.push_back( pose.psi( i ) );
356  cached_omega.push_back( pose.omega( i ));
357  }
358  //std::cout << "HERE1-1" << std::endl;
359 
360  Size max_pdb_index = remodel_data_.blueprint.size()*2;
361  //std::cout << "max_pdb index" << max_pdb_index << std::endl;
362 
363  while (pose.total_residue() >= max_pdb_index){
364  //std::cout << "pose total" << pose.total_residue() << std::endl;
366  }
367 
368  //similarly update archive pose in repeat cases
369  while (archive_pose.total_residue() >= max_pdb_index){
370  archive_pose.conformation().delete_residue_slow(archive_pose.total_residue());
371  }
372  }
373  }
374 
375  // REPEAT: used for fragment picking and others
377  if (basic::options::option[basic::options::OptionKeys::remodel::repeat_structure].user()) {
378  // adding a tail to the starter monomer pose
379  if ( pose.total_residue() < (remodel_data_.sequence.length()*2) ) {
380 
381  Size len_diff = (2*remodel_data_.sequence.length()) - pose.total_residue();
382  // append a tail of the same length
383  for (Size i = 1; i<= len_diff; i++){
384  core::chemical::ResidueTypeSet const & rsd_set = (pose.residue(1).residue_type_set());
388  pose.set_omega(pose.total_residue()-1,180);
389  }
390  }
391 
392  else if ( pose.total_residue() > (remodel_data_.sequence.length()*2)){
393  while (pose.total_residue() != (2* remodel_data_.sequence.length())){
395  }
396  }
397 
398  // similarly for archive_pose, process the same way for length
399  // adding a tail to the starter monomer pose
400  if ( archive_pose.total_residue() < (remodel_data_.sequence.length()*2) ) {
401 
402  Size len_diff = (2*remodel_data_.sequence.length()) - archive_pose.total_residue();
403  // append a tail of the same length
404  for (Size i = 1; i<= len_diff; i++){
405  core::chemical::ResidueTypeSet const & rsd_set = (archive_pose.residue(1).residue_type_set());
407  archive_pose.conformation().safely_append_polymer_residue_after_seqpos(* new_rsd,archive_pose.total_residue(), true);
408  archive_pose.conformation().insert_ideal_geometry_at_polymer_bond(archive_pose.total_residue()-1);
409  archive_pose.set_omega(archive_pose.total_residue()-1,180);
410  }
411  }
412 
413  else if ( archive_pose.total_residue() > (remodel_data_.sequence.length()*2)){
414  while (archive_pose.total_residue() != (2* remodel_data_.sequence.length())){
415  archive_pose.conformation().delete_residue_slow(archive_pose.total_residue());
416  }
417  }
418 
419 
420  assert( pose.total_residue() == (2* remodel_data_.sequence.length()));
422 
423  //update the new lengthened pose with pose angles.
424  for (Size i = remodel_data_.sequence.length()+1, j=1; i<= pose.total_residue(); i++,j++){
425  if (cached_phi.size() != 0){
426  pose.set_phi(i, cached_phi[j]);
427  pose.set_psi(i, cached_psi[j]);
428  pose.set_omega(i, cached_omega[j]);
429  }else {
430  pose.set_phi(i, 150);
431  pose.set_psi(i, 150);
432  pose.set_omega(i, 180);
433  }
434  }
435  }
436 
437  //flo may '12, give user supplied setup movers
438  //a chance to modify the pose before centroid building happens
439  //pose.dump_pdb("vlb_bef_setup_movers.pdb");
440  for( utility::vector1< moves::MoverOP >::iterator mover_it( setup_movers_.begin() ); mover_it != setup_movers_.end(); ++mover_it ){
441  (*mover_it)->apply( pose );
442  }
443  //pose.dump_pdb("vlb_aft_setup_movers.pdb");
444 
445  // fix the abego string to deal with ligands that might have been added to the pose
446  if( abego_.size() > 0 ) {
447  TR << "Abego size=" << abego_.size() << " and pose size=" << pose.total_residue() << std::endl;
448  //runtime_assert( abego_.size() <= pose.total_residue() );
449  // account for possible ligands in the pose
450  for ( core::Size i=abego_.size(); i<pose.total_residue(); ++i ) {
451  abego_.push_back("X");
452  }
453  }
454 
455  // centroid level protocol
456  if ( get_last_move_status() == MS_SUCCESS ) {
457  if ( pose.residue( 1 ).residue_type_set().name() != core::chemical::CENTROID ) {
459  }
460  //pose.dump_pdb("vlb_bef_centroid_build.pdb");
461  if ( centroid_build( pose ) ) {
463  } else {
464  pose=archive_pose;
466  return;
467  }
468  }
469  //pose.dump_pdb("vlb_aft_centroid_build.pdb");
470 
471  if (basic::options::option[basic::options::OptionKeys::remodel::repeat_structure].user()) {
472  if (basic::options::option[basic::options::OptionKeys::remodel::repeat_structure] == 1){
473  // do nothing
474  } else {
475  //remove the added residue
476  //pose.conformation().delete_residue_slow(pose.total_residue());
477 
478  //need to extend the archive pose, otherwise the connectivity is wrong
479  using namespace protocols::loops;
481  std::set< Interval > loop_intervals = manager_.intervals_containing_undefined_positions();
482  LoopsOP loops = new Loops( intervals_to_loops( loop_intervals.begin(), loop_intervals.end() ) );
483 
484  Pose bufferPose(archive_pose);
487  RLM.repeat_generation_with_additional_residue( bufferPose, archive_pose );
488 
489  }
490  }
491 
492  // flip back to prior residue type set if necessary
493  if ( pose.residue( 1 ).residue_type_set().name() != archive_pose.residue( 1 ).residue_type_set().name() ) {
495  }
496 
497  // recover side chains in fixed regions
498  restore_residues( original2modified, archive_pose, pose );
499 
500  // finalize wrt to success/failure
501  if ( get_last_move_status() == MS_SUCCESS ) {
502  if (!basic::options::option[basic::options::OptionKeys::remodel::RemodelLoopMover::bypass_closure].user()) {
503  // seal the tree
506  } else {
507  if (basic::options::option[basic::options::OptionKeys::remodel::repeat_structure].user()){
508  }
509  else {
510  pose.fold_tree( fold_tree_from_pose( pose, pose.fold_tree().root(), MoveMap() ) );
511  }
512  }
513  }
514  } else if ( recover_original_on_failure_ ) {
515 
516  // user desires the original Pose
517  pose = archive_pose;
518 
519  }
520 }
521 
522 
525  return "VarLengthBuild";
526 }
527 
528 /// @brief run centroid level protocol on given Pose
529 /// @return true if regions modeled within tolerances, false otherwise
531  Pose & pose
532 ) {
536 
540 
541  typedef utility::vector1< Interval > Intervals;
542 
543  // safety, clear the energies object
544  pose.energies().clear();
545 
546  // grab new secondary structure
547  String ss;
548  if ( !new_secondary_structure_override_.empty() ) { // user has overridden the string auto-setup
549 /*
550  // first check to make sure length of the override string corresponds
551  // to the working pose
552  if ( new_secondary_structure_override_.length() != pose.n_residue() ) {
553  // fail fast
554  TR.Error << "ERROR: new secondary structure override string not equal in length to newly modified Pose."
555  << " Expected " << pose.n_residue() << " but found " << new_secondary_structure_override_.length()
556  << ". Programmer mistake!" << std::endl;
557  runtime_assert( false );
558  }
559 */
561 
562  } else { // auto-setup, take directly from the pose
563  ss = pose.secstruct();
564  }
565 
566  // construct new amino acid sequence, possibly empty
567  String aa;
568  if ( !new_sequence_override_.empty() ) { // user has overridden the string auto-setup
569 
570  // first check to make sure length of the override string corresponds
571  // to the working pose
572 // if ( new_sequence_override_.length() != pose.n_residue() ) {
573 // // fail fast
574 // TR.Error << "ERROR: new sequence override string not equal in length to newly modified Pose."
575 // << " Expected " << pose.n_residue() << " but found " << new_sequence_override_.length()
576 // << ". Programmer mistake!" << std::endl;
577 // runtime_assert( false );
578 // }
579 
581 
582  } else if ( !original_sequence_.empty() ) { // auto-setup
583 
584  aa.append( pose.n_residue(), '.' ); // do dummy fill w/ '.' first
585 
586  // get mapping of positions that exist in both original sequence and
587  // "new" modified pose and fill in the original sequence info
589  for ( Original2Modified::const_iterator i = o2m.begin(), ie = o2m.end(); i != ie; ++i ) {
590  aa.at( i->second - 1 ) = original_sequence_.at( i->first - 1 );
591  }
592 
593  // fill in the sequence of the new regions from the "new" modified Pose
594  // that we're working on
596  for ( Positions::const_iterator i = np.begin(), ie = np.end(); i != ie; ++i ) {
597  aa.at( (*i) - 1 ) = pose.residue( *i ).name1();
598  }
599  }
600 
601  // data to feed to other parts of rosetta
602  Intervals fragment_only_regions;
603  loops::LoopsOP loops = new loops::Loops();
604 
605  // identify regions to rebuild and pick fragments
606  std::set< Interval > loop_intervals = manager_.intervals_containing_undefined_positions();
607 
608  if (basic::options::option[basic::options::OptionKeys::remodel::domainFusion::insert_segment_from_pdb].user()){
609  //unfortunately hacky... pre-process interval sets to make sure fragments
610  //aren't picked for the insertion region; should move this processing to
611  //buildManager at some point
612 
613  //find insertion
614  Size insertStartIndex = remodel_data_.dssp_updated_ss.find_first_of("I");
615  Size insertEndIndex = remodel_data_.dssp_updated_ss.find_last_of("I");
616 
617  //loop over the interval set to find insertion and split it into two sections
618  for ( std::set< Interval >::iterator i = loop_intervals.begin(), ie = loop_intervals.end(); i != ie; ++i ) {
619  Interval interval = *i;
620 
621  if (interval.left <= insertStartIndex && interval.right >= insertEndIndex && ((insertEndIndex-insertStartIndex) != 0)){
622  //found insertion
623 
624  //create new left interval
625  Interval split_interval_left(interval.left, insertStartIndex);
626  //create new right interval
627  Interval split_interval_right(insertEndIndex, interval.right);
628 
629  //insert the intervals to loop_intervals definition
630  loop_intervals.insert(split_interval_left);
631  loop_intervals.insert(split_interval_right);
632 
633  //delete the current interval
634  loop_intervals.erase( i );
635 
636  break; //expect only one insertion, so can jump out if found one.
637  }
638  }
639 
640  // pick fragments for insertion case
641  for ( std::set< Interval >::const_iterator i = loop_intervals.begin(), ie = loop_intervals.end(); i != ie; ++i ) {
642  Interval interval = *i;
643  if ( !( cache_fragments_ && fragments_picked_ ) ) {
644  pick_all_fragments( ss, aa, abego_, interval, num_fragpick_ );
645  }
646  }
647  fragments_picked_ = true;
648  }
649 
650  //after finishing picking fragments, revert the interval, in case the
651  //intervals are split by pdb insertion. need to revert because the insertion
652  //should be part of a single loop and not flanked by two connection rebuilt
653  //loops
655 
656  for ( std::set< Interval >::const_iterator i = loop_intervals.begin(), ie = loop_intervals.end(); i != ie; ++i ) {
657  Interval interval = *i;
658 
659  Size n_cuts = count_cutpoints( pose, interval.left, interval.right );
660 
661  if (basic::options::option[basic::options::OptionKeys::remodel::repeat_structure].user()) {
662  //if (interval.right == pose.total_residue()){
663  if (interval.right == remodel_data_.blueprint.size()){
664  //interval.right = interval.right + repeat_tail_length_; // pad interval to include the extra shadow residue in pose
665  interval.right = interval.right + 2; // pad interval to include the extra shadow residue in pose
666  }
667  }
668  TR << "VLB count_cutpoints " << n_cuts << " interval.left " << interval.left << " interval.right " << interval.right << std::endl;
669 
670  // multi-cutpoint region handling not implemented yet
671  runtime_assert( n_cuts < 2 );
672 
673  // setup regions
674  if (interval.left != 1 && interval.right != pose.n_residue()){ //internal loop
675 
676  Size cutpoint = find_cutpoint( pose, interval.left, interval.right );
677 
678  loops->add_loop( Loop( interval.left, interval.right, cutpoint, 0.0, true ) );
679  if (cutpoint == 0){
680  loops->choose_cutpoints(pose);
681  }
682 
683  } else if ( n_cuts == 0 ) { // fragment only region
684 
685  if (basic::options::option[basic::options::OptionKeys::remodel::repeat_structure].user()) {
686  loops->add_loop( Loop( interval.left, interval.right, 0, 0.0, true ) );//pick additional frame for connection to repeats
687  }else{
688  loops->add_loop( Loop( interval.left, interval.right, 0, 0.0, true ) );
689  }
690  }
691 
692  // Pick fragments. Choose num_fragpick_ ( default 200 ) per position per size.
693  if ( !( cache_fragments_ && fragments_picked_ ) ) {
694  //pick_all_fragments( ss, aa, interval, num_fragpick_ );
695  pick_all_fragments( ss, aa, abego_, interval, num_fragpick_ );
696  }
697  }
698 
699  // we're done picking fragments; report status and do memory management
700  fragments_picked_ = true;
701 
702 
703  if ( use_fullmer_ ) {
704  TR << "total full-mer fragments: " << fragfull_->size() << std::endl;
705  }
706  TR << "total 9-mer fragments: " << frag9_->size() << std::endl;
707  TR << "total 3-mer fragments: " << frag3_->size() << std::endl;
708  TR << "total 1-mer fragments: " << frag1_->size() << std::endl;
709 
710  switch ( vall_memory_usage_ ) {
712  break;
714  if ( cache_fragments_ ) {
715  FragmentLibraryManager::get_instance()->clear_Vall();
716  }
717  break;
719  FragmentLibraryManager::get_instance()->clear_Vall();
720  break;
721  default:
722  break;
723  }
724 
725  //setup eventual remodel constraints
727 
728  if ( (!ignore_cmdline_enzdes_cstfile_) && basic::options::option[basic::options::OptionKeys::enzdes::cstfile].user() ){
729 
731 
732  //safety
733  pose.remove_constraints();
734  //wipe out cst_cache
735  protocols::toolbox::match_enzdes_util::get_enzdes_observer( pose ) -> set_cst_cache( NULL );
736  //wipe out observer too
738 
739  //RemodelEnzdesCstModule cst(remodel_data);
740  cstOP->use_backbone_only_blocks();
741  cstOP->apply(pose);
742  cstOP->enable_constraint_scoreterms(sfx_);
743  }
744 
745  if (basic::options::option[ basic::options::OptionKeys::constraints::cst_file ].user()){
746  //safety
747  pose.remove_constraints();
748 
750  constraint->apply( pose );
751 
752  sfx_->set_weight(core::scoring::atom_pair_constraint, 1.0);
753  sfx_->set_weight(core::scoring::dihedral_constraint, 10.0);
754  }
755 
756 
757  // setup loop building protocol
758  MoverOP loop_mover = loop_mover_instance( loops, manager_.movemap() );
759 
760  // Run loop modeling. The loop movers return the original fold tree
761  // after apply(). Do we want that...? There's also no good way to
762  // check that the loop mover actually finished with a closed loop,
763  // which is troubling. For now we work around this by post-evaluating
764  // the chainbreak at the original cutpoint.
765  loop_mover->apply( pose );
766 
767  //remove the remodel constraints
769 
770  // evaluate all chainbreaks using linear chainbreak
771  bool cbreaks_pass = true;
772 
773  if (basic::options::option[basic::options::OptionKeys::remodel::RemodelLoopMover::bypass_closure].user() ){
774  return cbreaks_pass;
775  }
776 
777  for ( Loops::const_iterator l = loops->begin(), le = loops->end(); l != le && cbreaks_pass; ++l ) {
778  if ( l->cut() > 0 ) {
779  Real const c = linear_chainbreak( pose, l->cut() );
780  TR << "centroid_build: final chainbreak at " << l->cut() << " = " << c << " max tolerance " << max_linear_chainbreak_ << std::endl;
781  cbreaks_pass = c <= max_linear_chainbreak_;
782  }
783  }
784 
785  return cbreaks_pass;
786 }
787 
788 
789 /// @param[in] loops The loops to model.
790 /// @param[in] false_mm Enforce False settings in this MoveMap. Currently
791 /// only useful with the RemodelLoopMover.
793  loops::LoopsOP const loops,
794  MoveMap const & false_mm
795 )
796 {
801 
803 
804  MoverOP lm;
805 
806  if ( loop_mover_str_ == "RemodelLoopMover" ) { // use RemodelLoopMover
807  RemodelLoopMoverOP loop_mover = new RemodelLoopMover( loops );
808  loop_mover->scorefunction( *sfx_ );
809 
810  if (basic::options::option[basic::options::OptionKeys::remodel::repeat_structure].user()) {
811  loop_mover->set_repeat_tail_length( repeat_tail_length_ );
812  }
813 
814  if ( use_fullmer_ ) {
815  loop_mover->add_fragments( fragfull_ );
816  }
817  loop_mover->add_fragments( frag9_ );
818  loop_mover->add_fragments( frag3_ );
819  loop_mover->add_fragments( frag1_ );
820 
821  loop_mover->false_movemap( false_mm );
822 
823  if( loop_mover_fold_tree_constant_ ) loop_mover->set_keep_input_foldtree(true);
824 
825  if( user_provided_movers_.size() != 0 ){
826  loop_mover->set_user_provided_movers( user_provided_movers_ );
827  loop_mover->user_provided_movers_apply_cycle( user_provided_movers_apply_cycle_ );
828  }
829 
830  lm = loop_mover;
831 
832  } else { // use a mover from the IndependentLoopMover factory
833 
834  // protocols::loops really needs to get refactored; when this happens the
835  // artificial cast and setup below will change.
836  IndependentLoopMoverOP loop_mover( static_cast< IndependentLoopMover * >( loops::LoopMoverFactory::get_instance()->create_loop_mover( loop_mover_str_, loops ).get() ) );
837  loop_mover->set_scorefxn( sfx_ );
838  loop_mover->set_strict_loops( true ); // no sliding window
839 
840  if ( use_fullmer_ ) {
841  loop_mover->add_fragments( fragfull_ );
842  }
843  loop_mover->add_fragments( frag9_ );
844  loop_mover->add_fragments( frag3_ );
845  loop_mover->add_fragments( frag1_ );
846 
847  lm = loop_mover;
848  }
849 
850  return lm;
851 }
852 
853 
854 /// @brief pick fragments of size full, 9, 3, 1
855 /// @param[in] complete_ss The complete secondary structure string, typically from a Pose.
856 /// @param[in] complete_aa The complete amino acid string, typically from a Pose;
857 /// can be empty. If empty, sequence bias is not used to pick fragments.
858 /// @param[in] interval The interval [left, right] to pick fragments from; Pose
859 /// numbering (i.e. 1-based indexing).
860 /// @param[in] n_frags The number of fragments to pick per position.
862  String const & complete_ss,
863  String const & complete_aa,
864  utility::vector1< String > const & complete_abego,
865  Interval const & interval,
866  Size const n_frags
867 )
868 {
871 
873 
874  // pick full-mers
875  if ( use_fullmer_ ) {
876  if ( !fragfull_.get() ){
877  fragfull_ = new OrderedFragSet();
878  }
879 
880  fragfull_->add( pick_fragments( complete_ss, complete_aa, complete_abego, interval, interval.length(), n_frags ) );
881  }
882 
883  // pick 9-mers
884  if ( !frag9_.get() ) {
885  frag9_ = new ConstantLengthFragSet( 9 );
886  }
887  if ( basic::options::option[basic::options::OptionKeys::in::file::frag9].user() ){
888  frag9_->read_fragment_file( basic::options::option[basic::options::OptionKeys::in::file::frag9]());
889  } else {
890  frag9_->add( pick_fragments( complete_ss, complete_aa, complete_abego, interval, 9, n_frags ) );
891  }
892 
893  // pick 3-mers
894  if ( !frag3_.get() ) {
895  frag3_ = new ConstantLengthFragSet( 3 );
896  }
897  ConstantLengthFragSetOP tmp_frag3 = new ConstantLengthFragSet( 3 );
898  if ( basic::options::option[basic::options::OptionKeys::in::file::frag3].user() ){
899  tmp_frag3->read_fragment_file( basic::options::option[basic::options::OptionKeys::in::file::frag3]());
900  frag3_->read_fragment_file( basic::options::option[basic::options::OptionKeys::in::file::frag3]());
901  } else {
902  tmp_frag3->add( pick_fragments( complete_ss, complete_aa, complete_abego, interval, 3, n_frags ) );
903  frag3_->add( *tmp_frag3 );
904  }
905 
906  // make 1-mers from 3-mers
907  if ( !frag1_.get() ) {
908  frag1_ = new ConstantLengthFragSet( 1 );
909  }
910  frag1_->add( *smallmer_from_largemer( tmp_frag3->begin(), tmp_frag3->end(), 1 ) );
911 }
912 
913 
914 /// @brief pick fragments of a given length, padding when necessary
915 /// @param[in] complete_ss The complete secondary structure string, typically from a Pose.
916 /// @param[in] complete_aa The complete amino acid string, typically from a Pose;
917 /// can be empty. If empty, sequence bias is not used to pick fragments.
918 /// @param[in] interval The interval [left, right] to pick fragments from; Pose
919 /// numbering (i.e. 1-based indexing).
920 /// @param[in] frag_length The desired length of the fragments
921 /// @param[in] n_frags The number of fragments to pick per position.
923  String const & complete_ss,
924  String const & complete_aa,
925  utility::vector1< String > const & complete_abego,
926  Interval const & interval,
927  Size const frag_length,
928  Size const n_frags
929 )
930 {
931  using core::fragment::Frame;
934 
938 
939  FrameList frames;
940 
941  for ( Size j = 0, je = interval.length(); j < je; ++j ) {
942  TR << "picking " << n_frags << " " << frag_length << "-mers for position " << ( interval.left + j ) << std::endl;
943 
944  String ss_sub = complete_ss.substr( interval.left + j - 1, frag_length );
945  if ( ss_sub.length() < frag_length ) {
946  ss_sub.append( frag_length - ss_sub.length(), 'D' );
947  }
948 
949  String aa_sub;
950  if ( !complete_aa.empty() ) {
951  aa_sub = complete_aa.substr( interval.left + j - 1, frag_length );
952  if ( aa_sub.length() < frag_length ) {
953  aa_sub.append( frag_length - aa_sub.length(), '.' );
954  }
955  } else {
956  aa_sub = "";
957  }
958  //TR << "complete_ss length: " << complete_ss.length() << " complete_abego size: " << complete_abego.size() << std::endl;
959  utility::vector1< String > abego_sub;
960  if ( complete_abego.size() > 0 ) {
961  runtime_assert( complete_ss.length() == complete_abego.size() );
962  Size pos( 1 );
963  abego_sub.resize( frag_length );
964  for( Size ii = interval.left + j; ii <= interval.left + j + frag_length - 1; ++ii, ++pos ) {
965  if ( ii > complete_abego.size() ) {
966  abego_sub[ pos ] = "X";
967  } else {
968  abego_sub[ pos ] = complete_abego[ ii ];
969  }
970  }
971  } else {
972  abego_sub.clear(); // make sure it is empty
973  }
974 
975  FrameOP frame = new Frame( interval.left + j, frag_length );
976 
977  frame->add_fragment( pick_fragments( ss_sub, aa_sub, abego_sub, n_frags, true, IndependentBBTorsionSRFD() ) );
978 
979  // pick wrt sec.struct and possibly sequence bias
980  // if ( !complete_aa.empty() ) {
981  // String aa_sub = complete_aa.substr( interval.left + j - 1, frag_length );
982  // if ( aa_sub.length() < frag_length ) {
983  // aa_sub.append( frag_length - aa_sub.length(), '.' );
984  // }
985  // frame->add_fragment( pick_fragments_by_ss_plus_aa( ss_sub, aa_sub, n_frags, true, IndependentBBTorsionSRFD() ) );
986  // } else {
987  // frame->add_fragment( pick_fragments_by_ss( ss_sub, n_frags, true, IndependentBBTorsionSRFD() ) );
988  // }
989 
990  frames.push_back( frame );
991  }
992 
993  return frames;
994 }
995 
996 
997 /// @brief telling all rcgs to setup and insert constraints into the pose
998 void
1000  Pose & pose )
1001 {
1002  if ( rcgs_.empty() ) {
1003  return; // nothing to do...
1004  }
1005 
1006  for( utility::vector1< RemodelConstraintGeneratorOP >::iterator rcg_it = rcgs_.begin(); rcg_it != rcgs_.end(); ++rcg_it ){
1007  (*rcg_it)->set_seqmap( this->manager().sequence_mapping());
1008  TR << "Adding remodel constraints to pose using " << (*rcg_it)->get_name() << std::endl;
1009  (*rcg_it)->add_remodel_constraints_to_pose( pose );
1010  }
1011 }
1012 
1013 
1014 /// @brief telling all rcgs to remove their constraints from the pose
1015 void
1017  Pose & pose )
1018 {
1019  if ( rcgs_.empty() ) {
1020  return; // nothing to do...
1021  }
1022 
1023  for( utility::vector1< RemodelConstraintGeneratorOP >::iterator rcg_it = rcgs_.begin(); rcg_it != rcgs_.end(); ++rcg_it ){
1024  (*rcg_it)->remove_remodel_constraints_from_pose( pose );
1025  }
1026 }
1027 
1028 
1029 } // components
1030 } // forge
1031 } // protocols