23 #include <numeric/random/random.hh>
24 #include <numeric/random/random_permutation.hh>
29 #include <utility/tag/Tag.hh>
32 #include <basic/Tracer.hh>
40 #include <utility/vector1.hh>
43 #include <boost/foreach.hpp>
44 #define foreach BOOST_FOREACH
50 #include <utility/vector0.hh>
53 #include <utility/string_util.hh>
54 #include <utility/io/ozstream.hh>
57 #include <utility/excn/Exceptions.hh>
58 #include <basic/options/keys/OptionKeys.hh>
61 namespace design_opt {
63 static basic::Tracer
TR(
"protocols.design_opt.GreedyOptMutationMover" );
64 static numeric::random::RandomGenerator
RG( 27188 );
66 using namespace chemical;
73 task_factory_( NULL ),
81 stopping_condition_( NULL ),
82 stop_before_condition_( false ),
83 skip_best_check_( false ),
85 shuffle_order_( false ),
100 bool stop_before_condition,
101 bool skip_best_check,
148 return "GreedyOptMutationMover";
305 pair< Size, Real >
const pair1,
306 pair< Size, Real >
const pair2 )
308 return pair1.second < pair2.second;
316 return pair1.second[ 1 ] < pair2.second[ 1 ];
324 return pair1.second[ 1 ].second[ 1 ] < pair2.second[ 1 ].second[ 1 ];
349 if( rsd1.natoms() != rsd2.natoms() )
return false;
351 for(
Size ii = 1; ii <= rsd1.natoms(); ++ii ) {
352 if( rsd1.xyz( ii ).x() != rsd2.xyz( ii ).x() )
return false;
353 if( rsd1.xyz( ii ).y() != rsd2.xyz( ii ).y() )
return false;
354 if( rsd1.xyz( ii ).z() != rsd2.xyz( ii ).z() )
return false;
375 for(
Size rank = 1; rank <= filter_index_vals.size(); ++rank ){
376 Size ipose( filter_index_vals[ rank ].first );
393 assert( coords.size() == is_pfront.size() );
395 Size n( coords.size() );
398 for(
Size i = 1; i <= n; ++i ){
399 bool is_dom(
false );
401 for(
Size j = 1; j <= n; ++j ){
402 if( j == i )
continue;
404 bool is_equal =
true;
405 for(
Size k = 1; k <= d; ++k ){
407 is_equal = is_equal && ( coords[ i ][ k ] == coords[ j ][ k ] );
409 if( coords[ i ][ k ] < coords[ j ][ k ] ){
414 if( is_equal ) is_dom =
false;
417 if( is_dom ) is_pfront[ i ] =
false;
418 else is_pfront[ i ] =
true;
441 if( is_pfront[ iaa ] ) pfront_aa_vals.push_back(
seqpos_aa_vals_vec_[ iseq ].second[ iaa ] );
459 for(
Size ipose = 1; ipose <= poses.size(); ++ipose ){
460 if( is_pfront[ ipose ] ){
461 pfront_poses.push_back( poses[ ipose ] );
462 pfront_vals.push_back( vals[ ipose ] );
465 poses = pfront_poses;
472 utility::io::ozstream outtable(filename, std::ios::out | std::ios::app );
479 outtable <<
" (" << ref_pose.
pdb_info()->pose2pdb(pos) <<
")";
482 for(
core::Size jj(1); jj <= aa_pairs.size(); ++jj ) {
483 outtable << aa_pairs[jj].first << ((ref_pose.
aa(pos) == aa_pairs[jj].first)?
"*:":
":");
484 for(
core::Size kk( 1 ); kk <= aa_pairs[ jj ].second.size(); ++kk ){
485 outtable << aa_pairs[jj].second[ kk ] <<
":";
489 outtable << std::endl;
491 outtable << std::endl;
493 TR.Warning <<
"WARNING: Unable to open file " << filename <<
" for writing GreedyOptMutationMover table output." << std::endl;
502 using namespace core::pack::task;
503 using namespace core::pack::task::operation;
504 using namespace core::chemical;
527 utility_exit_with_message(
"ERROR: No acceptable mutations found. All possible mutations failed at least one filter!" );
559 TR<<
"Combining shuffled mutations… " << std::endl;
561 else TR<<
"Combining sorted mutations… " << std::endl;
571 ptmut_calc->mutate_and_relax( new_pose, resi_init, target_aa );
583 TR <<
"Combining " <<
pfront_poses_.size() <<
" structures with mutations at residue " << seqpos << std::endl;
595 ptmut_calc->mutate_and_relax( new_pose, seqpos, target_aa );
596 ptmut_calc->eval_filters( new_pose, filter_pass, vals );
598 if( !filter_pass )
continue;
600 new_poses.push_back( new_pose );
601 new_poses_filter_vals.push_back( vals );
609 if( new_poses.size() < 1 ){
610 TR <<
"Unable to generate any new poses that pass all filters at position " << iseq << std::endl;
616 for(
Size ipose = 1; ipose <= new_poses.size(); ++ipose ){
620 if( !
stop_before_condition() ) TR<<
"Stopping condition evaluates to true. Stopping early and acceptingn the last mutation: "<<
622 else TR<<
"Stopping condition evaluates to true. Stopping early and rejecting the last mutation."
635 for(
Size ipose = 1; ipose <= new_poses.size(); ++ipose ){
649 std::string const fname( delta_filter->get_user_defined_name() );
650 core::Real const fbaseline( delta_filter->filter()->report_sm( pose ) );
651 delta_filter->baseline( fbaseline );
652 delta_filter->ref_baseline( fbaseline );
653 TR<<
"Reset baseline for DeltaFilter "<<fname<<
" to "<<fbaseline<<std::endl;
656 TR <<
"Generated " <<
pfront_poses_.size() <<
" final structures" << std::endl;
665 TR <<
" " <<
filters()[ ival ]->get_user_defined_name() <<
": "
671 TR <<
" " <<
filters()[ ival ]->get_user_defined_name() <<
": "
686 if( filter_delta <
Real( 0. ) ) filter_delta = -1 * filter_delta;
700 TR <<
"GreedyOptMutationMover"<<std::endl;
704 protocols::moves::Movers_map::const_iterator mover_it( movers.find( relax_mover_name ) );
705 if( mover_it == movers.end() )
706 throw utility::excn::EXCN_RosettaScriptsOption(
"Relax mover "+relax_mover_name+
" not found" );
711 dump_pdb( tag->getOption<
bool >(
"dump_pdb",
false ) );
713 dump_table( tag->getOption<
bool >(
"dump_table",
false ) );
714 parallel( tag->getOption<
bool >(
"parallel",
false ) );
715 if( tag->hasOption(
"stopping_condition" ) ){
718 TR<<
"Defined stopping condition "<<stopping_filter_name<<std::endl;
724 if( btag->getName() ==
"Filters" ){
728 Filters_map::const_iterator find_filt( filters.find( filter_name ));
729 if( find_filt == filters.end() ) {
730 TR.Error <<
"Error !! filter not found in map: \n" << tag << std::endl;
731 runtime_assert( find_filt != filters.end() );
735 add_filter( find_filt->second->clone(), samp_type, filter_delta );
739 throw utility::excn::EXCN_RosettaScriptsOption(
"tag name " + btag->getName() +
" unrecognized." );
744 if( filter_name !=
"true_filter" ||
filters_.size() < 1 ){
745 protocols::filters::Filters_map::const_iterator find_filt( filters.find( filter_name ) );
746 if( find_filt == filters.end() )
747 throw utility::excn::EXCN_RosettaScriptsOption(
"Filter "+filter_name+
" not found" );
751 add_filter( find_filt->second->clone(), samp_type, filter_delta );
757 delta_filter_names.clear();
758 if( tag->hasOption(
"reset_delta_filters" ) ){
759 delta_filter_names = utility::string_split( tag->getOption<
std::string >(
"reset_delta_filters" ),
',' );
760 foreach(
std::string const fname, delta_filter_names ){
762 TR<<
"The baseline for Delta Filter "<<fname<<
" will be reset upon each accepted mutation"<<std::endl;
773 rtmin( tag->getOption<
bool >(
"rtmin",
false ) );
775 shuffle_order( tag->getOption<
bool >(
"shuffle_order",
false ) );