30 #include <basic/Tracer.hh>
31 #include <basic/database/open.hh>
33 #include <utility/io/izstream.hh>
34 #include <utility/vector1.hh>
35 #include <utility/vector1.functions.hh>
37 #include <ObjexxFCL/string.functions.hh>
38 #include <ObjexxFCL/format.hh>
40 static basic::Tracer
TR(
"protocols.sasa_scores.sasapack" );
44 namespace sasa_scores {
47 using namespace core::pose;
48 using namespace core::conformation;
49 using namespace core::chemical;
50 using namespace core::scoring;
57 using namespace ObjexxFCL::fmt;
62 operator()(
Real const x )
const;
65 degree()
const {
return coeffs_.size() -1; }
80 runtime_assert( !coeffs_.empty() );
82 Size const degree( coeffs_.size() - 1 );
86 for (
Size i=0; i<= degree; ++i ) {
87 polyval += coeffs_[ degree+1-i ] * x_raised;
96 string tmp1,tmp2,tmp3;
97 is >> tmp1 >> tmp2 >> degree >> tmp3;
98 if ( is.fail() || tmp1 !=
"POLY" || tmp2 !=
"DEGREE" || tmp3 !=
"COEFFS_HI2LO" || degree > 10000 ) {
99 is.setstate( std::ios_base::failbit );
104 for (
Size i=1; i<=degree+1; ++i ) {
119 operator()(
Real const x )
const;
137 for (
Size ii=1; ii<= xmins_.size(); ++ii ) {
138 if ( x >= xmins_[ii] && x <= xmaxs_[ii] )
return polys_[ii](x);
140 utility_exit_with_message(
"PPoly::operator() x out of range: "+ObjexxFCL::string_of(x));
148 for (
Size ii=1; ii<= polys_.size(); ++ii ) {
149 md = max( md, polys_[ii].degree() );
158 is >> tmp1 >> tmp2 >> npoly;
159 if ( is.fail() || tmp1 !=
"PPOLY" || tmp2 !=
"NPOLY" ) {
160 is.setstate( std::ios_base::failbit );
164 for (
Size i=1; i<= npoly; ++i ) {
167 is >> tmp1 >> xmin >> tmp2 >> xmax >> p;
168 if ( is.fail() || tmp1 !=
"XMIN" || tmp2 !=
"XMAX" )
break;
170 pp.
xmins_.push_back( xmin );
171 pp.
xmaxs_.push_back( xmax );
173 if ( is.fail() || pp.
polys_.size() != npoly ) {
174 is.setstate( std::ios_base::failbit );
193 utility::io::izstream data;
194 string const datafile(
"scoring/sasa_scores/sasapack_datafile_v1.txt" );
195 basic::database::open( data, datafile );
200 bool found_avg_sasa(
false );
201 while ( getline( data,line ) ) {
202 string linetag, name1;
204 istringstream is(line );
206 if ( linetag ==
"PPOLY_SASAPACK" ) {
208 is >> name1 >> degree >> p;
209 runtime_assert( !is.fail() );
213 }
else if ( linetag ==
"PPOLYVAL_SASAPACK" ) {
215 is >> name1 >> degree >> x >> y;
217 all_polyvals[p].push_back( make_pair(x,y) );
218 }
else if ( linetag ==
"AVG_SASA" ) {
220 is >> name1 >> linetag >> mean;
221 found_avg_sasa =
true;
224 avg_sasa14s[ aa ] = mean;
227 runtime_assert( found_avg_sasa );
228 for (
Size i=1; i<= 20; ++i ) {
230 PPoly const & p( polys[i] );
232 cout <<
"load_sasapack_polynomial_coefficients: using degree " << degree <<
" polynomial for " << aa <<
233 " datafile: " << datafile << endl;
237 for (
Size ii=1; ii<= polyvals.size(); ++ii ) {
238 Real const x( polyvals[ii].first ), expected_y( polyvals[ii].second ), recomputed_y( p(x) );
239 err += ( expected_y - recomputed_y ) * ( expected_y - recomputed_y );
242 if ( count ) err /= count;
243 TR.Trace <<
"polyval_err: " << aa <<
' ' << degree <<
" npoints: " << I(4,count) <<
" err-per-point: " <<
245 runtime_assert( err < 1e-3 );
264 utility::io::izstream data;
265 string const datafile(
"scoring/sasa_scores/avge_datafile_score12prime_v1.txt" );
266 basic::database::open( data, datafile );
271 bool found_avg_sasa(
false );
272 while ( getline( data,line ) ) {
273 string linetag, name1;
275 istringstream is(line );
277 if ( linetag ==
"PPOLY_NORME" ) {
279 is >> name1 >> degree >> p;
280 runtime_assert( !is.fail() );
284 }
else if ( linetag ==
"PPOLYVAL_NORME" ) {
286 is >> name1 >> degree >> x >> y;
288 all_polyvals[p].push_back( make_pair(x,y) );
289 }
else if ( linetag ==
"AVG_SASA" ) {
291 is >> name1 >> linetag >> mean;
292 found_avg_sasa =
true;
295 avg_sasa14s[ aa ] = mean;
298 runtime_assert( found_avg_sasa );
300 for (
Size i=1; i<= 20; ++i ) {
302 PPoly const & p( polys[i] );
304 cout <<
"load_avge_polynomial_coefficients: using degree " << degree <<
" polynomial for " << aa <<
305 " datafile: " << datafile << endl;
309 for (
Size ii=1; ii<= polyvals.size(); ++ii ) {
310 Real const x( polyvals[ii].first ), expected_y( polyvals[ii].second ), recomputed_y( p( x ) );
311 err += ( expected_y - recomputed_y ) * ( expected_y - recomputed_y );
314 if ( count ) err /= count;
315 TR.Trace <<
"polyval_err: " << aa <<
' ' << degree <<
" npoints: " << I(4,count) <<
" err-per-point: " <<
317 runtime_assert( err < 1e-3 );
328 Real const probe_radius,
333 bool const use_big_polar_H(
false ), use_naccess_sasa_radii(
false ), expand_polar_radii(
false ),
334 include_probe_radius_in_atom_radii(
false ), use_lj_radii(
true );
335 Real const polar_expansion_radius_unused( 1.0 );
343 atom_subset, use_naccess_sasa_radii, expand_polar_radii, polar_expansion_radius_unused,
344 include_probe_radius_in_atom_radii, use_lj_radii );
355 Pose const & pose_in,
356 Reals & residue_avge,
357 Reals & residue_normsasa,
359 Real & average_normsasa
362 bool const ignore_gly_paa(
true ), ignore_pro_close(
true ), ignore_omega(
true ), ignore_fa_dun(
true ),
363 ignore_fa_rep(
true );
367 if ( !fa_scorefxn ) {
378 residue_avge.clear(); residue_avge.resize( pose_in.
total_residue(), 0.0 );
379 residue_normsasa.clear(); residue_normsasa.resize( pose_in.
total_residue(), 0.0 );
382 static Reals avg_sasa14s;
383 if ( polys.empty() ) {
387 Pose pose( pose_in );
392 Real const probe_radius( 1.4 );
396 (*fa_scorefxn)( pose );
398 EnergyMap const & wts( fa_scorefxn->weights() );
400 average_avge = average_normsasa = 0.0;
405 if ( !rsd.is_protein() )
continue;
406 if ( rsd.is_lower_terminus() || rsd.is_upper_terminus() )
continue;
409 Real const total_energy( rsd_energies.dot( fa_scorefxn->weights() ) );
411 Real normE( total_energy );
412 if ( ignore_gly_paa ) normE -= rsd_energies[
p_aa_pp ] * wts[
p_aa_pp ];
414 if ( ignore_omega ) normE -= rsd_energies[
omega ] * wts[
omega ];
415 if ( ignore_fa_dun ) normE -= rsd_energies[
fa_dun ] * wts[
fa_dun ];
416 if ( ignore_fa_rep ) normE -= rsd_energies[
fa_rep ] * wts[
fa_rep ];
418 Real const sasa14( rsd_sasa[i] ), expected_normE( polys[ rsd.aa() ]( sasa14 ) );
420 residue_avge [i] = normE - expected_normE;
421 residue_normsasa[i] = sasa14 - avg_sasa14s[ rsd.aa() ];
423 average_avge += residue_avge [ i ];
424 average_normsasa += residue_normsasa[ i ];
429 average_avge /= count;
430 average_normsasa /= count;
441 Reals & residue_sasapack,
442 Reals & residue_normsasa,
443 Real & average_sasapack,
444 Real & average_normsasa
448 static Reals avg_sasa14s;
449 if ( polys.empty() ) {
454 Real const big_probe_radius( 1.4 ), small_probe_radius( 0.5 );
455 Reals rsd_sasa_big_probe, rsd_sasa_small_probe;
459 residue_sasapack.clear(); residue_sasapack.resize( pose.
total_residue(), 0. );
460 residue_normsasa.clear(); residue_normsasa.resize( pose.
total_residue(), 0. );
462 average_sasapack = average_normsasa = 0.0;
467 if ( !rsd.is_protein() )
continue;
468 if ( rsd.is_lower_terminus() || rsd.is_upper_terminus() )
continue;
471 Real const actual_sasa14( rsd_sasa_big_probe[i] ), actual_sasa5( rsd_sasa_small_probe[i] );
472 Real const expected_sasa5( polys[ rsd.aa() ]( actual_sasa14 ) );
473 residue_sasapack[ i ] = actual_sasa5 - expected_sasa5;
474 residue_normsasa[ i ] = actual_sasa14 - avg_sasa14s[ rsd.aa() ];
476 average_sasapack += residue_sasapack[i];
477 average_normsasa += residue_normsasa[i];
481 average_sasapack /= count;
482 average_normsasa /= count;