46 #include <basic/options/option.hh>
47 #include <basic/options/keys/PCS.OptionKeys.gen.hh>
53 #include <basic/datacache/BasicDataCache.hh>
54 #include <basic/Tracer.hh>
57 #include <utility/vector1.hh>
60 #include <numeric/xyzVector.hh>
63 #include <ObjexxFCL/FArray1D.hh>
92 basic::Tracer
TR_PCS_Energy(
"protocols.scoring.methods.pcs.PCS_Energy");
100 std::cerr <<
"Error, == operator not correctly implemented in the PCS_Energy" << std::endl;
101 utility_exit_with_message(
"Exiting");
102 if (
this != &other ) {
147 if ( (!have_exclusions_changed) &&
154 using namespace basic::options;
155 using namespace basic::options::OptionKeys;
164 if(vec_filename.size() == 0){
165 utility_exit_with_message(
"Missing input file for PCS. Review your setup file");
171 if (has_exclude_residues) {
174 pcs_d =
new PCS_data(pcs_d_i, exclude_residues);
179 if ( have_exclusions_changed ) {
196 using namespace basic::options;
197 using namespace basic::options::OptionKeys;
198 using namespace core;
203 if( option[ basic::options::OptionKeys::PCS::write_extra ].user() ){
205 std::string file_dump (option[ basic::options::OptionKeys::PCS::write_extra ]());
207 std::ofstream myfile;
209 myfile.open (file_dump.c_str(), std::ios::out);
210 myfile <<
"# Tensor: Xxx Xxy Xxz Xyy Xyz x y z" << std::endl;
211 myfile <<
"# Spins: res_num atom_name PCS_exp PCS_calc PCS_dev PCS_abs_dev" << std::endl;
214 myfile.open (file_dump.c_str(), std::ios::app);
216 if (!myfile.is_open ()){
217 std::cerr <<
"Unable to open the file '" << file_dump <<
"'" << std::endl;
230 myfile <<
"#" << PCS_d_p_l.get_filename() <<
" RESCORE NUMBER " << n_rescore << std::endl;
238 const ObjexxFCL::FArray1D< core::Real > & fstyle_b(PCS_d_p_l.get_fstyle_b());
240 myfile <<
"# Tensor: " << std::setw(10) << Xxx <<
" " << Xxy <<
" " << Xxz <<
" " << Xyy <<
" " << Xyz <<
" " << best_coo.x() <<
" " << best_coo.y() <<
" " << best_coo.z() << std::endl;
242 for ( j = 1; j <= PCS_d_p_l.get_n_pcs(); ++j){
248 core::Size res_num(PCS_d_l_a_s[idx].residue_num());
249 std::string atom_name(PCS_d_l_a_s[idx].atom_name());
250 fill_A_line(A, best_coo.x(), best_coo.y(), best_coo.z(), x, y, z);
251 core::Real PCS_calc(A[1]*Xxx + A[2]*Xxy + A[3]*Xxz + A[4]*Xyy + A[5]*Xyz);
253 core::Real PCS_abs_dev (fabs(PCS_exp - PCS_calc));
254 myfile << res_num <<
" " << atom_name << std::setw(10) << PCS_exp <<
" " << PCS_calc<<
" " << PCS_dev<<
" " << PCS_abs_dev<<
" " << std::endl;
266 using namespace core;
267 using namespace basic::options;
268 using namespace basic::options::OptionKeys;
282 if (pcs_weight == 0){
288 for ( i = 1; i <= pcs_d.get_n_lanthanides(); ++i){
289 PCS_tensor PCS_t =
PCS_tensor(0, 0, 0, 0, 0, ((pcs_d.get_pcs_data_per_lanthanides_all())[i]).get_filename());
290 vec_tensor.push_back(PCS_t);
292 vec_score.resize(pcs_d.get_n_lanthanides());
299 bool minimize_best_tensor;
302 print_to_tracer =
false;
304 if(minimize_best_tensor){
307 TR_PCS_Energy <<
"*** Before minimization of the tensor ***" << std::endl;
310 for(i = 1; i <= vec_score.size(); ++i){
314 TR_PCS_Energy <<
"Score weighted: " << pcs_weight * pcs_score_total << std::endl;
316 for(i = 1; i <= vec_tensor.size(); ++i){
319 TR_PCS_Energy <<
"Lanthanide position: " << best_coo.x() <<
" " << best_coo.y() <<
" " << best_coo.z() << std::endl;
325 if((pcs_score_total + tolerance) < optimized_score){
326 TR_PCS_Energy <<
"Warning, optimized score has a higher value than starting position. Problem with minimizer?" << std::endl;
327 TR_PCS_Energy << pcs_score_total <<
" -> " << optimized_score << std::endl;
331 pcs_score_total = optimized_score;
334 TR_PCS_Energy <<
"*** After minimization of the tensor ***" << std::endl;
338 TR_PCS_Energy <<
"Score weighted: " << pcs_weight * optimized_score << std::endl;
340 for(i = 1; i <= vec_tensor.size(); ++i){
343 TR_PCS_Energy <<
"Lanthanide position: " << best_coo.x() <<
" " << best_coo.y() <<
" " << best_coo.z() << std::endl;
350 return (pcs_weight * pcs_score_total);
362 vect_to_opt.push_back(best_coo.x());
363 vect_to_opt.push_back(best_coo.y());
364 vect_to_opt.push_back(best_coo.z());
367 utility_exit_with_message(
"n_lanthanides and vec_best_tensor size differs in minimize_tensors_from_PCS_data");
370 for(i = 1; i <= vec_best_tensor.size(); ++i){
371 vect_to_opt.push_back(vec_best_tensor[i].chi_xx());
372 vect_to_opt.push_back(vec_best_tensor[i].chi_xy());
373 vect_to_opt.push_back(vec_best_tensor[i].chi_xz());
374 vect_to_opt.push_back(vec_best_tensor[i].chi_yy());
375 vect_to_opt.push_back(vec_best_tensor[i].chi_yz());
385 best_coo.assign(vect_to_opt[1], vect_to_opt[2], vect_to_opt[3]);
387 for(i = 1; i <= vec_best_tensor.size(); ++i){
388 vec_best_tensor[i].reset_tensor((
core::Real)vect_to_opt[3 + 5*(i-1) + 1],
394 return (optimized_cost);
422 size_of = vec_best_score.size();
423 if((size_of != vec_best_tensor.size())||
425 std::cerr <<
"Problem in calculate_scores_and_tensors_from_pose_and_PCS_data function" << std::endl;
427 std::cerr <<
"vec_best_tensor.size() = " << vec_best_tensor.size();
428 std::cerr <<
"vec_best_score.size() = " << vec_best_score.size() << std::endl;
429 utility_exit_with_message(
"Exiting");
432 for( i = 1; i <= size_of; i++){
433 vec_tensor_temp.push_back(vec_best_tensor[i]);
436 vec_score_temp.resize(size_of);
439 vec_score_ref_current = & vec_score_temp;
440 vec_tensor_ref_current = & vec_tensor_temp;
458 std::cerr <<
"Error: Couldn't find residue " << grid_residue_num_1 << std::endl;
459 std::cerr <<
"Numbering residue within Rosetta match the sequence provided as input" << std::endl;
460 utility_exit_with_message(
"Can't define gridsearchiterator");
463 std::cerr <<
"Error: Couldn't find residue " << grid_residue_num_1 << std::endl;
464 std::cerr <<
"Numbering residue within Rosetta match the sequence provided as input" << std::endl;
465 utility_exit_with_message(
"Can't define gridsearchiterator");
467 if( ! pdb.
residue(grid_residue_num_1).
has(grid_atom_name_1)){
468 std::cerr <<
"Error: Couldn't find the atom " << grid_atom_name_1 <<
" in residue " << grid_residue_num_1 << std::endl;
469 std::cerr <<
"Numbering residue within Rosetta match the sequence provided as input" << std::endl;
470 utility_exit_with_message(
"Can't define gridsearchiterator");
472 if( ! pdb.
residue(grid_residue_num_2).
has(grid_atom_name_2)){
473 std::cerr <<
"Error: Couldn't find the atom " << grid_atom_name_2 <<
" in residue " << grid_residue_num_2<< std::endl;
474 std::cerr <<
"Numbering residue within Rosetta match the sequence provided as input" << std::endl;
475 utility_exit_with_message(
"Can't define gridsearchiterator");
481 GridSearchIterator grid_it(coo1, coo2, grid_k_vector, grid_edge, grid_step, grid_small_cutoff, grid_large_cutoff, grid_cone_angle_cutoff);
483 best_coo.assign(coo1.x(), coo1.y(), coo1.z());
484 best_score = 999999999999999999999999999.9;
485 bool test_at_least_one_iteration =
false;
488 test_at_least_one_iteration =
true;
497 score += (*vec_score_ref_current)[i] * (*vec_score_ref_current)[i];
499 if (score > best_score){
504 if ( score < best_score){
507 best_coo.assign(x, y, z);
510 if((vec_score_ref_current != &vec_score_temp) && (vec_score_ref_current != &vec_best_score)){
511 std::cerr <<
"Problem in calculate_scores_and_tensors_from_pose_and_PCS_data function" << std::endl;
512 std::cerr <<
"The atomic switch is not working (1)" << std::endl;
513 utility_exit_with_message(
"Exiting");
515 if(vec_tensor_ref_current == &vec_best_tensor){
516 vec_tensor_ref_current = &vec_tensor_temp;
517 vec_score_ref_current = &vec_score_temp;
520 if(vec_tensor_ref_current != &vec_tensor_temp){
521 std::cerr <<
"Problem in calculate_scores_and_tensors_from_pose_and_PCS_data function" << std::endl;
522 std::cerr <<
"The atomic switch is not working (2)" << std::endl;
523 utility_exit_with_message(
"Exiting");
525 vec_tensor_ref_current = &vec_best_tensor;
526 vec_score_ref_current = &vec_best_score;
533 if(test_at_least_one_iteration ==
false){
534 std::cerr <<
"The description of the grid search given is too restrictive" << std::endl;
535 utility_exit_with_message(
"Exiting");
538 if( vec_tensor_ref_current == &vec_best_tensor ){
539 for(i = 1; i <= vec_best_score.size(); ++i){
540 vec_best_tensor[i].copy_from_ref(vec_tensor_temp[i]);
544 if( vec_score_ref_current == &vec_best_score ){
545 for(i = 1; i <= vec_best_score.size(); ++i){
546 vec_best_score[i] = vec_score_temp[i];
549 return (sqrt(best_score));
560 if ( instance_ == 0 ){
584 vec_exclude_residues_ = tmp;
585 vec_exclude_residues_exists_ =
false;
586 vec_exclude_residues_changed_ =
false;
601 if (vec_exclude.size() > 0) {
605 for (
core::Size i = 1; i <= vec_exclude.size(); ++i) {
606 if ( vec_exclude[i] > largest_n ) {
607 largest_n = vec_exclude[i];
613 for (
core::Size i = 1; i <= vec_exclude.size(); ++i) {
614 temp[vec_exclude[i]] =
true;
617 if ( vec_exclude_residues_ == temp ) {
618 vec_exclude_residues_changed_ =
false;
620 vec_exclude_residues_changed_ =
true;
623 vec_exclude_residues_ = temp;
624 vec_exclude_residues_exists_ =
true;
631 vec_exclude_residues_ = temp;
632 vec_exclude_residues_exists_ =
false;
633 vec_exclude_residues_changed_ =
true;
638 return vec_exclude_residues_exists_;
643 return vec_exclude_residues_changed_;
649 return vec_exclude_residues_;
654 vec_exclude_residues_changed_ =
false;
664 vec_filename_ = vec_filename;
665 vec_individual_weight_ = vec_individual_weight;
679 bool const minimize_best_tensor,
683 if((grid_residue_num_1 < 0)||(grid_residue_num_2 < 0)){
684 utility_exit_with_message(
"Residue num negative. Please review your setup files");
686 core::Size grid_residue_num_1_positif(grid_residue_num_1);
687 core::Size grid_residue_num_2_positif(grid_residue_num_2);
689 grid_edge_ = grid_edge;
690 grid_step_ = grid_step;
691 grid_small_cutoff_ = grid_small_cutoff;
692 grid_large_cutoff_ = grid_large_cutoff;
693 grid_cone_angle_cutoff_ = grid_cone_angle_cutoff;
694 grid_atom_name_1_ = grid_atom_name_1;
695 grid_atom_name_2_ = grid_atom_name_2;
696 grid_residue_num_1_ = grid_residue_num_1_positif;
697 grid_residue_num_2_ = grid_residue_num_2_positif;
698 grid_k_vector_ = grid_k_vector;
699 minimize_best_tensor_ = minimize_best_tensor;
700 pcs_weight_ = pcs_weight;
708 grid_small_cutoff_<<
" " <<
709 grid_large_cutoff_<<
" " <<
710 grid_cone_angle_cutoff_<<
" " <<
711 grid_atom_name_1_<<
" " <<
712 grid_atom_name_2_<<
" " <<
713 grid_residue_num_1_<<
" " <<
714 grid_residue_num_2_<<
" " <<
715 grid_k_vector_<<
" " <<
716 minimize_best_tensor_<<
" " <<
737 return grid_small_cutoff_;
742 return grid_large_cutoff_;
747 return grid_cone_angle_cutoff_;
752 return grid_atom_name_1_;
757 return grid_atom_name_2_;
762 return grid_residue_num_1_;
767 return grid_residue_num_2_;
772 return grid_k_vector_;
777 return minimize_best_tensor_;
787 return vec_filename_;
792 return vec_individual_weight_;