Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ResidueScoresFeatures.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 protocols/features/ResidueScoresFeatures.cc
11 /// @brief report residue scores to features Statistics Scientific Benchmark
12 /// @author Matthew O'Meara (mattjomeara@gmail.com)
13 
14 // Unit Headers
17 
18 // Project Headers
20 #include <core/pose/Pose.hh>
26 #include <core/scoring/Energies.hh>
30 #include <core/types.hh>
32 #include <basic/database/sql_utils.hh>
33 #include <basic/database/schema_generator/PrimaryKey.hh>
34 #include <basic/database/schema_generator/ForeignKey.hh>
35 #include <basic/database/schema_generator/Column.hh>
36 #include <basic/database/schema_generator/Schema.hh>
37 #include <basic/database/insert_statement_generator/InsertGenerator.hh>
38 #include <basic/database/insert_statement_generator/RowData.hh>
39 
40 // Utility Headers
41 #include <numeric/xyzVector.hh>
42 #include <utility/tag/Tag.hh>
43 #include <utility/vector1.hh>
44 #include <utility/tools/make_vector.hh>
45 #include <utility/sql_database/DatabaseSessionManager.hh>
46 
47 // External Headers
48 #include <cppdb/frontend.h>
49 #include <boost/uuid/uuid_io.hpp>
50 
51 // C++ Headers
52 #include <cmath>
53 #include <utility/excn/Exceptions.hh>
54 #include <sstream>
55 
56 namespace protocols{
57 namespace features{
58 
59 using std::endl;
60 using std::string;
61 using std::stringstream;
62 using core::Size;
63 using core::Real;
64 using core::pose::Pose;
65 using core::pose::PoseOP;
82 using numeric::xyzVector;
83 using basic::database::insert_statement_generator::InsertGenerator;
84 using basic::database::insert_statement_generator::RowData;
85 using basic::database::insert_statement_generator::RowDataBaseOP;
87 using utility::vector1;
88 using utility::sql_database::sessionOP;
89 using utility::tools::make_vector;
90 using cppdb::statement;
91 using boost::uuids::uuid;
92 
94  scfxn_(getScoreFunction())
95 {}
96 
98  ScoreFunctionOP scfxn) :
99  scfxn_(scfxn)
100 {}
101 
104  scfxn_(src.scfxn_)
105 {}
106 
108 {}
109 
110 string
111 ResidueScoresFeatures::type_name() const { return "ResidueScoresFeatures"; }
112 
113 void
115  sessionOP db_session
116 ) const {
120 }
121 
122 void
124  sessionOP db_session
125 ) const {
126  using namespace basic::database::schema_generator;
127 
128  Column batch_id("batch_id", new DbInteger());
129  Column struct_id("struct_id", new DbUUID());
130  Column resNum("resNum", new DbInteger());
131  Column score_type_id("score_type_id", new DbInteger());
132  Column score_value("score_value", new DbReal());
133  Column context_dependent("context_dependent", new DbInteger());
134 
135  Columns primary_key_columns;
136  primary_key_columns.push_back(batch_id);
137  primary_key_columns.push_back(struct_id);
138  primary_key_columns.push_back(resNum);
139  primary_key_columns.push_back(score_type_id);
140  PrimaryKey primary_key(primary_key_columns);
141 
142  Columns foreign_key_columns1;
143  foreign_key_columns1.push_back(struct_id);
144  foreign_key_columns1.push_back(resNum);
145  vector1< std::string > reference_columns1;
146  reference_columns1.push_back("struct_id");
147  reference_columns1.push_back("resNum");
148  ForeignKey foreign_key1(foreign_key_columns1, "residues", reference_columns1, true);
149 
150  Columns foreign_key_columns2;
151  foreign_key_columns2.push_back(batch_id);
152  foreign_key_columns2.push_back(score_type_id);
153  vector1< std::string > reference_columns2;
154  reference_columns2.push_back("batch_id");
155  reference_columns2.push_back("score_type_id");
156  ForeignKey foreign_key2(foreign_key_columns2, "score_types", reference_columns2, true);
157 
158 
159  Schema table("residue_scores_1b", primary_key);
160  table.add_foreign_key(foreign_key1);
161  table.add_foreign_key(foreign_key2);
162  table.add_column(score_value);
163  table.add_column(context_dependent);
164 
165  table.write(db_session);
166 }
167 
168 void
170  sessionOP db_session
171 ) const {
172  using namespace basic::database::schema_generator;
173 
174  Column batch_id("batch_id", new DbInteger());
175  Column struct_id("struct_id", new DbUUID());
176  Column resNum1("resNum1", new DbInteger());
177  Column resNum2("resNum2", new DbInteger());
178  Column score_type_id("score_type_id", new DbInteger());
179  Column score_value("score_value", new DbReal());
180  Column context_dependent("context_dependent", new DbInteger());
181 
182  Columns primary_key_columns;
183  primary_key_columns.push_back(batch_id);
184  primary_key_columns.push_back(struct_id);
185  primary_key_columns.push_back(resNum1);
186  primary_key_columns.push_back(resNum2);
187  primary_key_columns.push_back(score_type_id);
188  PrimaryKey primary_key(primary_key_columns);
189 
190  Columns foreign_key_columns1;
191  foreign_key_columns1.push_back(struct_id);
192  foreign_key_columns1.push_back(resNum1);
193  vector1< std::string > reference_columns1;
194  reference_columns1.push_back("struct_id");
195  reference_columns1.push_back("resNum");
196  ForeignKey foreign_key1(foreign_key_columns1, "residues", reference_columns1, true);
197 
198  Columns foreign_key_columns2;
199  foreign_key_columns2.push_back(struct_id);
200  foreign_key_columns2.push_back(resNum2);
201  vector1< std::string > reference_columns2;
202  reference_columns2.push_back("struct_id");
203  reference_columns2.push_back("resNum");
204  ForeignKey foreign_key2(foreign_key_columns2, "residues", reference_columns2, true);
205 
206  Columns foreign_key_columns3;
207  foreign_key_columns3.push_back(batch_id);
208  foreign_key_columns3.push_back(score_type_id);
209  vector1< std::string > reference_columns3;
210  reference_columns3.push_back("batch_id");
211  reference_columns3.push_back("score_type_id");
212  ForeignKey foreign_key3(foreign_key_columns3, "score_types", reference_columns3, true);
213 
214 
215  Schema table("residue_scores_2b", primary_key);
216  table.add_foreign_key(foreign_key1);
217  table.add_foreign_key(foreign_key2);
218  table.add_foreign_key(foreign_key3);
219  table.add_column(score_value);
220  table.add_column(context_dependent);
221 
222  table.write(db_session);
223 }
224 
225 void
227  sessionOP db_session
228 ) const {
229  using namespace basic::database::schema_generator;
230 
231  Column batch_id("batch_id", new DbInteger());
232  Column struct_id("struct_id", new DbUUID());
233  Column resNum1("resNum1", new DbInteger());
234  Column resNum2("resNum2", new DbInteger());
235  Column score_type_id("score_type_id", new DbInteger());
236  Column score_value("score_value", new DbReal());
237  Column context_dependent("context_dependent", new DbInteger());
238 
239  Columns primary_key_columns;
240  primary_key_columns.push_back(batch_id);
241  primary_key_columns.push_back(struct_id);
242  primary_key_columns.push_back(resNum1);
243  primary_key_columns.push_back(resNum2);
244  primary_key_columns.push_back(score_type_id);
245  PrimaryKey primary_key(primary_key_columns);
246 
247  Columns foreign_key_columns1;
248  foreign_key_columns1.push_back(struct_id);
249  foreign_key_columns1.push_back(resNum1);
250  vector1< std::string > reference_columns1;
251  reference_columns1.push_back("struct_id");
252  reference_columns1.push_back("resNum");
253  ForeignKey foreign_key1(foreign_key_columns1, "residues", reference_columns1, true);
254 
255  Columns foreign_key_columns2;
256  foreign_key_columns2.push_back(struct_id);
257  foreign_key_columns2.push_back(resNum2);
258  vector1< std::string > reference_columns2;
259  reference_columns2.push_back("struct_id");
260  reference_columns2.push_back("resNum");
261  ForeignKey foreign_key2(foreign_key_columns2, "residues", reference_columns2, true);
262 
263  Columns foreign_key_columns3;
264  foreign_key_columns3.push_back(batch_id);
265  foreign_key_columns3.push_back(score_type_id);
266  vector1< std::string > reference_columns3;
267  reference_columns3.push_back("batch_id");
268  reference_columns3.push_back("score_type_id");
269  ForeignKey foreign_key3(foreign_key_columns3, "score_types", reference_columns3, true);
270 
271 
272  Schema table("residue_scores_lr_2b", primary_key);
273  table.add_foreign_key(foreign_key1);
274  table.add_foreign_key(foreign_key2);
275  table.add_foreign_key(foreign_key3);
276  table.add_column(score_value);
277  table.add_column(context_dependent);
278 
279  table.write(db_session);
280 }
281 
282 
285  utility::vector1<std::string> dependencies;
286  dependencies.push_back("ResidueFeatures");
287  dependencies.push_back("ScoreTypeFeatures");
288  return dependencies;
289 }
290 
291 void
293  TagPtr const tag,
294  DataMap & data,
295  Filters_map const & /*filters*/,
296  Movers_map const & /*movers*/,
297  Pose const & /*pose*/
298 ) {
299  if(tag->hasOption("scorefxn")){
300  string const scorefxn_name(tag->getOption<string>("scorefxn"));
301  scfxn_ = data.get<ScoreFunction*>("scorefxns", scorefxn_name);
302  } else {
303  stringstream error_msg;
304  error_msg
305  << "The " << type_name() << " reporter requires a 'scorefxn' tag:" << endl
306  << endl
307  << " <feature name=" << type_name() <<" scorefxn=(name_of_score_function) />" << endl;
308  throw utility::excn::EXCN_RosettaScriptsOption(error_msg.str());
309  }
310 }
311 
312 Size
314  Pose const & pose,
315  vector1< bool > const & relevant_residues,
316  boost::uuids::uuid const struct_id,
317  sessionOP db_session
318 ){
319  Pose pose_copy(pose);
320  (*scfxn_)(pose_copy);
321  insert_residue_scores_rows(pose_copy, relevant_residues, struct_id, db_session);
322 
323  return 0;
324 }
325 
326 ///@details
327 ///
328 /// * Score types are either one body, two body, or whole structure and
329 /// can either dependend on the context or not.
330 ///
331 /// * Whole structure terms are reported in the structure_scores table
332 /// along with the totals from the remaining terms.
333 ///
334 /// * The one and two body terms are broken up into two different
335 /// tables because they are parametrized differently (one residue vs
336 /// two residues).
337 ///
338 /// * Residues are identified by Rosetta's residue numbering scheme.
339 /// To convert to the PDB residue numbering scheme, join with the
340 /// residues_pdb table.
341 ///
342 /// * Although two body terms can be with in the same residue, these
343 /// 'intrares' score terms are reported with the two body terms where
344 /// resNum == otherResNum.
345 ///
346 /// * Two body terms always are reported so that resNum1 <= resNum2.
347 ///
348 /// * Values for score terms are only reported if they are non-zero.
349 ///
350 /// * Values of two body energies are only reported when both residues
351 /// are true in the relevant_residues vector.
352 
353 void
355  Pose const & pose,
356  vector1< bool > const & relevant_residues,
357  boost::uuids::uuid const struct_id,
358  sessionOP db_session
359 ){
360 
361  //calling setup for scoring on a temp copy of the pose, maybe
362  //there's a better way of doing this but we can't (and shouldn't)
363  //require that the pose be previously setup for scoring before
364  //calling this mover
365  Pose temp_pose = pose;
366  scfxn_->setup_for_scoring(temp_pose);
367 
368  Size const batch_id(get_batch_id(struct_id, db_session));
369 
370 
371  vector1<bool> relevant_and_virtual_residues(relevant_residues);
372  // Since some scores terms, such as elec_dens_fast and constraints,
373  // use virtual residues to be compatible with the two-body scoring
374  // framework, include virtual residues with the relevant residues so
375  // these scores get computed.
376  for(Size i = 1; i <= pose.total_residue(); ++i){
377  if(pose.residue( i ).aa() == aa_vrt){
378  relevant_and_virtual_residues[i] = true;
379  }
380  }
381 
382 
384  temp_pose, relevant_and_virtual_residues, batch_id, struct_id, db_session);
385 
387  temp_pose, relevant_and_virtual_residues, batch_id, struct_id, db_session);
388 
390  temp_pose, relevant_and_virtual_residues, batch_id, struct_id, db_session);
391 
392 } // End function body
393 
394 void
396  Pose const & pose,
397  vector1< bool > const & relevant_residues,
398  Size const batch_id,
399  uuid const struct_id,
400  sessionOP db_session
401 ) {
402 
403  ScoreTypes const & ci_1b( scfxn_->ci_1b_types() );
404  ScoreTypes const & cd_1b( scfxn_->cd_1b_types() );
405 
406  InsertGenerator insert_onebody("residue_scores_1b");
407  insert_onebody.add_column("batch_id");
408  insert_onebody.add_column("struct_id");
409  insert_onebody.add_column("resNum");
410  insert_onebody.add_column("score_type_id");
411  insert_onebody.add_column("score_value");
412  insert_onebody.add_column("context_dependent");
413 
414  RowDataBaseOP batch_id_data(new RowData<Size>("batch_id", batch_id));
415  RowDataBaseOP struct_id_data(new RowData<uuid>("struct_id", struct_id));
416 
417  EnergyMap emap;
418 
419  for(Size resNum=1; resNum <= pose.total_residue(); ++resNum){
420  if(!relevant_residues[resNum]) continue;
421  Residue const & rsd( pose.residue(resNum) );
422 
423  RowDataBaseOP resNum_data(
424  new RowData<Size>("resNum", resNum));
425 
426  { // Context Independent One Body Energies
427  RowDataBaseOP context_dependent_data(
428  new RowData<bool>("context_dependent", false));
429 
430  emap.clear();
431  scfxn_->eval_ci_1b(rsd, pose, emap);
432  for(ScoreTypes::const_iterator st = ci_1b.begin(), ste = ci_1b.end(); st != ste; ++st){
433  if(!emap[*st]) continue;
434 
435  RowDataBaseOP score_type_id_data(
436  new RowData<Size>("score_type_id", *st));
437  RowDataBaseOP score_value_data(
438  new RowData<Real>("score_value", emap[*st]));
439 
440  insert_onebody.add_row(
441  make_vector(
442  batch_id_data, struct_id_data, resNum_data,
443  score_type_id_data, score_value_data, context_dependent_data));
444  }
445  }
446  { // Context Dependent One Body Energies
447  RowDataBaseOP context_dependent_data(
448  new RowData<bool>("context_dependent", true));
449 
450  emap.clear();
451  scfxn_->eval_cd_1b(rsd, pose, emap);
452  for(ScoreTypes::const_iterator
453  st = cd_1b.begin(), ste = cd_1b.end();
454  st != ste; ++st){
455 
456  if(!emap[*st]) continue;
457 
458  RowDataBaseOP score_type_id_data(
459  new RowData<Size>("score_type_id", *st));
460  RowDataBaseOP score_value_data(
461  new RowData<Real>("score_value", emap[*st]));
462 
463  insert_onebody.add_row(
464  make_vector(
465  batch_id_data, struct_id_data, resNum_data,
466  score_type_id_data, score_value_data, context_dependent_data));
467 
468  }
469  }
470  }
471  insert_onebody.write_to_database(db_session);
472 }
473 
474 void
476  Pose const & pose,
477  vector1< bool > const & relevant_residues,
478  Size batch_id,
479  uuid const struct_id,
480  sessionOP db_session
481 ) {
482 
483  // retrieve cached energies object
484  Energies const & energies( pose.energies() );
485  assert(energies.energies_updated());
486  // the neighbor/energy links
487  EnergyGraph const & energy_graph( energies.energy_graph() );
488  EnergyMap emap;
489 
490  ScoreTypes const & ci_2b( scfxn_->ci_2b_types() );
491  ScoreTypes const & cd_2b( scfxn_->cd_2b_types() );
492 
493  InsertGenerator insert_twobody("residue_scores_2b");
494  insert_twobody.add_column("batch_id");
495  insert_twobody.add_column("struct_id");
496  insert_twobody.add_column("resNum1");
497  insert_twobody.add_column("resNum2");
498  insert_twobody.add_column("score_type_id");
499  insert_twobody.add_column("score_value");
500  insert_twobody.add_column("context_dependent");
501 
502  RowDataBaseOP batch_id_data(new RowData<Size>("batch_id", batch_id));
503  RowDataBaseOP struct_id_data(new RowData<uuid>("struct_id", struct_id));
504 
505  for(Size resNum=1; resNum <= pose.total_residue(); ++resNum){
506  if(!relevant_residues[resNum]) continue;
507  Residue const & rsd( pose.residue(resNum) );
508 
509  // Two Body Energies
511  iru = energy_graph.get_node(resNum)->const_upper_edge_list_begin(),
512  irue = energy_graph.get_node(resNum)->const_upper_edge_list_end();
513  iru != irue; ++iru ) {
514  EnergyEdge const & edge( static_cast< EnergyEdge const &> (**iru) );
515  Size const otherResNum( edge.get_second_node_ind() );
516 
517  if(!relevant_residues[otherResNum]) continue;
518 
519  Size resNum1, resNum2;
520  if( resNum < otherResNum ){
521  resNum1 = resNum;
522  resNum2 = otherResNum;
523  } else {
524  resNum1 = otherResNum;
525  resNum2 = resNum;
526  }
527 
528  Residue const & otherRsd( pose.residue(otherResNum) );
529 
530  RowDataBaseOP resNum1_data(
531  new RowData<Size>("resNum1", resNum1));
532  RowDataBaseOP resNum2_data(
533  new RowData<Size>("resNum2", resNum2));
534 
535  { // Context Independent Two Body Energies
536 
537  RowDataBaseOP context_dependent_data(
538  new RowData<bool>("context_dependent", false));
539 
540  emap.clear();
541  scfxn_->eval_ci_2b(rsd, otherRsd, pose, emap);
542  for(ScoreTypes::const_iterator st = ci_2b.begin(), ste = ci_2b.end(); st != ste; ++st){
543  if(!emap[*st]) continue;
544 
545  RowDataBaseOP score_type_id_data(
546  new RowData<Size>("score_type_id", *st));
547  RowDataBaseOP score_value_data(
548  new RowData<Real>("score_value", emap[*st]));
549 
550  insert_twobody.add_row(
551  make_vector(
552  batch_id_data, struct_id_data, resNum1_data, resNum2_data,
553  score_type_id_data, score_value_data, context_dependent_data));
554 
555  }
556  }
557  { // Context Dependent Two Body Energies
558  RowDataBaseOP context_dependent_data(
559  new RowData<bool>("context_dependent", true));
560 
561  EnergyMap emap;
562  scfxn_->eval_cd_2b(rsd, otherRsd, pose, emap);
563  for(ScoreTypes::const_iterator st = cd_2b.begin(), ste = cd_2b.end(); st != ste; ++st){
564  if(!emap[*st]) continue;
565 
566  RowDataBaseOP score_type_id_data(
567  new RowData<Size>("score_type_id", *st));
568  RowDataBaseOP score_value_data(
569  new RowData<Real>("score_value", emap[*st]));
570 
571  insert_twobody.add_row(
572  make_vector(
573  batch_id_data, struct_id_data, resNum1_data, resNum2_data,
574  score_type_id_data, score_value_data, context_dependent_data));
575  }
576  }
577  }
578  }
579  insert_twobody.write_to_database(db_session);
580 }
581 
582 
583 void
585  Pose const & pose,
586  vector1< bool > const & relevant_residues,
587  Size batch_id,
588  uuid const struct_id,
589  sessionOP db_session
590 ) {
591 
592 
593  ScoreTypes const & ci_lr_2b( scfxn_->ci_lr_2b_types() );
594  ScoreTypes const & cd_lr_2b( scfxn_->cd_lr_2b_types() );
595 
596  InsertGenerator insert_twobody_longrange("residue_scores_lr_2b");
597  insert_twobody_longrange.add_column("batch_id");
598  insert_twobody_longrange.add_column("struct_id");
599  insert_twobody_longrange.add_column("resNum1");
600  insert_twobody_longrange.add_column("resNum2");
601  insert_twobody_longrange.add_column("score_type_id");
602  insert_twobody_longrange.add_column("score_value");
603  insert_twobody_longrange.add_column("context_dependent");
604 
605  RowDataBaseOP batch_id_data(new RowData<Size>("batch_id", batch_id));
606  RowDataBaseOP struct_id_data(new RowData<uuid>("struct_id", struct_id));
607 
608  EnergyMap emap;
609 
610  { // Context Independent Long Range Two Body Energies
611  RowDataBaseOP context_dependent_data(
612  new RowData<bool>("context_dependent", false));
613 
614  for(ScoreFunction::CI_LR_2B_Methods::const_iterator
615  iter = scfxn_->ci_lr_2b_methods_begin(),
616  iter_end = scfxn_->ci_lr_2b_methods_end();
617  iter != iter_end; ++iter ) {
618  LREnergyContainerCOP lrec =
619  pose.energies().long_range_container((*iter)->long_range_type());
620  if( !lrec || lrec->empty() ) continue; // only score non-emtpy energies.
621 
622  // Potentially O(N^2) operation...
623  for( Size resNum = 1; resNum <= pose.total_residue(); ++resNum ) {
624  if(!relevant_residues[resNum]) continue;
625 
627  rni = lrec->const_upper_neighbor_iterator_begin( resNum ),
628  rniend = lrec->const_upper_neighbor_iterator_end( resNum );
629  (*rni) != (*rniend); ++(*rni) ) {
630  Size const otherResNum(rni->upper_neighbor_id());
631  if(!relevant_residues[otherResNum]) continue;
632 
633  Size resNum1, resNum2;
634  if( resNum < otherResNum ){
635  resNum1 = resNum;
636  resNum2 = otherResNum;
637  } else {
638  resNum1 = otherResNum;
639  resNum2 = resNum;
640  }
641 
642  assert(rni->energy_computed());
643  emap.zero();
644  rni->retrieve_energy( emap );
645 
646  RowDataBaseOP resNum1_data(
647  new RowData<Size>("resNum1", resNum1));
648  RowDataBaseOP resNum2_data(
649  new RowData<Size>("resNum2", resNum2));
650 
651  for(
652  ScoreTypes::const_iterator
653  st = ci_lr_2b.begin(), ste = ci_lr_2b.end();
654  st != ste; ++st ){
655  if(!emap[*st]) continue;
656 
657  RowDataBaseOP score_type_id_data(
658  new RowData<Size>("score_type_id", *st));
659  RowDataBaseOP score_value_data(
660  new RowData<Real>("score_value", emap[*st]));
661 
662  insert_twobody_longrange.add_row(
663  make_vector(
664  batch_id_data, struct_id_data, resNum1_data, resNum2_data,
665  score_type_id_data, score_value_data, context_dependent_data));
666  }
667  }
668  }
669  }
670  }
671 
672  /////////////////////////////////////////////////////
673  /// Context Dependent Long Range Two Body methods
674  {
675  RowDataBaseOP context_dependent_data(
676  new RowData<bool>("context_dependent", true));
677 
678  for(ScoreFunction::CD_LR_2B_Methods::const_iterator
679  iter = scfxn_->cd_lr_2b_methods_begin(),
680  iter_end = scfxn_->cd_lr_2b_methods_end();
681  iter != iter_end; ++iter ) {
682  LREnergyContainerCOP lrec =
683  pose.energies().long_range_container((*iter)->long_range_type());
684  if( !lrec || lrec->empty() ) continue; // only score non-emtpy energies.
685 
686  // Potentially O(N^2) operation...
687  for( Size resNum = 1; resNum <= pose.total_residue(); ++resNum ) {
688  if(!relevant_residues[resNum]) continue;
689 
691  rni = lrec->const_upper_neighbor_iterator_begin( resNum ),
692  rniend = lrec->const_upper_neighbor_iterator_end( resNum );
693  (*rni) != (*rniend); ++(*rni) ) {
694  Size const otherResNum(rni->upper_neighbor_id());
695  if(!relevant_residues[otherResNum]) continue;
696 
697  Size resNum1, resNum2;
698  if( resNum < otherResNum ){
699  resNum1 = resNum;
700  resNum2 = otherResNum;
701  } else {
702  resNum1 = otherResNum;
703  resNum2 = resNum;
704  }
705 
706  assert(rni->energy_computed());
707  emap.zero();
708  rni->retrieve_energy( emap );
709 
710  RowDataBaseOP resNum1_data(
711  new RowData<Size>("resNum1", resNum1));
712  RowDataBaseOP resNum2_data(
713  new RowData<Size>("resNum2", resNum2));
714 
715  for(
716  ScoreTypes::const_iterator
717  st = ci_lr_2b.begin(), ste = cd_lr_2b.end();
718  st != ste; ++st ){
719  if(!emap[*st]) continue;
720 
721  RowDataBaseOP score_type_id_data(
722  new RowData<Size>("score_type_id", *st));
723  RowDataBaseOP score_value_data(
724  new RowData<Real>("score_value", emap[*st]));
725 
726  insert_twobody_longrange.add_row(
727  make_vector(
728  batch_id_data, struct_id_data, resNum1_data, resNum2_data,
729  score_type_id_data, score_value_data, context_dependent_data));
730  }
731  }
732  }
733  }
734  }
735  insert_twobody_longrange.write_to_database(db_session);
736 }
737 
738 
739 
740 
741 } // namesapce
742 } // namespace