Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
MMLJEnergyTable.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/mm/MMLJEnergyTable.cc
11 /// @brief Molecular mechanics lj energy table class
12 /// @author P. Douglas Renfrew (renfrew@unc.edu)
13 
14 // Unit headers
17 
18 // Project headers
20 
21 // AUTO-REMOVED #include <core/scoring/ScoringManager.hh>
22 
23 // AUTO-REMOVED #include <basic/prof.hh>
24 
25 // Utility header
26 // AUTO-REMOVED #include <utility/keys/Key4Tuple.hh>
27 // AUTO-REMOVED #include <utility/keys/Key3Tuple.hh>
28 #include <utility/pointer/access_ptr.hh>
29 #include <utility/pointer/owning_ptr.hh>
30 #include <utility/pointer/ReferenceCount.hh>
31 #include <basic/Tracer.hh>
32 
33 // C++ headers
34 // AUTO-REMOVED #include <iostream>
35 #include <string>
36 #include <map>
37 // AUTO-REMOVED #include <math.h>
38 
40 #include <utility/vector1.hh>
41 #include <cmath>
42 
43 
44 namespace core {
45 namespace scoring {
46 namespace mm {
47 
48 /// @details Auto-generated virtual destructor
50 
51 static basic::Tracer TR("core.scoring.mm.MMLJEnergyTable");
52 
54  max_dist_(49.0),
55  bin_dist_(0.05),
56  bins_per_angstrom_squared_(20),
57  linear_switch_point(0.6) // 60% of distance at minimum
58 {
59  using namespace core;
60  using namespace chemical;
61 
62  // get MMAtomTypeSet associated with the library
64  Size natomtypes( mm_atom_set->n_atomtypes() );
65 
66  TR << "Initializing MM LJ Energy Tables with " << natomtypes << " atom types" << std::endl;
67 
68  // init both table dimentions for all the tables based on the size of the library
69  mm_atom_pair_rep_energy_table_.resize( natomtypes );
70  mm_atom_pair_atr_energy_table_.resize( natomtypes );
71  mm_atom_pair_rep_deriv_table_.resize( natomtypes );
72  mm_atom_pair_atr_deriv_table_.resize( natomtypes );
73  mm_atom_pair_rep_three_bond_energy_table_.resize( natomtypes );
74  mm_atom_pair_atr_three_bond_energy_table_.resize( natomtypes );
75  mm_atom_pair_rep_three_bond_deriv_table_.resize( natomtypes );
76  mm_atom_pair_atr_three_bond_deriv_table_.resize( natomtypes );
77 
78  for ( Size i = 1; i <= natomtypes; ++i ) {
79  mm_atom_pair_rep_energy_table_[i].resize( natomtypes, NULL );
80  mm_atom_pair_atr_energy_table_[i].resize( natomtypes, NULL );
81  mm_atom_pair_rep_deriv_table_[i].resize( natomtypes, NULL );
82  mm_atom_pair_atr_deriv_table_[i].resize( natomtypes, NULL );
83  mm_atom_pair_rep_three_bond_energy_table_[i].resize( natomtypes, NULL );
84  mm_atom_pair_atr_three_bond_energy_table_[i].resize( natomtypes, NULL );
85  mm_atom_pair_rep_three_bond_deriv_table_[i].resize( natomtypes, NULL );
86  mm_atom_pair_atr_three_bond_deriv_table_[i].resize( natomtypes, NULL );
87  }
88 
89  // create MM atom pair energy tables for greater than three bonds
90  TR << "Precomputing >=4 bond energy values" << std::endl;
91  for ( Size i = 1; i <= natomtypes; ++i ) {
92  for ( Size j = 1; j <= natomtypes; ++j ) {
93  // if the energy vector at position i,j is not defined check to see if the one at j,i is
94  // since they shouold be the same. If the energy vector at j,i is not defined, create it at i,j
95  if ( mm_atom_pair_rep_energy_table_[i][j] == NULL ) {
96  if( mm_atom_pair_rep_energy_table_[j][i] == NULL ) {
97  // create the vector
102 
103  // get the distance and energy for when the function is a minimum
104  Real min_ener_dist( mm_lj_score_.min_dist( i, j, 4 ) );
105  Real min_ener( mm_lj_score_.score( i, j, 4, min_ener_dist ) );
106 
107  // get values for linear switching at short distances
108  Real switch_dist( linear_switch_point * min_ener_dist );
109  Real switch_dist_squared( switch_dist * switch_dist );
110  Real switch_slope( mm_lj_score_.deriv_score( i, j, 4, switch_dist ) );
111  Real switch_ener( mm_lj_score_.score( i, j, 4, switch_dist ) );
112  Real switch_intercept( -1 * switch_dist * switch_slope + switch_ener );
113 
114  // now the rest, starting from mm_lj_table_bin_dist_ distance
115  Real prev_score( switch_intercept );
116  for ( Real k = 0; k <= max_dist_; k += bin_dist_ ) {
117  Real temp_score(0), temp_deriv(0);
118  if( k <= switch_dist_squared ){ // in switch region
119  temp_score = switch_slope * sqrt(k) + switch_intercept;
120  temp_deriv = switch_slope;
121  } else { // not in switch region
122  temp_score = mm_lj_score_.score( i, j, 4, sqrt(k) );
123  temp_deriv = mm_lj_score_.deriv_score( i, j, 4, sqrt(k) );
124  }
125  if ( temp_score <= prev_score ) { // repulcive
126  mm_atom_pair_rep_energy_table_[i][j]->push_back( temp_score - min_ener );
127  mm_atom_pair_atr_energy_table_[i][j]->push_back( min_ener );
128  mm_atom_pair_rep_deriv_table_[i][j]->push_back( temp_deriv );
129  mm_atom_pair_atr_deriv_table_[i][j]->push_back( 0 );
130  } else { // atractive
131  mm_atom_pair_rep_energy_table_[i][j]->push_back( 0 );
132  mm_atom_pair_atr_energy_table_[i][j]->push_back( temp_score );
133  mm_atom_pair_rep_deriv_table_[i][j]->push_back( 0 );
134  mm_atom_pair_atr_deriv_table_[i][j]->push_back( temp_deriv );
135  }
136  prev_score = temp_score;
137  }
138  } else {
143  }
144  }
145  } // foreach i
146  } // foreach j
147 
148  // create the atom pair three bond energy tables
149  TR << "Precomputing 3 bond energy values" << std::endl;
150  for ( Size i = 1; i <= natomtypes; ++i ) {
151  for ( Size j = 1; j <= natomtypes; ++j ) {
152  // if the energy vector at position i,j is not defined check to see if the one at j,i is
153  // since they shouold be the same. If the energy vector at j,i is not defined, create it at i,j
154  if ( mm_atom_pair_rep_three_bond_energy_table_[i][j] == NULL ) {
155  if( mm_atom_pair_rep_three_bond_energy_table_[j][i] == NULL ) {
156  // create the vector
161 
162  // get the distance and energy for when the function is a minimum
163  Real min_ener_dist( mm_lj_score_.min_dist( i, j, 3 ) );
164  Real min_ener( mm_lj_score_.score( i, j, 3, min_ener_dist ) );
165 
166  // get values for linear switching at short distances
167  Real switch_dist( linear_switch_point * min_ener_dist );
168  Real switch_dist_squared( switch_dist * switch_dist );
169  Real switch_slope( mm_lj_score_.deriv_score( i, j, 3, switch_dist ) );
170  Real switch_ener( mm_lj_score_.score( i, j, 3, switch_dist ) );
171  Real switch_intercept( -1 * switch_dist * switch_slope + switch_ener );
172 
173  // now the rest starting from mm_lj_table_bin_dist_ distance
174  Real prev_score( switch_intercept );
175  for ( Real k = 0; k <= max_dist_; k += bin_dist_ ) {
176  Real temp_score(0), temp_deriv(0);
177  if( k <= switch_dist_squared ){ // in switch region
178  temp_score = switch_slope * sqrt(k) + switch_intercept;
179  temp_deriv = switch_slope;
180  } else {
181  temp_score = mm_lj_score_.score( i, j, 3, sqrt(k) );
182  temp_deriv = mm_lj_score_.deriv_score( i, j, 3, sqrt(k) );
183  }
184  if ( temp_score <= prev_score ) { // repulcive
185  mm_atom_pair_rep_three_bond_energy_table_[i][j]->push_back( temp_score - min_ener );
186  mm_atom_pair_atr_three_bond_energy_table_[i][j]->push_back( min_ener );
187  mm_atom_pair_rep_three_bond_deriv_table_[i][j]->push_back( temp_deriv );
188  mm_atom_pair_atr_three_bond_deriv_table_[i][j]->push_back( 0 );
189  } else { // atractive
190  mm_atom_pair_rep_three_bond_energy_table_[i][j]->push_back( 0 );
191  mm_atom_pair_atr_three_bond_energy_table_[i][j]->push_back( temp_score );
192  mm_atom_pair_rep_three_bond_deriv_table_[i][j]->push_back( 0 );
193  mm_atom_pair_atr_three_bond_deriv_table_[i][j]->push_back( temp_deriv );
194  }
195  prev_score = temp_score;
196  }
197  } else {
202  }
203  }
204  } // foreach i
205  } // foreach j
206 }
207 
208 void
209 MMLJEnergyTable::score( Size atom1, Size atom2, Size & path_distance, Real & squared_distance, Real & rep, Real & atr ) const
210 {
211  // init values
212  rep = atr = 0;
213 
214  if ( squared_distance <= max_dist_ ) {
215 
216  // calc distance bins and frac
217  Real bin( squared_distance * bins_per_angstrom_squared_ );
218  Size l_bin( static_cast< Size >( bin ) + 1 );
219  Size u_bin( l_bin + 1 );
220  Real frac( bin - ( l_bin - 1 ) );
221 
222  // get correct vectors
223  EnergyVector & rep_vec = ( path_distance == 3 ? *mm_atom_pair_rep_three_bond_energy_table_[ atom1][ atom2] : *mm_atom_pair_rep_energy_table_[ atom1][ atom2 ] );
224  EnergyVector & atr_vec = ( path_distance == 3 ? *mm_atom_pair_atr_three_bond_energy_table_[ atom1][ atom2] : *mm_atom_pair_atr_energy_table_[ atom1][ atom2 ] );
225 
226  // linear interpolate between upper and lower bins
227  rep = rep_vec[l_bin] + frac * ( rep_vec[u_bin] - rep_vec[l_bin] );
228  atr = atr_vec[l_bin] + frac * ( atr_vec[u_bin] - atr_vec[l_bin] );
229  }
230 }
231 
232 void
233 MMLJEnergyTable::deriv_score( Size atom1, Size atom2, Size & path_distance, Real & squared_distance, Real & drep, Real & datr ) const
234 {
235  // init values
236  drep = datr = 0;
237 
238  if ( squared_distance <= max_dist_ ) {
239 
240  // calc distance bins and frac
241  Real bin( squared_distance * bins_per_angstrom_squared_ );
242  Size l_bin( static_cast< Size >( bin ) + 1 );
243  Size u_bin( l_bin + 1 );
244  Real frac( bin - ( l_bin - 1 ) );
245 
246  // get correct vectors
247  EnergyVector & drep_vec = ( path_distance == 3 ? *mm_atom_pair_rep_three_bond_deriv_table_[ atom1][ atom2] : *mm_atom_pair_rep_deriv_table_[ atom1][ atom2 ] );
248  EnergyVector & datr_vec = ( path_distance == 3 ? *mm_atom_pair_atr_three_bond_deriv_table_[ atom1][ atom2] : *mm_atom_pair_atr_deriv_table_[ atom1][ atom2 ] );
249 
250  // linear interpolate between upper and lower bins
251  drep = drep_vec[l_bin] + frac * ( drep_vec[u_bin] - drep_vec[l_bin] );
252  datr = datr_vec[l_bin] + frac * ( datr_vec[u_bin] - datr_vec[l_bin] );
253  }
254 }
255 
256 } // namespace mm
257 } // namespace scoring
258 } // namespace core
259 
260 
261 // // DEBUG print stuff
262 // for ( Size i = 1; i <= natomtypes; ++i ) {
263 // for ( Size j = 1; j <= natomtypes; ++j ) {
264 // std::cout << "REP_SCORE " << i << ":" << j << "\t" << mm_atom_pair_rep_energy_table_[i][j] << "\t";
265 // for ( Size k = 1; k <= mm_atom_pair_rep_energy_table_[i][j]->size(); ++k ) {
266 // std::cout << mm_atom_pair_rep_energy_table_[i][j]->at(k) << " ";
267 // }
268 // std::cout << std::endl;
269 // }
270 // }
271 
272 // for ( Size i = 1; i <= natomtypes; ++i ) {
273 // for ( Size j = 1; j <= natomtypes; ++j ) {
274 // std::cout << "ATR_SCORE " << i << ":" << j << "\t" << mm_atom_pair_atr_energy_table_[i][j] << "\t";
275 // for ( Size k = 1; k <= mm_atom_pair_atr_energy_table_[i][j]->size(); ++k ) {
276 // std::cout << mm_atom_pair_atr_energy_table_[i][j]->at(k) << " ";
277 // }
278 // std::cout << std::endl;
279 // }
280 // }
281 
282 // for ( Size i = 1; i <= natomtypes; ++i ) {
283 // for ( Size j = 1; j <= natomtypes; ++j ) {
284 // std::cout << "REP_DERIV " << i << ":" << j << "\t" << mm_atom_pair_rep_deriv_table_[i][j] << "\t";
285 // for ( Size k = 1; k <= mm_atom_pair_rep_deriv_table_[i][j]->size(); ++k ) {
286 // std::cout << mm_atom_pair_rep_deriv_table_[i][j]->at(k) << " ";
287 // }
288 // std::cout << std::endl;
289 // }
290 // }
291 
292 // for ( Size i = 1; i <= natomtypes; ++i ) {
293 // for ( Size j = 1; j <= natomtypes; ++j ) {
294 // std::cout << "ATR_DERIV " << i << ":" << j << "\t" << mm_atom_pair_atr_deriv_table_[i][j] << "\t";
295 // for ( Size k = 1; k <= mm_atom_pair_atr_deriv_table_[i][j]->size(); ++k ) {
296 // std::cout << mm_atom_pair_atr_deriv_table_[i][j]->at(k) << " ";
297 // }
298 // std::cout << std::endl;
299 // }
300 // }
301 
302 // EnergyVector* rep_vec;
303 // EnergyVector* atr_vec;
304 
305 // if( path_distance == 3 ) {
306 // rep_vec = mm_atom_pair_rep_three_bond_energy_table_[atom1][atom2];
307 // atr_vec = mm_atom_pair_atr_three_bond_energy_table_[atom1][atom2];
308 // } else {
309 // rep_vec = mm_atom_pair_rep_energy_table_[atom1][atom2];
310 // atr_vec = mm_atom_pair_atr_energy_table_[atom1][atom2];
311 // }
312 
313 // rep = rep_vec->at(l_bin) + frac * ( rep_vec->at(u_bin) - rep_vec->at(l_bin) );
314 // atr = atr_vec->at(l_bin) + frac * ( atr_vec->at(u_bin) - atr_vec->at(l_bin) );
315 
316 // EnergyVector* drep_vec;
317 // EnergyVector* datr_vec;
318 
319 // if( path_distance == 3 ) {
320 // drep_vec = mm_atom_pair_rep_three_bond_deriv_table_[atom1][atom2];
321 // datr_vec = mm_atom_pair_atr_three_bond_deriv_table_[atom1][atom2];
322 // } else {
323 // drep_vec = mm_atom_pair_rep_deriv_table_[atom1][atom2];
324 // datr_vec = mm_atom_pair_atr_deriv_table_[atom1][atom2];
325 // }
326 
327 // drep = drep_vec->at(l_bin) + frac * ( drep_vec->at(u_bin) - drep_vec->at(l_bin) );
328 // datr = datr_vec->at(l_bin) + frac * ( datr_vec->at(u_bin) - datr_vec->at(l_bin) );
329