66 #include <basic/options/option.hh>
67 #include <basic/Tracer.hh>
68 #include <utility/exit.hh>
71 #include <basic/options/keys/run.OptionKeys.gen.hh>
72 #include <basic/options/keys/in.OptionKeys.gen.hh>
73 #include <basic/options/keys/packing.OptionKeys.gen.hh>
74 #include <basic/options/keys/FloppyTail.OptionKeys.gen.hh>
77 #include <utility/vector0.hh>
78 #include <utility/vector1.hh>
80 #if defined(WIN32) || defined(__CYGWIN__)
88 static basic::Tracer
TR(
"protocols.floppy_tail.FloppyTail");
91 namespace floppy_tail {
96 init_for_input_yet_(false),
97 centroid_scorefunction_(NULL),
98 fullatom_scorefunction_(NULL),
101 movemap_lesstail_(NULL),
108 if (basic::options::option[ basic::options::OptionKeys::in::file::frag3].user()){
110 fragset3mer_->read_fragment_file( basic::options::option[ basic::options::OptionKeys::in::file::frag3].value() );
113 bool const pair_off(basic::options::option[ basic::options::OptionKeys::FloppyTail::pair_off ].value() );
116 using namespace core::scoring;
117 if (basic::options::option[ basic::options::OptionKeys::FloppyTail::cen_weights].user()){
155 if (
this == &rhs)
return *
this;
188 using namespace basic::options;
189 using namespace basic::options::OptionKeys;
191 if(!option[in::file::movemap].user() && !
movemap_){
193 char const chain(option[FloppyTail::flexible_chain].value()[0]);
194 start_ = pose.
pdb_info()->pdb2pose().find(chain, option[FloppyTail::flexible_start_resnum].value());
195 if(option[FloppyTail::flexible_stop_resnum].user())
196 stop_ = pose.
pdb_info()->pdb2pose().find(chain, option[FloppyTail::flexible_stop_resnum].value());
199 TR <<
"Tail is from " <<
start_ <<
" to " <<
stop_ << std::endl;
212 for(
core::Size i(start_); i <= substop; ++i) {
218 option[FloppyTail::flexible_chain].user() ||
219 option[FloppyTail::flexible_stop_resnum].user() ||
220 option[FloppyTail::flexible_chain].user() ||
221 option[FloppyTail::short_tail::short_tail_fraction].user() ||
222 option[FloppyTail::short_tail::short_tail_off].user() ) {
223 utility_exit_with_message(
"option in::file::movemap not compatible with options flexible_chain, flexible_stop_resnum, flexible_chain, short_tail_fraction, or short_tail off. This is because a manually-defined movemap overrides these options.");
228 movemap_->init_from_file(option[in::file::movemap].value());
252 std::ostringstream message;
253 message <<
"invalid flexible region (start (" <<
start_ <<
") or stop (" <<
stop_ <<
") is undefined) - check your flags or movemap file";
254 utility_exit_with_message( message.str());
259 if( !((
stop_ == pose.
total_residue()) || (
start_ == 1)) || basic::options::option[ FloppyTail::force_linear_fold_tree].value() ){
260 TR <<
"non-terminal or N-terminal (C-rooted) floppy section, using a linear fold tree to try to ensure downstream residues follow \nOld tree: " << pose.
fold_tree();
264 if( basic::options::option[ FloppyTail::C_root].value() ) {
266 TR <<
"C-rooted tree: " << *
foldtree_ << std::endl;
271 using namespace core::pack::task;
274 if ( option[ packing::resfile ].user() ) {
283 bool previous_state(
false);
285 std::set < core::Size >
const empty;
287 regions.push_back(empty);
292 bool const this_state(
movemap_->get_bb(i));
293 if(this_state != previous_state) {
294 if( previous_state ==
false ) {
295 regions.push_back(empty);
298 previous_state = this_state;
300 regions[current_group].insert(i);
301 if(this_state) regions[current_group-1].insert(i);
308 for(
core::Size first_group(1); first_group < num_regions; ++first_group) {
309 for(
core::Size second_group(first_group+1); second_group <= num_regions; ++second_group){
310 vector_of_pairs.push_back(std::make_pair(regions[first_group], regions[second_group]));
315 core::Size const num_pairs(vector_of_pairs.size());
318 onestart(*(vector_of_pairs[i].first.begin())),
319 onestop(*(vector_of_pairs[i].first.rbegin())),
320 twostart(*(vector_of_pairs[i].second.begin())),
321 twostop(*(vector_of_pairs[i].second.rbegin()));
323 TR <<
"IGNC will compare group " << onestart <<
"-" << onestop <<
" with " << twostart <<
"-" << twostop << std::endl;
326 for(std::set<core::Size>::const_iterator iter(vector_of_pairs[i].first.begin()),
end(vector_of_pairs[i].first.end()); iter !=
end; ++iter) {
327 if(guess++ != *iter)
TR.Error <<
"non-contiguous set, debug me!" << std::endl;
331 for(std::set<core::Size>::const_iterator iter(vector_of_pairs[i].second.begin()),
end(vector_of_pairs[i].second.end()); iter !=
end; ++iter) {
332 if(guess++ != *iter)
TR.Error <<
"non-contiguous set, debug me!" << std::endl;
342 TR <<
"removed a PoseMetricCalculator " << calc <<
", hopefully this is due to multiple inputs to FloppyTail and not a name clash" << std::endl;
348 std::pair< std::string, std::string> IGNC_cmd( calc,
"neighbors" );
349 calculators_used.push_back( IGNC_cmd );
359 using namespace basic::options;
360 using namespace basic::options::OptionKeys;
366 TR <<
"foldtree, movemap: " << std::endl;
369 TR <<
"foldtree, movemap for first part of refine: " << std::endl;
376 clock_t starttime = clock();
377 TR <<
"entering perturb steps" << std::endl;
382 typeset_swap.
apply( pose );
384 TR <<
"centroid score of starting PDB: " << (*centroid_scorefunction_)(pose) << std::endl;
400 small_mover_cen->angle_max(
'H', 180.0 );
401 small_mover_cen->angle_max(
'E', 180.0 );
402 small_mover_cen->angle_max(
'L', 180.0 );
403 backbone_mover_cen->add_mover(small_mover_cen, 1.0);
406 shear_mover_cen->angle_max(
'H', 180.0 );
407 shear_mover_cen->angle_max(
'E', 180.0 );
408 shear_mover_cen->angle_max(
'L', 180.0 );
414 frag_mover->enable_end_bias_check(
false);
415 backbone_mover_cen->add_mover(frag_mover, 0.5);
424 basic::options::option[ basic::options::OptionKeys::run::min_type ].value(),
432 using basic::options::option;
437 core::Size const perturb_applies = option[ FloppyTail::perturb_cycles ].value();
439 if(shear_on_cyc == 0) shear_on_cyc = 1;
440 TR <<
"shear on at " << shear_on_cyc << std::endl;
441 TR <<
" Current Low total cycles =" << perturb_applies << std::endl;
442 for (
core::Size i = 1; i <= perturb_applies; ++i ) {
443 if( i == shear_on_cyc ) backbone_mover_cen->add_mover(shear_mover_cen, 1.0);
444 if( (i % 20 == 0) || (i == perturb_applies) ) min_mover_cen->apply(pose);
445 else backbone_mover_cen->apply(pose);
448 mc_cen->boltzmann(pose);
450 TR << i <<
" " << mc_cen->last_accepted_score() <<
" " << mc_cen->lowest_score() << std::endl;
457 mc_cen->recover_low(pose);
469 if ( basic::options::option[basic::options::OptionKeys::FloppyTail::perturb_show ].value() ) {
470 using namespace protocols::jd2;
472 JobDistributor::get_instance()->job_outputter()->other_pose( job_me, pose,
"centroid");
476 TR <<
"centroid score of final perturbed PDB: " << (*centroid_scorefunction_)(pose) << std::endl;
480 clock_t stoptime = clock();
481 TR <<
"One perturb took " << ((double) stoptime - starttime )/CLOCKS_PER_SEC <<
" seconds" << std::endl;
482 TR <<
"perturb steps complete" << std::endl;
490 return_sidechains.
apply( pose );
504 basic::options::option[ basic::options::OptionKeys::run::min_type ].value(),
515 pack_mover->apply(pose);
517 TAmin_mover_fa->apply(pose);
523 small_mover_fa->angle_max(
'H', 4.0 );
524 small_mover_fa->angle_max(
'E', 4.0 );
525 small_mover_fa->angle_max(
'L', 4.0 );
528 shear_mover_fa->angle_max(
'H', 4.0 );
529 shear_mover_fa->angle_max(
'E', 4.0 );
530 shear_mover_fa->angle_max(
'L', 4.0 );
532 backbone_mover_fa->add_mover(small_mover_fa, 1.0);
533 backbone_mover_fa->add_mover(shear_mover_fa, 1.0);
549 core::Size const refine_applies = option[ FloppyTail::refine_cycles ].value();
550 core::Size const repack_cycles = option[ FloppyTail::refine_repack_cycles ].value();
551 core::Size const min_cycles = repack_cycles/2;
553 TR <<
" Current Low total cycles =" << refine_applies << std::endl;
554 for (
core::Size i(1); i <= refine_applies; ++i ) {
555 if( i == switch_movemaps ){
559 if( (i % repack_cycles == 0) || (i == refine_applies) ) {
560 pack_mover->apply(pose);
561 TAmin_mover_fa->apply(pose);
562 }
else if ( i % min_cycles == 0 ) {
563 TAmin_mover_fa->apply(pose);
565 backbone_mover_fa->apply(pose);
566 rt_mover->apply(pose);
569 mc_fa->boltzmann(pose);
570 TR << i <<
" " << mc_fa->last_accepted_score() <<
" " << mc_fa->lowest_score() << std::endl;
572 mc_fa->recover_low( pose );
580 (*fullatom_scorefunction_)(pose);