Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
compute_holes_score.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/packing/compute_holes_score.cc
11 /// @brief Packing Score
12 /// @author Will Sheffler
13 
14 #include <basic/options/keys/holes.OptionKeys.gen.hh>
15 #include <basic/options/option.hh>
16 #include <core/pose/Pose.hh>
17 #include <core/pose/util.hh> // REQUIRED FOR WINDOWS
18 // AUTO-REMOVED #include <core/scoring/EnergyGraph.hh>
20 // AUTO-REMOVED #include <core/scoring/packing/HolesEnergy.hh>
22 //#include <core/scoring/ScoringManager.hh>
23 // AUTO-REMOVED #include <basic/prof.hh>
24 #include <basic/database/open.hh>
25 #include <iomanip>
26 #include <iostream>
27 #include <numeric/numeric.functions.hh>
28 // AUTO-REMOVED #include <numeric/xyz.functions.hh>
29 #include <numeric/xyzMatrix.hh>
30 #include <numeric/xyzVector.hh>
31 #include <utility/exit.hh>
32 #include <utility/vector1.hh>
33 #include <basic/Tracer.hh>
34 // AUTO-REMOVED #include <utility/io/ozstream.hh>
35 
36 // AUTO-REMOVED #include <stdlib.h>
37 
38 #ifndef WIN32
39 #ifndef __native_client__
40 #include <pstream.h>
41 
42 //Auto Headers
43 #include <core/pose/util.tmpl.hh>
44 #include <boost/math/special_functions/fpclassify.hpp>
45 
46 
47 #endif
48 #endif
49 
50 static basic::Tracer TR("core.scoring.packing.compute_holes_score");
51 
52 namespace core {
53 namespace scoring {
54 namespace packing {
55 
56 /// @details Auto-generated virtual destructor
58 
59 
61 
62 #ifndef WIN32
63 #ifndef __native_client__
64 
65  using namespace std;
66  using namespace basic::options;
67 
68  for(Size tries = 1; tries <= 10; ++tries) {
69  TR << "compute_holes_surfs try: " << tries << std::endl;
70  pb.reset_surf();
71 
72  std::string cmd = basic::options::option[ OptionKeys::holes::dalphaball ]();
73  //utility::io::ozstream pout("test.dab");
74  redi::pstream proc( cmd + " alpha20_surf" );
75  proc << "NPOINTS" << endl << pb.nballs() << endl << "COORDS" << endl;
76  //pout << "NPOINTS" << endl << pb.nballs() << endl << "COORDS" << endl;
77  for( Size i = 1; i <= pb.nballs(); i++ ) {
78  Ball const & b(pb.ball(i));
79  proc << b.x() << " " << b.y() << " " << b.z() << " " << b.r() << " " << endl;
80  //pout << b.x() << " " << b.y() << " " << b.z() << " " << b.r() << " " << endl;
81  }
82  proc << "END" << endl << redi::peof;
83  //pout << "END" << endl << redi::peof;
84 
85  bool fail = false;
86  for( Size a = 1; a <= 20; a++ ) {
87  for( Size i = 1; i <= pb.nballs(); i++ ) {
88  Size index,ialpha;
89  std::string val;
90  proc >> ialpha >> index >> val;
91  Real rval = atof(val.c_str());
92  if(boost::math::isnan(rval)) rval = 0.0;
93  //TR << "DAlphaBall output index " << ialpha << " " << a << " " << index << " " << i << std::endl;
94  if( i != index || a != ialpha ) {
95  TR << "DAlphaBall output index mismatch " << ialpha << " " << a << " " << index << " " << i << std::endl;
96  fail = true;
97  break;
98  }
99  pb.set_surf(i,a,rval);
100  }
101  if(fail) break;
102  }
103 
104  if(!fail) {
105  TR << "compute_holes_surfs completed successfully" << std::endl;
106  return;
107  }
108  // utility_exit_with_message("dab test");
109  }
110  std::cerr << "Too many compute_holes_surfs failures" << std::endl;
111  std::exit(-1);
112 
113 #endif
114 #endif
115 
116 }
117 
118 
119 HolesResult
121  pose::Pose const & pose,
122  PoseBalls & pb,
123  HolesParams const & resl_params,
124  HolesParams const & dec_params,
125  HolesParams const & dec15_params,
126  bool use_cached_surfs,
127  std::string cmd
128 )
129 {
130  if( cmd == "" ) {
131  cmd = basic::options::option[ basic::options::OptionKeys::holes::dalphaball ]();
132  }
133 
134  HolesResult result;
135  if(!use_cached_surfs) compute_holes_surfs(pb,cmd);
136 
138  for( Size i = 1; i <= pb.nballs(); ++i ) {
139  Real resl_score = 0.0, dec_score = 0.0, dec15_score = 0.0;
140  Size at = pb.atom_type(i);
141  char ss = pb.secstruct(i);
142  for( Size a = 1; a <= 20; ++a ) {
143  resl_score += resl_params .sa_weight(at,ss,a) * pb.surf(i,a);// now in weights / 12.56637;
144  dec_score += dec_params .sa_weight(at,ss,a) * pb.surf(i,a);// now in weights / 12.56637;
145  dec15_score += dec15_params .sa_weight(at,ss,a) * pb.surf(i,a);// now in weights / 12.56637;
146  }
147  resl_score += resl_params.nb_weight(at,ss) * pb.smooth_nb(i);// now in weights / 150.0;
148  dec_score += dec_params .nb_weight(at,ss) * pb.smooth_nb(i);// now in weights / 150.0;
149  dec15_score += dec15_params .nb_weight(at,ss) * pb.smooth_nb(i);// now in weights / 150.0;
150  resl_score -= resl_params.intercept(at,ss) + resl_params.intercept();
151  dec_score -= dec_params .intercept(at,ss) + dec_params .intercept();
152  dec15_score -= dec15_params .intercept(at,ss) + dec15_params .intercept();
153  result.resl_score += resl_score;
154  result.decoy_score += dec_score;
155  result.dec15_score += dec15_score;
156  Real tmp = 1.0 - (1.0 / (1.0 + exp( 3.768941 * dec_score - 0.5842765 ) ));
157  result.atom_scores.set( pb.index_to_id(i), resl_score + 3*tmp );
158  }
159  result.resl_score /= pb.nballs();
160  result.decoy_score /= pb.nballs();
161  result.dec15_score /= pb.nballs();
162  result.natom = pb.nballs();
163 
164  result.score = 1.0 - (1.0 / (1.0 + exp( 3.768941 * result.decoy_score - 0.5842765 ) ));
165  result.score = result.resl_score + 3*result.score;
166 
167  TR << "compute_rosettaholes_score done: " << result.score << std::endl;
168 
169  return result;
170 }
171 
172 Real
174  pose::Pose const & pose
175 )
176 {
177  std::string cmd = basic::options::option[ basic::options::OptionKeys::holes::dalphaball ]();
178 
179  HolesParams dec15_params;
180  dec15_params.read_data_file(basic::database::full_name("scoring/rosettaholes/decoy15.params"));
181  PoseBalls pb(pose);
182 
183  Real dec15_score = 0.0;
184  compute_holes_surfs(pb,cmd);
185 
186  for( Size i = 1; i <= pb.nballs(); ++i ) {
187  Size at = pb.atom_type(i);
188  char ss = pb.secstruct(i);
189  for( Size a = 1; a <= 20; ++a ) {
190  dec15_score += dec15_params .sa_weight(at,ss,a) * pb.surf(i,a);// now in weights / 12.56637;
191  }
192  dec15_score += dec15_params .nb_weight(at,ss) * pb.smooth_nb(i);// now in weights / 150.0;
193  dec15_score -= dec15_params .intercept(at,ss) + dec15_params .intercept();
194  }
195  dec15_score /= pb.nballs();
196 
197  TR << "compute_dec15_score done: " << dec15_score << std::endl;
198 
199  return dec15_score;
200 }
201 
202 
203 HolesResult
205  pose::Pose const & pose,
206  PoseBalls & pb,
207  HolesParams const & params,
208  bool use_cached_surfs,
209  std::string cmd
210 ) {
211 
212  if( cmd == "" ) {
213  cmd = basic::options::option[ basic::options::OptionKeys::holes::dalphaball ]();
214  }
215 
216  HolesResult result;
217  if( !use_cached_surfs ) compute_holes_surfs(pb,cmd);
218 
220  for( Size i = 1; i <= pb.nballs(); ++i ) {
221  Size at = pb.atom_type(i);
222  char ss = pb.secstruct(i);
223  Real tmp = 0.0;
224  for( Size a = 1; a <= 20; ++a ) {
225  tmp += params.sa_weight(at,ss,a) * pb.surf(i,a);// now in weights / 12.56637;
226  }
227  tmp += params.nb_weight(at,ss) * pb.smooth_nb(i);// now in weights / 150.0;
228  tmp -= params.intercept(at,ss) + params.intercept();
229  result.score += tmp;
230  result.atom_scores.set( pb.index_to_id(i), tmp );
231  }
232  // result.score /= pb.nballs();
233  TR << "compute_holes_score done: " << result.score << std::endl;
234  return result;
235 }
236 
237 inline core::Real sqr( core::Real x ) {
238  return x*x;
239 }
240 
241 // smoothed neighbor is between 9 and 11 A
243  if( sqdist >= 121.0 ) {
244  return 0.0;
245  } else if( sqdist <= 81.0 ) {
246  return 1.0;
247  } else {
248  Real dist = sqrt( sqdist );
249  return sqr(1.0 - sqr( (dist - 9.0) / (11.0 - 9.0) ) );
250  }
251 }
252 
253 // smoothed neighbor is between 9 and 11 A
255  if( sqdist >= 121.0 ) {
256  return 0.0;
257  } else if( sqdist <= 81.0 ) {
258  return 0.0;
259  } else {
260  Real dist = sqrt( sqdist );
261  Real x = (dist - 9.0)/ (11.0 - 9.0);
262  return -2*x * 2*(1-x*x) / (11.0 - 9.0);
263  }
264 }
265 
267  PoseBalls & pb,
268  HolesParams const & params,
270 ) {
271  using namespace numeric;
272  Real tot_snb = 0.0;
273  for( core::Size i = 1; i <= pb.nballs(); i++ ) {
274  if( !pb.is_heavy(i) ) continue;
275  deriv.set(pb.index_to_id(i),deriv.get(pb.index_to_id(i)));
276  xyzVector<Real> & ixyz( pb.ball(i).xyz() );
277  Size at1 = pb.atom_type(i);
278  char ss1 = pb.secstruct(i);
279  tot_snb += params.nb_weight(at1,ss1);
280  for( core::Size j = 1; j < i; j++ ) {
281  if( !pb.is_heavy(j) ) continue;
282  xyzVector<Real> & jxyz( pb.ball(j).xyz() );
283  Real d2( ixyz.distance_squared(jxyz) );
284  if( d2 < 121.0 ) {
285  Real sn = sigmoidish_neighbor(d2);
287  Size at2 = pb.atom_type(j);
288  char ss2 = pb.secstruct(j);
289  xyzVector<core::Real> dxyz = ixyz-jxyz;
290  dxyz.normalize();
291  Real w = 0.0;
292  if( params.have_params(at1,ss1) ) w += params.nb_weight(at1,ss1);
293  if( params.have_params(at2,ss2) ) w += params.nb_weight(at2,ss2);
294  tot_snb += sn * w;
295  if( d2 > 81 ) {
296  // // TODO: sheffler why 4*?
297  deriv[pb.index_to_id(i)] += dxyz*dsn*w;
298  deriv[pb.index_to_id(j)] -= dxyz*dsn*w;
299  }
300  }
301  }
302  }
303  return tot_snb;
304 }
305 
306 
307 HolesResult
309  pose::Pose const & /*pose*/,
310  PoseBalls & pb,
311  HolesParams const & params,
313 ) {
314 
315 
316  HolesResult result;
317 
318 #ifndef WIN32
319 #ifndef __native_client__
320  using namespace std;
321  using namespace basic::options;
322 
323  for(Size tries = 1; tries <= 10; ++tries) {
324  TR << "compute_holes_deriv try:" << tries << std::endl;
325  deriv.clear(numeric::xyzVector<Real>(0.0,0.0,0.0));
326  /*Real orig_tot_snb = */compute_smooth_nb_deriv( pb, params, deriv );
327 
328  // TESTING SMOOTH NB DERIV
329  // Real test_snb = 0.0;
330  // for( Size i = 1; i <= pb.nballs(); i++ ) {
331  // Size at = pb.atom_type(i);
332  // char ss = pb.secstruct(i);
333  // // std::cerr << "test " << pb.smooth_nb(i) << " " << params.nb_weight(at,ss) << std::endl;
334  // test_snb = test_snb + pb.smooth_nb(i) * params.nb_weight(at,ss);
335  // }
336  // std::cerr << "snb: " << test_snb << " " << orig_tot_snb << std::endl;
337  //
338  // Real DELTA = 0.0001;
339  // for( Size i = 1; i < pb.nballs(); i++ ) {
340  // pb.ball(i).x() += DELTA;
341  // core::id::AtomID_Map< numeric::xyzVector<core::Real> > dummy;
342  // Real tot_snb = compute_smooth_nb_deriv( pb, params, dummy );
343  // pb.ball(i).x() -= DELTA;
344  // std::cerr << "dsnb " << (tot_snb-orig_tot_snb)/DELTA << " " << deriv[pb.index_to_id(i)].x() << std::endl;
345  // }
346 
347  std::string cmd = basic::options::option[ OptionKeys::holes::dalphaball ]();
348  redi::pstream proc( cmd + " alpha20_deriv_surf" );
349  proc << "NPOINTS" << endl << pb.nballs() << endl << "COORDS" << endl;
350  for( Size i = 1; i <= pb.nballs(); i++ ) {
351  Ball const & b(pb.ball(i));
352  proc << b.x() << " " << b.y() << " " << b.z() << " " << b.r() << " " << endl;
353  }
354  proc << "WEIGHTS" << endl;
355  for( Size i = 1; i <= pb.nballs(); i++ ) {
356  Size at = pb.atom_type(i);
357  char ss = pb.secstruct(i);
358  if( params.have_params(at,ss) ) {
359  for( Size j = 1; j <=20; ++j ) {
360  proc << params.sa_weight(at,ss,j) << " ";
361  }
362  proc << endl;
363  } else {
364  proc << "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0" << endl;
365  }
366  }
367  proc << "END" << endl << redi::peof;
368 
369  bool fail = false;
370  result.score = 0.0;
371  for( Size i = 1; i <= pb.nballs(); i++ ) {
372  Size index;
373  Real val,dx,dy,dz;
374  proc >> index >> val >> dx >> dy >> dz;
375  if( i != index ) {
376  TR << "compute_holes_deriv DAlphaBall output index mismatch " << i << " " << index << std::endl;
377  fail = true;
378  break;
379  }
380  Size at = pb.atom_type(i);
381  char ss = pb.secstruct(i);
382  if( params.have_params(at,ss) ) {
383  val += params.nb_weight(at,ss) * pb.smooth_nb(i);
384  val -= params.intercept(at,ss) + params.intercept();
385  } else if ( abs(val) > 9e-6 ) {
386  TR << "no holes params but dalphaball score for atom is not 0!!!! " << val << std::endl;
387  }
388  result.score += val;
389  result.atom_scores.set( pb.index_to_id(i), val );
390  deriv[pb.index_to_id(i)] += numeric::xyzVector<core::Real>(dx,dy,dz);
391  }
392  if(!fail) {
393  TR << "compute_holes_deriv done: " << result.score << std::endl;
394  return result;
395  }
396  // result.score /= pb.nballs();
397 
398  // test that score from alpha20 and alpha20_deriv match
399  // HolesResult result2 = compute_holes_score(pb,pose,params);
400  // TR << "result1: " << result.score << " result2: " << result2.score << std::endl;
401  // for( Size i = 1; i <= pose.total_residue(); ++i ) {
402  // TR << i << " " << result2.atom_scores[core::id::AtomID(1,i)] << " " << result.atom_scores[core::id::AtomID(1,i)] << std::endl;
403  // }
404 
405  // pb.compute_smooth_nb();
406  // Real base = compute_holes_score(pose,pb,params).score;
407  // Real delta = 0.0001;
408  // for( Size i = 1; i <= 10; ++i ) {
409  // pb.ball(i).x() += delta;
410  // pb.compute_smooth_nb();
411  // Real delta_x = (compute_holes_score(pose,pb,params).score - base) / delta;
412  // pb.ball(i).x() -= delta;
413  // pb.ball(i).y() += delta;
414  // pb.compute_smooth_nb();
415  // Real delta_y = (compute_holes_score(pose,pb,params).score - base) / delta;
416  // pb.ball(i).y() -= delta;
417  // pb.ball(i).z() += delta;
418  // pb.compute_smooth_nb();
419  // Real delta_z = (compute_holes_score(pose,pb,params).score - base) / delta;
420  // pb.ball(i).z() -= delta;
421  //
422  // std::cerr << params.intercept()
423  // << " " << deriv[pb.index_to_id(i)].x() << " " << delta_x << " "
424  // << " " << deriv[pb.index_to_id(i)].y() << " " << delta_y << " "
425  // << " " << deriv[pb.index_to_id(i)].z() << " " << delta_z << endl;
426  // }
427  }
428  std::cerr << "too many dalphaball deriv fails!" << std::endl;
429  std::exit(-1);
430 
431 #endif
432 #endif
433 
434  return result;
435 
436 }
437 
438 
439 HolesResult
441  pose::Pose const & pose,
442  PoseBalls & pb
443 ) {
444  HolesParams hp_resl, hp_dec, hp_dec15;
445  hp_resl .read_data_file(basic::database::full_name("scoring/rosettaholes/resl.params"));
446  hp_dec .read_data_file(basic::database::full_name("scoring/rosettaholes/decoy25.params"));
447  hp_dec15.read_data_file(basic::database::full_name("scoring/rosettaholes/decoy15.params"));
448  return compute_rosettaholes_score(pose,pb,hp_resl,hp_dec,hp_dec15);
449 }
450 
451 
452 HolesResult
454  pose::Pose const & pose,
455  HolesParams const & params,
457 ) {
458  PoseBalls pb(pose);
459  return compute_holes_deriv( pose, pb, params, deriv );
460 }
461 
462 HolesResult
464  pose::Pose const & pose,
465  HolesParams const & resl_params,
466  HolesParams const & dec_params,
467  HolesParams const & dec15_params
468 ) {
469  PoseBalls pb(pose);
470  return compute_rosettaholes_score( pose, pb, resl_params, dec_params, dec15_params );
471 }
472 
473 HolesResult
475  pose::Pose const & pose
476 ) {
477  PoseBalls pb(pose);
478  return compute_rosettaholes_score( pose, pb );
479 }
480 
481 HolesResult
483  pose::Pose const & pose,
484  HolesParams const & params
485 ) {
486  PoseBalls pb(pose);
487  return compute_holes_score(pose,pb,params);
488 }
489 
490 HolesResult
491 compute_holes_score( pose::Pose const & pose, std::string const & cmd )
492 {
493  PoseBalls pb(pose);
494  HolesParams hp_resl, hp_dec, hp_dec15;
495  hp_resl .read_data_file(basic::database::full_name("scoring/rosettaholes/resl.params"));
496  hp_dec .read_data_file(basic::database::full_name("scoring/rosettaholes/decoy25.params"));
497  hp_dec15.read_data_file(basic::database::full_name("scoring/rosettaholes/decoy15.params"));
498  bool use_cached_surfs( false );
499  return compute_rosettaholes_score( pose, pb, hp_resl, hp_dec, hp_dec15, use_cached_surfs, cmd );
500 }
501 
502 
503 } // packing
504 } // scoring
505 } // core