33 #include <utility/file/FileName.hh>
34 #include <utility/file/file_sys_util.hh>
35 #include <utility/exit.hh>
36 #include <utility/vector1.functions.hh>
39 #include <numeric/angle.functions.hh>
53 #include <utility/vector1.hh>
57 namespace MakeRotLib {
60 using namespace utility;
67 Real t1( fabs(a1 - a2) );
69 return( t1 <= t2 ? t1 : t2 );
76 for(
Size i = 1; i <= rotamers.size(); ++i ) {
77 Real temp_chi( rotamers[i].get_min_chi(2) );
78 if ( temp_chi >= 90 && temp_chi <= 180 ) {
79 rotamers[i].set_min_chi( temp_chi+180, 2 );
80 }
else if ( temp_chi > 180 && temp_chi <= 270 ) {
81 rotamers[i].set_min_chi( temp_chi-180, 2 );
89 for(
Size i = 1; i <= rotamers.size(); ++i ) {
90 Real temp_chi( rotamers[i].get_min_chi(3) );
91 if ( temp_chi >= 90 && temp_chi <= 180 ) {
92 rotamers[i].set_min_chi( temp_chi+180, 3 );
93 }
else if ( temp_chi > 180 && temp_chi <= 270 ) {
94 rotamers[i].set_min_chi( temp_chi-180, 3 );
102 for(
Size i = 1; i <= rotamers.size(); ++i ) {
103 Real temp_chi( rotamers[i].get_min_chi(2) );
104 if ( temp_chi >= 135 && temp_chi <= 180 ) {
105 rotamers[i].set_min_chi( temp_chi+180, 2 );
106 }
else if ( temp_chi > 180 && temp_chi <= 315 ) {
107 rotamers[i].set_min_chi( temp_chi-180, 2 );
117 Real temp_omg( iter->get_min_omega() );
118 if ( temp_omg >=0 && temp_omg < 90 ) {
119 rotamers.erase( iter );
121 }
else if ( temp_omg >= 270 && temp_omg < 360 ) {
122 rotamers.erase( iter );
126 std::cout <<
"Erased " << count <<
"CIS PEPTOID rotamers" << std::endl;
134 Real temp_omg( iter->get_min_omega() );
135 if ( temp_omg >= 90 && temp_omg < 270 ) {
136 rotamers.erase( iter );
140 std::cout <<
"Erased " << count <<
"TRANS PEPTOID rotamers" << std::endl;
146 using namespace core;
147 using namespace pose;
148 using namespace scoring;
149 using namespace chemical;
150 using namespace conformation;
152 std::cout <<
"In min_rotamers()..." << std::flush << std::endl;
155 Size const nrot( rotamers.size() );
156 for (
Size i = 1; i <= nrot; ++i ) {
158 std::cout <<
"Working on rotamer " << i <<
" of " << nrot << std::flush << std::endl;
161 Size const nchi( rotamers[i].get_num_chi() );
164 std::stringstream start_name;
165 start_name <<
"tripeptide_" << rotamers[i].get_phi() <<
"_" << rotamers[i].get_psi() <<
"_";
166 for(
Size j = 1; j <= nchi; ++j ) {
167 start_name << rotamers[i].get_inp_chi( j ) <<
"_";
169 start_name <<
"start.pdb";
172 std::stringstream end_name;
173 end_name <<
"tripeptide_" << rotamers[i].get_phi() <<
"_" << rotamers[i].get_psi() <<
"_";
174 for(
Size j = 1; j <= nchi; ++j ) {
175 end_name << rotamers[i].get_inp_chi( j ) <<
"_";
177 end_name <<
"end.pdb";
183 ResidueType const & RT( RTS->name_map( aa_name ) );
185 pose.append_residue_by_jump( R, 1 );
197 pose.set_torsion( bb1, rotamers[i].get_omega() );
198 pose.set_torsion( bb2, rotamers[i].get_phi() );
199 pose.set_torsion( bb3, rotamers[i].get_psi() );
200 pose.set_torsion( bb4, rotamers[i].get_epsilon() );
202 for(
Size j = 1; j <= nchi; ++j ) {
203 pose.set_chi( j, 1, rotamers[i].get_inp_chi( j ) );
210 Real orig_ener( (*scrfxn)( pose ) );
212 std::cout <<
"ORIG ENER: " << orig_ener <<
"\t" << pose.energies().total_energy() << std::endl;
216 mvmp->set_chi( 1,
true );
217 mvmp->set( bb1,
true );
218 mvmp->set( bb4,
true );
222 Real current_ener( orig_ener), previous_ener( orig_ener );
225 previous_ener = current_ener;
227 current_ener = pose.energies().total_energy();
229 if ( iter > 100 )
break;
230 }
while ( current_ener + 0.001 < previous_ener );
233 Real min_ener( pose.energies().total_energy() );
238 std::cout <<
"MIN ENER: " << min_ener <<
" found in " << iter <<
" steps" << std::endl;
240 EnergyMap em( pose.energies().residue_total_energies(1) );
241 rotamers[i].set_twist( em[
mm_twist ] );
246 rotamers[i].set_solvation( em[
fa_sol ] );
249 for(
Size j = 1; j <= nchi; ++j ) {
250 rotamers[i].set_min_chi( pose.chi( j, 1 ), j );
252 rotamers[i].set_energy( min_ener );
253 rotamers[i].set_min_omega( numeric::nonnegative_principal_angle_degrees( pose.torsion( bb1 ) ) );
254 rotamers[i].set_min_epsilon( numeric::nonnegative_principal_angle_degrees( pose.torsion( bb4 ) ) );
268 Real omega_start_val,
269 Real epsilon_start_val
279 utility_exit_with_message(
"Cannot find options file"+options_filename);
283 std::ifstream options( options_filename.c_str() );
286 while ( getline( options, line ) ) {
287 std::istringstream l( line );
288 if ( line.size() < 1 || line[0] ==
'#' )
continue;
289 lines.push_back( line );
296 Size const nlines( lines.size() );
302 for (
Size i=1; i<= nlines; ++i ) {
304 std::istringstream l( line );
310 if ( tag ==
"NUM_CHI" ) {
315 else if ( tag ==
"CENTROID" ) {
320 else if ( tag ==
"AA_NAME" ) {
328 patch =
"_p:AcetylatedNtermDimethylatedCtermPeptoidFull";
329 std::cout <<
"Making a PEPTOID rotamer library..." << std::endl;
331 patch =
"_p:MethylatedCtermProteinFull_p:AcetylatedNtermProteinFull";
332 std::cout <<
"Making a PROTEIN rotamer library..." << std::endl;
335 aa_name = base_aa_name + patch;
339 int phi_lower(0), phi_upper(0), phi_increment(0);
340 int psi_lower(0), psi_upper(0), psi_increment(0);
342 chi_lower.resize(nchi, 0); chi_upper.resize(nchi, 0); chi_increment.resize(nchi, 0);
344 for (
Size i=1; i<= nlines; ++i ) {
346 std::istringstream l( line );
352 if ( tag ==
"PHI_RANGE" ) {
353 l >> phi_lower >> phi_upper >> phi_increment;
357 else if ( tag ==
"PSI_RANGE" ) {
358 l >> psi_lower >> psi_upper >> psi_increment;
362 else if ( tag ==
"CHI_RANGE" ) {
363 Size chi_num(0);
int temp_lower, temp_upper, temp_increment;
364 l >> chi_num >> temp_lower >> temp_upper >> temp_increment;
365 assert( chi_num <= nchi );
366 chi_lower[chi_num] = temp_lower;
367 chi_upper[chi_num] = temp_upper;
368 chi_increment[chi_num] = temp_increment;
372 else if ( tag ==
"CENTROID" ) {
373 RotData temp( nchi, ncluster );
374 for(
Size i = 1; i<= nchi; ++i ) {
375 Real chi_val(0);
int lib_chi_val(0);
376 l >> chi_val >> lib_chi_val;
381 centroids.push_back( temp );
387 total_chi_num_bins.resize(nchi, 0);
389 for(
Size i = 1; i <= nchi; ++i ) {
390 if ( (chi_upper[i] - chi_lower[i])%chi_increment[i] != 0 ) {
391 utility_exit_with_message(
"Number of chi bins not integer for chi: "+i);
393 total_chi_num_bins[i] = ((chi_upper[i] - chi_lower[i])/chi_increment[i])+1;
394 nrotamers *= total_chi_num_bins[i];
398 RotData temp( nchi, ncluster );
399 rotamers.resize(nrotamers, temp);
401 for (
Size i = 1; i <= nchi; ++i ) {
405 for (
int k = chi_lower[i]; k <= chi_upper[i]; k+=chi_increment[i] ){
406 chi_values.push_back( k );
418 for (
Size m = i+1; m <= nchi; ++m ) {
419 count_up *= total_chi_num_bins[m];
428 for (
Size m = 1; m < i; ++m ) {
429 count_down *= total_chi_num_bins[m];
434 for (
Size n = 1; n <= count_down; ++n ) {
435 for (
Size j = 1; j <= chi_values.size(); ++j ) {
436 for (
Size l = 1; l <= count_up; ++l ) {
437 rotamers[rot_iter].set_inp_chi(chi_values[j], i);
447 for(
Size i = 1; i <= nrotamers; ++i ) {
448 rotamers[i].set_phi( phi_lower );
449 rotamers[i].set_psi( psi_lower );
450 rotamers[i].set_omega( omega_start_val );
451 rotamers[i].set_epsilon( epsilon_start_val );
460 bool clust_change =
false;
461 for (
Size i=1; i<=rotamers.size(); ++i){
462 Size oldclust = rotamers[i].get_cluster_num();
463 Size clust = rotamers[i].get_min_cent_dist();
464 rotamers[i].set_cluster_num(clust);
465 if ( oldclust != clust ){
482 Size ncluster( centroids.size() );
483 Size nchi( rotamers[1].get_num_chi() );
487 num_rots.resize(ncluster,0);
491 total_chi_angle.resize(ncluster);
492 for(
Size i = 1; i <= total_chi_angle.size(); ++i ) {
493 total_chi_angle[i].resize(nchi, 0);
497 for(
Size i = 1; i <= rotamers.size(); ++i ) {
498 Size clusternum = rotamers[i].get_cluster_num();
499 for(
Size j = 1; j <= nchi; ++j) {
500 total_chi_angle[clusternum][j] += rotamers[i].get_min_chi(j);
502 num_rots[clusternum]++;
506 bool centroid_change(
false);
507 for (
Size i=1;i <= ncluster; ++i){
508 for (
Size j=1; j <= nchi; ++j ){
509 Real old_angle = centroids[i].get_min_chi( j );
510 Real avg_angle = total_chi_angle[i][j] / num_rots[i];
511 centroids[i].set_min_chi( avg_angle, j );
512 if(old_angle != avg_angle) {
513 centroid_change =
true;
518 return centroid_change;
527 for(
Size i = 1; i <= nchi; ++i ) {
531 return sqrt( sd/nchi );
542 total_dist.resize(ncluster,0);
543 num_rots.resize(ncluster,0);
546 for(
Size i = 1; i <= rotamers.size(); ++i ) {
547 Size clusternum = rotamers[i].get_cluster_num();
548 total_dist[clusternum] += rotamers[i].get_cen_dist(clusternum);
549 num_rots[clusternum]++;
553 for (
Size i=1; i <= ncluster; ++i){
554 std::cout <<
"Cluster: "<< i <<
" contains "<< num_rots[i] <<
" of "<< rotamers.size()<<
" or %=" <<
static_cast<Real>(num_rots[i]) / static_cast<Real>(rotamers.size()) <<std::endl;
557 std::cout <<
"AVG_CLUST_CENT_DST: " <<std::endl;
559 for(
Size i = 1; i <= ncluster; ++i ) {
560 std::cout << total_dist[i]/num_rots[i] <<
"\t";
561 avgdist += (total_dist[i]/num_rots[i]);
563 std::cout << std::endl;
564 std::cout <<
"AVG_CENT_DST:" <<
"\t";
565 return avgdist / total_dist.size();
571 for (
Size i=1; i <= rotamers.size(); ++i){
572 for (
Size j=1; j<= centroids.size(); ++j){
574 rotamers[i].set_cen_dist(dist, j);
582 RotData temp(rotamers[1].get_num_chi(), nclusters);
583 final_rotamers.resize(nclusters, temp);
586 for (
Size j=1; j<= nclusters ; ++j){
587 final_rotamers[j].set_energy(6000);
590 for (
Size i=1; i<= rotamers.size(); ++i){
591 Size cluster_num( rotamers[i].get_cluster_num() );
592 if (rotamers[i].get_energy() <= final_rotamers[cluster_num].get_energy()){
593 final_rotamers[cluster_num] = rotamers[i];
604 prob_temp.resize(final_rotamers.size(),0);
606 normalized_ener.resize(final_rotamers.size(),0);
611 Real min_ener(final_rotamers[1].get_energy());
612 for (
Size i=1; i<=final_rotamers.size(); ++i){
613 if ( final_rotamers[i].get_energy() < min_ener ) {
614 min_ener = final_rotamers[i].get_energy();
619 for (
Size i=1; i<=final_rotamers.size(); ++i){
620 normalized_ener[i] = final_rotamers[i].get_energy() - min_ener;
624 for (
Size i=1; i<=final_rotamers.size(); ++i){
625 prob_temp[i] = exp( ( -normalized_ener[i] ) / KbT ) ;
626 total_prob += prob_temp[i];
627 std::cout <<
"Cluster: " << i <<
" Probability=" << prob_temp[i] << std::endl;
629 std::cout <<
"Total Probability= " << total_prob << std::endl;
630 std::cout <<
"Kb T value used: " << KbT << std::endl;
633 for (
Size i=1; i<=final_rotamers.size(); ++i){
634 final_rotamers[i].set_probability(prob_temp[i] / total_prob);
643 using namespace pose;
644 using namespace scoring;
645 using namespace chemical;
646 using namespace conformation;
651 ResidueType const & RT( RTS->name_map( aa_name ) );
653 pose.append_residue_by_jump( R, 1 );
656 for (
Size i = 1; i<= final_rotamers.size(); ++i){
657 Size const nchi (final_rotamers[i].get_num_chi() );
664 pose.set_torsion( bb1, final_rotamers[i].get_omega() );
665 pose.set_torsion( bb2, final_rotamers[i].get_phi() );
666 pose.set_torsion( bb3, final_rotamers[i].get_psi() );
667 pose.set_torsion( bb4, final_rotamers[i].get_epsilon() );
669 for(
Size l = 1; l <= nchi; ++l ) {
670 pose.set_chi( l, 1, final_rotamers[i].get_inp_chi( l ) );
675 mvmp->set_chi( 1,
true );
676 mvmp->set( bb1,
true );
677 mvmp->set( bb4,
true );
679 for (
Size j=1; j<= 25; ++j ) {
685 std::stringstream final_name;
686 final_name << pose.residue(1).type().name3() <<
"_" << final_rotamers[i].get_phi() <<
"_" << final_rotamers[i].get_psi() <<
"_";
687 final_name <<
"INP_CHI_";
688 for(
Size j = 1; j <= nchi; ++j ) {
689 final_name << final_rotamers[i].get_inp_chi( j ) <<
"_";
691 final_name <<
"MIN_CHI_";
692 for(
Size j = 1; j <= nchi; ++j ) {
693 final_name << final_rotamers[i].get_min_chi( j ) <<
"_";
695 final_name <<
"final.pdb";
702 Real cut_off_ener (final_rotamers[i].get_energy() + 0.5);
705 Real test_ener ( (*scrfxn)(pose) );
706 Real found_ener (final_rotamers[i].get_energy());
707 if (test_ener != found_ener){
708 std::cout <<
"--------WARNING---------"<< std::endl;
709 std::cout <<
"For Final_Rot: " << i <<
" Scored E: "<< test_ener <<
" but Min Rot E: "<< found_ener <<std::endl;
717 for(
Size j = 1; j <= nchi; ++j ) {
721 while(new_ener < cut_off_ener && (k * chi_step) <= 30 ){
724 numeric::nonnegative_principal_angle_degrees( final_rotamers[i].get_min_chi( j ) + k * chi_step ));
725 Real plus_ener( (*scrfxn)( pose ) );
727 numeric::nonnegative_principal_angle_degrees( final_rotamers[i].get_min_chi( j ) - k * chi_step ));
728 Real neg_ener( (*scrfxn)( pose ) );
730 new_ener = (plus_ener >= neg_ener ? plus_ener : neg_ener);
735 final_rotamers[i].set_std_dev(k*chi_step, j);
738 pose.set_chi( j, 1, final_rotamers[i].get_min_chi( j ) );
749 cout <<
"PHI: " << setw(4) << setprecision(2) << fixed << rot.
get_phi() <<
" "
750 <<
"PSI: " << setw(4) << setprecision(2) << fixed << rot.
get_psi() <<
" "
751 <<
"OMG: " << setw(8) << setprecision(4) << fixed << rot.
get_min_omega() <<
" "
752 <<
"ESL: " << setw(8) << setprecision(4) << fixed << rot.
get_min_epsilon() <<
" "
753 <<
"PRB: " << setw(4) << setprecision(4) << fixed << rot.
get_probability() <<
" "
754 <<
"ENR: " << setw(8) << setprecision(4) << fixed << rot.
get_energy() <<
" "
755 <<
"TWS: " << setw(8) << setprecision(4) << fixed << rot.
get_twist() <<
" "
756 <<
"RAR: " << setw(8) << setprecision(4) << fixed << rot.
get_intra_rep() <<
" "
757 <<
"RAA: " << setw(8) << setprecision(4) << fixed << rot.
get_intra_atr() <<
" "
761 <<
"NCH: " << setw(4) << fixed << rot.
get_num_chi() <<
" "
767 cout << setw(7) << setprecision(2) << fixed << rot.
get_inp_chi(i) <<
" ";
772 cout << setw(7) << setprecision(2) << fixed << rot.
get_min_chi(i) <<
" ";
777 cout << setw(7) << setprecision(2) << fixed << rot.
get_std_dev(i) <<
" ";
782 cout << setw(7) << setprecision(2) << fixed << rot.
get_cen_dist(i) <<
" ";
804 assert( final_rotamers.size() >= 1 && centroids.size() >= 1 && final_rotamers.size() == centroids.size() );
807 Size nchi( final_rotamers[1].get_num_chi() );
808 Size nrot( final_rotamers.size() );
809 Real phi( final_rotamers[1].get_phi() );
810 Real psi( final_rotamers[1].get_psi() );
813 std::string aa_name3( aa_name_full.substr( 0, 3 ) );
819 for (
Size i = 1; i <= nrot; ++i ) {
821 for (
Size j = i+1; j <= nrot; ++j ) {
822 if( final_rotamers[j].get_probability() > final_rotamers[max].get_probability() ) {
826 RotData temp_rot( final_rotamers[i] );
827 RotData temp_cen( centroids[i] );
828 final_rotamers[i] = final_rotamers[max];
829 centroids[i] = centroids[max];
830 final_rotamers[max] = temp_rot;
831 centroids[max] = temp_cen;
836 chi1_bin_nums.resize( nrot, 0 ); chi4_bin_nums.resize( nrot, 0 ); chi3_bin_nums.resize( nrot, 0 ); chi2_bin_nums.resize( nrot, 0 );
839 for(
Size i = 1; i <= nrot; ++i ) {
840 chi1_bin_nums[i] =
Size( centroids[i].get_lib_chi_val(1) );
845 for(
Size i = 1; i <= nrot; ++i ) {
846 chi2_bin_nums[i] =
Size( centroids[i].get_lib_chi_val(2) );
851 for(
Size i = 1; i <= nrot; ++i ) {
852 chi3_bin_nums[i] =
Size( centroids[i].get_lib_chi_val(3) );
857 for(
Size i = 1; i <= nrot; ++i ) {
858 chi4_bin_nums[i] =
Size( centroids[i].get_lib_chi_val(4) );
863 std::stringstream lib_name;
864 lib_name << aa_name3 <<
"_" << phi <<
"_" << psi <<
"_bbdep.rotlib";
867 std::ofstream rotlib;
868 rotlib.open( lib_name.str().c_str() );
871 for(
Size i = 1; i <= nrot; ++i ) {
872 rotlib << setw(3) << aa_name3
874 << setw(4) << setprecision(0) << fixed << phi
876 << setw(4) << setprecision(0) << fixed << psi
880 << chi1_bin_nums[i] <<
" " << chi2_bin_nums[i] <<
" " << chi3_bin_nums[i] <<
" " << chi4_bin_nums[i]
882 << setw(8) << setprecision(6) << fixed << final_rotamers[i].get_probability()
885 for(
Size j = 1; j <= 4; ++j ){
886 if( j <= nchi ) rotlib << setw(6) << setprecision(1) << fixed << numeric::principal_angle_degrees( final_rotamers[i].get_min_chi(j) );
887 else rotlib << setw(6) << setprecision(1) << fixed <<
"0.0";
893 for(
Size j = 1; j <= 4; ++j ){
894 if( j <= nchi ) rotlib << setw(6) << setprecision(1) << fixed << final_rotamers[i].get_std_dev(j);
895 else rotlib << setw(6) << setprecision(1) << fixed <<
"0.0";