Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
EnzdesFlexBBProtocol.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/enzdes/EnzdesFlexBBProtocol.cc
11 ///
12 /// @brief
13 /// @author Florian Richter
14 
15 
19 // AUTO-REMOVED #include <protocols/toolbox/match_enzdes_util/EnzConstraintIO.hh>
23 
27 // AUTO-REMOVED #include <core/chemical/ResidueTypeSet.hh>
28 
30 #include <core/fragment/util.hh>
31 #include <core/graph/graph_util.hh> //for deleting edges from graph in calculating lig part sums
32 #include <basic/options/option.hh>
33 #include <core/pack/interaction_graph/PDInteractionGraph.hh> //for calculating lig part sums
36 #include <core/pack/task/TaskFactory.hh> //task shit
38 #include <core/pack/packer_neighbors.hh> //for calculating lig part sums
39 #include <core/pack/rotamer_set/RotamerSets.hh> //for calculating lig part sums
41 #include <core/pose/PDBInfo.hh> //for getting pdb name
42 #include <core/pose/Pose.hh>
48 //#include <core/scoring/constraints/CoordinateConstraint.hh>
49 //#include <core/scoring/constraints/HarmonicFunc.hh>
50 #include <core/scoring/Energies.hh>
53 #include <core/scoring/rms_util.hh>
55 #include <protocols/simple_filters/ScoreCutoffFilter.hh> // for filtering kinematic mover
56 #include <protocols/loops/Loop.hh>
57 #include <protocols/loops/Loops.hh> //input file reading
60 // AUTO-REMOVED #include <protocols/simple_moves/PackRotamersMover.hh>
65 // AUTO-REMOVED #include <core/scoring/TwelveANeighborGraph.hh>
67 
68 #include <numeric/random/random.hh>
69 
70 #include <basic/Tracer.hh>
71 #include <basic/prof.hh>
72 
73 // Utility headers
74 #include <utility/string_util.hh>
75 #include <utility/sort_predicates.hh>
76 #include <utility/file/file_sys_util.hh> //checking file existence for loop pdb reading
77 
78 // Numeric headers
79 #include <numeric/statistics.functions.hh>
80 
81 //C++ Headers
82 // AUTO-REMOVED #include <ctime>
83 //#include <math.h> //std::min ?
84 // option key includes
85 
86 #include <basic/options/keys/loops.OptionKeys.gen.hh>
87 #include <basic/options/keys/backrub.OptionKeys.gen.hh>
88 #include <basic/options/keys/enzdes.OptionKeys.gen.hh>
89 #include <basic/options/keys/packing.OptionKeys.gen.hh>
90 #include <basic/options/keys/in.OptionKeys.gen.hh>
91 
95 #include <core/pose/util.hh>
97 #include <utility/vector0.hh>
98 #include <utility/vector1.hh>
99 
100 
101 namespace protocols{
102 namespace enzdes{
103 
104 static basic::Tracer tr("protocols.enzdes.EnzdesFlexBBProtocol");
105 
107 
109  : EnzdesBaseProtocol(),
110  enz_loops_file_(NULL),
111  mc_kt_low_(basic::options::option[basic::options::OptionKeys::enzdes::mc_kt_low] ),
112  mc_kt_high_(basic::options::option[basic::options::OptionKeys::enzdes::mc_kt_high] ),
113  brub_min_atoms_( basic::options::option[basic::options::OptionKeys::backrub::min_atoms] ),
114  brub_max_atoms_( basic::options::option[basic::options::OptionKeys::backrub::max_atoms] ),
115  loop_ensemble_size_( basic::options::option[basic::options::OptionKeys::enzdes::single_loop_ensemble_size]),
116  loopgen_trials_( basic::options::option[basic::options::OptionKeys::enzdes::loop_generator_trials] )
117 {
118  flex_regions_.clear();
119 
120  //if( loop_ensemble_size_ % 2 != 0 ) loop_ensemble_size_++;
121  //loop_ensemble_size_ /= 2; //divide by 2 because brub generates two reasonable structs for each run
122 
123  //brub_mover_ = new protocols::backrub::BackrubMover();
124  //apparently it's better to initialize the backrub mover new for every structure
125  brub_mover_ = NULL;
126  brub_pivot_atoms_.push_back("CA");
127 
128  /*
129  if( basic::options::option[ basic::options::OptionKeys::enzdes::enz_loops_file ].user() ){
130 
131  enz_loops_file_ = new toolbox::match_enzdes_util::EnzdesLoopsFile();
132 
133  if( !enz_loops_file_->read_loops_file( basic::options::option[ basic::options::OptionKeys::enzdes::enz_loops_file ] ) ){
134  utility_exit_with_message("Reading enzdes loops file failed");
135  }
136  }
137  */
138  if ( ! basic::options::option[ basic::options::OptionKeys::enzdes::kic_loop_sampling ] ) {
139  if( scorefxn_->has_zero_weight( core::scoring::mm_bend ) ){ scorefxn_->set_weight( core::scoring::mm_bend, 1.0 ); }
140 
141  if( reduced_sfxn_->has_zero_weight( core::scoring::mm_bend ) ){ reduced_sfxn_->set_weight( core::scoring::mm_bend, 1.0 ); }
142  }
143 
144  if( scorefxn_->has_zero_weight( core::scoring::rama ) ){
145 
146  if( reduced_sfxn_->has_zero_weight( core::scoring::rama ) ) {
147  scorefxn_->set_weight( core::scoring::rama, 1.0 );
148  }
149  else scorefxn_->set_weight( core::scoring::rama, reduced_sfxn_->weights()[core::scoring::rama] );
150 
151  }
152 
153  if( reduced_sfxn_->has_zero_weight( core::scoring::rama ) ){ reduced_sfxn_->set_weight( core::scoring::rama, 1.0 ); }
154 }
155 
156 void
158  core::pose::Pose & pose
159 ){
160 
161  using namespace basic::options;
162  using namespace basic::options::OptionKeys;
163  using namespace protocols::moves;
164  using namespace core::pack::task;
165 
166  //if ( ! basic::options::option[ basic::options::OptionKeys::enzdes::kic_loop_sampling ] ) {
167  // brub_mover_ = new protocols::backrub::BackrubMover();
168  // brub_mover_->set_native_pose( & pose );
169  //}
170  //kinematic_mover_ = new protocols::loops::kinematic_closure::KinematicMover();
171 
172  pack_region_ala_pose_ = pose;
173 
174  flex_regions_.clear();
175  fragment_counters_.clear();
176 
177  if( ! basic::options::option[basic::options::OptionKeys::in::file::native].user() ){
178 
179  core::pose::PoseOP natpose = new core::pose::Pose( pose );
180  (*scorefxn_)( *natpose );
181  this->set_native_pose( natpose );
182  }
183 
184 
185  // Scoring function already set up by superclass
186  //tr.Info << "starting apply function..." << std::endl;
187 
188  //set up constraints (read cstfile, do mapping, etc, then add to pose)
189  if( basic::options::option[basic::options::OptionKeys::enzdes::cstfile].user() ){
191  setup_enzdes_constraints( pose, false );
192  }
193 
194  //create packer task (read resfile, etc)
195  PackerTaskOP fixbb_pack_task;
196 
197  tr.Info << "Done setting up the task and constraints... " << std::endl;
198  //score pose to make sure everything is initialised correctly
199  (*scorefxn_)( pose );
200 
201  //cst opt stage, if demanded
202  if(basic::options::option[basic::options::OptionKeys::enzdes::cst_opt]){
203  fixbb_pack_task = create_enzdes_pack_task( pose );
204  tr.Info << "starting cst_opt minimization..." << std::endl;
205  cst_minimize(pose, fixbb_pack_task, true);
206  (*scorefxn_)( pose );
207  tr.Info << "done cst_opt minimization." << std::endl;
208  }
209 
210 
211  if(basic::options::option[basic::options::OptionKeys::enzdes::cst_design]){
212 
213  fixbb_pack_task = create_enzdes_pack_task( pose ); //make a new task in case the ligand has moved a lot
214  //setup_pose_metric_calculators( pose );
215 
216  determine_flexible_regions( pose, fixbb_pack_task );
217 
218  //we should also make those residues designable that have been deemed flexible
219  PackerTaskOP design_pack_task_template = modified_task( pose, *fixbb_pack_task );
220 
221  //make a polyalanine copy of the pose
222  utility::vector1< core::Size >positions_to_replace;
223  utility::vector1< core::Size >all_pack_positions;
224  for(core::Size i = 1, i_end = pose.total_residue(); i <= i_end; ++i) {
225  if( design_pack_task_template->pack_residue(i) && !pose.residue( i ).is_ligand() ) {
226  all_pack_positions.push_back( i );
227  if( ! is_catalytic_position( pose, i ) ) positions_to_replace.push_back( i );
228  }
229 
230  }
231  core::pose::PoseOP poly_ala_pose = new core::pose::Pose(pose);
232 
233  protocols::toolbox::pose_manipulation::construct_poly_ala_pose( *poly_ala_pose, positions_to_replace, true, true, true );
235 
236  core::scoring::EnergyMap const cur_emap = scorefxn_->weights();
237 
238  scorefxn_->set_weight( core::scoring::fa_sol, 0.0);
239 
240 
241  if( !this->recover_loops_from_file( *poly_ala_pose ) ){
242 
243  for( core::Size regcount = 1; regcount <= flex_regions_.size(); ++regcount ){
244 
245  generate_ensemble_for_region( *poly_ala_pose, regcount );
246 
247  //flex_regions_[regcount]->sort_ensemble_by_designability( pose, scorefxn_, design_pack_task_template);
248 
249  flex_regions_[regcount]->hack_fillup_frag_designabilities();
250 
251  if( basic::options::option[basic::options::OptionKeys::enzdes::enz_debug]) break;
252  } //loop over flexible regions
253  }
254 
255  /// Quit if we're only trying to generate loop files for the flexible regions.
256  if ( basic::options::option[ basic::options::OptionKeys::enzdes::dump_loop_samples ]() != "no"){
257 
258  std::string loops_pdb = pose.pdb_info()->name();
259  utility::file::FileName fname( loops_pdb );
260  loops_pdb = fname.base() + "_flex_loops.pdb";
261 
262  core::fragment::dump_frames_as_pdb( *poly_ala_pose, flex_regions_, loops_pdb, 2 );
263  }
264 
265  if ( basic::options::option[ basic::options::OptionKeys::enzdes::dump_loop_samples ]() == "quit_afterwards" ) {
266  utility_exit_with_message( "Exiting as requested by option enzdes::dump_loop_samples" );
267  }
268 
269  scorefxn_->set_weight(core::scoring::fa_sol, cur_emap[ core::scoring::fa_sol ]);
270 
271  //ok, we have our ensembles sorted by designability, now assemble combinations
272  //of ensemble members in order of best energies
273  //note: we can't minimize bond angles yet, so set them to 0
274  scorefxn_->set_weight( core::scoring::mm_bend, 0.0 );
275 
276  PackerTaskOP flex_pack_task = enzutil::recreate_task( pose, *design_pack_task_template );
277 
279  if( basic::options::option[basic::options::OptionKeys::packing::soft_rep_design] ) flexpack_sfxn = soft_scorefxn_;
280 
281  flexpack::FlexPackerOP flex_packer = new flexpack::FlexPacker( flex_pack_task, flex_regions_, flexpack_sfxn );
282 
283  time_t flex_start_time = time( NULL );
284  flex_packer->apply( pose );
285  time_t flex_end_time = time( NULL );
286 
287  tr << " flexpacker took " << long( flex_end_time - flex_start_time ) << " seconds. " << std::endl;
288 
289  if( option[OptionKeys::enzdes::cst_min] ) cst_minimize( pose, flex_pack_task );
290 
291  //should we do some fixbb design rounds afterward?
292  if( option[OptionKeys::enzdes::design_min_cycles] > 1 ){
293 
294  core::Size fixbb_cycles = option[OptionKeys::enzdes::design_min_cycles] - 1;
295  tr << "Doing " << fixbb_cycles << " rounds of fixbb design/min after flexpacking... " << std::endl;
296 
297  PackerTaskOP fix_pack_task = enzutil::recreate_task( pose, *design_pack_task_template );
298 
299  enzdes_pack( pose, fix_pack_task, scorefxn_, fixbb_cycles, basic::options::option[basic::options::OptionKeys::enzdes::cst_min], false, option[ OptionKeys::enzdes::favor_native_res].user() );
300 
301 
302  }
303 
304  //do a repack without constraints
305  if( ! basic::options::option[basic::options::OptionKeys::enzdes::no_unconstrained_repack]){
306  PackerTaskOP repack_task = create_enzdes_pack_task( pose, false );
307  enzdes_pack( pose, repack_task, scorefxn_, basic::options::option[basic::options::OptionKeys::enzdes::cst_min].user(), 1, true, false );
308  }
309 
310  } //if cst_design
311 
312 } //apply function
313 
314 
317  return "EnzdesFlexBBProtocol";
318 }
319 
320 void
322 {
323 
324  using namespace basic::options;
325 
326  option.add_relevant( OptionKeys::enzdes::dump_loop_samples );
327  option.add_relevant( OptionKeys::loops::loop_file );
328  option.add_relevant( OptionKeys::enzdes::enz_loops_file );
329  option.add_relevant( OptionKeys::enzdes::cst_predock );
330  option.add_relevant( OptionKeys::enzdes::kic_loop_sampling);
331  option.add_relevant( OptionKeys::enzdes::mc_kt_low);
332  option.add_relevant( OptionKeys::enzdes::mc_kt_high);
333  option.add_relevant( OptionKeys::enzdes::single_loop_ensemble_size);
334  option.add_relevant( OptionKeys::enzdes::loop_generator_trials );
335 
336  option.add_relevant( OptionKeys::enzdes::no_catres_min_in_loopgen );
337  option.add_relevant( OptionKeys::enzdes::min_cacb_deviation );
338  option.add_relevant( OptionKeys::enzdes::max_bb_deviation_from_startstruct );
339  option.add_relevant( OptionKeys::enzdes::max_bb_deviation );
340  option.add_relevant( OptionKeys::enzdes::checkpoint );
341 
343 
344 }
345 
346 
347 
348 bool
350 {
351  for( core::Size i = 1; i <= flex_regions_.size(); ++i ){
352  if( ( seqpos >= flex_regions_[i]->start() ) && ( seqpos <= flex_regions_[i]->end() ) ) return true;
353  }
354  return false;
355 }
356 
357 bool
359 {
360  for( core::Size i = 1; i <= flex_regions_.size(); ++i ){
361  if( !flex_regions_[i]->remodelable() ) continue;
362  if( ( seqpos >= flex_regions_[i]->start() ) && ( seqpos <= flex_regions_[i]->end() ) ) return true;
363  }
364 
365  return false;
366 }
367 
368 
369 /// As output, residue_position[i] is true for all neighbor residues including orginal input residues.
370 /// The function is used to find all neighboring residues of the loop residues in case they need to be
371 /// repacked or minimized in fullatom refinement.
372 void
374  core::pose::Pose const & pose,
375  utility::vector1<bool> & residue_positions
376 )
377 {
378  //make a local copy first because we will change content in residue_positions
379  core::scoring::TenANeighborGraph const & tenA_neighbor_graph( pose.energies().tenA_neighbor_graph() );
380  for ( Size i=1; i <= pose.total_residue(); ++i ) {
381  if ( !is_remodelable(i) && !is_flexible(i) ) continue;
382  core::graph::Node const * current_node( tenA_neighbor_graph.get_node(i)); // find neighbors for this node
383  for ( core::graph::Node::EdgeListConstIter it = current_node->const_edge_list_begin();
384  it != current_node->const_edge_list_end(); ++it ) {
385  Size pos = (*it)->get_other_ind(i);
386  if (pose.residue(pos).type().name() == "CYD") continue;
387  residue_positions[ pos ] = true;
388  // tr << "residue pos TenAGraph " << pos << std::endl;
389  }
390  }
391 }
392 
393 
396  core::pose::Pose const & pose,
397  core::pack::task::PackerTask const & orig_task
398 ){
399 
400  using namespace core::pack::task;
401 
402  tr << "Modifiyng task according to flexible regions. The following residues are additionally set to designing: ";
403 
404  PackerTaskOP mod_task = TaskFactory::create_packer_task( pose );
405  mod_task->initialize_from_command_line();
406 
407  utility::vector1 < bool > remodel_loop_interface( pose.total_residue(), false );
408  get_tenA_neighbor_residues(pose, remodel_loop_interface);
409 
410  for( core::Size i = 1; i <= pose.total_residue(); i++ ){
411 
412  //first, we need to copy the rotamer and rotamerset operations
413  for( core::pack::rotamer_set::RotamerOperations::const_iterator rot_it = orig_task.residue_task(i).rotamer_operations().begin(); rot_it != orig_task.residue_task(i).rotamer_operations().end(); ++rot_it ){
414  mod_task->nonconst_residue_task( i ).append_rotamer_operation( *rot_it );
415  }
416  for( core::pack::rotamer_set::RotSetOperationListIterator rotset_it = orig_task.residue_task(i).rotamer_set_operation_begin(); rotset_it != orig_task.residue_task(i).rotamer_set_operation_end(); ++rotset_it ){
417  mod_task->nonconst_residue_task( i ).append_rotamerset_operation( *rotset_it );
418  }
419 
420  if( is_catalytic_position( pose, i ) ) {
421 
422  if( !basic::options::option[basic::options::OptionKeys::enzdes::fix_catalytic_aa] ) mod_task->nonconst_residue_task(i).restrict_to_repacking();
423 
424  else mod_task->nonconst_residue_task(i).prevent_repacking();
425  }
426 
427  /// APL TEMP HACK: Try to make the flexbb protocol as similar to the fixbb protocol as possible by not allowing design
428  /// at extra positions.
429  else if( orig_task.pack_residue( i ) && is_flexible( i ) && !is_remodelable( i ) && ( ! orig_task.design_residue( i )) ){
430  mod_task->nonconst_residue_task(i).restrict_to_repacking();
431  }
432 
433  else if( orig_task.pack_residue( i ) && !is_flexible( i ) && ( ! orig_task.design_residue( i )) ){
434  mod_task->nonconst_residue_task(i).restrict_to_repacking();
435  }
436 
437  else if ( remodel_loop_interface[i] && !orig_task.design_residue( i ) && !orig_task.pack_residue( i ) && !is_flexible( i ) && !is_remodelable( i ) ){
438  mod_task->nonconst_residue_task(i).restrict_to_repacking();
439  //tr << i << "+";
440  }
441 
442  else if( !(orig_task.pack_residue( i ) || orig_task.design_residue( i ) ) && !is_flexible( i ) ){
443  mod_task->nonconst_residue_task( i ).prevent_repacking() ;
444  }
445 
446  //tr << std::endl;
447  //decision done
448 
449  if( mod_task->design_residue(i) ) {
450 
451  //std::cerr << i << " is designing in mod task, ";
452 
453  //ok, some restrictions apply
454  if( pose.residue( i ).name3() == "CYS" && pose.residue( i ).has_variant_type( core::chemical::DISULFIDE ) ){
455  mod_task->nonconst_residue_task( i ).restrict_to_repacking();
456  }
457 
458  else{
459 
461  all_aas[ core::chemical::aa_cys ] = false;
462 
464 
465  for( ResidueLevelTask::ResidueTypeCOPListConstIter res_it = orig_task.residue_task( i ).allowed_residue_types_begin(); res_it != orig_task.residue_task( i ).allowed_residue_types_end(); ++res_it) {
466 
467  keep_aas[ (*res_it)->aa() ] = true;
468  }
469 
470 
471  if( orig_task.design_residue(i) ){
472  mod_task->nonconst_residue_task(i).restrict_absent_canonical_aas( keep_aas );
473  }
474 
475  else {
476  tr << i << "+";
477  mod_task->nonconst_residue_task(i).restrict_absent_canonical_aas( all_aas );
478  }
479  }
480  //std::cerr << std::endl;
481  }
482 
483  } //loop over all residues
484  tr << std::endl;
485 
486  //don't forget to copy the upweighters
487  if( orig_task.IGEdgeReweights() ) {
488  for( utility::vector1< IGEdgeReweighterOP >::const_iterator it = orig_task.IGEdgeReweights()->reweighters_begin(); it != orig_task.IGEdgeReweights()->reweighters_end(); ++it){
489  mod_task->set_IGEdgeReweights()->add_reweighter( *it );
490  }
491  }
492 
493  return mod_task;
494 }
495 
496 
497 
498 void
500  core::pose::Pose const & pose,
501  core::id::SequenceMapping const & smap
502 ){
503  EnzdesBaseProtocol::remap_resid( pose, smap );
504  for( core::Size regcount = 1; regcount <= flex_regions_.size(); ++regcount ){
505  if( !flex_regions_[regcount]->remap_resid( pose, smap ) ) utility_exit_with_message("Failed to remap resid for flexible region");
506  }
507 }
508 
509 void
511  core::pose::Pose const & pose,
513 )
514 {
515  //flex regions need to have a minimum length, since we don't want to be diversifying 2 or 3 residue stretches
516  core::Size no_flex_regions(0);
517  flex_regions_.clear();
518 
519  tr << "Determining regions to be treated as flexible... " << std::endl;
520 
521  //is there an enzdes loops file?
523  else if( !enz_loops_file_ && basic::options::option[ basic::options::OptionKeys::enzdes::enz_loops_file ].user() ){
524 
526 
527  if( !loops_file->read_loops_file( basic::options::option[ basic::options::OptionKeys::enzdes::enz_loops_file ] ) ){
528  utility_exit_with_message("Reading enzdes loops file failed");
529  }
530  enz_loops_file_ = loops_file;
531  }
532 
533  if( enz_loops_file_ ){
534 
535  //if the SpecialSegmentsObserver in the pose cache has been set,
536  //loop start and end will be taken from it, in case another
537  //loop has been previously remodeled with indels
541  segob = utility::pointer::static_pointer_cast< core::pose::datacache::SpecialSegmentsObserver const >( cache_ob );
542  runtime_assert( segob->segments().size() == enz_loops_file_->num_loops() );
543  }
544 
545  for( core::Size i(1); i <= enz_loops_file_->num_loops(); ++i){
546 
547  core::Size lstart(0), lstop(0);
548 
549  if( segob ){
550  lstart = segob->segments()[i].first;
551  lstop = segob->segments()[i].second - 1; //segment convention
552  }
553  else if ( enz_loops_file_->loop_info( i )->pose_numb() ) {
554 
555  lstart = enz_loops_file_->loop_info( i )->start();
556 
557  lstop = enz_loops_file_->loop_info( i )->stop();
558 
559  } else if ( enz_loops_file_->loop_info( i )->pdb_numb() ) {
560 
561  lstart =
562  pose.pdb_info() -> pdb2pose(
563  enz_loops_file_->loop_info( i )->start_pdb_chain(),
564  enz_loops_file_->loop_info( i )->start_pdb() );
565 
566  lstop =
567  pose.pdb_info() -> pdb2pose(
568  enz_loops_file_->loop_info( i )->stop_pdb_chain(),
569  enz_loops_file_->loop_info( i )->stop_pdb() );
570 
571  }
572 
573  core::Size length( lstop - lstart +1 );
574 
575  flex_regions_.push_back( new EnzdesFlexibleRegion( i, lstart, lstop, length, pose, this ) );
576  tr << " " << lstart << "-" << lstop;
577 
578  core::Size min_length( enz_loops_file_->loop_info( i )->min_length() );
579  core::Size max_length( enz_loops_file_->loop_info( i )->max_length() );
580 
581  //if( (min_length != length) || (max_length != length ) ){
582  flex_regions_[i]->declare_remodelable( min_length, max_length );
583  tr << " (remodelable with min_length " << min_length << " and max_length " << max_length << ")";
584  //}
585  tr << ", ";
586  }
587  }
588 
589  //is there a regular loops file?
590  else if( basic::options::option[basic::options::OptionKeys::loops::loop_file].user() ){
591 
592  // we're hijacking the loop file reader
593  loops::Loops loops_helper( true );
594 
595  tr << "reading information from loops file " << loops_helper.loop_file_name() << ": loops are " ;
596 
597 
598  for( utility::vector1< loops::Loop >::const_iterator lit = loops_helper.v_begin(); lit != loops_helper.v_end(); ++lit){
599  no_flex_regions++;
600  core::Size lstart( lit->start() ), lstop( lit->stop() );
601  flex_regions_.push_back( new EnzdesFlexibleRegion( no_flex_regions, lstart, lstop, lstop - lstart + 1, pose, this ) );
602  tr << " " << lstart << "-" << lstop;
603 
604  if( lit->is_extended() ){
605 
606  core::Size min_length( lit->cut() ), max_length( (core::Size) lit->skip_rate() );
607 
608  flex_regions_[no_flex_regions]->declare_remodelable( min_length, max_length );
609 
610  tr << " (remodelable with min_length " << min_length << " and max_length " << max_length << ")";
611  }
612  tr << ", ";
613  }
614  } else {
615  //if not, determine the flex regions automatically
616 
617  core::Size const min_flex_length = 6;
618  utility::vector1< bool > flex_res( pose.total_residue(), false );
619 
620  for( core::Size i = 1; i<= pose.total_residue(); ++i){
621  if( ( task->design_residue( i ) || is_catalytic_position( pose, i ) ) && pose.residue(i).is_polymer() ) flex_res[i] = true;
622  }
623 
624  enzutil::make_continuous_true_regions_in_bool_vector( flex_res, min_flex_length );
625 
626  //make sure that the first residue isn't flexible and that no ligand was set to flexible
627  flex_res[1] = false;
628  for( core::Size i = 1; i<= pose.total_residue(); ++i){
629  if( flex_res[i] && !pose.residue(i).is_polymer() ){
630 
631  core::Size lower( std::max( core::Size (1), i-1) );
632  core::Size upper( std::min( i+1, pose.total_residue() ) );
633  if( (flex_res[lower] && (lower != i ) ) && (flex_res[upper] && (upper != i ) ) ) utility_exit_with_message("Somehow a non polymer residue got into the middle of a flexible region.");
634 
635  flex_res[i] = false;
636  }
637  }
638 
639  for( core::Size i = 1; i<= pose.total_residue(); ++i){
640  if( flex_res[i] ){
641  core::Size j = i;
642 
643 
644  while( flex_res[j] && (j <= pose.total_residue()) ) j++;
645 
646  no_flex_regions++;
647  flex_regions_.push_back( new EnzdesFlexibleRegion( no_flex_regions, i, j - 1, (j - i), pose, this ) );
648  //fragment_counters_.push_back( 1 );
649  tr << "found " << i << "-" << j - 1 << ", ";
650  i = j;
651  }
652  }
653  } //automatic flex region determination
654 
655  for( core::Size i = 1; i <= flex_regions_.size(); ++i) fragment_counters_.push_back( 1 );
656  tr << flex_regions_.size() << " flexible regions in total." << std::endl;
657 
658 } //determine_flexible_regions function
659 
660 
661 
662 void
664  core::pose::Pose & pose,
665  core::Size region
666 )
667 {
668  time_t start_time = time(NULL);
669 
670  tr << "Starting to generate ensemble for region " << region << " ( aiming for " << loop_ensemble_size_ << " members, " << loopgen_trials_ << " brub trials for each ) ... " << std::endl;
671  tr.flush();
672 
673  if ( ! basic::options::option[ basic::options::OptionKeys::enzdes::kic_loop_sampling ] ) {
675  //brub_mover_->set_native_pose( & pose );
676  }
678 
679  (*reduced_scorefxn())( pose );
680 
681  minimize_cats_ = !( basic::options::option[basic::options::OptionKeys::enzdes::no_catres_min_in_loopgen].user()) && flex_regions_[region]->contains_catalytic_res();
682 
684 
685  Size const region_size( flex_regions_[region]->positions().size() );
686 
687  Size const rbegin( flex_regions_[region]->positions()[ 1 ] );
688  Size const rend( flex_regions_[region]->positions()[ flex_regions_[region]->positions().size()] );
689  Size const region_middle( (region_size + 1) / 2 );
690  Size rmid( flex_regions_[region]->positions()[ region_middle ] );
691 
692  /// NOTE: proline and pre-proline residues have a very sensitive Rama distribution; try to avoid
693  /// them as pivot residues.
694  if ( pose.residue_type( rmid ).aa() == core::chemical::aa_pro ) {
695  // try to avoid prolines as the middle residue in the pivot.
696  rmid += 1;
697  } else if ( pose.residue_type( rmid + 1 ).aa() == core::chemical::aa_pro ) {
698  // try also to avoid pre-pro residues.
699  rmid -= 1;
700  }
701 
702  core::kinematics::FoldTree ft_old = pose.fold_tree();
703  core::kinematics::FoldTree ft_temp = pose.fold_tree();
704 
705  if ( rend <= pose.total_residue() - 3 && pose.chain( rbegin ) == pose.chain( rend + 2 ) ) {
706  using namespace core::kinematics;
707  //std::cout << "orig fold tree " << ft << std::endl;
708  //ft_temp.new_jump( rbegin, rend+2, rend+1 );
709  ft_temp.new_jump( rbegin, rend+3, rend+2 );
710  //std::cout << "new fold tree? " << ft << std::endl;
711  pose.fold_tree( ft_temp );
712  }
713 
714  kinematic_mover_->set_pivots(rbegin, rmid, rend);
715 
717 
718  if ( basic::options::option[ basic::options::OptionKeys::enzdes::kic_loop_sampling ] ) {
719 
721  bump_filter->set_positions( flex_regions_[region]->positions() );
722  bump_filter->set_score_type( core::scoring::fa_rep );
723  bump_filter->set_cutoff( bump_filter->get_score( pose ) + region_size * 0.2 );
724 
725  kinematic_mover_->clear_filters();
726  kinematic_mover_->set_rama_check( false );
727  kinematic_mover_->set_hardsphere_bump_check( true );
728  //kinematic_mover_->add_filter( bump_filter );
729  kinematic_mover_->set_sfxn( reduced_scorefxn() );
730  kinematic_mover_->set_do_sfxn_eval_every_iteration( false );
731 
732 
733  core::Real sample_vicinity = 15.0; //( region_size > 10 ? 1.0 : 40.0 / region_size );
734  //perturber->set_sample_vicinity( true );
735  perturber->set_degree_vicinity( sample_vicinity );
736  perturber->set_max_sample_iterations( 100 );
737 
738  kinematic_mover_->set_idealize_loop_first( false );
739  kinematic_mover_->set_perturber( perturber );
740 
741  generate_alc_ensemble_for_region( pose, region );
742  //if ( flex_regions_[ region ]->nr_frags() < loop_ensemble_size_ ) {
743  /// try again choosing different pivot residues?
744  // generate_alc_ensemble_for_region( pose, region, true );
745  //}
746  } else {
747 
748  core::Real sample_vicinity = 2.0;
749  //perturber->set_sample_vicinity( true );
750  perturber->set_degree_vicinity( sample_vicinity );
751  perturber->set_max_sample_iterations( 100 );
752 
753  kinematic_mover_->set_rama_check( false );
754  kinematic_mover_->set_hardsphere_bump_check( false );
755  kinematic_mover_->set_do_sfxn_eval_every_iteration( false );
756  kinematic_mover_->set_idealize_loop_first( true );
757  kinematic_mover_->set_perturber( perturber );
758 
759  generate_backrub_ensemble_for_region( pose, region );
760  }
761 
762  minimize_cats_ = false;
763  catmin_movemap_ = NULL;
764  catmin_mover_ = NULL;
765  brub_mover_ = NULL;
766  pose.fold_tree( ft_old );
767 
768  time_t end_time = time(NULL);
769 
770  tr << " done generating ensemble for region " << region << " in " << long(end_time - start_time ) << " seconds. " << std::endl;
771  tr.flush();
772 
773 }
774 
775 bool
777  core::pose::Pose & pose,
778  core::Size region,
780  std::set< core::Size > const & chi_to_move,
781  bool const including_CA_angles,
782  core::Real min_tolerance
783 )
784 {
785  return flex_regions_[region]->minimize_region( pose, scorefxn, chi_to_move, including_CA_angles, min_tolerance );
786 }
787 
788 void
790  core::pose::Pose & pose,
791  core::Size region
792 )
793 {
794  using namespace core;
795  using namespace core::fragment;
796  using namespace core::chemical;
797 
798  flex_regions_[region]->set_target_proximity_to_starting_conformation(
799  std::min( 0.2, basic::options::option[basic::options::OptionKeys::enzdes::max_bb_deviation_from_startstruct] / 2) );
800  /// It's easy to generate tons of conformations; score and store them and then weed through them later.
801  std::list< std::pair< Real, FragDataOP > > scored_confs;
802  FragDataOP example_fragment = flex_regions_[region]->fragment_ptr( 1 )->clone();
803 
804  /// Faster kinematics and scoring if the right fold-tree topology is in place.
805  core::pose::Pose local_pose( pose );
806  (*reduced_scorefxn())( local_pose );
807 
808  //if rend is near the end of the pose, then it won't help to add a jump, so don't bother
809  //if ( rend <= pose.total_residue() - 2 && pose.chain( rbegin ) == pose.chain( rend + 2 ) ) {
810  // using namespace core::kinematics;
811  // FoldTree ft = pose.fold_tree();
812  //std::cout << "orig fold tree " << ft << std::endl;
813  // ft.new_jump( rbegin, rend+2, rend+1 );
814  //std::cout << "new fold tree? " << ft << std::endl;
815  // local_pose.fold_tree( ft );
816  //}
817 
818  //local_pose.dump_pdb( "alc_local_pose_" + utility::to_string( rbegin ) + "_" + utility::to_string( rend ) + ".pdb" );
819 
820  core::Size const rbegin( flex_regions_[region]->positions()[ 1 ] );
821  core::Size const rend( flex_regions_[region]->positions()[ flex_regions_[region]->positions().size()] );
822  core::Size const len = rend - rbegin + 1;
823 
824  utility::vector1< core::pose::PoseOP > loop_poses; loop_poses.reserve( loop_ensemble_size_ );
825  core::pose::PoseOP native_loop_pose = new core::pose::Pose();
826  utility::vector1< core::Real > rmsd_to_native; rmsd_to_native.reserve( loop_ensemble_size_ );
827  flex_regions_[region]->fragment_as_pose( 1, *native_loop_pose, this->restype_set() );
828  native_loop_pose->prepend_polymer_residue_before_seqpos( pose.residue( flex_regions_[region]->start() - 1) , 1, false );
829  native_loop_pose->copy_segment( flex_regions_[region]->length() + 1, pose, 1, flex_regions_[region]->start() - 1 );
830  loop_poses.push_back( native_loop_pose );
831  core::pose::Pose loop_template_pose = *native_loop_pose;
832 
833  core::Real mc_decrement( (mc_kt_high_ - mc_kt_low_ ) / loopgen_trials_ );
834  core::Real mc_temp( mc_kt_high_);
835 
836  protocols::moves::MonteCarlo mc( local_pose, *reduced_scorefxn(), mc_temp );
837 
838 
839  static Size count_output = 1;
840  core::Real kinmover_successrate(0.0);
841  core::Size kinmover_successes(0), kintrials( loopgen_trials_ );
842 
843  //core::Size successive_failures(0);
844 
845  //core::Real const native_score = local_pose.energies().total_energies()[ core::scoring::total_score ];
846 
847  for( core::Size outerloop = 1; outerloop <= ( 5*loop_ensemble_size_) ; outerloop++ ){
848 
849  mc.reset( local_pose );
850  mc_temp = mc_kt_high_;
851  mc.set_temperature( mc_temp );
852 
853  kinmover_successes = 0;
854 
855  for ( core::Size kinits = 1; kinits <= kintrials; ++kinits ){
856 
857  //every 10th iteration reset the pose to the native to avoid drift
858  //if( kinits % 10 == 0 ) example_fragment->apply( local_pose, flex_regions_[region]->start(), flex_regions_[region]->stop() );
859 
860 
861  //if the kinematic mover has sampled itself to a region where it's
862  //difficult to get closed solutions, put back one of the previous confs
863  //if( successive_failures > 5 ){
864 
865  // if( flex_regions_[region]->apply( numeric::random::random_range( 1, flex_regions_[region]->nr_frags() ), pose ) != flex_regions_[region]->length() ) utility_exit_with_message("unknown error when trying to apply a random fragment during ensemble generation.");
866  //}
867 
868  //std::cerr << "outerloop " << outerloop << " Kinit " << kinits << ".... ";
869  if( len > 3 ){
870  core::Size p1( numeric::random::random_range( rbegin, rend - 3) );
871  core::Size p2( numeric::random::random_range( p1+1, rend - 1) );
872  core::Size p3( numeric::random::random_range( p2+1, rend) ) ;
873  kinematic_mover_->set_pivots(p1, p2, p3);
874  }
875 
876  kinematic_mover_->apply( local_pose );
877 
878  if( !kinematic_mover_->last_move_succeeded() ){
879  //successive_failures++;
880  continue;
881  }
882  //else successive_failures = 0;
883 
884  kinmover_successes++;
885 
886  (*reduced_scorefxn())( local_pose );
887 
888  //std::cerr << "Kinit " << kinits << " was successful.... " << std::endl;
889  if( minimize_cats_ ) catmin_mover_->apply( local_pose );
890 
891  ++count_output;
892  //std::cout << "Found one sc: " << (*reduced_scorefxn())( local_pose ) << std::endl;
893  ///local_pose.dump_pdb( "test_sweep_" + utility::to_string( count_output ) + ".pdb" );
894  Real score = local_pose.energies().total_energies()[ core::scoring::total_score ];
895 
896  FragDataOP newfrag = example_fragment->clone();
897  newfrag->steal( local_pose, *flex_regions_[region] );
898  //newfrag->apply( pose, *flex_regions_[region] );
899  //pose.dump_pdb( "test_sweep_after_apply_stolen_" + utility::to_string( count_output ) + ".pdb" );
900  scored_confs.push_back( std::make_pair( score, newfrag ) );
901 
902  mc_temp = mc_temp - mc_decrement;
903  mc.set_temperature( mc_temp );
904  mc.boltzmann( local_pose );
905 
906  } //kinit iterations
907 
908  //on the first iteration, we determine how difficult it is for the kinematic mover
909  //to generate confs for this particular loop
910  //then we scale kintrials by the successrate
911  if( kinmover_successes > 0 ){
912  kinmover_successrate = ( (core::Real) kinmover_successes) / ( (core::Real) kintrials );
913  kintrials = std::min( 5 * loopgen_trials_, (core::Size)(loopgen_trials_ / kinmover_successrate) );
914 
915  //std::cerr << "setting kinmover succesrate to " << kinmover_successrate << " ( " << kinmover_successes << " successful moves ) and kintrials to " << kintrials << " ";
916  }
917 
918  //native_loop_pose->dump_pdb( "alc_native_loop_pose_" + utility::to_string( rbegin ) + "_" + utility::to_string( rend ) + ".pdb" );
919 
920 
921  //std::sort( scored_confs.begin(), scored_confs.end(), utility::SortFirst< Real, FragDataOP >() );
922  //scored_confs.sort( utility::SortFirst< Real, FragDataOP >() );
923 
924  /// check the fragments the first time. we're only examining those that have a better score than the native
925  /*
926  for ( std::list< std::pair< Real, FragDataOP > >::iterator list_it = scored_confs.begin(),
927  list_end = scored_confs.end(); list_it != list_end; ) {
928 
929  //std::list< std::pair< Real, FragDataOP > >::iterator iter_next = list_it;
930  //iter_next++;
931 
932  if( list_it->first > native_score ){
933  break;
934  }
935 
936  //std::cout << "ScoredConfs sorted: " << ii << " " << scored_confs[ ii ].first << " accepted: " << flex_regions_[region]->nr_frags() << " nloop_poses: " << loop_poses.size() << std::endl;
937  list_it->second->apply( local_pose, flex_regions_[region]->start(), flex_regions_[region]->stop() );
938 
939  if(flex_regions_[region]->examine_new_loopconf( local_pose, loop_template_pose, loop_poses, rmsd_to_native ) ){
940  list_it = scored_confs.erase( list_it );
941  if ( flex_regions_[region]->nr_frags() == loop_ensemble_size_ ) break;
942  }
943  else ++list_it;
944  }
945  */
946 
947  //we remember both the lowest score pose as well as the last accepted one
948  flex_regions_[region]->examine_new_loopconf( mc.lowest_score_pose(), loop_template_pose, loop_poses, rmsd_to_native );
949  if ( flex_regions_[region]->nr_frags() == loop_ensemble_size_ ) break;
950 
951  flex_regions_[region]->examine_new_loopconf( mc.last_accepted_pose(), loop_template_pose, loop_poses, rmsd_to_native );
952  if ( flex_regions_[region]->nr_frags() == loop_ensemble_size_ ) break;
953 
954 
955  if ( flex_regions_[region]->nr_frags() == loop_ensemble_size_ ) break;
956 
957  //now put a random one of the previously generated regions into the pose, might help with generating diversity
958  if( flex_regions_[region]->apply( numeric::random::random_range( 1, flex_regions_[region]->nr_frags() ), pose ) != flex_regions_[region]->length() ) utility_exit_with_message("unknown error when trying to apply a random fragment during ensemble generation.");
959 
960  //std::cerr << kinmover_successes << " kinsuccesses in outeriteration " << outerloop << ", num frags is " << flex_regions_[region]->nr_frags() << std::endl;
961 
962  } //outerloop
963 
964  scored_confs.sort( utility::SortFirst< Real, FragDataOP >() );
965 
966  mc.show_counters();
967 
968  Size count( 0 );
969  Size const count_limit( basic::options::option[basic::options::OptionKeys::enzdes::max_bb_deviation ].user() ? 4: 2 );
970 
971  if( flex_regions_[region]->nr_frags() < loop_ensemble_size_ ){
972  tr << "Not enough fragments after monte carlo (" << flex_regions_[region]->nr_frags() << " so far) , going through all stored configurations to find more." << std::endl;
973  }
974 
975  while ( flex_regions_[region]->nr_frags() < loop_ensemble_size_ && count < count_limit ) {
976 
977  if ( count == 2 ) {
978  /// Reduce the smoothness filter if we're not getting hits
979  flex_regions_[region]->scale_target_proximity_to_other_conformations( 3 );
980  flex_regions_[region]->set_target_proximity_to_starting_conformation(
981  basic::options::option[basic::options::OptionKeys::enzdes::max_bb_deviation_from_startstruct]);
982  }
983 
984  if ( count == 3 ) {
985  /// Reduce the proximity-to-native filter if we're not getting hits
986  flex_regions_[region]->scale_target_proximity_to_starting_conformation( 1.5 );
987  }
988 
989  if ( count == 4 ) {
990  /// Go further if we have to!
991  flex_regions_[region]->scale_target_proximity_to_other_conformations( 2 );
992  }
993 
994  for ( std::list< std::pair< Real, FragDataOP > >::iterator list_it = scored_confs.begin(),
995  list_end = scored_confs.end(); list_it != list_end; ) {
996  //std::cout << "ScoredConfs sorted: " << ii << " " << scored_confs[ ii ].first << " accepted: " << flex_regions_[region]->nr_frags() << " nloop_poses: " << loop_poses.size() << std::endl;
997  list_it->second->apply( local_pose, flex_regions_[region]->start(), flex_regions_[region]->stop() );
998 
999  if (flex_regions_[region]->examine_new_loopconf( local_pose, loop_template_pose, loop_poses, rmsd_to_native ) ){
1000  list_it = scored_confs.erase( list_it );
1001  if ( flex_regions_[region]->nr_frags() == loop_ensemble_size_ ) break;
1002  }
1003  else ++list_it;
1004  }
1005  ++count;
1006  }
1007 
1008  core::Real av_rmsd = numeric::statistics::mean( rmsd_to_native.begin(), rmsd_to_native.end(), 0.0 );
1009  core::Real std_dev_rmsd = numeric::statistics::std_dev_with_provided_mean( rmsd_to_native.begin(), rmsd_to_native.end(), av_rmsd );
1010 
1011  tr << " done generating ensemble for region " << region << ". " << flex_regions_[region]->nr_frags() - 1 << " new unique fragments were generated. Average rmsd/stdev to native is " << av_rmsd << " +- " << std_dev_rmsd << ". Kinematic Mover had a success rate of " << kinmover_successrate << std::endl;
1012 }
1013 
1014 void
1016  core::pose::Pose & pose,
1017  core::Size region
1018 )
1019 {
1020  //ObjexxFCL::FArray1D_bool flex_res( pose.total_residue(), false);
1021  //for( core::Size i = flex_regions_[region]->start() - 1; i <= flex_regions_[region]->end(); ++i) flex_res(i) = true;
1022  brub_mover_->set_native_pose( new core::pose::Pose( pose ) );
1023  brub_mover_->set_input_pose( brub_mover_->get_native_pose() );
1024  brub_mover_->clear_segments();
1025  brub_mover_->add_mainchain_segments( flex_regions_[region]->positions(), brub_pivot_atoms_, brub_min_atoms_, brub_max_atoms_ );
1026  brub_mover_->optimize_branch_angles( pose );
1027 
1029  core::pose::PoseOP native_loop_pose = new core::pose::Pose();
1030 
1031  utility::vector1< core::Real > rmsd_to_native;
1032 
1033  flex_regions_[region]->fragment_as_pose( 1, *native_loop_pose, this->restype_set() );
1034 
1035  native_loop_pose->prepend_polymer_residue_before_seqpos( pose.residue( flex_regions_[region]->start() - 1) , 1, false );
1036 
1037 
1038  native_loop_pose->copy_segment( flex_regions_[region]->length() + 1, pose, 1, flex_regions_[region]->start() - 1 );
1039 
1040  loop_poses.push_back( native_loop_pose );
1041 
1042  core::pose::Pose loop_template_pose = *native_loop_pose;
1043 
1044  //native_loop_pose->dump_pdb("natloop"+utility::to_string( region )+".pdb");
1045 
1046  core::Real mc_decrement( (mc_kt_high_ - mc_kt_low_ ) / loopgen_trials_ );
1047  core::Real mc_temp( mc_kt_high_);
1048 
1049  protocols::moves::MonteCarlo mc( pose, *reduced_scorefxn(), mc_temp );
1050 
1051  //core::Size kintrials(0), kinfails(0);
1052 
1053  for( core::Size i = 1; i <= ( 5 * loop_ensemble_size_) ; ++i ){
1054 
1055  mc.reset( pose );
1056  mc_temp = mc_kt_high_;
1057  mc.set_temperature( mc_temp );
1058 
1059  for( core::Size j = 1; j <= loopgen_trials_; ++j ){
1060 
1061  PROF_START( basic::BACKRUB_MOVER );
1062  brub_mover_->apply( pose );
1063  PROF_STOP( basic::BACKRUB_MOVER );
1064 
1065  //we have to idealize the bond angles
1066  //kinematic mover previously setup to do this
1067  //kinematic_mover_->apply( pose );
1068  //kintrials++;
1069 
1070  //if( !kinematic_mover_->last_move_succeeded() ){
1071  //std::cerr << "Kinematic mover idealize fail on iteration " << j << " " ;
1072  //kinfails++;
1073  //continue;
1074  //}
1075  if( minimize_cats_ ){
1076 
1077  catmin_mover_->apply( pose );
1078  (*reduced_scorefxn() )( pose );
1079 
1080  }
1081 
1082  //we have to idealize the bond angles
1083  //kinematic mover previously setup to do this
1084 
1085  PROF_START( basic::MC_ACCEPT );
1086  mc_temp = mc_temp - mc_decrement;
1087  mc.set_temperature( mc_temp );
1088  mc.boltzmann( pose, brub_mover_->type() );
1089  PROF_STOP( basic::MC_ACCEPT );
1090  }
1091 
1092  //std::cerr << "rmsd lowest to native is " << core::scoring::rmsd_no_super_subset( *this->get_native_pose(), mc.lowest_score_pose(), flex_res, core::scoring::is_protein_CA ) << ", ";
1093 
1094  //std::cerr << "rmsd lastaccep to native is " << core::scoring::rmsd_no_super_subset( *this->get_native_pose(), mc.last_accepted_pose(), flex_res, core::scoring::is_protein_CA ) << std::endl;
1095 
1096  //if( i == 3){
1097  // mc.lowest_score_pose().dump_pdb("reg"+utility::to_string( region )+"_ens5.pdb");
1098  // mc.last_accepted_pose().dump_pdb("reg"+utility::to_string( region )+"_ens6.pdb");
1099  //}
1100 
1101  //we remember both the lowest score pose as well as the last accepted one
1102  flex_regions_[region]->examine_new_loopconf( mc.lowest_score_pose(), loop_template_pose, loop_poses, rmsd_to_native );
1103  if ( flex_regions_[region]->nr_frags() == loop_ensemble_size_ ) break;
1104 
1105  flex_regions_[region]->examine_new_loopconf( mc.last_accepted_pose(), loop_template_pose, loop_poses, rmsd_to_native );
1106  if ( flex_regions_[region]->nr_frags() == loop_ensemble_size_ ) break;
1107 
1108  //if( ! flex_regions_[ region ]->steal( mc.lowest_score_pose() ) ) utility_exit_with_message("Could not steal a just generated bbfragment from the pose");
1109  //if( ! flex_regions_[ region ]->steal( mc.last_accepted_pose() ) ) utility_exit_with_message("Could not steal a just generated bbfragment from the pose");
1110 
1111 
1112  //now put a random one of the previously generated regions into the pose, might help with generating diversity
1113  if( flex_regions_[region]->apply( numeric::random::random_range( 1, flex_regions_[region]->nr_frags() ), pose ) != flex_regions_[region]->length() ) utility_exit_with_message("unknown error when trying to apply a random fragment during ensemble generation.");
1114 
1115  } //outerloop
1116 
1117  //for ( Size ii = 2; ii <= flex_regions_[ region ]->nr_frags(); ++ii ) {
1118  // core::pose::Pose copy_pose( pose );
1119  // flex_regions_[region]->apply( ii, copy_pose );
1120  // copy_pose.dump_pdb("fullpose_loopreg_" + utility::to_string( region ) + "_" + utility::to_string( ii ) + ".pdb" );
1121  //}
1122  //basic::prof_show();
1123 
1124  mc.show_counters();
1125 
1126  //put back the native conformation, just in case
1127  if( flex_regions_[region]->apply( 1, pose ) != flex_regions_[region]->length() ) utility_exit_with_message("unknown error when trying to reapply native fragment after generating ensemble.");
1128 
1129 
1130  core::Real av_rmsd = numeric::statistics::mean( rmsd_to_native.begin(), rmsd_to_native.end(), 0.0 );
1131  core::Real std_dev_rmsd = numeric::statistics::std_dev_with_provided_mean( rmsd_to_native.begin(), rmsd_to_native.end(), av_rmsd );
1132 
1133  tr << flex_regions_[region]->nr_frags() - 1 << " new unique fragments were generated. Average rmsd/stdev to native is " << av_rmsd << " +- " << std_dev_rmsd << "." << std::endl;
1134 
1135  //core::Real kinfailrate = ( (core::Real) kinfails ) / ((core::Real) kintrials);
1136  //tr << "Kinematic mover had a fail rate of " << kinfailrate << std::endl;
1137 
1138  //some debug shit below
1139  /*
1140  flex_regions_[region]->apply( 6, pose ); //restore native pose
1141  pose.dump_pdb("regident5_"+utility::to_string( region )+".pdb" );
1142 
1143  flex_regions_[region]->apply( 1, pose ); //restore native pose
1144  pose.dump_pdb("reg"+utility::to_string( region )+"nat.pdb" );
1145 
1146  */
1147 } //generate_ensemble_for_region
1148 
1149 
1150 /// @details figure out which combination of loop conformations is the next most promising one
1151 bool
1153  core::pose::Pose & pose
1154 )
1155 {
1156  runtime_assert( flex_regions_.size() == fragment_counters_.size() );
1157 
1158  //2. figure out for which of the regions we still have frags to try
1159  utility::vector1< bool > valid_regions( flex_regions_.size(), false );
1160 
1161  for( core::Size i = 1; i <= flex_regions_.size(); ++i){
1162  if( fragment_counters_[i] < flex_regions_[i]->no_ranked_frags() ) valid_regions[i] = true;
1163  }
1164 
1165  core::Real lowest_deltaE(10000000 );
1166  core::Size best_region(0);
1167 
1168  //3. then go through the fragments and put in one where the gain in energy is best
1169  for( core::Size i = 1; i <= flex_regions_.size(); ++i){
1170 
1171  if( valid_regions[i] && ( flex_regions_[i]->deltaE_best( fragment_counters_[i] + 1 ) < lowest_deltaE ) ){
1172  lowest_deltaE = flex_regions_[i]->deltaE_best( fragment_counters_[i] + 1 );
1173  best_region = i;
1174  }
1175  }
1176 
1177  if( best_region == 0 ) utility_exit_with_message("Trying to assemble a new combination of loops even though all combinations have alrady been assembled.");
1178 
1179  tr << "Assembling next best loop conformation: fragment " << fragment_counters_[best_region] << " of region " << best_region << " with deltaE_best " << lowest_deltaE << "put into pose." << std::endl;
1180  fragment_counters_[best_region]++;
1181 
1182  for( core::Size i = 1; i <= flex_regions_.size(); ++i){
1183  flex_regions_[i]->apply_ranked_fragment( pose, fragment_counters_[i] );
1184  }
1185 
1186  return true;
1187 
1188 } //assemble_next_best_loop_combination
1189 
1190 
1191 /// @details returns false if the last combination is reached, true otherwise
1192 bool
1194  core::pose::Pose & pose
1195  )
1196 {
1197 
1198  assert( flex_regions_.size() == fragment_counters_.size() );
1199 
1200  //std::cerr << "MEEP calling hack_assemble_next_loop_combination ";
1201 
1202  core::Size first_region_at_end(0);
1203  core::Size last_region_at_end(0);
1204 
1205  bool all_regions_at_end(true);
1206 
1207  for( core::Size j = flex_regions_.size(); j >= 1; --j){
1208 
1209  if( fragment_counters_[j] == flex_regions_[j]->no_ranked_frags() ){
1210  first_region_at_end = j;
1211  if( last_region_at_end == 0 ) last_region_at_end = j;
1212  }
1213  else all_regions_at_end = false;
1214 
1215  }
1216 
1217  if( first_region_at_end == 0 ){
1218  fragment_counters_[ flex_regions_.size() ]++;
1219  flex_regions_[ flex_regions_.size() ]->apply_ranked_fragment( pose, fragment_counters_[ flex_regions_.size() ] );
1220  //tr << "put in frag " << fragment_counters_[ flex_regions_.size() ] << " of region " << flex_regions_.size() << ", returning at first point " << std::endl;
1221  return true;
1222  }
1223 
1224  if( all_regions_at_end ) return false; //means we've exhausted every combination
1225 
1226  if( flex_regions_[ flex_regions_.size() ]->no_ranked_frags() != fragment_counters_[ flex_regions_.size() ] ){
1227  fragment_counters_[ flex_regions_.size() ]++;
1228  flex_regions_[ flex_regions_.size() ]->apply_ranked_fragment( pose, fragment_counters_[ flex_regions_.size() ] );
1229  //tr << "put in frag " << fragment_counters_[ flex_regions_.size() ] << " of region " << flex_regions_.size() << ", returning at second point " << std::endl;
1230  return true;
1231  }
1232 
1233  else{
1234  for( core::Size i = flex_regions_.size(); i >= first_region_at_end; --i ){
1235 
1236  if( flex_regions_[ i ]->no_ranked_frags() != fragment_counters_[ i ] ){
1237 
1238  fragment_counters_[ i ]++;
1239  flex_regions_[ i ]->apply_ranked_fragment( pose, fragment_counters_[ i ] );
1240  //tr << " put in frag " << fragment_counters_[ i ] << " of reg " << i << ", ";
1241  for( core::Size jj = i + 1; jj <= flex_regions_.size(); ++jj){
1242  fragment_counters_[ jj ] = 1;
1243  flex_regions_[ jj ]->apply_ranked_fragment( pose, fragment_counters_[ jj ] );
1244  //tr << " put in frag " << fragment_counters_[ jj ] << " reg " << jj << ", ";
1245  }
1246  //tr << "returning" << std::endl;
1247  return true;
1248  }
1249  }
1250  }
1251 
1252  //fragment_counters_[ last_region_at_end ] = 1;
1253  //fragment_counters_[ last_region_at_end - 1 ]
1254  return false;
1255 }
1256 
1257 
1258 bool
1260 {
1261 
1262  using namespace basic::options;
1263  //annoying: let's mute a couple of tracer channels that cause complaints when input files are missing
1264  //OXT and termini H
1265  //utility::vector1< std::string > muted_channels = option[OptionKeys::out::mute].value();
1266  //muted_channels.push_back("core.io.pdb.file_data");
1267  //muted_channels.push_back("core.conformation.Conformation");
1268  //option[OptionKeys::out::mute].value() = muted_channels;
1269 
1270  //option[OptionKeys::out::mute].value().push_back( std::string("core.io.pdb.file_data"));
1271  //option[OptionKeys::out::mute].value().push_back( std::string("core.conformation.Conformation"));
1272 
1273  std::string loops_pdb = option[OptionKeys::enzdes::checkpoint];
1274 
1275  if( loops_pdb == "" ){
1276 
1277  loops_pdb = pose.pdb_info()->name();
1278  utility::file::FileName fname( loops_pdb );
1279 
1280  loops_pdb = fname.base() + "_flex_loops.pdb";
1281  }
1282 
1283  if( option[OptionKeys::enzdes::checkpoint].user() ){
1284 
1285  if( utility::file::file_exists( loops_pdb ) ){
1286 
1287  tr << "Recovering loop conformations from file " << loops_pdb << "... " << std::endl;
1289  tr << " done recovering loop conformations." << std::endl;
1290  return true;
1291  }
1292 
1293  else{
1294  utility_exit_with_message("Unknown error when trying to recover loop conformations from file "+loops_pdb+".");
1295 
1296  }
1297  }
1298  }
1299 
1300  return false;
1301 
1302 } //recover_loops_from_file
1303 
1304 
1305 void
1307  core::pose::Pose const & pose,
1308  core::Size region )
1309 {
1310 
1312  catmin_sfxn_->reset();
1319 
1320  //bool minimize_cats = !( basic::options::option[basic::options::OptionKeys::enzdes::no_catres_min_in_loopgen].user()) && flex_regions_[region]->contains_catalytic_res();
1321 
1322  //if( minimize_cats )
1324  catmin_movemap_->clear();
1325 
1326  tr << "Allowing minimization of the following catalytic residues during ensemble generation for region " << region << ": ";
1327  for( core::Size rescount = flex_regions_[region]->start(); rescount <= flex_regions_[region]->end(); ++rescount ){
1328  if( is_catalytic_position( pose, rescount ) ){
1329  catmin_movemap_->set_chi( rescount, true);
1330  tr << rescount << ", ";
1331  }
1332  }
1333 
1334  catmin_mover_ = new protocols::simple_moves::MinMover( catmin_movemap_, catmin_sfxn_, "linmin", 0.02, true /*use_nblist*/ );
1335  tr << std::endl;
1336 
1337 } //setup_catalytic_residue_minimization_for_region
1338 
1340  core::Size index_in,
1341  core::Size start,
1342  core::Size end,
1343  core::Size nr_res,
1344  core::pose::Pose const & pose,
1345  EnzdesFlexBBProtocolCAP enz_prot
1346 ) :
1347  core::fragment::Frame( start, end, nr_res ),
1348  index_(index_in),
1349  enzdes_protocol_( enz_prot ),
1350  design_targets_( enz_prot->design_targets( pose ) ),
1351  target_proximity_to_native_conformation_(
1352  basic::options::option[basic::options::OptionKeys::enzdes::max_bb_deviation_from_startstruct] ),
1353  target_proximity_to_other_conformations_(
1354  basic::options::option[basic::options::OptionKeys::enzdes::max_bb_deviation].user() ?
1355  basic::options::option[basic::options::OptionKeys::enzdes::max_bb_deviation] :
1356  0.0 ),
1357  remodelable_(false),
1358  remodel_min_length_(nr_res),
1359  remodel_max_length_(nr_res)
1360 {
1361 
1363 
1364  core::Size addfrag_returnval = add_fragment( native_conf_ );
1365  if( addfrag_returnval != 1 ) utility_exit_with_message("Could not add the native conformation to the EnzdesFlexibleRegion, returnval is "+utility::to_string( addfrag_returnval ) + ".");
1366 
1367  positions_.reserve( end - start + 1 );
1368  for ( core::Size i = start; i <= end; ++i ) positions_.push_back( i );
1369  frag_designabilities_.clear();
1370 
1371 } //FlexibleRegion constructor
1372 
1374 
1375 
1376 bool
1378 {
1379 
1380  for( std::set< core::Size >::const_iterator cat_it = design_targets_.begin();
1381  cat_it != design_targets_.end(); ++cat_it ){
1382  if( this->contains_seqpos( *cat_it ) ) return true;
1383  }
1384  return false;
1385 }
1386 
1389 {
1391 
1392  if( !loop_file ){
1393  utility_exit_with_message("no enzdes loops file was read, but the info therein requested." );
1394  }
1395 
1396  assert( index_ <= loop_file->num_loops() );
1397 
1398  return loop_file->loop_info( index_ );
1399 
1400 }
1401 
1402 void
1404  core::Size min_length,
1405  core::Size max_length
1406 )
1407 {
1408  remodelable_ = true;
1409  remodel_min_length_ = min_length;
1410  remodel_max_length_ = max_length;
1411 }
1412 
1413 core::Real
1415  core::Size const frag_rank
1416 ) const
1417 {
1418  if( frag_rank > frag_designabilities_.size() ) utility_exit_with_message("Trying to add a fragment that is not ranked.");
1419 
1420  return frag_designabilities_[frag_rank].second - frag_designabilities_[1].second;
1421 } //deltaE_best
1422 
1423 
1426  core::pose::Pose const & pose
1427 )
1428 {
1429 
1430  using namespace core::fragment;
1431 
1432  FragDataOP new_fragdata = new FragData();
1433 
1434 // tex 8/16/08
1435 // lines containing core::id::AtomID[3] aren't portable. /// WHY NOT?!!?!
1436 #ifndef WIN32
1437  for( core::Size i = this->start(); i<= this->end(); ++i){
1438 
1440  //utility::vector1< std::pair< core::Size[3], core::Real > > angles;
1442 
1443  //for now we only keep the Ca angle
1444  //core::id::AtomID atoms[3] = { core::id::AtomID (pose.residue_type( i ).atom_index( " N "), i),
1445  // core::id::AtomID (pose.residue_type( i ).atom_index( " CA "), i),
1446  // core::id::AtomID (pose.residue_type( i ).atom_index( " C "), i) };
1447 
1448  //fuckin' A, icc compiler doesn't like the following line that gcc is perfectly fine with:
1449  //angles.push_back( std::pair< core::id::AtomID[3], core::Real>( atoms, 0 ) );
1450  //so we have to create (and copy) everything explicityly :(
1451  //std::pair< core::Size[3], core::Real> newpair;
1452  std::pair<std::vector<core::Size>, core::Real> newpair; // REQUIRED FOR WINDOWS
1453  //newpair.first[0] = pose.residue_type( i ).atom_index( " N ");
1454  //newpair.first[1] = pose.residue_type( i ).atom_index( " CA ");
1455  //newpair.first[2] = pose.residue_type( i ).atom_index( " C ");
1456  newpair.first.push_back(pose.residue_type( i ).atom_index( " N "));
1457  newpair.first.push_back(pose.residue_type( i ).atom_index( " CA "));
1458  newpair.first.push_back(pose.residue_type( i ).atom_index( " C "));
1459  newpair.second = 0;
1460 
1461  angles.push_back( newpair );
1462 
1463  if( enzdes_protocol_->is_catalytic_position( pose, i ) ){
1464  srfd = new BBTorsionAndAnglesSRFD( angles ); //temporary, we will do something different for the catalytic res
1465  }
1466  else { srfd = new BBTorsionAndAnglesSRFD( angles ); }
1467 
1468  new_fragdata->add_residue( srfd );
1469  }
1470 
1471 #endif
1472  if( ! new_fragdata->steal( pose, this->start(), this->end() ) ) utility_exit_with_message("Some error occured when trying to steal enzdes_fragdata from the pose. fuckin' A ... ");
1473 
1474  return new_fragdata;
1475 
1476 } //assemble_enzdes_fragdata
1477 
1478 void
1480 {
1481 
1482  for( core::Size i = 1; i<= this->nr_frags(); ++i )
1483  {
1484 
1485  core::Real fake_designability( -1 * i * this->index_ );
1486  frag_designabilities_.push_back( SizeRealPair( i, fake_designability ) );
1487  }
1488 
1489 } //hack_fillup_frag_designabilities();
1490 
1491 /// @details this function assumes that the pose is a poly ala pose of the residues to redesign
1492 /// @details and that the backbone is in the native conformation
1493 void
1495  core::pose::Pose const & ref_pose,
1498 )
1499 {
1500  using namespace core::pack;
1501  using namespace core::pack::task;
1502 
1503  //make a modifiable copy
1504  core::pose::Pose pose = ref_pose;
1505  (*scorefxn)( pose );
1506  //pose.dump_pdb("sortstart_reg"+utility::to_string(index_)+".pdb");
1507 
1509 
1510  //ok, for each of the ensemble members, we design and record the energy with respect to the ligand
1511 
1512  //first, let's make the right task (and what residues to mutate to alanine in this particular context)
1513  utility::vector1< core::Size > other_design_res;
1514  get_12A_neighbors( pose );
1515 
1516  PackerTaskOP looptask_template = task->clone();
1517 
1518  for( core::Size i = 1; i <= pose.total_residue(); ++i ){
1519 
1520  if( looptask_template->design_residue( i )
1521  && !this->contains_seqpos( i )
1522  && !enzdes_protocol_->is_catalytic_position(pose, i) )
1523  {
1524  looptask_template->nonconst_residue_task(i).prevent_repacking();
1525  other_design_res.push_back( i );
1526  }
1527 
1528  else if( looptask_template->pack_residue(i)
1529  && (twelve_A_neighbors_.find( i ) == twelve_A_neighbors_.end() )
1530  && !this->contains_seqpos( i ) )
1531  {
1532  looptask_template->nonconst_residue_task(i).prevent_repacking();
1533  }
1534 
1535  if( this->contains_seqpos( i ) && !looptask_template->design_residue(i) && !enzdes_protocol_->is_catalytic_position(pose, i) ){
1536  utility_exit_with_message("Task is corrupted when trying to screen ensemble for region "+utility::to_string(index_));
1537  }
1538  }
1539 
1540  protocols::toolbox::pose_manipulation::construct_poly_ala_pose( pose, other_design_res, true, true, true );
1541  //pose.dump_pdb("sortala_reg"+utility::to_string(index_)+".pdb");
1542 
1543  IGEdgeReweighterOP ig_up = new protocols::toolbox::ResidueGroupIGEdgeUpweighter( 0.5, this->positions(), other_design_res);
1544  looptask_template->set_IGEdgeReweights()->add_reweighter( ig_up );
1545 
1546  tr << "Beginning designability screen for " << this->nr_frags() << " ensemble members of flexible region " << index_ << "... " << std::endl;
1547  time_t start_time = time(NULL);
1548 
1549  //get the native designability score
1550  PackerTaskOP looptask = enzutil::recreate_task( pose, *looptask_template );
1551 
1552  pose.update_residue_neighbors();
1553  core::pack::pack_scorefxn_pose_handshake( pose, *scorefxn );
1554  scorefxn->setup_for_packing( pose, looptask->repacking_residues(), looptask->designing_residues() );
1555 
1556  utility::vector1< core::Real > native_lig_part_sum_compare;
1557  native_lig_part_sum_compare.push_back( calculate_rotamer_set_design_targets_partition_sum( pose, scorefxn, looptask ) );
1558 
1559  pack_rotamers_loop( pose, *scorefxn, looptask, 1 );
1560  (*scorefxn)( pose );
1561 
1562  core::Real native_backgroundE(0);
1563  core::Real native_designability = extract_lig_designability_score( pose, task, native_backgroundE );
1564 
1565  native_lig_part_sum_compare.push_back( native_designability );
1566 
1567  lig_part_sums.push_back( native_lig_part_sum_compare );
1568 
1569  std::list< SizeRealPair > frag_designability_list;
1570  //now get the designability for every of the fragment ensemble members
1571  //start at 2 because one is the native
1572  for( core::Size i = 2; i<= this->nr_frags(); ++i){
1573 
1574  if( this->apply( i, pose ) != this->length() ) utility_exit_with_message("unknown error when trying to apply a fragment for generating designability score.");
1575 
1576  pose.update_residue_neighbors();
1577  core::pack::pack_scorefxn_pose_handshake( pose, *scorefxn );
1578  scorefxn->setup_for_packing( pose, looptask->repacking_residues(), looptask->designing_residues() );
1579 
1580  PackerTaskOP looptask = enzutil::recreate_task( pose, *looptask_template );
1581 
1582  utility::vector1< core::Real > lig_part_sum_compare;
1583  lig_part_sum_compare.push_back( calculate_rotamer_set_design_targets_partition_sum( pose, scorefxn, looptask ) );
1584 
1585  pack_rotamers_loop( pose, *scorefxn, looptask, 1 );
1586  (*scorefxn)( pose );
1587 
1588  core::Real backgroundE(0);
1589  core::Real designability = extract_lig_designability_score( pose, task, backgroundE );
1590 
1591  lig_part_sum_compare.push_back( designability );
1592 
1593  if( (designability < native_designability) && (backgroundE < native_backgroundE) ) {
1594  frag_designability_list.push_back( SizeRealPair( i, designability ) );
1595  //pose.dump_pdb("loopdes_reg"+utility::to_string( index_ )+"_"+utility::to_string( frag_designability_list.size() )+".pdb");
1596  }
1597 
1598  lig_part_sums.push_back( lig_part_sum_compare );
1599  }
1600  //make sure the best fragment comes first
1601  frag_designability_list.sort( compare_SizeRealPairs );
1602 
1603  for( std::list< SizeRealPair >::const_iterator it = frag_designability_list.begin(); it != frag_designability_list.end(); ++it) frag_designabilities_.push_back( *it );
1604 
1605  time_t end_time = time(NULL);
1606  tr << "done with designability screen for region " << index_ << " in " << (long)(end_time - start_time ) << " seconds, " << frag_designabilities_.size() << " of " << this->nr_frags() << " ensemble conformations are potentially better than the native conformation." << std::endl;
1607 
1608  if( frag_designabilities_.size() > 0 ){
1609  tr << "Native designability score is " << native_designability << ", best designability score is " << frag_designabilities_[1].second << ", worst designability score is " << frag_designabilities_[ frag_designabilities_.size() ].second << "." << std::endl;
1610  //and then append the native as the last fragment
1611  }
1612  frag_designabilities_.push_back( SizeRealPair( 1, native_designability) );
1613 
1614  //pose.dump_pdb("sortend_reg"+utility::to_string(index_)+".pdb");
1615  //and lastly put back the native conformation
1616  if( this->apply( 1, pose ) != this->length() ) utility_exit_with_message("unknown error when trying to reapply the native conformation after getting designability scores for fragments.");
1617 
1618 
1619  //last thing, for now, write out the measured lig designabilitis and the number out of the partition sums
1620  for( utility::vector1< utility::vector1< core::Real > >::const_iterator lig_part_sum_it = lig_part_sums.begin();
1621  lig_part_sum_it != lig_part_sums.end(); ++lig_part_sum_it ){
1622 
1623  tr << "LIGPARTCOMPARE ";
1624  for( utility::vector1< core::Real >::const_iterator comp_it = (*lig_part_sum_it).begin(); comp_it != (*lig_part_sum_it).end(); ++comp_it) {
1625  tr << *comp_it << " ";
1626  }
1627  tr << std::endl;
1628  }
1629 } //sort_enseble_by_designability
1630 
1631 
1632 
1633 core::Real
1635  core::pose::Pose const & pose,
1638 ) const
1639 {
1640 
1641  core::Real boltzmann_fac( 1 / 0.6 );
1642 
1643  core::Real dtps(0);
1644 
1645  //first, build a rotamer set
1647  core::graph::GraphOP packer_neighbor_graph = core::pack::create_packer_graph( pose, *scorefxn, task );
1648 
1649  rotsets->set_task( task );
1650 
1651  rotsets->build_rotamers( pose, *scorefxn, packer_neighbor_graph );
1652 
1653  rotsets->prepare_sets_for_packing( pose, *scorefxn );
1654 
1655  //ig = InteractionGraphFactory::create_interaction_graph( *task, *rotsets, pose, *scorefxn );
1657 
1658  ig->initialize( *rotsets );
1659 
1660  rotsets->compute_one_body_energies( pose, *scorefxn, packer_neighbor_graph, ig );
1661 
1662  //now delete the unnecessary edges from the graph
1663  utility::vector1< core::Size > residue_groups( pose.total_residue(), 0 );
1664  for( std::set< core::Size >::const_iterator cat_it = design_targets_.begin(); cat_it != design_targets_.end(); ++cat_it){
1665  if( (*cat_it >= *(positions_.begin() ) ) && (*cat_it <= *(positions_.rbegin() ) ) ){
1666  residue_groups[ *cat_it ] = 2;
1667  //tr << "CATKEEPGRAPH: resi " << *cat_it << " is part of loop between " << *(positions_.begin() ) << " and " << *(positions_.rbegin() ) << std::endl;
1668  }
1669  else residue_groups[ *cat_it ] = 1;
1670  }
1671  core::graph::delete_all_intragroup_edges( *packer_neighbor_graph, residue_groups );
1672 
1673  //and then precompute the energies of (hopefully) only the positions/ligand interactions
1674  rotsets->precompute_two_body_energies( pose, *scorefxn, packer_neighbor_graph, ig );
1675 
1676  for( utility::vector1< core::Size >::const_iterator pos_it = positions_.begin(); pos_it != positions_.end(); ++pos_it ){
1677 
1678  core::Size moltenid = rotsets->resid_2_moltenres( *pos_it);
1679 
1680  core::Real dtps_this_position(0.0);
1681 
1682 
1683  for( ig->reset_edge_list_iterator_for_node( moltenid ); !ig->edge_list_iterator_at_end(); ig->increment_edge_list_iterator() ){
1684 
1685  //core::pack::interaction_graph::PDEdge const & cur_edge = (core::pack::interaction_graph::PDEdge) ig->get_edge();
1686  core::pack::interaction_graph::PDEdge const & cur_edge = static_cast< core::pack::interaction_graph::PDEdge const & > ( ig->get_edge() );
1687 
1688  core::Size targ_moltenid = cur_edge.get_other_ind( moltenid );
1689 
1690  core::Size lower_res = std::min( moltenid, targ_moltenid );
1691  core::Size upper_res = std::max( moltenid, targ_moltenid );
1692 
1693  for( int ii = 1; ii <= ig->get_num_states_for_node( lower_res ); ++ii){
1694 
1695  core::Real pos_1body_E = ig->get_one_body_energy_for_node_state( lower_res, ii );
1696  if( pos_1body_E < 0.0 ) pos_1body_E = 0.0;
1697 
1698  for( int jj = 1; jj <= ig->get_num_states_for_node( upper_res ); ++jj){
1699 
1700  core::Real E_this_state = pos_1body_E + ig->get_one_body_energy_for_node_state( upper_res, jj ) + cur_edge.get_two_body_energy( ii, jj );
1701 
1702  dtps_this_position += exp(- boltzmann_fac * E_this_state );
1703 
1704  //tr << "BOLTZ pos " << rotsets->moltenres_2_resid( lower_res ) << " state " << ii << " to pos " << rotsets->moltenres_2_resid( upper_res ) << " state " << jj << ": interaction E " << E_this_state << "; pure int E " << cur_edge.get_two_body_energy( ii, jj ) << "; boltzmann fac " << exp(- boltzmann_fac * E_this_state ) << std::endl;
1705 
1706  } // loop over num states for design target
1707 
1708  } // loop over num states of loop residue
1709 
1710  } //loop over design target edges for this position
1711  //tr << "DTPS pos " << *pos_it << " is " << dtps_this_position << std::endl;
1712  dtps += dtps_this_position;
1713 
1714  } //loop over positions of this loop
1715 
1716  return ( dtps / design_targets_.size() );
1717 
1718 } //calculate_rotamer_set_design_target_partition_sum(
1719 
1720 
1721 /// @details function under heavy development, will prolly change a lot in the coming weeks/months
1722 /// @details main idea: look at how the conformation of this region in the input pose interacts with
1723 /// @details the ligand as well as the protein background, then combine the two numbers in some way
1724 core::Real
1726  core::pose::Pose const & pose,
1728  core::Real & backgroundE
1729 )
1730 {
1731  using namespace core::scoring;
1732 
1733  //first, figure out which residues we're designing against( ligand and catalytic positions,
1734  //and sum up the interaction with them
1735  core::Real per_res_design_target_interactionE(0);
1736  core::Real av_background_interactionE(0);
1737 
1738  EnergyMap const cur_weights = pose.energies().weights();
1739 
1740  for( std::set< Size >::const_iterator targ_it = design_targets_.begin(); targ_it != design_targets_.end(); ++targ_it ){
1741 
1743  egraph_it != pose.energies().energy_graph().get_node( *targ_it )->const_edge_list_end(); ++egraph_it){
1744 
1745  core::Size other_res = (*egraph_it)->get_other_ind( *targ_it );
1746  if( !this->contains_seqpos( other_res ) ) continue;
1747 
1748  EnergyEdge const * Eedge = static_cast< EnergyEdge const * > (*egraph_it);
1749 
1750  per_res_design_target_interactionE += Eedge->dot( cur_weights );
1751 
1752  }//loop over interactig partners of particular design target
1753  } //loop over design targets
1754  per_res_design_target_interactionE /= design_targets_.size();
1755 
1756 
1757  //then, get the interaction energy of this stretch with itself and neighboring packing residues
1758  std::set< Size > interacting_neighbors;
1759 
1760  for( core::Size i = this->start(); i <= this->end(); ++i ){
1761 
1763  egraph_it != pose.energies().energy_graph().get_node( i )->const_edge_list_end(); ++egraph_it){
1764 
1765  core::Size other_res = (*egraph_it)->get_other_ind( i );
1766  if( task->design_residue( other_res )
1767  || ( this->contains_seqpos( other_res ) && (other_res < i ) ) //no overcounting please
1768  || ( design_targets_.find( other_res ) != design_targets_.end() ) ) continue;
1769 
1770  if( !this->contains_seqpos( other_res )
1771  && ( interacting_neighbors.find( other_res) == interacting_neighbors.end() ) ) interacting_neighbors.insert( other_res );
1772 
1773  EnergyEdge const * Eedge = static_cast< EnergyEdge const * > (*egraph_it);
1774 
1775  av_background_interactionE += Eedge->dot( cur_weights );
1776 
1777  } //loop over interacting partners of particular residue
1778  } //loop over all residues of this region
1779 
1780  av_background_interactionE /= ( interacting_neighbors.size() + this->length() );
1781 
1782  backgroundE = av_background_interactionE;
1783 
1784  return per_res_design_target_interactionE;
1785  //return av_background_interactionE + (per_res_design_target_interactionE * basic::options::option[basic::options::OptionKeys::enzdes::lig_packer_weight] );
1786 
1787 } //extract_region_designability_score
1788 
1789 void
1791  core::pose::Pose & pose,
1792  core::Size frag_rank
1793 )
1794 {
1795  if( frag_rank > frag_designabilities_.size() ) utility_exit_with_message("Trying to access a fragment that is not ranked.");
1796 
1797  //std::list< SizeRealPair >::const_iterator list_it = frag_designabilities_.begin();
1798  //for( core::Size i = 2; i <= frag_rank; ++i) ++list_it;
1799  //tr << "putting ranked fragment " << frag_rank << " of region " << this->index_ << " into pose, translates to fragment " << frag_designabilities_[frag_rank].first << std::endl;
1800 
1801  this->apply( frag_designabilities_[frag_rank].first, pose );
1802 
1803 } //apply_ranked_fragment
1804 
1805 core::Real
1807  core::pose::Pose const & pose ) const
1808 {
1809 
1810  core::Real to_return(0.0);
1811 
1812  for( core::Size i = this->start(); i <= this->end(); ++i){
1813  to_return += pose.energies().residue_total_energies( i )[ core::scoring::mm_bend ];
1814  }
1815 
1816  return to_return;
1817 } // get_region_mm_bend_score
1818 
1819 bool
1821  core::pose::Pose const & pose,
1822  core::pose::Pose & template_pose,
1824  utility::vector1< core::Real > & rmsd_to_native
1825 )
1826 {
1827  //static Size count_examined( 0 );
1828  //Size const sought_loop_id = 5;
1829 
1830  runtime_assert( compare_poses.size() > 0 );
1831  runtime_assert( template_pose.total_residue() == this->length() + 1);
1832 
1833  core::fragment::FragDataOP newfrag = this->fragment_ptr( 1 )->clone();
1834  if( !newfrag->steal( pose, *this ) ) utility_exit_with_message("unknown error when trying to steal fragment from pose for examination.");
1835 
1836  if( !newfrag->is_valid() ) utility_exit_with_message("unknown error when trying to steal fragment from pose for examination. fragment not valid");
1837 
1838  newfrag->apply( template_pose, 2, this->length() );
1839  /// FIX C and O on the last residue
1840  template_pose.set_phi( template_pose.total_residue(), pose.phi( positions_[ positions_.size() ] ) );
1841  template_pose.set_psi( template_pose.total_residue(), pose.psi( positions_[ positions_.size() ] ) );
1842  template_pose.set_omega( template_pose.total_residue(), pose.omega( positions_[ positions_.size() ] ) );
1843 
1844  //std::cout << "template: O " << template_pose.residue( template_pose.total_residue() ).xyz( "O" ).x();
1845  //std::cout << " " << template_pose.residue( template_pose.total_residue() ).xyz( "O" ).y();
1846  //std::cout << " " << template_pose.residue( template_pose.total_residue() ).xyz( "O" ).z() << std::endl;
1847 
1848  //std::cout << "regular: O " << pose.residue( positions_[ positions_.size() ] ).xyz( "O" ).x();
1849  //std::cout << " " << pose.residue( positions_[ positions_.size() ] ).xyz( "O" ).y();
1850  //std::cout << " " << pose.residue( positions_[ positions_.size() ] ).xyz( "O" ).z() << std::endl;
1851 
1852  template_pose.set_xyz(
1853  core::id::AtomID( template_pose.residue( template_pose.total_residue() ).atom_index( "O" ), template_pose.total_residue() ),
1854  pose.residue( positions_[ positions_.size() ] ).xyz( "O" ) );
1855 
1856 
1857  core::Real similarity_to_native = core::scoring::rmsd_no_super( *compare_poses[1], template_pose, core::scoring::is_protein_backbone );
1858  //if ( index_ == sought_loop_id ) {
1859  // std::cout << "loop " << count_examined << " distance to native: " << similarity_to_native << std::endl;
1860  //}
1861 
1862  bool frag_close_to_native = ( similarity_to_native <= target_proximity_to_native_conformation_ );
1863 
1864  if( !frag_close_to_native ) return false;
1865 
1866 
1867  bool frag_unique(true);
1868  //std::cerr << "gotta compare against " << compare_poses.size() << "unique poses " << std::endl;
1869  Size count( 0 );
1870  for( utility::vector1< core::pose::PoseOP >::const_iterator pose_it = compare_poses.begin(); pose_it != compare_poses.end(); ++pose_it){
1871 
1872  count++;
1873  //std::cout << "rmsd with prepose " << count << " is " << core::scoring::rmsd_no_super( **pose_it, template_pose, core::scoring::is_protein_CA ) << ", biggest CA/CB dist is " << core::scoring::biggest_residue_deviation_no_super( **pose_it, template_pose, core::scoring::is_protein_CA_or_CB ) << std::endl;
1874 
1875  if( core::scoring::biggest_residue_deviation_no_super( **pose_it, template_pose, core::scoring::is_protein_CA_or_CB ) < basic::options::option[basic::options::OptionKeys::enzdes::min_cacb_deviation] ){
1876  frag_unique = false;
1877  return false;
1878  }
1879  }
1880 
1881 
1882  bool frag_close_to_another_fragment( true );
1883  if ( basic::options::option[basic::options::OptionKeys::enzdes::max_bb_deviation ].user() )
1884  {
1885  // Find the smallest maximum deviation the template pose has to all other accepted poses.
1887  *compare_poses[1], template_pose, core::scoring::is_protein_backbone );
1888  for ( Size ii = 2; ii <= compare_poses.size(); ++ii ) {
1890  *compare_poses[ii], template_pose, core::scoring::is_protein_backbone );
1891  if ( ii_super < smallest_max_dist ) {
1892  smallest_max_dist = ii_super;
1893  }
1894  }
1895 
1896  frag_close_to_another_fragment = smallest_max_dist < target_proximity_to_other_conformations_;
1897 
1898  }
1899 
1900 
1901  //if( compare_poses.size() == 1 ) { template_pose.dump_pdb("template_1.pdb"); std::cerr << " dumping " << std::endl; }
1902  if ( frag_unique && frag_close_to_native && frag_close_to_another_fragment ){
1903  this->add_fragment( newfrag );
1904  rmsd_to_native.push_back( core::scoring::rmsd_no_super( *compare_poses[1], template_pose, core::scoring::is_protein_backbone ) );
1905  compare_poses.push_back( new core::pose::Pose( template_pose ) );
1906 
1907  return true;
1908 
1909  // if ( basic::options::option[ basic::options::OptionKeys::enzdes::dump_loop_samples ]() != "no" ) {
1910  // template_pose.dump_pdb("loopreg_"+utility::to_string( index_ )+"_"+utility::to_string( compare_poses.size() )+".pdb");
1911  // }
1912  }
1913 
1914  return false;
1915 
1916  /*else if ( ! pose_close_to_native ) {
1917  //std::cout << "rejected pose, unique, but not near enough to the native: " <<
1918  // core::scoring::biggest_residue_deviation_no_super( *compare_poses[1], template_pose, core::scoring::is_protein_CA )
1919  // << std::endl;
1920  if ( index_ == sought_loop_id ) {
1921  std::cout << "dumping rejected_pose_not_close_to_native_" + utility::to_string( index_ ) + "_" + utility::to_string( ++count_examined ) + ".pdb" << std::endl;
1922  template_pose.dump_pdb("rejected_pose_not_close_to_native_" + utility::to_string( index_ ) + "_" + utility::to_string( count_examined ) + ".pdb" );
1923  }
1924  } else if ( ! pose_unique ) {
1925  if ( index_ == sought_loop_id ) {
1926  std::cout << "dumping rejected_pose_not_unique_" + utility::to_string( index_ ) + "_" + utility::to_string( ++count_examined ) + ".pdb" << std::endl;
1927  template_pose.dump_pdb("rejected_pose_not_unique_" + utility::to_string( index_ ) + "_" + utility::to_string( count_examined ) + ".pdb" );
1928  }
1929  } else {
1930  if ( index_ == sought_loop_id ) {
1931  std::cout << "dumping rejected_pose_not_near_anothre_frag_" + utility::to_string( index_ ) + "_" + utility::to_string( ++count_examined ) + ".pdb" << std::endl;
1932  template_pose.dump_pdb("rejected_pose_not_near_anothre_frag_" + utility::to_string( index_ ) + "_" + utility::to_string( count_examined ) + ".pdb" );
1933  }
1934  }*/
1935 
1936  /*
1937  if(this->nr_frags() == 6 ){
1938  template_pose.dump_pdb("looppose_"+utility::to_string( index_ )+"_5.pdb");
1939  std::cerr << "dumped looppose_5.pdb" << std::endl;
1940  }
1941  if(this->nr_frags() == 7 ){
1942  template_pose.dump_pdb("looppose_"+utility::to_string( index_ )+"_6.pdb");
1943  std::cerr << "dumped looppose_6.pdb" << std::endl;
1944  }
1945  */
1946 
1947 } //examine_new_loopconf
1948 
1949 
1950 
1951 /// @details minimize the backbone of this pose over the fragment residues, including the
1952 /// @details bond angles around Calpha if desired. NOTE: CA ANGLE MINIMIZATION UNTESTED
1953 /// a chainbreak at the end of the region will be introduced. chainbreak weight will be
1954 /// set to 100 to make sure that it stays closed. in case the chainbreak score is higher
1955 /// after the min then before, function returns false. this might be the case when
1956 /// the input conformation has bad clashes, which is the case e.g. for some conformations
1957 /// that come out of remodel
1958 bool
1960  core::pose::Pose & pose,
1962  std::set< core::Size > const & chi_to_move,
1963  bool const including_CA_angles,
1964  core::Real min_tolerance
1965 )
1966 {
1967 
1968  //1. we need to setup a correct foldtree, so no downstream residues get affected
1971  //core::Real mm_bend_bef = get_region_mm_bend_score( pose );
1972 
1973  core::kinematics::FoldTree old_fold_tree = pose.fold_tree();
1974  core::Size old_njump = old_fold_tree.num_jump();
1975  core::kinematics::FoldTree temp_fold_tree;
1976  core::kinematics::FoldTree const & f_const = old_fold_tree;
1977  //tr << "regmindebug start foldtree " << old_fold_tree << std::endl;
1978  core::scoring::ScoreFunctionOP min_scorefxn = scorefxn->clone();
1979  min_scorefxn->set_weight( core::scoring::chainbreak, 100.0 );
1980 
1981  //fold tree approach
1982  //the segment will be covered by an edge from start -1 to end
1983  //non-jump edges spanning the segment will be replaced by two edges
1984  //jump edges spanning the segment will be left untouched
1985  //non-jump edges going into the segment will go either until start or end
1986  //jump ed
1987  bool backward_into_seg(false), backward_outof_seg(false);
1988  utility::vector1< std::pair<core::Size,int> > jump_origins, jump_destinations;
1989 
1990  //find the edge that spans the end of this segment
1991  //tr << "regmindebug setting foldtree for region from " << this->start() << " to " << this->end() << std::endl;
1992  for( core::kinematics::FoldTree::const_iterator e = f_const.begin(); e != f_const.end(); ++e ){
1993  bool is_jump( e->is_jump() ), backward( e->start() > e->stop() ), start_in_seg( e->start() >= (int)this->start() && e->start() <= (int)this->end() ), stop_in_seg( e->stop() >= (int)this->start() && e->stop() <= (int)this->end() );
1994  bool span( backward ? ( (e->start() > (int)this->end()) && (e->stop() < (int)this->start()) ) : ( (e->start() < (int)this->start()) && (e->stop() > (int)this->end()) ) );
1995  //tr << "regmindebug dealing with edge from " << e->start() << " to " << e->stop() << " with label " << e->label() << " backward is " << backward << ", span is " << span << ", start_in_seg is " << start_in_seg << ", stop in seg is " << stop_in_seg << ", is_jump is " << is_jump << std::endl;
1996 
1997  //edges only in the segment will be discarded
1998  if( start_in_seg && stop_in_seg ){
1999  if( is_jump ) old_njump--;
2000  continue;
2001  }
2002 
2003  if( is_jump && start_in_seg ) jump_destinations.push_back( std::pair<core::Size, int>(e->stop(), e->label()) );
2004  else if( is_jump && stop_in_seg ) jump_origins.push_back( std::pair< core::Size, int>(e->start(), e->label() ) );
2005  else if( !is_jump && start_in_seg ){
2006  if( backward ){
2007  temp_fold_tree.add_edge( this->start(), e->stop(), e->label() );
2008  backward_outof_seg = true;
2009  }
2010  else temp_fold_tree.add_edge( this->end() + 1, e->stop(), e->label() );
2011  }
2012  else if( !is_jump && stop_in_seg ){
2013  if( backward ){
2014  temp_fold_tree.add_edge( e->start(), this->end() + 1, e->label() );
2015  backward_into_seg = true;
2016  }
2017  else temp_fold_tree.add_edge( e->start(), this->start(), e->label() );
2018  }
2019  else if (!is_jump && span ){
2020  if(backward ){
2021  //tr << "regmindebug dealing with backward span " << std::endl;
2022  temp_fold_tree.add_edge( e->start(), this->end() + 1, e->label() );
2023  temp_fold_tree.add_edge( this->start(), e->stop(), e->label() );
2024  backward_outof_seg = true;
2025  backward_into_seg = true;
2026  }
2027  else{
2028  //tr << "regmindebug dealing with forward span " << std::endl;
2029  temp_fold_tree.add_edge( e->start(), this->start(), e->label() );
2030  temp_fold_tree.add_edge( this->end() + 1, e->stop(), e->label() );
2031  }
2032  }
2033 
2034  else{
2035  temp_fold_tree.add_edge( *e );
2036  }
2037  } // loop over edges
2038  temp_fold_tree.add_edge( this->start(), this->end(), -1); // add edge for segment
2039  core::Size jump_focus( this->start() );
2040  if( backward_into_seg && backward_outof_seg ){
2041  jump_focus = this->end() + 1;
2042  temp_fold_tree.add_edge( core::kinematics::Edge(this->end() +1, this->start(), old_njump + 1 ,"CA", "CA", false ) );
2043  }
2044  else{
2045  //tr << "regmindebug adding jump across segment " << std::endl;
2046  temp_fold_tree.add_edge( core::kinematics::Edge(this->start(), this->end() +1, old_njump + 1 ,"CA", "CA", false ) );
2047  }
2048 
2049  for( utility::vector1< std::pair<core::Size, int> >::const_iterator jump_o_it = jump_origins.begin(); jump_o_it != jump_origins.end(); ++jump_o_it ) temp_fold_tree.add_edge( core::kinematics::Edge(jump_o_it->first, jump_focus, jump_o_it->second ,"CA", "CA", false ) );
2050 
2051  for( utility::vector1< std::pair< core::Size,int> >::const_iterator jump_d_it = jump_destinations.begin(); jump_d_it != jump_destinations.end(); ++jump_d_it ) temp_fold_tree.add_edge( core::kinematics::Edge( jump_focus, jump_d_it->first, jump_d_it->second ,"CA", "CA", false ) );
2052 
2053 
2054  temp_fold_tree.delete_extra_vertices();
2055  //tr << "regmindebug new foldtree " << temp_fold_tree << std::endl;
2056 
2057  if( !temp_fold_tree.check_fold_tree() ) {
2058  utility_exit_with_message("Invalid fold tree after trying to set up for flexbb ca angle min");
2059  }
2060 
2061  //std::cerr << "frigging new fold tree at end has " << temp_fold_tree.num_cutpoint() << " cutpoints." << std::endl << temp_fold_tree << std::endl;
2062  pose.fold_tree( temp_fold_tree );
2063 
2064  //get the cur chainbreak
2065  core::Real totE_start = (*scorefxn)( pose );
2067 
2068  //2. now set up the correct movemap, including the CA bond angles
2070  movemap->clear();
2071 
2072  for( core::Size i = this->start(); i <= this->end(); ++i){
2073 
2074  movemap->set_chi( i, true );
2075  movemap->set_bb( i, true );
2076 
2077  if( including_CA_angles ){
2078  core::id::AtomID c_id ( pose.residue_type(i).atom_index("C"), i );
2079  core::id::DOF_ID ca_dof( c_id, core::id::PHI );
2080  movemap->set( ca_dof, true );
2081  }
2082 
2083  }
2084 
2085  for( std::set< core::Size >::const_iterator chi_it = chi_to_move.begin(); chi_it != chi_to_move.end(); ++chi_it ){
2086  movemap->set_chi( *chi_it, true );
2087  }
2088 
2089  //core::scoring::ScoreFunctionOP trial_score = new core::scoring::ScoreFunction( *scorefxn );
2090  //trial_score->set_weight( core::scoring::mm_bend, 0.0 );
2091  //(*trial_score)(pose);
2092  (*min_scorefxn)(pose);
2093  protocols::simple_moves::MinMoverOP dfpMinTightTol = new protocols::simple_moves::MinMover( movemap, min_scorefxn, "dfpmin_armijo_nonmonotone_atol", min_tolerance, true );
2094  dfpMinTightTol->apply(pose);
2095  core::Real totE_end = (*scorefxn)(pose);
2097 
2098  //finally put back the old fold tree
2099  pose.fold_tree( old_fold_tree );
2102 
2103  (*scorefxn)(pose);
2104  //core::Real mm_bend_aft = get_region_mm_bend_score( pose );
2105 
2106  if( cbE_end > ( cbE_start + 0.1) ){
2107  tr << "FlexRegion minimization failed: cbE_start " << cbE_start << ", cbE_end " << cbE_end << "." << std::endl;
2108  return false;
2109  }
2110 
2111  if( totE_end > totE_start ){
2112  tr << "FlexRegion minimization failed: totE_start " << totE_start << ", totE_end " << totE_end << "." << std::endl;
2113  return false;
2114  }
2115  //lastly, we should clear the frags of this region
2116  this->clear();
2117  if( !this->steal( pose ) ) utility_exit_with_message("Unknown error when trying to save fragdata after minimizing region.");
2118  runtime_assert( this->nr_frags() == 1 );
2119  return true;
2120 
2121  //tr << "MMBEND before minimization, mm_bend score was " << mm_bend_bef << ", while after it is " << mm_bend_aft << std::endl;
2122 } //minimize_region
2123 
2124 
2125 core::Real
2127 {
2128 
2129  using namespace core::scoring;
2130 
2131  core::Real to_return(0.0);
2132 
2133  for( core::Size i = this->start(); i <= this->end(); ++i ){
2134  to_return += pose.energies().residue_total_energy( i );
2135  }
2136 
2137  return to_return;
2138 }
2139 
2140 bool
2142  core::pose::Pose const & pose,
2143  core::id::SequenceMapping const& smap
2144 )
2145 {
2146  core::Size newstart( smap[ this->start()] ), newend( smap[ this->end()] );
2147  core::Size newlength( newend - newstart + 1 );
2148 
2149  //only shifting?
2150  if( newlength == this->length() ){
2151  bool to_return = Super::align( smap );
2152 
2153  //super class handles checks for 0 in sequence mapping
2154  if( to_return ){
2155 
2156  for( core::Size i = 1; i <= positions_.size(); ++i){
2157  positions_[i] = smap[ positions_[i] ];
2158  }
2159  }
2160  return to_return;
2161  }
2162 
2163  //if length of this region changed, need to proceed differently
2164  if( (newstart == 0) || (newend == 0 ) || !is_continuous() ) return false;
2165  positions_.clear();
2166 
2167  this->init_length( newstart, newend, newlength );
2168  for ( core::Size i = newstart; i <= newend; ++i ) positions_.push_back( i );
2169 
2170  this->clear();
2172  if( add_fragment( native_conf_ ) != 1 ) return false;
2173  frag_designabilities_.clear();
2174  return true;
2175 }
2176 
2177 /// @brief requires that the pose was scored
2178 void
2180  core::pose::Pose const & pose
2181 ){
2182 
2183  twelve_A_neighbors_.clear();
2184  //shiat, seems to be complicated to have the scorefxn build the 12a neighbor graph,
2185  //so we'll take the ten a one for now...
2186  core::scoring::TenANeighborGraph const & cur_graph = pose.energies().tenA_neighbor_graph();
2187 
2188  for( core::Size i = this->start(); i <= this->end(); ++i ){
2189 
2190  for( core::graph::EdgeListConstIterator graph_it = cur_graph.get_node( i )->const_edge_list_begin();
2191  graph_it != cur_graph.get_node( i )->const_edge_list_end(); ++graph_it){
2192 
2193  core::Size other_res = (*graph_it)->get_other_ind( i );
2194  if( !this->contains_seqpos( other_res )
2195  && ( twelve_A_neighbors_.find( other_res) == twelve_A_neighbors_.end() ) )
2196  {
2197  twelve_A_neighbors_.insert( other_res );
2198  }
2199  }
2200  }
2201 } //determine_12A_neighbors(
2202 
2203 
2204 
2205 
2206 void
2208  core::pose::Pose const & pose,
2210 ){
2211 
2212  using namespace flexpack::rotamer_set;
2213 
2214  FlexbbRotamerSetsOP flexset = new FlexbbRotamerSets( task );
2215 
2216  std::cerr << "FlexbbRotamerSet test: done initialising set." << std::endl;
2217 
2218  flexset->set_frames( pose, flex_regions_ );
2219 
2220  std::cerr << "FlexbbRotamerSet test: done setting frames." << std::endl;
2221 
2222  core::graph::GraphOP flex_graph = flexset->flexpack_neighbor_graph( pose, *scorefxn_, task );
2223 
2224  std::cerr << "FlexbbRotamerSet test: done setting up flexpack neighbor graph." << std::endl;
2225 
2226  flexset->build_rotamers( pose, *scorefxn_, *flex_graph );
2227 
2228  std::cerr << "FlexbbRotamerSet test: done building rotamers." << std::endl;
2229 
2230  flexset->dump_pdbs( pose, "flextest" );
2231 
2232 } // test_flexbb_rotamer_sets
2233 
2234 
2235 } //namespace enzdes
2236 } //namespace protocols