26 #include <basic/Tracer.hh>
35 #include <utility/tag/Tag.hh>
48 #include <numeric/random/random.hh>
49 #include <numeric/random/random_permutation.hh>
58 #include <utility/vector0.hh>
59 #include <utility/vector1.hh>
60 #include <utility/excn/Exceptions.hh>
61 #include <boost/foreach.hpp>
64 #define foreach BOOST_FOREACH
66 namespace rosetta_scripts {
68 static basic::Tracer
TR(
"protocols.rosetta_scripts.ParsedProtocol" );
69 static basic::Tracer
TR_call_order(
"protocols.rosetta_scripts.ParsedProtocol_call_order" );
70 static basic::Tracer
TR_report(
"protocols.rosetta_scripts.ParsedProtocol.REPORT" );
71 static numeric::random::RandomGenerator
RG(48569);
93 return "ParsedProtocol";
97 protocols::moves::
Mover(
"ParsedProtocol" ),
100 last_attempted_mover_idx_( 0 ),
101 report_call_order_( false )
115 if(
mode_ ==
"sequence")
117 for ( rmover_it=
movers_.rbegin() ; rmover_it != movers_crend; ++rmover_it ) {
122 std::string const mover_name( rmover_it->first.first->get_name() );
125 if (checkpoint &&
mode_ !=
"sequence")
126 utility_exit_with_message(
"Mover "+mover_name+
" returned multiple poses in a ParsedProtocol with mode!=sequence");
128 TR<<
"=======================RESUMING FROM "<<mover_name<<
"======================="<<std::endl;
141 if(
mode_ ==
"sequence"){
143 }
else if(
mode_ ==
"random_order"){
145 }
else if(
mode_ ==
"single_random"){
149 TR <<
"WARNING: mode is " <<
mode_ <<
" .This is not a valid ParsedProtocol Mode, your pose is being ignored" <<std::endl;
167 mover_filter_pair p( std::pair< protocols::moves::MoverOP, std::string > ( mover_p, mover_name ), filter_p );
185 if( ! scorefxn ) {
return; }
195 TR_report<<
"=============Starting final report================"<<std::endl;
197 TR_report<<
"============Begin report for "<<mover_pair.second->get_user_defined_name()<<
"=================="<<std::endl;
198 mover_pair.second->report( TR_report, pose );
199 TR_report<<
"============End report for "<<mover_pair.second->get_user_defined_name()<<
"=================="<<std::endl;
209 mover_it!=
movers_.end(); ++mover_it ) {
210 core::Real const filter_value( (*mover_it).second->report_sm( pose ) );
211 if( filter_value > -9999 )
212 job_me->add_string_real_pair((*mover_it).second->get_user_defined_name(), filter_value);
219 mover_it!=
movers_.end(); ++mover_it ) {
220 core::Real const filter_value( (*mover_it).second->report_sm( pose ) );
221 if( filter_value >= -9999 )
222 score_map[ (*mover_it).second->get_user_defined_name() ] = filter_value;
251 using namespace protocols::moves;
270 using namespace protocols::moves;
271 using namespace utility::tag;
273 TR<<
"ParsedProtocol mover with the following movers and filters\n";
275 mode_=tag->getOption<
string>(
"mode",
"sequence");
276 if(
mode_ !=
"sequence" &&
mode_ !=
"random_order" &&
mode_ !=
"single_random"){
277 throw utility::excn::EXCN_RosettaScriptsOption(
"Error: mode must be sequence, random_order, or single_random");
284 TagPtr const tag_ptr = *dd_it;
289 bool mover_defined(
false ), filter_defined(
false );
292 runtime_assert( !( tag_ptr->hasOption(
"mover_name") && tag_ptr->hasOption(
"mover") ) );
293 if( tag_ptr->hasOption(
"mover_name" ) ){
294 mover_name = tag_ptr->getOption<
string>(
"mover_name",
"null" );
295 mover_defined =
true;
297 else if( tag_ptr->hasOption(
"mover" ) ){
298 mover_name = tag_ptr->getOption<
string>(
"mover",
"null" );
299 mover_defined =
true;
303 if( data.
has(
"stopping_condition", mover_name ) && tag->hasOption(
"name" ) ){
304 TR<<
"ParsedProtocol's mover "<<mover_name<<
" requests its own stopping condition. This ParsedProtocol's stopping_condition will point at the mover's"<<std::endl;
309 runtime_assert( !( tag_ptr->hasOption(
"filter_name") && tag_ptr->hasOption(
"filter" ) ) );
310 if( tag_ptr->hasOption(
"filter_name" ) ){
311 filter_name = tag_ptr->getOption<
string>(
"filter_name",
"true_filter" );
312 filter_defined =
true;
313 }
else if( tag_ptr->hasOption(
"filter" ) ){
314 filter_name = tag_ptr->getOption<
string>(
"filter",
"true_filter" );
315 filter_defined =
true;
319 Movers_map::const_iterator find_mover( movers.find( mover_name ) );
320 if( find_mover == movers.end() ) {
321 TR.Error<<
"mover not found in map. skipping:\n"<<tag_ptr<<std::endl;
322 runtime_assert( find_mover != movers.end() );
325 mover_to_add = find_mover->second;
329 if( filter_defined ){
330 protocols::filters::Filters_map::const_iterator find_filter( filters.find( filter_name ));
331 if( find_filter == filters.end() ) {
332 TR.Error<<
"filter not found in map. skipping:\n"<<tag_ptr<<std::endl;
333 runtime_assert( find_filter != filters.end() );
336 filter_to_add = find_filter->second;
340 add_mover( mover_to_add, mover_name, filter_to_add );
341 TR <<
"added mover \"" << mover_name <<
"\" with filter \"" << filter_name <<
"\"\n";
342 if(
mode_ ==
"single_random" ){
343 a_probability[ count ] = tag_ptr->getOption<
core::Real >(
"apply_probability", 1.0/dd_tags.size() );
344 TR<<
"and execution probability of "<<a_probability[ count ]<<
'\n';
348 if(
mode_ ==
"single_random" )
363 for ( rmover_it=
movers_.rbegin() ; rmover_it != movers_crend; ++rmover_it ) {
366 std::string const mover_name( rmover_it->first.first->get_name() );
367 TR<<
"=======================RESUMING FROM "<<mover_name<<
"======================="<<std::endl;
379 if (!pose)
return NULL;
382 if (
mode_ !=
"sequence")
383 utility_exit_with_message(
"ParsedProtocol returned multiple poses in a ParsedProtocol with mode!=sequence");
387 mover_it!=
movers_.end(); ++mover_it ) {
393 TR<<
"setting status to success"<<std::endl;
408 std::string const mover_name( mover_pair.first.first->get_name() );
411 TR<<
"=======================BEGIN MOVER "<<mover_name<<
"=======================\n{"<<std::endl;
412 mover_pair.first.first->apply( pose );
413 TR<<
"\n}\n=======================END MOVER "<<mover_name<<
"======================="<<std::endl;
421 std::string const filter_name( mover_pair.second->get_user_defined_name() );
423 TR<<
"=======================BEGIN FILTER "<<filter_name<<
"=======================\n{"<<std::endl;
424 info().insert(
info().
end(), mover_pair.first.first->info().begin(), mover_pair.first.first->info().end() );
428 TR<<
"\n}\n=======================END FILTER "<<filter_name<<
"======================="<<std::endl;
431 TR <<
"Mover " << mover_pair.first.first->get_name() <<
" reports failure!" << std::endl;
434 TR <<
"Filter " << filter_name <<
" reports failure!" << std::endl;
444 TR<<
"setting status to success"<<std::endl;
451 using namespace protocols::jd2;
453 std::string job_name (JobDistributor::get_instance()->job_outputter()->output_name( job2 ) );
455 TR_call_order << job_name<<
" ";
457 TR_call_order<<p.first.second<<
" ";
458 TR_call_order<<std::endl;
471 mover_it!=
movers_.end(); ++mover_it ) {
501 runtime_assert( sum >= 0.999 && sum <= 1.001 );
512 runtime_assert( sum >= 0.999 && sum <= 1.001 );
520 sum += probability; mover_index++;
521 if( sum >= random_num )