56 #include <basic/MetricValue.hh>
82 #include <basic/options/option.hh>
83 #include <ObjexxFCL/FArray1D.hh>
84 #include <ObjexxFCL/FArray2D.hh>
86 #include <basic/Tracer.hh>
87 #include <utility/exit.hh>
88 #include <numeric/angle.functions.hh>
89 #include <numeric/random/random.hh>
90 #include <numeric/xyzVector.hh>
99 #include <basic/options/keys/loops.OptionKeys.gen.hh>
100 #include <basic/options/keys/run.OptionKeys.gen.hh>
101 #include <basic/options/keys/AnchoredDesign.OptionKeys.gen.hh>
103 #include <utility/vector0.hh>
104 #include <utility/vector1.hh>
105 #include <numeric/xyzVector.io.hh>
108 #if defined(WIN32) || defined(__CYGWIN__)
115 using basic::Warning;
117 static basic::Tracer
T_design(
"protocols.AnchoredDesign.AnchoredDesignMover");
118 static basic::Tracer
T_perturb(
"protocols.AnchoredDesign.AnchoredPerturbMover");
119 static basic::Tracer
T_refine(
"protocols.AnchoredDesign.AnchoredRefineMover");
120 static basic::Tracer
T_shared(
"protocols.AnchoredDesign.Anchor_Movers");
121 static numeric::random::RandomGenerator
RG(37633224);
124 namespace anchored_design{
139 using namespace protocols::jd2;
140 mover->apply(*posecopy);
141 JobDistributor::get_instance()->job_outputter()->other_pose(JobDistributor::get_instance()->
current_job(), *posecopy, tag);
149 T_shared <<
"pose says 'is_cutpoint(#)': ";
152 T_shared << std::endl;
154 T_shared <<
"pose says 'has_variant_type CUTPOINT_LOWER': ";
157 T_shared << std::endl;
159 T_shared <<
"pose says 'has_variant_type CUTPOINT_UPPER': ";
162 T_shared << std::endl;
172 interface_( interface_in ),
173 RMSD_only_this_pose_( 0 ),
174 IAM_( new protocols::analysis::InterfaceAnalyzerMover(
ANCHOR_TARGET) ),
177 delete_interface_native_sidechains_(false),
178 show_extended_(false),
179 randomize_input_sequence_(false),
180 vary_cutpoints_(false),
182 filter_score_(std::numeric_limits<core::
Real>::max()),
183 use_filter_score_(false),
185 use_filter_SASA_(false),
186 use_filter_omega_(false),
187 autoinitialize_(true),
188 init_for_input_yet_(false)
196 RMSD_only_this_pose_( 0 ),
197 IAM_( new protocols::analysis::InterfaceAnalyzerMover(
ANCHOR_TARGET) ),
200 delete_interface_native_sidechains_(false),
201 show_extended_(false),
202 randomize_input_sequence_(false),
203 vary_cutpoints_(false),
205 filter_score_(std::numeric_limits<core::
Real>::max()),
206 use_filter_score_(false),
208 use_filter_SASA_(false),
209 use_filter_omega_(false),
210 autoinitialize_(true),
211 init_for_input_yet_(false)
227 if (
this == &rhs)
return *
this;
278 clock_t starttime = clock();
304 if(
interface_->get_anchor_noise_constraints_mode() ){
305 interface_->anchor_noise_constraints_setup(pose);
312 ||
interface_->get_anchor_noise_constraints_mode()){
313 using namespace protocols::jd2;
314 JobDistributor::get_instance()->job_outputter()->other_pose(JobDistributor::get_instance()->
current_job(), pose,
"preprocessed");
320 anchor_perturb.
apply( pose );
327 anchor_refine.
apply( pose );
347 clock_t stoptime = clock();
348 T_design <<
"One perturb/refine took " << ((double) stoptime - starttime )/CLOCKS_PER_SEC <<
" seconds" << std::endl;
355 (*
interface_->get_fullatom_scorefunction())(pose);
364 T_design <<
"CA_sup_RMSD for this trajectory: " << rmsd << std::endl;
367 std::list<core::Size> loops_for_rmsd;
370 for (
core::Size j = loopstart; j <= loopend; ++j){
371 loops_for_rmsd.insert(loops_for_rmsd.end(), j);
382 T_design <<
"loop_CA_sup_RMSD for this trajectory: " << loop_rmsd << std::endl;
387 T_design <<
"chain 1 sup_RMSD for this trajectory: " << ch1_sup_rmsd << std::endl;
392 T_design <<
"chain 2 sup_RMSD for this trajectory: " << ch2_sup_rmsd << std::endl;
401 T_design <<
"chain 1 RMSD for this trajectory: " << ch1_rmsd << std::endl;
407 T_design <<
"chain 2 RMSD for this trajectory: " << ch2_rmsd << std::endl;
417 typedef std::set< core::Size > SizeSet;
418 basic::MetricValue< SizeSet > mv_sizeset;
419 start_pose->metric(interface_calc,
"interface_residues", mv_sizeset);
420 SizeSet
const & sizeset(mv_sizeset.value());
424 ObjexxFCL::FArray1D_bool is_interface( pose.
total_residue(), false );
425 for (SizeSet::const_iterator it = sizeset.begin(); it != sizeset.end(); ++it){
426 is_interface(*it) =
true;
427 T_design <<
" " << *it;
429 T_design << std::endl;
433 T_design <<
"interface backbone RMSD for this trajectory: " << I_sup_bb_rmsd << std::endl;
445 T_design <<
"entering randomize_input_sequence" << std::endl;
456 ResidueLevelTask
const & rlt(oldtask->residue_task(i));
457 if(rlt.being_designed()){
459 ResidueLevelTask::ResidueTypeCOPList types(rlt.allowed_residue_types());
462 T_design <<
"before HIS/D check, position " << i;
464 for( ResidueLevelTask::ResidueTypeCOPListIter
465 allowed_iter = types.begin(),
466 allowed_end = types.end();
467 allowed_iter != allowed_end; ++allowed_iter ) {
468 T_design <<
" " << (*allowed_iter)->name();
475 for( ResidueLevelTask::ResidueTypeCOPListIter
476 allowed_iter = types.begin(),
477 iter_next = types.begin(),
478 allowed_end = types.end();
479 allowed_iter != allowed_end; ) {
480 iter_next = allowed_iter;
485 histidine=*allowed_iter;
486 types.erase( allowed_iter );
488 allowed_iter = iter_next;
490 if( num_histidines > 0 && num_histidines < 3 ){
491 types.push_back(histidine);
492 }
else if ( num_histidines < 3 ) {
493 utility_exit_with_message(
"removed more than 2 histidines in AnchoredDesign::randomize_input_sequence, something is wrong");
497 T_design <<
"after HIS/D check, position " << i;
499 for( ResidueLevelTask::ResidueTypeCOPListIter
500 allowed_iter = types.begin(),
501 allowed_end = types.end();
502 allowed_iter != allowed_end; ++allowed_iter ) {
503 T_design <<
" " << (*allowed_iter)->name();
509 core::Size const chosen_type_index(
RG.random_range(1, num_types));
510 ResidueLevelTask::ResidueTypeCOPListIter iter = types.begin();
511 for(
core::Size add(1); add<chosen_type_index; ++add) ++iter;
514 T_design <<
"chose at position " << i << chosen_type->name() << std::endl;
515 T_design <<
"chose at position " << i << chosen_type->name() << std::endl;
518 using namespace core::conformation;
533 using namespace core::pack::task;
541 calcs_and_calcns.push_back(std::make_pair(interface_calc,
"interface_residues"));
542 calcs_and_calcns.push_back(std::make_pair(neighborhood_calc,
"neighbors"));
547 tf->push_back(rbcop);
552 prop->include_residue(i);
574 pack_mover->score_function(
interface_->get_fullatom_scorefunction() );
575 pack_mover->apply(pose);
597 core::Real const new_x(translation.x() + ((
RG.uniform()*2.0) - 1.0));
598 core::Real const new_y(translation.y() + ((
RG.uniform()*2.0) - 1.0));
599 core::Real const new_z(translation.z() + ((
RG.uniform()*2.0) - 1.0));
601 T_design <<
"perturb_anchor: old/new, x->y->z\n"
602 << translation.x() <<
" " << new_x <<
"\n"
603 << translation.y() <<
" " << new_y <<
"\n"
604 << translation.z() <<
" " << new_z << std::endl;
612 T_design <<
"perturb_anchor: old and new CA positions:\n"
613 << original_anchor_xyz <<
'\n'
614 << new_anchor_xyz << std::endl;
621 return "AnchoredDesignMover";
639 std::ostringstream failure;
645 failure <<
"failed total score filter; score " << pscore;
651 basic::MetricValue< core::Real > mv_delta_sasa;
652 pose.
metric(
"InterfaceSasaDefinition_1",
"delta_sasa", mv_delta_sasa);
654 failure <<
"failed interface SASA filter; sasa " << mv_delta_sasa.value();
663 for (
core::Size j = loopstart; j <= loopend; ++j){
666 if( (omega < 160) && (omega > -160) ) {
667 failure <<
"failed omega at " << j <<
" " <<
omega;
682 T_design << failure.str() << std::endl;
696 Warning() <<
"AnchoredDesign only tested with two chains; later chains may(?) be rigidly attached to chain 2 COOH, or not move at all, or who knows what";
708 Size anchor_jump_end( anchormid > chain1end ? chain1end : chain1end+1);
709 jump_starts[
ANCHOR_TARGET] = anchormid < anchor_jump_end ? anchormid : anchor_jump_end;
710 jump_stops[
ANCHOR_TARGET] = anchormid > anchor_jump_end ? anchormid : anchor_jump_end;
712 assert(anchormid != anchor_jump_end);
725 jump_starts.pop_back();
726 jump_stops.pop_back();
733 jump_starts[jump_num] =
interface_->loop(i).start() - 1;
734 jump_stops[ jump_num] =
interface_->loop(i).stop() + 1;
744 assert(cuts.size() == num_jumps);
745 ObjexxFCL::FArray2D<int> Fjumps(2, num_jumps);
746 ObjexxFCL::FArray1D<int> Fcuts(num_jumps);
748 Fjumps(1, i) = jump_starts[i];
749 Fjumps(2, i) = jump_stops[i];
757 T_design <<
"anchored_design_fold_tree: " << foldtree << std::flush;
765 T_design <<
"anchored_design_fold_tree: " << foldtree << std::flush;
776 for(
core::Size loop(1); loop <= num_loops; ++loop ){
781 for(
core::Size res(loop_start); res<=loop_end; ++res ){
783 using namespace core::id;
784 if(
interface_->movemap_cen_all()->get_bb(res)){
849 using namespace basic::options;
850 using namespace basic::options::OptionKeys::AnchoredDesign;
853 rmsd_ = option[ OptionKeys::AnchoredDesign::rmsd ].value();
856 if( option[ testing::RMSD_only_this ].user() ){
878 if( option[ OptionKeys::AnchoredDesign::filters::score].user() ){
879 filter_score_ = option[ OptionKeys::AnchoredDesign::filters::score].value();
886 if( option[ OptionKeys::AnchoredDesign::filters::sasa].user() ){
887 filter_SASA_ = option[ OptionKeys::AnchoredDesign::filters::sasa].value();
917 clock_t starttime = clock();
918 T_perturb <<
"entering perturb steps" << std::endl;
925 std::stringstream outputfilename;
928 T_perturb <<
"fullatom score of starting PDB: " << (*(
interface_->get_fullatom_scorefunction()))(pose) << std::endl;
933 typeset_swap.
apply( pose );
937 T_perturb <<
"centroid score of starting PDB: " << (*(
interface_->get_centroid_scorefunction()))(pose) << std::endl;
973 if(
perturb_CCD_off_ &&
perturb_KIC_off_ ) utility_exit_with_message(
"cannot pass both AnchoredDesign::perturb_CCD_off AND AnchoredDesign::perturb_KIC_off; this turns off both types of loop remodeling" );
986 kin_mover->set_vary_bondangles(
false );
988 kin_mover->set_rama_check(
true );
989 kin_mover->set_idealize_loop_first(
false );
995 TsamplingKP->set_movemap(
interface_->movemap_cen(i));
996 kin_mover->set_perturber(TsamplingKP);
1001 kin_wrapper->respect_this_movemap(
interface_->movemap_cen(i));
1002 oneloop_random->add_mover(kin_wrapper, 1);
1003 T_perturb <<
"creating KinematicWrapper with loop " << loop_start <<
" " << loop_end << std::endl;
1014 small_mover->angle_max(
'H', 180.0 );
1015 small_mover->angle_max(
'E', 180.0 );
1016 small_mover->angle_max(
'L', 180.0 );
1017 perturb_mover = small_mover;
1018 T_perturb <<
"creating SmallMover-based perturbation for loop " << loop_start <<
" " << loop_end << std::endl;
1025 frag_mover->enable_end_bias_check(
false);
1026 perturb_mover = frag_mover;
1027 T_perturb <<
"creating fragment-based perturbation for loop " << loop_start <<
" " << loop_end << std::endl;
1030 oneloop_subsequence->add_mover(perturb_mover);
1033 outputfilename.str(
"");
1034 outputfilename <<
"perturbed_" << counter;
1042 oneloop_subsequence->add_mover(
new CcdLoopClosureMover(
interface_->loop(i),
interface_->movemap_cen_omegafixed(i)));
1043 T_perturb <<
"creating CCD-closure after perturbation for loop " << loop_start <<
" " << loop_end << std::endl;
1046 outputfilename.str(
"");
1047 outputfilename <<
"perturbed_CCD_" << counter;
1048 debug_dump_pose(pose, posecopy, outputfilename.str(), oneloop_subsequence);
1051 oneloop_random->add_mover(oneloop_subsequence, 1);
1056 allloops_subsequence->add_mover(oneloop_random);
1057 backbone_mover->add_mover(oneloop_random, 1.0);
1060 backbone_mover->add_mover(allloops_subsequence, 0.25);
1062 perturb_sequence->add_mover(backbone_mover);
1071 interface_->get_centroid_scorefunction_min(),
1076 perturb_sequence->add_mover(min_mover);
1097 trial_mover->apply( pose );
1098 T_perturb << i <<
" " << mc->last_accepted_score() <<
" " << mc->lowest_score() << std::endl;
1100 mc -> recover_low( pose );
1103 using namespace protocols::jd2;
1104 JobDistributor::get_instance()->job_outputter()->other_pose(JobDistributor::get_instance()->
current_job(), pose,
"perturbed_centroid_final");
1108 T_perturb <<
"centroid score of final perturbed PDB: " << (*(
interface_->get_centroid_scorefunction()))(pose)
1114 using namespace protocols::jd2;
1115 JobDistributor::get_instance()->job_outputter()->other_pose(JobDistributor::get_instance()->
current_job(), pose,
"perturbed_prerefullatom");
1118 return_sidechains.
apply( pose );
1126 pack_mover->task_factory( task_factory );
1127 pack_mover->score_function(
interface_->get_fullatom_scorefunction() );
1141 pack_mover->apply( pose );
1142 TAmin_mover_fa->apply( pose );
1145 T_perturb <<
"fullatom score of perturbed, refullatomized, repacked/minimized PDB: "
1146 << (*(
interface_->get_fullatom_scorefunction()))(pose) << std::endl;
1150 clock_t stoptime = clock();
1151 T_perturb <<
"One perturb took " << ((double) stoptime - starttime )/CLOCKS_PER_SEC <<
" seconds" << std::endl;
1152 T_perturb <<
"perturb steps complete" << std::endl;
1159 return "AnchoredPerturbMover";
1203 using namespace basic::options;
1204 using namespace basic::options::OptionKeys::AnchoredDesign;
1228 min_type_ = option[ OptionKeys::run::min_type ].value();
1252 clock_t starttime = clock();
1253 T_refine <<
"entering refine steps" << std::endl;
1259 std::stringstream outputfilename;
1262 (*(
interface_->get_fullatom_scorefunction()))(pose);
1263 T_refine <<
"fullatom score upon entering refine mode:" << std::endl;
1291 pack_mover->score_function(
interface_->get_fullatom_scorefunction() );
1310 SequenceMoverOP repack_sequence =
new SequenceMover(pack_mover, packing_TAmin_mover);
1333 if(
refine_CCD_off_ &&
refine_KIC_off_ ) utility_exit_with_message(
"cannot pass both AnchoredDesign::refine_CCD_off AND AnchoredDesign::refine_KIC_off; this turns off both types of loop remodeling" );
1346 kin_mover->set_vary_bondangles(
false );
1348 kin_mover->set_rama_check(
true );
1349 kin_mover->set_idealize_loop_first(
false );
1355 TsamplingKP->set_movemap(
interface_->movemap_fa(i));
1358 kin_mover->set_perturber(TsamplingKP);
1363 kin_wrapper->respect_this_movemap(
interface_->movemap_fa(i));
1364 oneloop_random->add_mover(kin_wrapper, 1);
1365 T_perturb <<
"creating KinematicWrapper with loop " << loop_start <<
" " << loop_end << std::endl;
1373 T_refine <<
"creating Small & ShearMover for loop " << loop_start <<
" " << loop_end << std::endl;
1378 smallshear_mover->add_mover(small_mover);
1379 smallshear_mover->add_mover(shear_mover);
1381 oneloop_subsequence->add_mover(smallshear_mover);
1388 oneloop_subsequence->add_mover(CCD_mover);
1389 T_refine <<
"creating CCD-closure after perturbation for loop " << loop_start <<
" " << loop_end << std::endl;
1411 oneloop_random->add_mover(oneloop_subsequence, 1);
1414 if(
debug_) *posecopy = pose;
1416 allloops_subsequence->add_mover(oneloop_random);
1417 backbone_mover->add_mover(oneloop_random, 1.0);
1420 backbone_mover->add_mover(allloops_subsequence, 0.25);
1422 refine_sequence->add_mover(backbone_mover);
1440 refine_sequence->add_mover(rt_mover);
1449 refine_sequence->add_mover( min_mover );
1452 debug_dump_pose(pose, posecopy,
"refine_min.pdb", ( packing_TAmin_mover ));
1461 refine_repack_cycle->add_mover(repack_sequence);
1471 <<
", second resfile at " << refine_latefactory << std::endl;
1474 if ( i == refine_latefactory ) {
1475 pack_mover->task_factory(
interface_->get_late_factory());
1479 rt_mover->task_factory(rt_late_factory);
1483 repack_sequence->apply(pose);
1484 mc->boltzmann(pose);
1486 refine_master->apply( pose );
1488 T_refine << i <<
" " << mc->last_accepted_score() <<
" " << mc->lowest_score() << std::endl;
1490 mc->recover_low( pose );
1493 (*(
interface_->get_fullatom_scorefunction()))(pose);
1494 T_refine <<
"fullatom score exiting refine mode:" << std::endl;
1498 clock_t stoptime = clock();
1499 T_refine <<
"One refine took " << ((double) stoptime - starttime )/CLOCKS_PER_SEC <<
" seconds" << std::endl;
1500 T_refine <<
"refine steps complete" << std::endl;
1505 return "AnchoredRefineMover";
1553 using namespace basic::options;
1554 using namespace basic::options::OptionKeys::AnchoredDesign;
1581 min_type_ = option[ OptionKeys::run::min_type ].value();