Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
OrbitalsLookup.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 
11 
12 
13 //#include <core/scoring/rna/RNA_Util.hh>
14 
15 #include <utility/vector1.hh>
16 #include <numeric/interpolation/spline/Bicubic_spline.hh>
17 #include <numeric/interpolation/spline/Cubic_spline.hh>
18 #include <numeric/MathVector_operations.hh>
19 #include <iostream>
20 #include <fstream>
21 #include <sstream>
22 #include <utility/io/izstream.hh>
24 #include <basic/database/open.hh>
25 #include <map>
26 
27 #include <utility/exit.hh>
28 #include <utility/string_util.hh>
30 
31 #include <basic/options/keys/OptionKeys.hh>
32 #include <basic/options/keys/in.OptionKeys.gen.hh>
33 #include <basic/options/option.hh>
35 
36 
37 namespace core{
38 namespace scoring{
39 namespace orbitals{
40 
41 //this function reads in the potentials from database. The potentials are already in the form of Energy.
43  utility::vector1< std::string > const & DHO_energies,
44  utility::vector1< std::string > const & AOH_energies,
45  utility::vector1< std::string > const & AOD_orb_orb_energies,
46  utility::vector1< std::string > const & DOA_orb_orb_energies,
47  utility::vector1< std::string > const & ACO_AOH_orb_Hpol_energies
48 ) :
49  number_stats_(6),
50  number_elements_(600)
51 {
52 
53  if(basic::options::option[ basic::options::OptionKeys::in::add_orbitals] != true ){
54  utility_exit_with_message( "Trying to run orbitals score without orbitals! Pass the flag -add_orbitals!" );
55  }
56 
57 
58  std::map<core::Size, std::pair<core::Size, core::Size> > DHO_Hpol_scOrbscH_map;
59  utility::vector1< utility::vector1< core::Real > > DHO_Hpol_scOrbH_vector = parse_files(DHO_energies[1], DHO_Hpol_scOrbscH_map);
60  std::map<core::Size, std::pair<core::Size, core::Size> > DHO_bbOrbscH_map;
61  utility::vector1< utility::vector1< core::Real > > DHO_Hpol_bbOrbH_vector = parse_files(DHO_energies[2], DHO_bbOrbscH_map);
62  std::map<core::Size, std::pair<core::Size, core::Size> > DHO_HARO_scOrbscH_map;
63  utility::vector1< utility::vector1< core::Real > > DHO_Haro_scOrbH_vector = parse_files(DHO_energies[3], DHO_HARO_scOrbscH_map);
64 
65  //initial construction of a vector of MathMatrix. We will be pushing back matrixes into this
66  utility::vector1< numeric::MathMatrix<core::Real> > DHO_Hpol_scOrbH_vector_matrix;
67  utility::vector1< numeric::MathMatrix<core::Real> > DHO_Hpol_bbOrbH_vector_matrix;
68  utility::vector1< numeric::MathMatrix<core::Real> > DHO_Haro_scOrbH_vector_matrix;
69 
70  for( core::Size count=1; count <= static_cast< core::Size > (number_stats_); ++count ) {
71  //MathMatrix requires an array, not a vector. To get an array from a vector, we can use the & vector[1]. See wikipedia!
72  numeric::MathMatrix<core::Real> Hpol_scOrbH_matrix(DHO_Hpol_scOrbscH_map[count].second, DHO_Hpol_scOrbscH_map[count].first, & DHO_Hpol_scOrbH_vector[count][1] );
73  //std::cout << "second " << DHO_scOrbscH_map[count].second << "first " << DHO_scOrbscH_map[count].first << std::endl;
74  numeric::MathMatrix<core::Real> Hpol_bbOrbH_matrix(DHO_bbOrbscH_map[count].second, DHO_bbOrbscH_map[count].first, & DHO_Hpol_bbOrbH_vector[count][1] );
75  numeric::MathMatrix<core::Real> Haro_scOrbH_matrix(DHO_HARO_scOrbscH_map[count].second, DHO_HARO_scOrbscH_map[count].first, & DHO_Haro_scOrbH_vector[count][1]);
76 
77  DHO_Hpol_scOrbH_vector_matrix.push_back(Hpol_scOrbH_matrix);
78  DHO_Hpol_bbOrbH_vector_matrix.push_back(Hpol_bbOrbH_matrix);
79  DHO_Haro_scOrbH_vector_matrix.push_back(Haro_scOrbH_matrix);
80 
81  }
82 
83 
84 
85  //the spline will behave as a natural spline. This is controlled through an enum and put into an array. Using the natural spline
86  //allows for the border conditions to actuallay be met, unlike derivatives, where border conditions are never met
87  numeric::interpolation::spline::BorderFlag behavior[2] = {
88  numeric::interpolation::spline::e_Natural,
89  numeric::interpolation::spline::e_Natural };
90 
91  core::Real const start[2] = {0.00, -1.0}; //starting position of values in the matrix.0
92  core::Real const delta[2] = {0.1, 0.05 }; //change in values. Needed to increment the values
93  bool const linear_cont[2] = {false, false }; //if outside of range continue linearly
94 
95  //what is the characteristic of the spline at 0 values. Should be smoothed out at edges. Powerful if used with e_FristDer
96  std::pair< core::Real, core::Real > const first_deriv[2] = {
97  std::pair< core::Real, core::Real >(0.0,0.0),
98  std::pair< core::Real, core::Real >(0.0,0.0) };
99 
100 
101  numeric::interpolation::spline::BicubicSpline bicubic_spline;// apl -- fixing memory leak = new numeric::interpolation::spline::BicubicSpline;
105 
106  for(core::Size count=1; count <= static_cast< core::Size > (number_stats_); ++count){
107  bicubic_spline.train(behavior, start, delta, DHO_Hpol_scOrbH_vector_matrix[count], linear_cont, first_deriv);
108  DHO_Hpol_scOrbH_vector_spline.push_back( bicubic_spline );
109 
110  bicubic_spline.train(behavior, start, delta, DHO_Hpol_bbOrbH_vector_matrix[count], linear_cont, first_deriv);
111  DHO_Hpol_bbOrbH_vector_spline.push_back( bicubic_spline );
112 
113  bicubic_spline.train(behavior, start, delta, DHO_Haro_scOrbH_vector_matrix[count], linear_cont, first_deriv);
114  DHO_Haro_scOrbH_vector_spline.push_back( bicubic_spline );
115 
116  }
117 
118  //store all splines in a private member look up table. This allows for looking up the values in the actual score and provides an
119  //interface for the OrbitalsScore class.
120  for(core::Size count=1; count <= static_cast< core::Size > (number_stats_); ++count){
121  DHO_Hpol_scOrbH_splines_.push_back(DHO_Hpol_scOrbH_vector_spline[count]);
122  DHO_Hpol_bbOrbH_splines_.push_back(DHO_Hpol_bbOrbH_vector_spline[count]);
123  DHO_Haro_scOrbH_splines_.push_back(DHO_Haro_scOrbH_vector_spline[count]);
124  }
125 
126 
127  //some verbose checking. Not needed
128 /*
129  for(core::Real i=0.00; i <= 3; i+=0.1){
130  core::Size number=0;
131  for(core::Real j=-1.0; j<=0; j+=0.05){
132  ++number;
133  if( number == 20){
134  std::cout << DHO_Hpol_scOrbH_vector_spline[1].F((numeric::MakeVector(i,j))) << std::endl;
135 
136  }else{
137  std::cout << DHO_Hpol_scOrbH_vector_spline[1].F((numeric::MakeVector(i,j))) << " ";
138  //std::cout << i << " " << j << std::endl;
139  }
140  }
141  }
142  std::cout << "###################################################################################\n#####################3" << std::endl;
143 */
144 
145 
146 
147 
148 
149 /*
150 
151  for(core::Real i=0.00; i <= 30; i+=0.1){
152  core::Size number=0;
153  for(core::Real j=-1.0; j<=0; j+=0.05){
154  ++number;
155  if( number == 20){
156  std::cout << i << ", " << j << std::endl;
157 
158  }else{
159  std::cout << i << ", " << j << " ";
160  //std::cout << i << " " << j << std::endl;
161  }
162  }
163  }
164 */
165 
166 
167 
168 //std::cout << "###################################################################################\n#####################3" << std::endl;
169 
170 
171  std::map<core::Size, std::pair<core::Size, core::Size> > AOH_Hpol_scOrbscH_map;
172  utility::vector1< utility::vector1< core::Real > > AOH_Hpol_scOrbH_vector = parse_files(AOH_energies[1], AOH_Hpol_scOrbscH_map);
173  std::map<core::Size, std::pair<core::Size, core::Size> > AOH_bbOrbscH_map;
174  utility::vector1< utility::vector1< core::Real > > AOH_Hpol_bbOrbH_vector = parse_files(AOH_energies[2], AOH_bbOrbscH_map);
175  std::map<core::Size, std::pair<core::Size, core::Size> > AOH_HARO_scOrbscH_map;
176  utility::vector1< utility::vector1< core::Real > > AOH_Haro_scOrbH_vector = parse_files(AOH_energies[3], AOH_HARO_scOrbscH_map);
177 
178 
179 
180 
181  //initial construction of a vector of MathMatrix. We will be pushing back matrixes into this
182  utility::vector1< numeric::MathMatrix<core::Real> > AOH_Hpol_scOrbH_vector_matrix;
183  utility::vector1< numeric::MathMatrix<core::Real> > AOH_Hpol_bbOrbH_vector_matrix;
184  utility::vector1< numeric::MathMatrix<core::Real> > AOH_Haro_scOrbH_vector_matrix;
185 
186  for( core::Size count=1; count <= static_cast< core::Size > (number_stats_); ++count ) {
187  //MathMatrix requires an array, not a vector. To get an array from a vector, we can use the & vector[1]. See wikipedia!
188  numeric::MathMatrix<core::Real> Hpol_scOrbH_matrix(AOH_Hpol_scOrbscH_map[count].second, AOH_Hpol_scOrbscH_map[count].first, & AOH_Hpol_scOrbH_vector[count][1] );
189  numeric::MathMatrix<core::Real> Hpol_bbOrbH_matrix(AOH_bbOrbscH_map[count].second, AOH_bbOrbscH_map[count].first, & AOH_Hpol_bbOrbH_vector[count][1] );
190  numeric::MathMatrix<core::Real> Haro_scOrbH_matrix(AOH_HARO_scOrbscH_map[count].second, AOH_HARO_scOrbscH_map[count].first, & AOH_Haro_scOrbH_vector[count][1]);
191 
192  AOH_Hpol_scOrbH_vector_matrix.push_back(Hpol_scOrbH_matrix);
193  AOH_Hpol_bbOrbH_vector_matrix.push_back(Hpol_bbOrbH_matrix);
194  AOH_Haro_scOrbH_vector_matrix.push_back(Haro_scOrbH_matrix);
195 
196  }
197 
201 
202  for(core::Size count=1; count <= static_cast< core::Size > (number_stats_); ++count){
203  bicubic_spline.train(behavior, start, delta, AOH_Hpol_scOrbH_vector_matrix[count], linear_cont, first_deriv);
204  AOH_Hpol_scOrbH_vector_spline.push_back( bicubic_spline );
205 
206  bicubic_spline.train(behavior, start, delta, AOH_Hpol_bbOrbH_vector_matrix[count], linear_cont, first_deriv);
207  AOH_Hpol_bbOrbH_vector_spline.push_back( bicubic_spline );
208 
209  bicubic_spline.train(behavior, start, delta, AOH_Haro_scOrbH_vector_matrix[count], linear_cont, first_deriv);
210  AOH_Haro_scOrbH_vector_spline.push_back( bicubic_spline );
211 
212  }
213 
214  //store all splines in a private member look up table. This allows for looking up the values in the actual score and provides an
215  //interface for the OrbitalsScore class.
216  for(core::Size count=1; count <= static_cast< core::Size > (number_stats_); ++count){
217  AOH_Hpol_scOrbH_splines_.push_back(AOH_Hpol_scOrbH_vector_spline[count]);
218  AOH_Hpol_bbOrbH_splines_.push_back(AOH_Hpol_bbOrbH_vector_spline[count]);
219  AOH_Haro_scOrbH_splines_.push_back(AOH_Haro_scOrbH_vector_spline[count]);
220  }
221 
222 /*
223 
224 
225  //std::cout << "###################################################################################\n#####################3" << std::endl;
226  for(core::Real i=0.00; i <= 4; i+=0.1){
227  core::Size number=0;
228  for(core::Real j=-1.0; j<=1; j+=0.05){
229  ++number;
230  if( number == 80){
231  std::cout << i << " " << j << ", " << std::endl;
232 
233  }else{
234  std::cout << i << " " << j << ", ";
235  //std::cout << i << " " << j << std::endl;
236  }
237  }
238  }
239 
240  std::cout << "########################################################################################################3" << std::endl;
241 
242  for(core::Real i=0.00; i <= 4; i+=0.1){
243  core::Size number=0;
244  for(core::Real j=-1.0; j<=1; j+=0.05){
245  ++number;
246  if( number == 40){
247  std::cout << AOH_Hpol_scOrbH_splines_[1].F((numeric::MakeVector(i,j))) << "\n" << std::endl;
248  }else{
249  std::cout << AOH_Hpol_scOrbH_splines_[1].F((numeric::MakeVector(i,j))) << " ";
250  //std::cout << i << " " << j << std::endl;
251  }
252  }
253  }
254  std::cout << "########################################################################################################3" << std::endl;
255  std::cout << "########################################################################################################3" << std::endl;
256 
257  std::cout << "table ";
258  core::Size number=0;
259  for(core::Real j=-1.0; j<=1; j+=0.025){
260  ++number;
261  if( number == 80){
262  std::cout << j << std::endl;
263  }else{
264  std::cout << j << " ";
265  }
266  }
267  for(core::Real i=0.00; i <= 4; i+=0.05){
268  core::Size number=0;
269  std::cout << i << " ";
270  for(core::Real j=-1.0; j<=1; j+=0.025){
271  ++number;
272  if( number == 80){
273  std::cout << AOH_Hpol_scOrbH_splines_[1].F((numeric::MakeVector(i,j))) << std::endl;
274  }else{
275  std::cout << AOH_Hpol_scOrbH_splines_[1].F((numeric::MakeVector(i,j))) << " ";
276  //std::cout << i << " " << j << std::endl;
277  }
278  }
279  }
280 
281 
282 
283 */
284 
285 
286 
287 
288  std::map<core::Size, std::pair<core::Size, core::Size> > AOD_orb_orb_map;
289  utility::vector1< utility::vector1< core::Real > > AOD_orb_orb_vector = parse_files(AOD_orb_orb_energies[1], AOD_orb_orb_map);
290 
291  std::map<core::Size, std::pair<core::Size, core::Size> > DOA_orb_orb_map;
292  utility::vector1< utility::vector1< core::Real > > DOA_orb_orb_vector = parse_files(DOA_orb_orb_energies[1], DOA_orb_orb_map);
293 
294  utility::vector1< numeric::MathMatrix<core::Real> > AOD_orb_orb_vector_matrix;
295  utility::vector1< numeric::MathMatrix<core::Real> > DOA_orb_orb_vector_matrix;
296 
297  for( core::Size count=1; count <= 5; ++count ) {
298  //MathMatrix requires an array, not a vector. To get an array from a vector, we can use the & vector[1]. See wikipedia!
299  numeric::MathMatrix<core::Real> AOD_orb_orb_matrix(AOD_orb_orb_map[count].second, AOD_orb_orb_map[count].first, & AOD_orb_orb_vector[count][1] );
300  numeric::MathMatrix<core::Real> DOA_orb_orb_matrix(DOA_orb_orb_map[count].second, DOA_orb_orb_map[count].first, & DOA_orb_orb_vector[count][1] );
301 
302  AOD_orb_orb_vector_matrix.push_back(AOD_orb_orb_matrix);
303  DOA_orb_orb_vector_matrix.push_back(DOA_orb_orb_matrix);
304  }
305 
308 
309  for(core::Size count=1; count <= 5; ++count){
310  bicubic_spline.train(behavior, start, delta, AOD_orb_orb_vector_matrix[count], linear_cont, first_deriv);
311  AOD_orb_orb_vector_spline.push_back( bicubic_spline );
312 
313  bicubic_spline.train(behavior, start, delta, DOA_orb_orb_vector_matrix[count], linear_cont, first_deriv);
314  DOA_orb_orb_vector_spline.push_back( bicubic_spline );
315  }
316 
317  //store all splines in a private member look up table. This allows for looking up the values in the actual score and provides an
318  //interface for the OrbitalsScore class.
319  for(core::Size count=1; count <= 5; ++count){
320  AOD_orb_orb_splines_.push_back(AOD_orb_orb_vector_spline[count]);
321  DOA_orb_orb_splines_.push_back(DOA_orb_orb_vector_spline[count]);
322  }
323 
324 
325 /*
326  for(core::Real i=0.00; i <= 4; i+=0.1){
327  core::Size number=0;
328  for(core::Real j=-1.0; j<=0; j+=0.05){
329  ++number;
330  if( number == 40){
331  if(AOD_orb_orb_splines_[1].F((numeric::MakeVector(i,j))) > 0 || AOD_orb_orb_splines_[1].F((numeric::MakeVector(i,j))) > -1e-5){
332  std::cout << "0" << std::endl;
333  }else {
334  std::cout << AOD_orb_orb_splines_[1].F((numeric::MakeVector(i,j))) << std::endl;
335  }
336  }else{
337  if(AOD_orb_orb_splines_[1].F((numeric::MakeVector(i,j))) > 0 || AOD_orb_orb_splines_[1].F((numeric::MakeVector(i,j))) > -1e-5){
338  std::cout << "0" << " ";
339  }else {
340  std::cout << AOD_orb_orb_splines_[1].F((numeric::MakeVector(i,j))) << " ";
341  }
342  //std::cout << i << " " << j << std::endl;
343  }
344  }
345  }
346  std::cout << "###################################################################################\n#####################3" << std::endl;
347 */
348 
349 
350 
351 
352  std::map<core::Size, std::pair<core::Size, core::Size> > ACO_AOH_orb_Hpol_map;
353  utility::vector1< utility::vector1< core::Real > > ACO_AOH_orb_Hpol_vector = parse_files(ACO_AOH_orb_Hpol_energies[1], ACO_AOH_orb_Hpol_map);
354  utility::vector1< numeric::MathMatrix<core::Real> > ACO_AOH_orb_Hpol_vector_matrix;
355 
356 
357  //MathMatrix requires an array, not a vector. To get an array from a vector, we can use the & vector[1]. See wikipedia!
358  numeric::MathMatrix<core::Real> ACO_AOH_orb_Hpol_matrix(ACO_AOH_orb_Hpol_map[1].second, ACO_AOH_orb_Hpol_map[1].first, & ACO_AOH_orb_Hpol_vector[1][1] );
359  ACO_AOH_orb_Hpol_vector_matrix.push_back(ACO_AOH_orb_Hpol_matrix);
360 
362 
363 
364 
365  bicubic_spline.train(behavior, start, delta, ACO_AOH_orb_Hpol_vector_matrix[1], linear_cont, first_deriv);
366  ACO_AOH_orb_Hpol_vector_spline.push_back( bicubic_spline );
367 
368 
369  //store all splines in a private member look up table. This allows for looking up the values in the actual score and provides an
370  //interface for the OrbitalsScore class.
371  ACO_AOH_orb_Hpol_splines_.push_back(ACO_AOH_orb_Hpol_vector_spline[1]);
372 
373 
374 
375 }//end orbitalsLookup
376 
377 
378 
380  std::string const & file,
381  std::map<core::Size, std::pair<core::Size, core::Size> > & orbital_angle_dist_map
382 )const
383 {
385  utility::vector1< utility::vector1< core::Real > > energy_vector(static_cast <core::Size> (number_stats_), E_vector); //600 default value for KBP, resized later
386  std::string line;
387  utility::io::izstream stream;
388  basic::database::open( stream, file );
389  core::Size orbital_type(0);
390  core::Size overall_count(1);
391  for( core::Size count=1; utility::io::getline(stream, line); ++count ) {
392  utility::vector1< std::string > split_string = utility::string_split(line, '\t'); //file is tab-delimenated
393  if(split_string[1]=="Orbital"){
394  orbital_type = static_cast< core::Size > (core::chemical::orbitals::OrbitalTypeMapper::get_instance()->get_orbital_enum(split_string[2]));
395  overall_count=1;
396  }else if(split_string[1] == "Size"){
397  core::Size angle_bins = utility::string2int(split_string[2]);
398  core::Size dist_bins = utility::string2int(split_string[3]);
399  std::pair<core::Size, core::Size> angle_dist(angle_bins, dist_bins);
400  orbital_angle_dist_map.insert(std::pair<core::Size, std::pair<core::Size, core::Size> >(orbital_type, angle_dist));
401  energy_vector[orbital_type].resize((angle_bins*dist_bins), 0);//need to resize. KBP have differing amount of elements
402  }else{
403  for(core::Size x=1; x<= orbital_angle_dist_map[orbital_type].first; ++x){//iterate through angles and put into vector
404  energy_vector[orbital_type][overall_count] = utility::string2float(split_string[x]);
405  ++overall_count;
406  }
407  }
408  }
409  stream.close();
410  return energy_vector;
411 }
412 
413 
414 //get the energy from the bicubic spline. This is done by using the mm atom name as a key in the map. We pass in the distance and angle.
416 (
417  const h_type h_enum,
418  const core::Size orb_type_name,
419  const core::Real distance,
420  const core::Real DHO_angle,
421  core::Real & energy,
422  core::Real & distance_derivative,
423  core::Real & angle_derivative,
424  bool check_derivative
425 ) const
426 {
427 
428  if ( (distance > 4.0 ) ) { energy = distance_derivative = angle_derivative = 0.0; return; }
429 
430  //if(orb_type_name == core::chemical::orbitals::N_pi_sp2 && h_enum==Hpol_scOrbH){energy = distance_derivative = angle_derivative = 0.0; return;}
431 
432  numeric::MathVector<core::Real> dist_angle_pair(numeric::MakeVector(distance, DHO_angle));
433  if(check_derivative){
434  if(h_enum == Hpol_scOrbH){
435  const numeric::interpolation::spline::BicubicSpline &spline( DHO_Hpol_scOrbH_splines_[orb_type_name]);
436  distance_derivative = spline.dFdx(dist_angle_pair);
437  angle_derivative = spline.dFdy(dist_angle_pair);
438  if(orb_type_name==chemical::orbitals::C_pi_sp2){
439  //this is to match the orbital orbital and orbital hpol weight. Set the weight of cation_pi interactions to that of orb orb
440  distance_derivative = ((distance_derivative*scOrb_scOrb_weight_));
441  angle_derivative = ((angle_derivative*scOrb_scOrb_weight_));
442  }
443 
444  }
445  if(h_enum == Haro_scOrbH){
446  const numeric::interpolation::spline::BicubicSpline &spline(DHO_Haro_scOrbH_splines_[orb_type_name]);
447  distance_derivative = spline.dFdx(dist_angle_pair);
448  angle_derivative = spline.dFdy(dist_angle_pair);
449  }
450  if(h_enum == Hpol_bbOrbH){
451  const numeric::interpolation::spline::BicubicSpline &spline(DHO_Hpol_bbOrbH_splines_[orb_type_name]);
452  distance_derivative = spline.dFdx(dist_angle_pair);
453  angle_derivative = spline.dFdy(dist_angle_pair);
454  }
455  }else{
456  if(h_enum == Hpol_scOrbH){
457  const numeric::interpolation::spline::BicubicSpline &spline(DHO_Hpol_scOrbH_splines_[orb_type_name]);
458  energy = spline.F(dist_angle_pair);
459  if(orb_type_name==chemical::orbitals::C_pi_sp2){
460  //this is to match the orbital orbital and orbital hpol weight. Set the weight of cation_pi interactions to that of orb orb
461  energy = ((energy*scOrb_scOrb_weight_));
462  }
463  }
464  if(h_enum == Haro_scOrbH){
465  const numeric::interpolation::spline::BicubicSpline &spline(DHO_Haro_scOrbH_splines_[orb_type_name]);
466  energy = spline.F(dist_angle_pair);
467  }
468  if(h_enum == Hpol_bbOrbH){
469  const numeric::interpolation::spline::BicubicSpline &spline(DHO_Hpol_bbOrbH_splines_[orb_type_name]);
470  energy = spline.F(dist_angle_pair);
471  }
472  }
473 }
474 
475 
477 (
478  const h_type h_enum,
479  const core::Size orb_type_name,
480  const core::Real distance,
481  const core::Real AOH_angle,
482  core::Real & energy,
483  core::Real & distance_derivative,
484  core::Real & angle_derivative,
485  bool check_derivative,
486  bool ACO //action centor orbital?
487 ) const
488 {
489  if ( distance > 4.0 ) { energy = distance_derivative = angle_derivative = 0.0; return; }
490  //if(orb_type_name == core::chemical::orbitals::N_pi_sp2 && h_enum==Hpol_scOrbH){energy = distance_derivative = angle_derivative = 0.0; return;}
491 // if(orb_type_name == core::chemical::orbitals::C_pi_sp2 && h_enum==Hpol_bbOrbH){energy = distance_derivative = angle_derivative = 0.0; return;}
492 
493  numeric::MathVector<core::Real> dist_angle_pair(numeric::MakeVector(distance, AOH_angle));
494  if(check_derivative){
495  if(h_enum == Hpol_scOrbH){
496  const numeric::interpolation::spline::BicubicSpline &spline( AOH_Hpol_scOrbH_splines_[orb_type_name]);
497  distance_derivative = spline.dFdx(dist_angle_pair);
498  angle_derivative = spline.dFdy(dist_angle_pair);
499  if(orb_type_name==chemical::orbitals::C_pi_sp2){
500  //this is to match the orbital orbital and orbital hpol weight. Set the weight of cation_pi interactions to that of orb orb
501  distance_derivative = ((distance_derivative*scOrb_scOrb_weight_));
502  angle_derivative = ((angle_derivative*scOrb_scOrb_weight_));
503  }
504 
505  }
506  if(h_enum == Haro_scOrbH){
507  if(ACO){
508  const numeric::interpolation::spline::BicubicSpline &spline(ACO_AOH_orb_Hpol_splines_[orb_type_name]);
509  distance_derivative = spline.dFdx(dist_angle_pair);
510  angle_derivative = spline.dFdy(dist_angle_pair);
511  }else{
512  const numeric::interpolation::spline::BicubicSpline &spline(AOH_Haro_scOrbH_splines_[orb_type_name]);
513  distance_derivative = spline.dFdx(dist_angle_pair);
514  angle_derivative = spline.dFdy(dist_angle_pair);
515  }
516 
517  }
518  if(h_enum == Hpol_bbOrbH){
519  const numeric::interpolation::spline::BicubicSpline &spline(AOH_Hpol_bbOrbH_splines_[orb_type_name]);
520  distance_derivative = spline.dFdx(dist_angle_pair);
521  angle_derivative = spline.dFdy(dist_angle_pair);
522  }
523  }else{
524  if(h_enum == Hpol_scOrbH){
525  const numeric::interpolation::spline::BicubicSpline &spline(AOH_Hpol_scOrbH_splines_[orb_type_name]);
526  energy = spline.F(dist_angle_pair);
527  if(orb_type_name==chemical::orbitals::C_pi_sp2){
528  //this is to match the orbital orbital and orbital hpol weight. Set the weight of cation_pi interactions to that of orb orb
529  energy = ((energy*scOrb_scOrb_weight_));
530  }
531  }
532  if(h_enum == Haro_scOrbH){
533  if(ACO){
534  const numeric::interpolation::spline::BicubicSpline &spline(ACO_AOH_orb_Hpol_splines_[orb_type_name]);
535  energy = spline.F(dist_angle_pair);
536  }else{
537  const numeric::interpolation::spline::BicubicSpline &spline(AOH_Haro_scOrbH_splines_[orb_type_name]);
538  energy = spline.F(dist_angle_pair);
539  }
540  }
541  if(h_enum == Hpol_bbOrbH){
542  const numeric::interpolation::spline::BicubicSpline &spline(AOH_Hpol_bbOrbH_splines_[orb_type_name]);
543  energy = spline.F(dist_angle_pair);
544  }
545  }
546 }
547 
549  const core::Size orb_type_name1,
550  const core::Size orb_type_name2,
551  const core::Real distance,
552  const core::Real AOO_angle,
553  core::Real & energy,
554  core::Real & distance_derivative,
555  core::Real & angle_derivative,
556  bool check_derivative
557 )const{
558 
559  //if(AOO_angle > 0) energy=distance_derivative=angle_derivative=0.0;
560  numeric::MathVector<core::Real> dist_angle_pair(numeric::MakeVector(distance, AOO_angle));
561  if(check_derivative){
562  if(orb_type_name1==static_cast <core::Size>(core::chemical::orbitals::C_pi_sp2)){
563  if(orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::N_pi_sp2))
564  {
565  const numeric::interpolation::spline::BicubicSpline &spline(AOD_orb_orb_splines_[2]);
566  distance_derivative = spline.dFdx(dist_angle_pair);
567  angle_derivative = spline.dFdy(dist_angle_pair);
568  }
569  if(orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::O_pi_sp2)){
570  const numeric::interpolation::spline::BicubicSpline &spline(AOD_orb_orb_splines_[3]);
571  distance_derivative = spline.dFdx(dist_angle_pair);
572  angle_derivative = spline.dFdy(dist_angle_pair);
573  }
574  if(orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::C_pi_sp2)){
575  const numeric::interpolation::spline::BicubicSpline &spline(AOD_orb_orb_splines_[1]);
576  distance_derivative = spline.dFdx(dist_angle_pair);
577  angle_derivative = spline.dFdy(dist_angle_pair);
578  }
579 
580  }
581  if(orb_type_name1==static_cast <core::Size>(core::chemical::orbitals::N_pi_sp2) && orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::C_pi_sp2)){
582  const numeric::interpolation::spline::BicubicSpline &spline(AOD_orb_orb_splines_[4]);
583  distance_derivative = spline.dFdx(dist_angle_pair);
584  angle_derivative = spline.dFdy(dist_angle_pair);
585  }
586  if(orb_type_name1==static_cast <core::Size>(core::chemical::orbitals::O_pi_sp2) && orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::C_pi_sp2)){
587  const numeric::interpolation::spline::BicubicSpline &spline(AOD_orb_orb_splines_[5]);
588  distance_derivative = spline.dFdx(dist_angle_pair);
589  angle_derivative = spline.dFdy(dist_angle_pair);
590  }
591 
592  }else{
593  if(orb_type_name1==static_cast <core::Size>(core::chemical::orbitals::C_pi_sp2)){
594  if(orb_type_name2==core::chemical::orbitals::N_pi_sp2)
595  {
596  const numeric::interpolation::spline::BicubicSpline &spline(AOD_orb_orb_splines_[2]);
597  energy = spline.F(dist_angle_pair);
598  }
599  if(orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::O_pi_sp2)){
600  const numeric::interpolation::spline::BicubicSpline &spline(AOD_orb_orb_splines_[3]);
601  energy = spline.F(dist_angle_pair);
602  }
603  if(orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::C_pi_sp2)){
604  const numeric::interpolation::spline::BicubicSpline &spline(AOD_orb_orb_splines_[1]);
605  energy = spline.F(dist_angle_pair);
606  }
607 
608  }
609  if(orb_type_name1==static_cast <core::Size>(core::chemical::orbitals::N_pi_sp2) && orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::C_pi_sp2)){
610  const numeric::interpolation::spline::BicubicSpline &spline(AOD_orb_orb_splines_[4]);
611  energy = spline.F(dist_angle_pair);
612  }
613  if(orb_type_name1==static_cast <core::Size>(core::chemical::orbitals::O_pi_sp2) && orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::C_pi_sp2)){
614  const numeric::interpolation::spline::BicubicSpline &spline(AOD_orb_orb_splines_[5]);
615  energy = spline.F(dist_angle_pair);
616  }
617  }
618 }
620  const core::Size orb_type_name1,
621  const core::Size orb_type_name2,
622  const core::Real distance,
623  const core::Real DOO_angle,
624  core::Real & energy,
625  core::Real & distance_derivative,
626  core::Real & angle_derivative,
627  bool check_derivative
628 
629 )const{
630  //if(DOO_angle > 0) energy=distance_derivative=angle_derivative=0.0;
631  numeric::MathVector<core::Real> dist_angle_pair(numeric::MakeVector(distance, DOO_angle));
632 
633  if(check_derivative){
634  if(orb_type_name1==static_cast <core::Size>(core::chemical::orbitals::C_pi_sp2)){
635  if(orb_type_name2==core::chemical::orbitals::N_pi_sp2)
636  {
637  const numeric::interpolation::spline::BicubicSpline &spline(DOA_orb_orb_splines_[2]);
638  distance_derivative = spline.dFdx(dist_angle_pair);
639  angle_derivative = spline.dFdy(dist_angle_pair);
640  }
641  if(orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::O_pi_sp2)){
642  const numeric::interpolation::spline::BicubicSpline &spline(DOA_orb_orb_splines_[3]);
643  distance_derivative = spline.dFdx(dist_angle_pair);
644  angle_derivative = spline.dFdy(dist_angle_pair);
645  }
646  if(orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::C_pi_sp2)){
647  const numeric::interpolation::spline::BicubicSpline &spline(DOA_orb_orb_splines_[1]);
648  distance_derivative = spline.dFdx(dist_angle_pair);
649  angle_derivative = spline.dFdy(dist_angle_pair);
650  }
651 
652  }
653  if(orb_type_name1==static_cast <core::Size>(core::chemical::orbitals::N_pi_sp2) && orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::C_pi_sp2)){
654  const numeric::interpolation::spline::BicubicSpline &spline(DOA_orb_orb_splines_[4]);
655  distance_derivative = spline.dFdx(dist_angle_pair);
656  angle_derivative = spline.dFdy(dist_angle_pair);
657  }
658  if(orb_type_name1==static_cast <core::Size>(core::chemical::orbitals::O_pi_sp2) && orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::C_pi_sp2)){
659  const numeric::interpolation::spline::BicubicSpline &spline(DOA_orb_orb_splines_[5]);
660  distance_derivative = spline.dFdx(dist_angle_pair);
661  angle_derivative = spline.dFdy(dist_angle_pair);
662  }
663 
664  }else{
665  if(orb_type_name1==static_cast <core::Size>(core::chemical::orbitals::C_pi_sp2)){
666  if(orb_type_name2==core::chemical::orbitals::N_pi_sp2)
667  {
668  const numeric::interpolation::spline::BicubicSpline &spline(DOA_orb_orb_splines_[2]);
669  energy = spline.F(dist_angle_pair);
670  }
671  if(orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::O_pi_sp2)){
672  const numeric::interpolation::spline::BicubicSpline &spline(DOA_orb_orb_splines_[3]);
673  energy = spline.F(dist_angle_pair);
674  }
675  if(orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::C_pi_sp2)){
676  const numeric::interpolation::spline::BicubicSpline &spline(DOA_orb_orb_splines_[1]);
677  energy = spline.F(dist_angle_pair);
678  }
679 
680  }
681  if(orb_type_name1==static_cast <core::Size>(core::chemical::orbitals::N_pi_sp2) && orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::C_pi_sp2)){
682  const numeric::interpolation::spline::BicubicSpline &spline(DOA_orb_orb_splines_[4]);
683  energy = spline.F(dist_angle_pair);
684  }
685  if(orb_type_name1==static_cast <core::Size>(core::chemical::orbitals::O_pi_sp2) && orb_type_name2==static_cast <core::Size>(core::chemical::orbitals::C_pi_sp2)){
686  const numeric::interpolation::spline::BicubicSpline &spline(DOA_orb_orb_splines_[5]);
687  energy = spline.F(dist_angle_pair);
688  }
689  }
690 }
691 
692 
693 void OrbitalsLookup::set_orb_weights(ScoreFunction const & weights) const{
696 }
697 
698 
699 }//namespace orbitals
700 
701 }//namespace scoring
702 
703 }//namespace core