61 #include <basic/options/util.hh>
63 #include <basic/options/keys/OptionKeys.hh>
65 #include <basic/options/keys/ddg.OptionKeys.gen.hh>
66 #include <basic/options/keys/constraints.OptionKeys.gen.hh>
67 #include <basic/options/keys/out.OptionKeys.gen.hh>
68 #include <basic/options/keys/packing.OptionKeys.gen.hh>
73 #include <numeric/xyzVector.hh>
74 #include <numeric/random/random.hh>
97 #include <basic/Tracer.hh>
99 #include <utility/vector0.hh>
100 #include <utility/vector1.hh>
104 using basic::Warning;
105 static basic::Tracer
TR(
"protocols.moves.ddGMover");
107 namespace protocols {
110 static numeric::random::RandomGenerator
RG(15430);
112 using namespace core;
113 using namespace core::scoring;
115 typedef std::vector<double>
ddGs;
119 num_decoys_used_in_calculations_(20),
124 restrict_to_nbrhood_(false),
125 interface_ddg_(false),
128 min_cst_sfxn_no_cst_weight_( 0 ),
130 min_cst_set_wt_(new core::scoring::constraints::
ConstraintSet()),
132 min_cst_set_mut_(new core::scoring::constraints::
ConstraintSet()),
133 min_cst_mut_types_(),
134 repack_cst_set_wt_(new core::scoring::constraints::
ConstraintSet()),
136 repack_cst_set_mut_(new core::scoring::constraints::
ConstraintSet()),
138 residues_to_mutate_(0,core::chemical::
aa_unk),
142 wt_components_(1,1,-999.99),
143 wt_unbound_components_(1,1,-999.99),
144 mutant_components_(1,1,-999.99),
145 mutant_unbound_components_(1,1,-999.99),
156 num_decoys_used_in_calculations_(20),
161 restrict_to_nbrhood_(false),
162 interface_ddg_(false),
165 min_cst_sfxn_no_cst_weight_( new core::scoring::
ScoreFunction( *m ) ),
167 min_cst_set_wt_(new core::scoring::constraints::
ConstraintSet()),
169 min_cst_set_mut_(new core::scoring::constraints::
ConstraintSet()),
170 min_cst_mut_types_(),
171 repack_cst_set_wt_(new core::scoring::constraints::
ConstraintSet()),
173 repack_cst_set_mut_(new core::scoring::constraints::
ConstraintSet()),
176 residues_to_mutate_(res_to_mutate),
180 wt_components_(1,1,-999.99),
181 wt_unbound_components_(1,1,-999.99),
182 mutant_components_(1,1,-999.99),
183 mutant_unbound_components_(1,1,-999.99),
198 for(
core::Size i = 1; i <= mutation_position.size();++i) {
201 i_pos = p.
residue(mutation_position[i]).
xyz(
" CA ");
203 i_pos = p.
residue(mutation_position[i]).
xyz(
" CB ");
212 if(i_pos.distance(j_pos) <= radii) {
223 for(
int i = to_check.l1(); i <= to_check.u1();i++){
224 for(
int j = to_check.l2(); j <= to_check.u2();j++){
225 if(to_check(i,j) == -999.99){
237 for(
unsigned int i =0;i<scores_to_sum.size();i++) {
238 sum+=scores_to_sum[i];
247 for(
unsigned int i =1;i<=scores_to_average.size();i++) {
248 sum+=scores_to_average[i];
250 return (sum/scores_to_average.size());
255 ObjexxFCL::FArray2D< double > & two_d_e_arrays,
276 int num_score_components = 0;
281 num_score_components++;
285 if((two_d_e_arrays.u1() != num_score_components) ||
286 (two_d_e_arrays.u2() != size_to_expect)){
287 two_d_e_arrays.dimension(num_score_components,size_to_expect,-999.99);
289 int current_score_component=0;
293 current_score_component++;
295 two_d_e_arrays(j++,next_index)=(*i) *
307 ObjexxFCL::FArray2D< double > &scores_to_average,
318 for(
int i = scores_to_average.l1(); i <= scores_to_average.u1(); i++){
319 double sum_score_component = 0;
320 for(
int j = scores_to_average.l2(); j <= scores_to_average.u2(); j++){
321 sum_score_component += scores_to_average(i,j);
324 sum_score_component/(scores_to_average.u2()-scores_to_average.l2()+1);
329 typedef std::pair<double,score_components> enrgs;
333 for(
int i = scores_to_average.l2(); i <= scores_to_average.u2(); i++){
336 for(
int j = scores_to_average.l1(); j <= scores_to_average.u1(); j++){
337 total_score += scores_to_average(j,i);
338 sc.push_back(scores_to_average(j,i));
342 scores_to_sort.push_back(e);
349 for(
unsigned int i=1; i<= scores_to_sort.size(); i++){
350 if(scores_to_sort[i].first < min){
351 min = scores_to_sort[i].first;
356 sorted.push_back(scores_to_sort[min_index]);
357 scores_to_sort.erase(scores_to_sort.begin()+(min_index-1));
361 for(
unsigned int i =1; i <= sorted[1].second.size(); i++){
362 double sum_score_component = 0.0;
363 for(
unsigned int j = 1; j <= sorted.size(); j++){
364 sum_score_component += sorted[j].second[i];
366 averaged_scores.push_back(sum_score_component/(sorted.size()));
381 using namespace protocols::moves;
382 using namespace core::pack;
384 int const rb_jump(1);
387 separate_partners->step_size(1000.0);
388 separate_partners->apply(p);
400 using namespace core::scoring;
401 using namespace core::scoring::constraints;
402 using namespace basic::options::OptionKeys;
403 using namespace basic::options;
405 double const CONSTRAINT_WEIGHT = 1.0;
432 using namespace core::scoring;
433 using namespace core::scoring::constraints;
434 using namespace basic::options::OptionKeys;
435 using namespace basic::options;
436 static float const CA_cutoff(9.0);
437 double const CONSTRAINT_WEIGHT = 1.0;
447 if(basic::options::option[basic::options::OptionKeys::constraints::cst_file].user()){
451 option[basic::options::OptionKeys::constraints::cst_file][1],cstset,
456 for(
int i = 1; i <= nres; i++){
459 for(
int j = 1; j < i; j++){
462 Real const CA_dist = (CA_i - CA_j).length();
463 if(CA_dist < CA_cutoff){
476 TR.Debug<<
"size of cst set is " << pose.
constraint_set()->get_all_constraints().size() << std::endl;
486 using namespace basic::options::OptionKeys;
487 using namespace basic::options;
490 float minimizer_tol = 0.000001;
492 "dfpmin_armijo_nonmonotone", minimizer_tol,
503 if(basic::options::option[OptionKeys::ddg::sc_min_only]()){
505 minimizer_tol = 0.0001;
509 if (basic::options::option[OptionKeys::ddg::ramp_repulsive]()) {
516 min_struc.run(pose,mm,one_tenth_orig,options);
523 min_struc.run(pose,mm,one_third_orig,options);
528 s->show(std::cout,pose);
530 min_struc.run(pose,mm,*s,options);
532 while ( std::abs((*s)(pose)-(*s)(before)) > 1 ){
536 if(basic::options::option[OptionKeys::ddg::pack_until_converge]()){
541 if ( basic::options::option[OptionKeys::ddg::ramp_repulsive]() ) {
548 min_struc.run(pose,mm,one_tenth_orig,options);
554 min_struc.run(pose,mm,one_third_orig,options);
557 min_struc.run(pose,mm,*s,options);
562 s->show(std::cout, pose);
576 for(
unsigned int i=1;i<=scores.size();i++){
577 if(scores[i] < min) {
695 ObjexxFCL::FArray2D<double>
700 ObjexxFCL::FArray2D<double>
705 ObjexxFCL::FArray2D<double>
727 total_scores.push_back(total_score);
732 double min_score = 10000;
733 for(
unsigned int i = 1; i <= total_scores.size(); i++){
734 if(total_scores[i] < min_score){
736 min_score = total_scores[i];
739 assert(min_index != -1);
745 return wt_min_score_components;
766 return wt_averaged_score_components;
781 total_scores.push_back(total_score);
786 double min_score = 10000;
787 for(
unsigned int i = 1; i <= total_scores.size(); i++){
788 if(total_scores[i] < min_score){
790 min_score = total_scores[i];
793 assert(min_index != -1);
799 return mutant_min_score_components;
812 ObjexxFCL::FArray2D<double> dG_bound_unbound(
823 return mutant_averaged_score_components;
839 assert(wt.size() == mut.size());
840 for(
unsigned int i=1;i<=wt.size();i++) {
841 delta_energy.push_back(mut[i]-wt[i]);
853 int score_component=0;
857 i != sfxn->weights().end(); i++){
859 if(*i != 0 &&
ScoreType(score_component) != atom_pair_cst ){
876 std::ostringstream q;
890 for(
unsigned int i =1;i<=wt.size();i++){
900 for(
unsigned int i =1;i <= wt.size();i++){
911 for(
unsigned int i =1;i<=mut.size();i++){
921 for(
unsigned int i =1;i <= mut.size();i++){
934 std::cerr <<
"neither mean or min set, reverting to default" << std::endl;
955 bool is_initialized=
true;
959 is_initialized=
false;
964 return is_initialized;
995 using namespace pose;
996 using namespace scoring;
997 using namespace conformation;
999 using namespace basic::options;
1000 using namespace basic::options::OptionKeys;
1001 using namespace core::pack::task;
1006 TR.Debug <<
"weights being used: " <<
1015 if(basic::options::option[OptionKeys::ddg::use_rotamer_constraints_to_native]()){
1023 if(basic::options::option[OptionKeys::ddg::min_cst]()){
1024 if(basic::options::option[OptionKeys::ddg::harmonic_ca_tether].user()){
1042 if( option[OptionKeys::ddg::opt_input_structure].user() && option[OptionKeys::ddg::opt_input_structure]() ) {
1043 PackerTaskOP norepacking(pack::task::TaskFactory::create_packer_task(pose));
1044 norepacking->temporarily_fix_everything();
1060 if(!dG_native_calculated &&
1061 !(basic::options::option[OptionKeys::ddg::mut_only].user() && (basic::options::option[OptionKeys::ddg::mut_only]()))){
1064 TR <<
"dG_wildtype hasn't been calculated yet! " <<
1065 "starting to calculate dG for native structure\n";}
1068 std::ofstream record_trajectories;
1070 record_trajectories.open(wt_traj.c_str());
1072 TR <<
"wt_traj is emtpy, not recording trajectories.\n";
1077 if(basic::options::option[out::file::silent].user()){
1078 silentfilename = basic::options::option[out::file::silent]();
1096 mutations.push_back(i);
1101 if(mutations.size() == 0){
1102 TR <<
"FATAL ERROR no mutations specified, which are needed to determine neighbors" << std::endl;
1109 if ( neighborhood[ ii ] ) {
1110 TR <<
"residue " << ii <<
" is within range of a mutating residue and will be repacked" << std::endl;
1111 repack_native->nonconst_residue_task(ii).restrict_to_repacking();
1113 TR <<
"residue " << ii <<
" is not within range of any mutating residue and will NOT be repacked" << std::endl;
1114 repack_native->nonconst_residue_task(ii).prevent_repacking();
1119 repack_native->restrict_to_repacking();
1126 repack_native->nonconst_residue_task(j).prevent_repacking();
1140 for(
unsigned int i=1;i<=poses.size();i++){
1142 std::ostringstream q;
1151 ( *min_cst_sfxn_no_cst_weight_) ( resulting_pose );
1160 " score before mutation: residue ";
1175 pose::Pose temporary_unbound_pose = resulting_pose;
1182 natives_.push_back(resulting_pose);
1184 std::string dump_repacked_wt =
"repacked_wt_round_" + q.str() +
".pdb";
1185 resulting_pose.
dump_pdb(dump_repacked_wt);
1208 using namespace pose;
1209 using namespace scoring;
1210 using namespace conformation;
1212 using namespace basic::options;
1213 using namespace basic::options::OptionKeys;
1214 using namespace core::pack::task;
1227 packer_task->nonconst_residue_task(i).restrict_absent_canonical_aas(restrict_to_aa);
1231 if(neighborhood[i]){
1232 TR <<
"MUT residue " << i <<
" is within the cutoff distance to a mutation and will be repacked " << std::endl;
1234 packer_task->nonconst_residue_task(i).restrict_to_repacking();
1236 TR <<
"MUT residue " << i <<
" is not within the cutoff distance to any mutation and will NOT be repacked " << std::endl;
1237 packer_task->nonconst_residue_task(i).prevent_repacking();
1240 packer_task->nonconst_residue_task(i).restrict_to_repacking();
1250 packer_task->nonconst_residue_task(i).prevent_repacking();
1263 using namespace basic::options;
1264 using namespace basic::options::OptionKeys;
1266 packer_task->initialize_extra_rotamer_flags_from_command_line();
1267 if ( option[ packing::multi_cool_annealer ].user() ) {
1268 packer_task->or_multi_cool_annealer(
true );
1269 packer_task->increase_multi_cool_annealer_history_size( option[ packing::multi_cool_annealer ] );
1279 bool const output_silent
1282 using namespace pose;
1283 using namespace scoring;
1284 using namespace conformation;
1286 using namespace basic::options;
1287 using namespace basic::options::OptionKeys;
1288 using namespace core::pack::task;
1290 bool any_pdb_empty =
false;
1291 struct stat filesize;
1292 if(!
dmp_pdb_ && stat(mutant_traj.c_str(), &filesize) == 0){
1293 std::cout <<
"mutation " << this->
mutation_label(pose) <<
" already has a trajectory file. skipping!....." << std::endl;
1294 any_pdb_empty =
false;
1297 std::ostringstream q;
1300 +
"round_" + q.str() +
".pdb");
1301 if(stat(file_to_check.c_str(), &filesize) == 0 && !basic::options::option[OptionKeys::ddg::suppress_checkpointing]()){
1303 if(filesize.st_size == 0){
1304 any_pdb_empty =
true;
1305 std::cout <<
"file " << file_to_check <<
" is empty! re-doing calculations " << std::endl;
1308 any_pdb_empty =
true;
1314 if(!basic::options::option[OptionKeys::ddg::suppress_checkpointing]()){
1316 std::cout <<
"checking for decoys in silent file: " << file_to_check << std::endl;
1317 if(stat(file_to_check.c_str(), &filesize) == 0){
1318 std::cout <<
"silent file " << file_to_check <<
" exists. checking how many tags exist" << std::endl;
1323 std::cout <<
"number of tags " << tags.size() <<
" is less than number of iterations " <<
num_iterations_ <<
" re-doing calculations " << std::endl;
1324 any_pdb_empty =
false;
1327 std::cout <<
"mutant silent file " << file_to_check <<
" doesn't exist. starting calculations" << std::endl;
1332 return any_pdb_empty;
1345 for(
core::Size ii = 1; ii <= mutations.size(); ++ii ) {
1346 Size iiresid = mutations[ ii ];
1354 if ( neighbors[ jj ] )
continue;
1363 if(ii_pos.distance_squared(jj_pos) <= rad2 ){
1364 neighbors[ jj ] =
true;
1386 using namespace pose;
1387 using namespace scoring;
1388 using namespace conformation;
1390 using namespace basic::options;
1391 using namespace basic::options::OptionKeys;
1392 using namespace core::pack::task;
1411 bool output_silent =
false;
1413 if(basic::options::option[OptionKeys::ddg::output_silent].user()){
1414 output_silent = basic::options::option[OptionKeys::ddg::output_silent]();
1425 bool contains_mutation=
false;
1434 contains_mutation =
true;
1442 if(!contains_mutation){
1447 std::ofstream record_mutant_trajectories;
1451 if(any_pdb_empty || basic::options::option[OptionKeys::ddg::suppress_checkpointing]()){
1452 TR <<
"[DEBUG] file does not exist. "<< mutant_traj <<
". Creating logfile now.\n";
1454 record_mutant_trajectories.open( mutant_traj.c_str() );
1456 record_mutant_trajectories <<
"beginning logfile" <<std::endl;
1461 if(basic::options::option[out::file::silent].user()){
1462 silentfilename = basic::options::option[out::file::silent]();
1479 for(
unsigned int i = 1; i <= poses.size(); i++){
1485 ( * min_cst_sfxn_no_cst_weight_)( resulting_pose );
1490 Real final_score = -1;
1492 final_score=(*scorefxn_)( resulting_pose ) ;
1494 final_score=(*min_cst_sfxn_no_cst_weight_)(resulting_pose);
1505 pose::Pose temporary_unbound_pose = resulting_pose;
1514 " score after mutation: residue " << this->
mutation_label(pose) <<
" "
1515 << final_score <<
" ";
1523 std::ostringstream q;
1526 TR <<
"round " << q.str()
1528 <<
" " << (final_score) << std::endl;
1533 resulting_pose.
dump_pdb(output_pdb);
1538 mutants_.push_back(resulting_pose);
1542 " " <<
" " <<
" wildtype_dG is: "
1546 record_mutant_trajectories.close();