24 #include <basic/database/open.hh>
25 #include <basic/options/option.hh>
28 #include <numeric/angle.functions.hh>
29 #include <numeric/interpolation/periodic_range/half/interpolation.hh>
30 #include <numeric/random/random.hh>
33 #include <utility/pointer/ReferenceCount.hh>
34 #include <utility/io/izstream.hh>
37 #include <ObjexxFCL/FArray1D.hh>
38 #include <ObjexxFCL/FArray2D.hh>
39 #include <ObjexxFCL/FArray2A.hh>
40 #include <ObjexxFCL/FArray4D.hh>
41 #include <ObjexxFCL/string.functions.hh>
50 #include <basic/options/keys/corrections.OptionKeys.gen.hh>
52 #include <basic/options/keys/OptionKeys.hh>
54 #include <utility/vector1.hh>
59 using namespace ObjexxFCL;
65 Ramachandran::~Ramachandran() {}
69 bool R::rama_initialized_(
false );
70 Real const R::binw_( 10.0 );
71 Real const R::rama_sampling_thold_( 0.00075 );
72 Real const R::rama_sampling_factor_( 10.0 );
73 ObjexxFCL::FArray4D< Real > R::ram_probabil_( R::n_phi_, R::n_psi_, 3, R::n_aa_ );
74 ObjexxFCL::FArray4D_int R::ram_counts_( R::n_phi_, R::n_psi_, 3, R::n_aa_ );
75 ObjexxFCL::FArray4D< Real > R::ram_energ_( R::n_phi_, R::n_psi_, 3, R::n_aa_);
76 ObjexxFCL::FArray2D< Real > R::ram_entropy_( 3, R::n_aa_ );
78 Ramachandran::Ramachandran()
80 using namespace basic::options;
82 option[ OptionKeys::corrections::score::rama_map ]().name(),
83 option[ OptionKeys::corrections::score::use_bicubic_interpolation ]);
87 Ramachandran::Ramachandran(
89 bool use_bicubic_interpolation
91 read_rama(rama_map_filename, use_bicubic_interpolation);
100 Ramachandran::eval_rama_score_all(
143 for (
int ii = 1; ii <= total_residue; ++ii )
147 Real rama_score,dphi,dpsi;
148 eval_rama_score_residue(pose.
residue(ii),rama_score,dphi,dpsi);
158 Ramachandran::write_rama_score_all(
Pose const & )
const
165 Ramachandran::init_rama_sampling_table(
166 char const torsion_bin)
170 current_rama_sampling_table.resize(n_aa_);
172 FArray2A< Real >::IR
const zero_index( 0, n_phi_ - 1);
173 for (
int aa=1; aa<=n_aa_; aa++) {
174 FArray2A< Real >
const rama_for_res( ram_probabil_(1, 1, ss_type, aa), zero_index, zero_index );
175 Size max_allowed = n_phi_ * n_psi_;
176 Size actual_allowed = 0;
182 for (
int i=0; i<n_phi_; i++) {
183 for (
int j=0; j<n_psi_; j++) {
184 Real res_prob = rama_for_res(i,j);
185 if ( res_prob > rama_sampling_thold_ ) {
187 if (res_prob < min_val) min_val = res_prob;
188 else if (res_prob > max_val) max_val = res_prob;
193 Real cur_phi, cur_psi;
194 if (i <= n_phi_ / 2) {
198 cur_phi = 0 - (n_phi_ - i);
200 if (j <= n_psi_ / 2) {
204 cur_psi = 0 - (n_psi_ - j);
207 if (torsion_bin !=
'X')
209 if (torsion_bin ==
'X' || cur_tb == torsion_bin) {
211 res_probs[actual_allowed] = res_prob;
212 torsion[1] = static_cast <
Real> ( cur_phi * binw_);
213 torsion[2] = static_cast <
Real> ( cur_psi * binw_);
214 res_torsions[actual_allowed] = torsion;
223 if( ((
int)aa < (int)1) || ((int)aa > (
int)current_rama_sampling_table.size()) ){
224 std::cerr <<
"AA exceeded size of rama_sampling_table_ AA=" + ObjexxFCL::string_of( aa ) +
" size()=" + ObjexxFCL::string_of( current_rama_sampling_table.size() );
231 current_rama_sampling_table[aa].resize(
Size(actual_allowed * (max_val / min_val) * rama_sampling_factor_));
234 for (
Size tor = 1; tor <= actual_allowed; tor++) {
235 Size n_indices =
Size(( res_probs[tor] / min_val ) * rama_sampling_factor_);
237 for (
Size ind=1; ind<=n_indices; ind++) {
239 if( (
int(index) < 1) || (
int(index) > (
int)current_rama_sampling_table[aa].
size()) ){
240 std::cerr <<
"index exceeded size of rama_sampling_table_[aa] index=" +
241 ObjexxFCL::string_of( (index) ) +
242 " rama_sampling_table_[aa].size()=" +
243 ObjexxFCL::string_of( current_rama_sampling_table[aa].
size() ) +
244 " AA=" + ObjexxFCL::string_of( aa );
248 if( ((
int)tor < 1) || ((
int)tor > (
int)res_torsions.size()) ){
249 std::cerr <<
"tor exceeded size of rama_sampling_table_[aa] index=" +
250 ObjexxFCL::string_of( tor ) +
251 " res_torsions.size()=" + ObjexxFCL::string_of( res_torsions.size() ) +
252 " AA=" + ObjexxFCL::string_of( aa );
256 current_rama_sampling_table[aa][index] = res_torsions[tor];
259 current_rama_sampling_table[aa].resize(index);
263 if (torsion_bin ==
'X') {
264 rama_sampling_table_ = current_rama_sampling_table;
266 core::Size tb_index = get_torsion_bin_index(torsion_bin);
268 if (rama_sampling_table_by_torsion_bin_.size() < tb_index)
269 rama_sampling_table_by_torsion_bin_.resize(tb_index);
271 rama_sampling_table_by_torsion_bin_[tb_index] = current_rama_sampling_table;
292 Ramachandran::random_phipsi_from_rama(
299 if ( rama_sampling_table_.size() == 0 ) {
301 const_cast< Ramachandran *
> (
this)->init_rama_sampling_table(
'X');
304 Size n_torsions = rama_sampling_table_[res_aa].size();
305 Size index = numeric::random::random_range(1, n_torsions);
309 phi = rama_sampling_table_[res_aa][index][1] +
310 (numeric::random::uniform() * binw_ * 0.5 * (numeric::random::uniform() < 0.5 ? -1 : 1));
311 psi = rama_sampling_table_[res_aa][index][2] +
312 (numeric::random::uniform() * binw_ * 0.5 * (numeric::random::uniform() < 0.5 ? -1 : 1));
339 Ramachandran::random_phipsi_from_rama_by_torsion_bin(
343 char const torsion_bin
351 if (rama_sampling_table_by_torsion_bin_.size() == 0) {
352 const_cast< Ramachandran *
> (
this)->init_rama_sampling_tables_by_torsion_bin();
360 core::Size tb_index = get_torsion_bin_index(torsion_bin);
373 Size n_torsions = rama_sampling_table_by_torsion_bin_[tb_index][res_aa].size();
374 Size index = numeric::random::random_range(1, n_torsions);
387 phi = rama_sampling_table_by_torsion_bin_[tb_index][res_aa][index][1] +
388 (numeric::random::uniform() * binw_ * 0.5 * (numeric::random::uniform() < 0.5 ? -1 : 1));
389 psi = rama_sampling_table_by_torsion_bin_[tb_index][res_aa][index][2] +
390 (numeric::random::uniform() * binw_ * 0.5 * (numeric::random::uniform() < 0.5 ? -1 : 1));
401 core::Size Ramachandran::get_torsion_bin_index(
char torsion_bin)
const
403 return toupper(torsion_bin) - toupper(
'A') + 1;
409 Ramachandran::init_rama_sampling_tables_by_torsion_bin()
411 const_cast< Ramachandran *
> (
this)->init_rama_sampling_table(
'A' );
412 const_cast< Ramachandran *
> (
this)->init_rama_sampling_table(
'B' );
413 const_cast< Ramachandran *
> (
this)->init_rama_sampling_table(
'E' );
414 const_cast< Ramachandran *
> (
this)->init_rama_sampling_table(
'G' );
415 const_cast< Ramachandran *
> (
this)->init_rama_sampling_table(
'X' );
419 Ramachandran::get_entries_per_torsion_bin(
AA const res_aa, std::map< char, core::Size > & tb_frequencies )
const
422 if (rama_sampling_table_by_torsion_bin_.size() == 0)
424 tb_frequencies[
'A'] = rama_sampling_table_by_torsion_bin_[get_torsion_bin_index(
'A')][res_aa].size();
425 tb_frequencies[
'B'] = rama_sampling_table_by_torsion_bin_[get_torsion_bin_index(
'B')][res_aa].size();
426 tb_frequencies[
'E'] = rama_sampling_table_by_torsion_bin_[get_torsion_bin_index(
'E')][res_aa].size();
427 tb_frequencies[
'G'] = rama_sampling_table_by_torsion_bin_[get_torsion_bin_index(
'G')][res_aa].size();
428 tb_frequencies[
'X'] = rama_sampling_table_by_torsion_bin_[get_torsion_bin_index(
'X')][res_aa].size();
434 Ramachandran::eval_rama_score_residue(
441 using namespace numeric;
458 eval_rama_score_residue( rsd.
aa(),
phi,
psi,
rama, drama_dphi, drama_dpsi );
465 Ramachandran::eval_rama_score_residue(
473 eval_rama_score_residue( res_aa, phi, psi, rama, drama_dphi, drama_dpsi );
478 Ramachandran::eval_rama_score_residue(
486 using namespace basic::options;
487 eval_rama_score_residue(
488 option[ OptionKeys::corrections::score::use_bicubic_interpolation ],
489 option[ OptionKeys::corrections::score::rama_not_squared ],
490 res_aa, phi, psi, rama, drama_dphi, drama_dpsi);
496 Ramachandran::eval_rama_score_residue(
497 bool use_bicubic_interpolation,
498 bool rama_not_squared,
507 using namespace numeric;
535 if ( use_bicubic_interpolation ) {
537 rama = rama_energy_splines_[ res_aa ].F(phi,psi);
538 drama_dphi = rama_energy_splines_[ res_aa ].dFdx(phi,psi);
539 drama_dpsi = rama_energy_splines_[ res_aa ].dFdy(phi,psi);
543 FArray2A< Real >::IR
const zero_index( 0, n_phi_ - 1);
544 FArray2A< Real >
const rama_for_res( ram_probabil_(1, 1, ss_type, res_aa), zero_index, zero_index );
545 Real interp_p,dp_dphi,dp_dpsi;
547 using namespace numeric::interpolation::periodic_range::half;
548 interp_p = bilinearly_interpolated( phi, psi, binw_, n_phi_, rama_for_res, dp_dphi, dp_dpsi );
550 if ( interp_p > 0.0 ) {
551 rama = ram_entropy_(ss_type, res_aa ) - std::log( static_cast< double >( interp_p ) );
552 double const interp_p_inv_neg = -1.0 / interp_p;
553 drama_dphi = interp_p_inv_neg * dp_dphi;
554 drama_dpsi = interp_p_inv_neg * dp_dpsi;
566 if ( ! rama_not_squared ) {
568 Real const rama_squared = rama *
rama;
569 if ( rama_squared > 20.0 ) {
576 drama_dphi = 2 * rama * drama_dphi;
577 drama_dpsi = 2 * rama * drama_dpsi;
588 void Ramachandran::eval_procheck_rama(
597 Ramachandran::read_rama(
599 bool use_bicubic_interpolation
602 int aa_num,phi_bin,psi_bin,ss_type;
603 Real check,min_prob,max_prob;
609 utility::io::izstream iunit;
612 iunit.open( rama_map_filename );
614 if ( !iunit.good() ) {
616 if(!basic::database::open( iunit, rama_map_filename )){
617 std::stringstream err_msg;
618 err_msg <<
"Unable to open Ramachandran map '" << rama_map_filename <<
"'.";
619 utility_exit_with_message(err_msg.str());
625 for (
int i = 1; i <= n_aa_ ; ++i ) {
626 for (
int ii = 1; ii <= 3; ++ii ) {
630 max_prob = -min_prob;
631 for (
int j = 1; j <= 36; ++j ) {
632 for (
int k = 1; k <= 36; ++k ) {
633 iunit.getline( line, 60 );
636 }
else if ( iunit.fail() ) {
639 std::sscanf( line,
"%5d", &aa_num );
640 std::sscanf( line+6,
"%5d", &ss_type );
641 std::sscanf( line+12,
"%5d", &phi_bin );
642 std::sscanf( line+18,
"%5d", &psi_bin );
643 std::sscanf( line+24,
"%5d", &ram_counts_(j,k,ii,i) );
644 std::sscanf( line+30,
"%12f", &pval );
645 ram_probabil_(j,k,ii,i) = pval;
646 scan_count = std::sscanf( line+43,
"%12f", &eval );
647 ram_energ_(j,k,ii,i) = eval;
649 if ( scan_count == EOF )
continue;
671 check += ram_probabil_(j,k,ii,i);
672 entropy += ram_probabil_(j,k,ii,i) *
673 std::log( static_cast< double >( ram_probabil_(j,k,ii,i) ) );
674 min_prob = std::min(ram_probabil_(j,k,ii,i),min_prob);
675 max_prob = std::max(ram_probabil_(j,k,ii,i),max_prob);
678 ram_entropy_(ii,i) = entropy;
687 if ( use_bicubic_interpolation ) {
688 using namespace numeric;
689 using namespace numeric::interpolation::spline;
692 BicubicSpline ramaEspline;
693 MathMatrix< Real > energy_vals( 36, 36 );
694 for (
Size jj = 0; jj < 36; ++jj ) {
695 for (
Size kk = 0; kk < 36; ++kk ) {
696 energy_vals( jj, kk ) = -std::log( ram_probabil_(jj+1,kk+1,3,ii )) + ram_entropy_(3,ii) ;
699 BorderFlag periodic_boundary[2] = { e_Periodic, e_Periodic };
700 Real start_vals[2] = {5.0, 5.0};
701 Real deltas[2] = {10.0, 10.0};
702 bool lincont[2] = {
false,
false};
703 std::pair< Real, Real > unused[2];
704 unused[0] = std::make_pair( 0.0, 0.0 );
705 unused[1] = std::make_pair( 0.0, 0.0 );
706 ramaEspline.train( periodic_boundary, start_vals, deltas, energy_vals, lincont, unused );
707 rama_energy_splines_[ ii ] = ramaEspline;