Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
OmegaTether.cc
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file core/scoring/OmegaTether.cc
11 /// @brief OmegaTether potential class implementation
12 /// @author Andrew Leaver-Fay (leaverfa@email.unc.edu)
13 
14 // Unit Headers
16 
17 // Package Headers
18 #include <core/scoring/Energies.hh>
20 
21 // Project Headers
22 #include <core/pose/Pose.hh>
23 #include <basic/basic.hh>
24 
25 // Numeric Headers
26 #include <numeric/angle.functions.hh>
27 #include <numeric/constants.hh>
28 #include <numeric/MathMatrix.hh>
29 
30 // Utility Headers
31 #include <utility/pointer/ReferenceCount.hh>
32 #include <utility/io/izstream.hh>
33 
34 // ObjexxFCL Headers
35 #include <ObjexxFCL/FArray1D.hh>
37 #include <utility/vector1.hh>
38 #include <ObjexxFCL/FArray2D.hh>
39 
40 #include <basic/database/open.hh>
41 #include <basic/options/option.hh>
42 #include <basic/options/keys/corrections.OptionKeys.gen.hh>
43 #include <basic/options/keys/OptionKeys.hh>
44 
45 
46 namespace core {
47 namespace scoring {
48 
49 
51  using namespace basic::options;
52  use_phipsi_dep_ = option[ OptionKeys::corrections::score::bbdep_omega ]();
53  if (use_phipsi_dep_)
55 }
56 
57 
58 ///////////////////////////////////////////////////////////////////////////////
59 /// @brief evaluate omega score for each (protein) residue and store that score
60 /// in the pose.energies() object
61 void
63  pose::Pose & pose,
64  ScoreFunction const & scorefxn
65 ) const
66 {
67  if ( scorefxn.has_zero_weight( omega ) ) return; // unnecessary, righ?
68 
69  int const total_residue = pose.total_residue();
70 
71  Energies & pose_energies( pose.energies() );
72 
73  for ( int ii = 1; ii <= total_residue; ++ii )
74  {
75  if ( pose.residue(ii).is_protein() && ! pose.residue(ii).is_terminus() && ! pose.residue(ii).is_virtual_residue() )
76  {
77  Real omega_score,dscore_domega, dscore_dphi, dscore_dpsi ;
78  eval_omega_score_residue(pose.residue(ii),omega_score,dscore_domega, dscore_dphi, dscore_dpsi );
79  pose_energies.onebody_energies( ii )[omega] = omega_score;
80  }
81  }
82 }
83 
84 
85 
86 ///////////////////////////////////////////////////////////////////////////////
87 ///
88 Real
90  AA const res_aa,
91  Real const omega,
92  Real const phi,
93  Real const psi
94 ) const
95 {
96  Real score, dscore_domega, dscore_dphi, dscore_dpsi ;
97  eval_omega_score_residue( res_aa, omega, phi, psi, score, dscore_domega, dscore_dphi, dscore_dpsi );
98  return score;
99 }
100 
101 
102 ///////////////////////////////////////////////////////////////////////////////
103 void
105  conformation::Residue const & rsd,
106  Real & score,
107  Real & dscore_domega,
108  Real & dscore_dphi,
109  Real & dscore_dpsi
110 ) const
111 {
112  using namespace numeric;
113 
114  assert( rsd.is_protein() );
115 
116  Real const phi_angle
117  ( nonnegative_principal_angle_degrees( rsd.mainchain_torsion(1)));
118  Real const psi_angle
119  ( nonnegative_principal_angle_degrees( rsd.mainchain_torsion(2)));
120  Real const omega_angle
121  ( nonnegative_principal_angle_degrees( rsd.mainchain_torsion(3)));
122 
123  if ( rsd.is_upper_terminus() || rsd.is_virtual_residue() ) { // begin or end of chain
124  score = 0.0;
125  dscore_domega = dscore_dphi = dscore_dpsi = 0.0;
126  return;
127  }
128 
129  eval_omega_score_residue( rsd.aa(), omega_angle, phi_angle, psi_angle, score, dscore_domega, dscore_dphi, dscore_dpsi );
130 }
131 
132 
133 ///////////////////////////////////////////////////////////////////////////////
134 ///
135 void
137  AA const aa,
138  Real const omega,
139  Real const phi,
140  Real const psi,
141  Real & score,
142  Real & dscore_domega,
143  Real & dscore_dphi,
144  Real & dscore_dpsi
145 ) const
146 {
147  using basic::subtract_degree_angles;
148 
149  core::Real omega_p = omega;
150  while( omega_p < -90.0 ) omega_p += 360.0;
151  while( omega_p > 270.0 ) omega_p -= 360.0;
152 
153  if ( !use_phipsi_dep_ || omega_p < 90.0 ) { // use standard form for cis omegas
154  // standard form
155  core::Real dangle;
156  core::Real weight = 0.01; // This is 1 in rosetta but divided by the number of residues oddly. we'll just assume N=100 here such
157  // that omega can be calculated on a per residue basis
158 
159  if( omega_p >= 90.0 ){
160  // trans
161  dangle = subtract_degree_angles(omega_p, 180);
162  } else {
163  // cis
164  dangle = subtract_degree_angles(omega_p, 0);
165  }
166 
167  score = weight*dangle*dangle;
168  dscore_domega = weight*2*dangle;
169  dscore_dphi = dscore_dpsi = 0.0; // stdard form is independent of phi and psi
170  } else {
171  // figure our which table to use
172  core::Size table=1;
173  if (aa == core::chemical::aa_gly)
174  table = 2;
175  if (aa == core::chemical::aa_pro)
176  table = 3;
178  table = 4;
179 
180  //fpd note: preproline is not yet implemented as this would have to be a 2b energy term
181 
182  // phi-psi dependent
183  // interpolate phi/psi
184  core::Real mu, sigma, dmu_dphi, dmu_dpsi, dsigma_dphi, dsigma_dpsi;
185 
186  mu = omega_mus_all_splines_[table].F(phi,psi);
187  dmu_dphi = omega_mus_all_splines_[table].dFdx(phi,psi);
188  dmu_dpsi = omega_mus_all_splines_[table].dFdy(phi,psi);
189 
190  sigma = omega_sigmas_all_splines_[table].F(phi,psi);
191  dsigma_dphi = omega_sigmas_all_splines_[table].dFdx(phi,psi);
192  dsigma_dpsi = omega_sigmas_all_splines_[table].dFdy(phi,psi);
193 
194  // energy
195  core::Real normalization = log( 1/ (6* sqrt(2*numeric::constants::f::pi) ) ); // shift scores to match default
196  core::Real entropy = -log( 1/ (sigma* sqrt(2*numeric::constants::f::pi) ) );
197  core::Real offset = subtract_degree_angles(omega_p, mu);
198  core::Real logprob = offset*offset / (2*sigma*sigma);
199  score = normalization + entropy + logprob;
200  //score = logprob;
201 
202  // derivatives
203  dscore_domega = offset / (sigma*sigma);
204 
205  // derivatives w.r.t mu,sigma
206  core::Real dscore_dmu = -dscore_domega;
207  core::Real dscore_dsigma = 1/(sigma) - 2*logprob/sigma;
208 
209  // derivatives w.r.t. phi/psi
210  dscore_dphi = dscore_dmu*dmu_dphi + dscore_dsigma*dsigma_dphi;
211  dscore_dpsi = dscore_dmu*dmu_dpsi + dscore_dsigma*dsigma_dpsi;
212  }
213 }
214 
215 ///
216 /// load bb-dep omega tables
217 void
219  omega_mus_all_.resize(5);
220  omega_sigmas_all_.resize(5);
221  omega_mus_all_splines_.resize(5);
222  omega_sigmas_all_splines_.resize(5);
223 
224  for (int i=1; i<=5; ++i) {
225  utility::io::izstream stream;
226  if (i==1) basic::database::open( stream, "scoring/score_functions/omega/omega_ppdep.all.txt");
227  else if (i==2) basic::database::open( stream, "scoring/score_functions/omega/omega_ppdep.gly.txt");
228  else if (i==3) basic::database::open( stream, "scoring/score_functions/omega/omega_ppdep.pro.txt");
229  else if (i==4) basic::database::open( stream, "scoring/score_functions/omega/omega_ppdep.valile.txt");
230  //else if (i==5) basic::database::open( stream, "scoring/score_functions/omega/omega_ppdep.prepro.txt");
231  else if (i==5) continue; // prepro not yet used
232 
236  }
237 }
238 
239 void
241  ObjexxFCL::FArray2D< Real > & x,
242  numeric::interpolation::spline::BicubicSpline &sx
243 ) {
244  using namespace numeric;
245  using namespace numeric::interpolation::spline;
246 
247  // just interpolate phi/psi
248  MathMatrix< Real > energy_vals( 36, 36 );
249  for ( Size jj = 0; jj < 36; ++jj ) {
250  for ( Size kk = 0; kk < 36; ++kk ) {
251  energy_vals( jj, kk ) = x(jj+1,kk+1);
252  }
253  }
254  BorderFlag periodic_boundary[2] = { e_Periodic, e_Periodic };
255  Real start_vals[2] = {5.0, 5.0}; // grid is shifted by five degrees.
256  Real deltas[2] = {10.0, 10.0}; // grid is 10 degrees wide
257  bool lincont[2] = {false,false}; //meaningless argument for a bicubic spline with periodic boundary conditions
258  std::pair< Real, Real > unused[2];
259  unused[0] = std::make_pair( 0.0, 0.0 );
260  unused[1] = std::make_pair( 0.0, 0.0 );
261  sx.train( periodic_boundary, start_vals, deltas, energy_vals, lincont, unused );
262 }
263 
264 
265 void
267  utility::io::izstream &stream,
268  ObjexxFCL::FArray2D< Real > &mus,
269  ObjexxFCL::FArray2D< Real > &sigmas
270 ) {
271  core::Size i, j;
272  core::Real phi, psi, mu,sig;
273  std::string line;
274 
275  mus.dimension(36,36);
276  sigmas.dimension(36,36);
277 
278  while ( getline( stream, line ) ) {
279  std::istringstream l(line);
280  l >> i >> j >> phi >> psi >> mu >> sig;
281  mus(i+1,j+1) = mu;
282  sigmas(i+1,j+1) = sig;
283  }
284 }
285 
286 
287 }
288 }