Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SimpleInteractionGraph.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/pack/interaction_graph/SimpleInteractionGraph.cc
11 /// @brief
12 /// @author Liz Kellogg (ekellogg@u.washington.edu)
13 
14 // Unit headers
16 
17 // Project headers
18 #include <core/graph/Graph.hh>
19 // AUTO-REMOVED #include <core/conformation/PointGraph.hh>
20 // AUTO-REMOVED #include <core/conformation/find_neighbors.hh>
22 #include <core/pose/Pose.hh>
23 
25 // AUTO-REMOVED #include <core/scoring/ScoreFunctionInfo.hh>
26 // AUTO-REMOVED #include <core/scoring/TenANeighborGraph.hh>
27 // AUTO-REMOVED #include <core/scoring/Energies.hh>
28 #include <core/scoring/util.hh>
29 // AUTO-REMOVED #include <core/scoring/methods/ContextIndependentTwoBodyEnergy.hh>
30 // AUTO-REMOVED #include <core/scoring/methods/ContextDependentTwoBodyEnergy.hh>
31 
32 // Basic headers
33 #include <basic/Tracer.hh>
34 // AUTO-REMOVED #include <basic/prof.hh>
35 
36 #include <utility/vector1.hh>
37 
38 
39 
40 namespace core {
41 namespace pack {
42 namespace interaction_graph {
43 
44 using namespace graph;
45 using namespace scoring;
46 
47 static basic::Tracer TR("core.pack.interaction_graph.SimpleInteractionGraph");
48 
49 SimpleNode::SimpleNode( Graph* owner, Size node_id ):
50  Node( owner, node_id ),
51  moved_(false),
52  resnum_( node_id ),
53  current_one_body_energy_(0),
54  alternate_one_body_energy_(0)
55 {
56  initialize();
57 }
58 
60 
61 void
63 {
64  /**
65  SimpleInteractionGraphCOP ig( static_cast< SimpleInteractionGraph const * >(Node::get_owner()));
66  runtime_assert( ig );
67  set_current( ig->pose().residue( resnum_ ) );
68  **/ //better to set up in graph initialization??
69 }
70 
71 Real
73 {
74  if( moved_ ){
76  } else{
78  }
79 }
80 
81 Real
83 {
85 }
86 
87 Real
89 {
91 }
92 
93 void
95 {
98 }
99 
100 void
102 {
103  moved_ = false;
105  for ( EdgeListIterator edge_itr = edge_list_begin(); edge_itr != edge_list_end(); ++edge_itr) {
106  //update energies
107  SimpleEdge* current_edge(static_cast< SimpleEdge *>(*edge_itr));
108  current_edge->commit_change();
109  }
110 }
111 
112 void
114 {
115  moved_ = false;
116 }
117 
118 bool
120  return moved_;
121 }
122 
123 void
125  //TR.Debug << "setting res " << res->seqpos() << " to current: " << std::endl;
126  if ( ! current_residue_ ) {
127  /// This is the first time current_ is being set; calculate backbone centroid and radius
128  /*bb_centroid_.zero();
129  Size count_n_bb( 0 );
130  for ( Size ii = 1; ii <= res->type().first_sidechain_atom() - 1; ++ii ) {
131  ++count_n_bb;
132  bb_centroid_ += res->xyz( ii );
133  }
134  if ( count_n_bb != 0 ) { bb_centroid_ /= count_n_bb; }
135  bb_radius_ = 0.0;
136  for ( Size ii = 1; ii <= res->type().first_sidechain_atom() - 1; ++ii ) {
137  Real d2 = res->xyz( ii ).distance_squared( bb_centroid_ );
138  if ( bb_radius_ < d2 ) bb_radius_ = d2;
139  }*/
140 
143  }
144 
145  current_residue_ = res;
148 
149  moved_ = false;
150  //current_residue_->update_actcoord();
152  //also update edge energies
153  for ( EdgeListIterator edge_itr = edge_list_begin(); edge_itr != edge_list_end(); ++edge_itr) {
154  //update energies
155  SimpleEdge* current_edge(static_cast< SimpleEdge *>(*edge_itr));
156  current_edge->update_current_energy();
157  }
158 }
159 
160 
161 void
163 {
164  //TR.Debug << "setting res " << res->seqpos() << " to alternate: " << std::endl;
165  if( alternate_residue_ != 0 && TR.Debug.visible() ) {
166  // output statements like this are very expensive, even when muted!
167  TR.Debug << "setting res " << alternate_residue_->type().name() << " to new-res: " << res->type().name() << std::endl;
168  }
169  alternate_residue_ = res;
170 
173 
174  moved_ = true;
175  //alternate_residue_->update_actcoord();
177  //also update edge energies
178  for( EdgeListIterator edge_itr = this->edge_list_begin();
179  edge_itr != this->edge_list_end();
180  ++edge_itr){
181  SimpleEdge* current_edge(static_cast< SimpleEdge *>(*edge_itr));
182  current_edge->update_proposed_energy();
183  }
184 }
185 
187 {
188  current_residue_ = res;
189 }
190 
192 {
193  alternate_residue_ = res;
194  moved_ = true;
195 }
196 
198 {
200  //also update edge energies
201  for( EdgeListIterator edge_itr = this->edge_list_begin();
202  edge_itr != this->edge_list_end(); ++edge_itr){
203  SimpleEdge* current_edge(static_cast< SimpleEdge *>(*edge_itr));
204  current_edge->update_proposed_energy();
205  }
206 }
207 
208 
211 {
212  return current_residue_;
213 }
214 
217 {
218  return alternate_residue_;
219 }
220 
221 Vector const &
223 {
224  return bb_centroid_;
225 }
226 
227 Real
229 {
230  return bb_radius_;
231 }
232 
233 Vector const &
235 {
236  return curr_sc_centroid_;
237 }
238 
239 Real
241 {
242  return curr_sc_radius_;
243 }
244 
245 Vector const &
247 {
248  return alt_sc_centroid_;
249 }
250 
251 Real
253 {
254  return alt_sc_radius_;
255 }
256 
257 void
259 {
260  SimpleInteractionGraph const * ig( static_cast< SimpleInteractionGraph const * >(Node::get_owner()));
261  runtime_assert( ig );
262  EnergyMap emap;
265  ig->scorefunction().eval_ci_1b( *current_residue_, ig->pose(), emap );
266  ig->scorefunction().eval_cd_1b( *current_residue_, ig->pose(), emap );
268 }
269 
270 void
272 {
273  assert( dynamic_cast< SimpleInteractionGraph const * >(Node::get_owner()) );
274 
275  SimpleInteractionGraph const * ig( static_cast< SimpleInteractionGraph const * >(Node::get_owner()));
276  EnergyMap emap;
279  ig->scorefunction().eval_ci_1b( *alternate_residue_, ig->pose(), emap );
280  ig->scorefunction().eval_cd_1b( *alternate_residue_, ig->pose(), emap );
282 }
283 
284 /*Vector
285 SimpleNode::calc_sc_centroid( conformation::Residue const & res ) const
286 {
287  Vector centroid( 0.0 );
288  Size count( 0 );
289  for ( Size ii = res.type().first_sidechain_atom(); ii <= res.type().nheavyatoms(); ++ii ) {
290  count += 1;
291  centroid += res.xyz( ii );
292  }
293  if ( count == 0 ) {
294  return bb_centroid_;
295  } else {
296  centroid /= count;
297  return centroid;
298  }
299 }
300 
301 Real
302 SimpleNode::calc_sc_radius( conformation::Residue const & res, Vector const & centroid )
303 {
304  Real max_d2 = 0;
305  for ( Size ii = res.type().first_sidechain_atom(); ii <= res.type().nheavyatoms(); ++ii ) {
306  Real d2 = res.xyz(ii).distance_squared( centroid );
307  if ( d2 > max_d2 ) max_d2 = d2;
308  }
309  return std::sqrt( max_d2 );
310 }*/
311 
312 
313 /*SimpleEdge::SimpleEdge( Graph* owner ):
314  Edge( owner, 0, 0 ),
315  current_energy_(0),
316  proposed_energy_(0)
317 {
318  for ( Size ii = 0; ii < 3; ++ii ) {
319  for ( Size jj = 0; jj < 3; ++jj ) {
320  bb_bbE_calced_[ ii ][ jj ] = false;
321  bb_bbE_[ ii ][ jj ] = -1234; // sentinel; this should never be returned.
322  }
323  }
324 }*/
325 
326 
327 SimpleEdge::SimpleEdge( Graph* owner, Size res1, Size res2 ):
328  Edge( owner, res1, res2 ),
329  long_range_energies_exist_( false ),
330  current_energy_(0),
331  proposed_energy_(0)
332 {
333  // compute_energy();
334  for ( Size ii = 0; ii < 3; ++ii ) {
335  for ( Size jj = 0; jj < 3; ++jj ) {
336  bb_bbE_calced_[ ii ][ jj ] = false;
337  bb_bbE_[ ii ][ jj ] = -1234; // sentinel; this should never be returned.
338  }
339  }
340 }
341 
343 
344 Real
346 {
347  return current_energy_;
348 }
349 
350 Real
352 {
353  return proposed_energy_;
354 }
355 
356 void
358 {
359  compute_energy( true, true );
360 }
361 
362 void
364 {
365  SimpleNode * node1( static_cast< SimpleNode * > (this->get_node( (platform::Size) 0 )));
366  SimpleNode * node2( static_cast< SimpleNode * > (this->get_node( (platform::Size) 1 )));
367  bool use_current_node1 = true;
368  bool use_current_node2 = true;
369  if ( node1->moved() ) {
370  use_current_node1 = false;
371  }
372  if ( node2->moved() ) {
373  use_current_node2 = false;
374  }
375  compute_energy( use_current_node1, use_current_node2 );
376 }
377 
378 void
380 {
382 }
383 
384 void
385 SimpleEdge::compute_energy( bool use_current_node1, bool use_current_node2 )
386 {
387  // TR.Debug << "num nodes " << (this->get_owner())->num_nodes() << std::endl;
388  SimpleNode * node1( static_cast< SimpleNode * > (this->get_node( (platform::Size) 0 )));
389  SimpleNode * node2( static_cast< SimpleNode * > (this->get_node( (platform::Size) 1 )));
390  assert( node1 && node2 );
393  Vector r1bb_centroid( node1->bb_centroid() ), r2bb_centroid( node2->bb_centroid() );
394  //Real r1bb_rad( node1->bb_radius() + 0.5 ), r2bb_rad( node2->bb_radius() + 0.5 );
395  Real r1bb_rad( node1->bb_radius() ), r2bb_rad( node2->bb_radius() );
396  Vector r1sc_centroid, r2sc_centroid;
397  Real r1sc_rad, r2sc_rad;
398  //std::string node1_used = "";
399  //std::string node2_used = "";
400 
401  if ( !use_current_node1 ) {
402  res1 = node1->get_alternate();
403  r1sc_centroid = node1->alt_sc_centroid();
404  r1sc_rad = node1->alt_sc_radius();
405  //node1_used= "alternate";
406  } else {
407  res1 = node1->get_current();
408  r1sc_centroid = node1->curr_sc_centroid();
409  r1sc_rad = node1->curr_sc_radius();
410  //node1_used = "current";
411  }
412 
413  if ( !use_current_node2 ) {
414  //node2_used = "alternate";
415  res2 = node2->get_alternate();
416  r2sc_centroid = node2->alt_sc_centroid();
417  r2sc_rad = node2->alt_sc_radius();
418  } else {
419  //node2_used = "current";
420  res2 = node2->get_current();
421  r2sc_centroid = node2->curr_sc_centroid();
422  r2sc_rad = node2->curr_sc_radius();
423  }
424  //r1sc_rad += 0.5;
425  //r2sc_rad += 0.5;
426 
427  //res1->update_actcoord();
428  //res2->update_actcoord();
429 
430  // TR.Debug << res1->seqpos() << " using " << node1_used << " " << res2->seqpos() << " " << node2_used << std::endl;
431 
432  assert( dynamic_cast< SimpleInteractionGraph const * >(this->get_owner()) );
433  SimpleInteractionGraph const * ig( static_cast< SimpleInteractionGraph const * >(this->get_owner()));
434  pose::Pose const & pose = ig->pose();
435  scoring::ScoreFunction const & sfxn = ig->scorefunction();
436  EnergyMap emap; // APL Note: class TwoBodyEnergyMap has been deprecated / removed
437 
438  //ig->scorefunction().eval_ci_2b( *res1, *res2, pose, emap );
439  //ig->scorefunction().eval_cd_2b( *res1, *res2, pose, emap );
440 
441  scoring::eval_scsc_sr2b_energies( *res1, *res2, r1sc_centroid, r2sc_centroid, r1sc_rad, r2sc_rad, pose, sfxn, emap );
442  scoring::eval_bbsc_sr2b_energies( *res1, *res2, r1bb_centroid, r2sc_centroid, r1bb_rad, r2sc_rad, pose, sfxn, emap );
443  scoring::eval_bbsc_sr2b_energies( *res2, *res1, r2bb_centroid, r1sc_centroid, r2bb_rad, r1sc_rad, pose, sfxn, emap );
444 
445 
446  Real energy =
447  ig->scorefunction().weights().dot( emap, ig->scorefunction().ci_2b_types() ) +
448  ig->scorefunction().weights().dot( emap, ig->scorefunction().cd_2b_types() ) +
449  get_bb_E( *res1, *res2 );
450  if ( use_current_node1 && use_current_node2 ) {
451  current_energy_ = energy;
452  } else {
453  proposed_energy_ = energy;
454  }
455 }
456 
457 Real
459 {
460  //return 0.0;
461 
462  Size const i1 = get_bb_index( r1 );
463  Size const i2 = get_bb_index( r2 );
464 
465  if ( ! bb_bbE_calced( i1, i2 ) ) {
466  SimpleInteractionGraph const * ig( static_cast< SimpleInteractionGraph const * >(this->get_owner()));
467  pose::Pose const & pose = ig->pose();
468  EnergyMap emap;
469  ig->scorefunction().eval_ci_2b_bb_bb( r1, r2, pose, emap );
470  ig->scorefunction().eval_cd_2b_bb_bb( r1, r2, pose, emap );
471  set_bb_bbE( i1, i2 , ig->scorefunction().weights().dot( emap, ig->scorefunction().ci_2b_types()) +
472  ig->scorefunction().weights().dot( emap, ig->scorefunction().cd_2b_types() ) );
473  set_bb_bbE_calced( i1, i2 );
474  //std::cout << get_first_node_ind() << " " << get_second_node_ind() << " get bb bb E " << bb_bbE( i1, i2 ) << std::endl;
475  }
476  return bb_bbE( i1, i2 );
477 }
478 
479 Size
481 {
482  using namespace chemical;
483  switch ( r.aa() ) {
484  case aa_pro : return 1;
485  case aa_gly : return 2;
486  default : return 0;
487  }
488 }
489 
490 bool
492 {
493  return ind1 <= 2 && ind2 <= 2; // 0 <= ind1 && 0 <= ind2 always hold
494 }
495 
496 bool
498 {
499  assert( bb_bb_boundaries( ind1, ind2 ));
500  return bb_bbE_calced_[ ind1 ][ ind2 ];
501 }
502 
503 void
505 {
506  assert( bb_bb_boundaries( ind1, ind2 ));
507  bb_bbE_calced_[ ind1 ][ ind2 ] = true;
508 }
509 
510 void
512 {
513  assert( bb_bb_boundaries( ind1, ind2 ));
514  bb_bbE_[ ind1 ][ ind2 ] = val;
515 }
516 
517 
518 Real
519 SimpleEdge::bb_bbE( Size ind1, Size ind2 ) const
520 {
521  assert( bb_bb_boundaries( ind1, ind2 ));
522  return bb_bbE_[ ind1 ][ ind2 ];
523 }
524 
526  Graph(),
527  sfxn_(),
528  pose_(),
529  accumulated_ediff_(0)
530 {}
531 
533 
535 {
536  sfxn_ = new scoring::ScoreFunction( sfxn );
537 }
538 
539 //set up all nodes of graph
540 void
542  TR.Debug << "calling initialize on pose " << std::endl;
543  set_pose_no_initialize( pose );
544  //Real current_energy = (*sfxn_)(*pose_); //DEBUG
545  runtime_assert( pose_ );
546  //Graph::delete_everything();//DEBUG
547  if ( num_nodes() != pose.total_residue() ) {
548  set_num_nodes( pose.total_residue() );
549  }
550  for ( Size res_i = 1; res_i <= pose_->total_residue(); res_i++ ) {
551  SimpleNode * newnode = static_cast< SimpleNode * >(get_node( res_i ));
552  runtime_assert( newnode );
553  newnode->set_current( new conformation::Residue( pose_->residue( res_i )) );
554  }
555 
556  //neighbors determined through ScoreFunction::are_they_neighbors function
557  for (Size ii = 1; ii <= pose_->total_residue(); ii++) {
558  for (Size jj = 1; jj < ii; jj++) {
559  //TR.Debug << "examining nodes " << jj << " " << ii << std::endl;
560  if ( sfxn_->are_they_neighbors( *pose_, jj, ii ) ) {
561  if( Graph::get_edge_exists( jj, ii ) ) {
562  SimpleEdge * existing_edge = static_cast< SimpleEdge * >( Graph::find_edge( jj, ii ) );
563  if( existing_edge ){
564  existing_edge->compute_energy( true, true );
565  }
566  } else {
567  /// NOOOOO SimpleEdge* newedge( new SimpleEdge( this, jj, ii ) ); //automatically adds edge upon creation
568  /// Edges should only be added to a graph using the "add_edge" method.
569 
570  SimpleEdge * newedge = static_cast< SimpleEdge * > ( add_edge( jj, ii ));
571  newedge->compute_energy( true, true );
572  //TR.Debug << "DEBUG2 these two residues are neighbors " << ii << " " << jj << std::endl;
573  }
574  }
575  }
576  }
577 }
578 
579 void
581 {
582  pose_ = new pose::Pose(pose);
583  if ( num_nodes() != pose.total_residue() ) {
584  set_num_nodes( pose.total_residue() );
585  }
586  for ( Size res_i = 1; res_i <= pose_->total_residue(); res_i++ ) {
587  SimpleNode * newnode = static_cast< SimpleNode * >(get_node( res_i ));
588  runtime_assert( newnode );
589  newnode->set_current( new conformation::Residue( pose_->residue( res_i )) );
590  }
591 }
592 
593 
594 void
596  static_cast< SimpleNode * >(get_node( node_id ))->commit_change();
597  //SimpleNode * node = static_cast< SimpleNode * >(get_node( node_id ));
598  //node->set_current( node->get_alternate() );
599 }
600 
601 void
603  static_cast< SimpleNode * >( get_node( node_id ) )->reject_change();
604 }
605 
606 /// @details Note, this function returns (currE - altE) which represents
607 /// the negative of the change in energy for the substition
608 Real
610  Real current_energy = 0.0;
611 
612  SimpleNode* thisnode = static_cast< SimpleNode *>(get_node( node_id ));
613 
614  for( EdgeListIterator edge_itr = thisnode->edge_list_begin();
615  edge_itr != thisnode->edge_list_end(); ++edge_itr){
616  //update energies
617  SimpleEdge* current_edge(static_cast< SimpleEdge *>(*edge_itr));
618  current_energy += current_edge->get_current_energy();
619  }
620  current_energy += thisnode->current_one_body_energy();
621 
622  thisnode->set_alternate( new_state );
623  //iterate over all edges
624  Real alternate_energy = 0.0;
625  for( EdgeListIterator edge_itr = thisnode->edge_list_begin();
626  edge_itr != thisnode->edge_list_end(); ++edge_itr){
627  //update energies
628  SimpleEdge* current_edge(static_cast< SimpleEdge *> (*edge_itr));
629  alternate_energy += current_edge->get_proposed_energy();
630  }
631  alternate_energy += thisnode->proposed_one_body_energy();
632  return (current_energy - alternate_energy); // this is -deltaE for the substitution
633 }
634 
635 
636 Real
638  //iterate over node ids
639  Real total_energy = 0.0;
640  for(Size node_itr = 1; node_itr <= pose_->total_residue(); node_itr++){
641  SimpleNode* thisnode = static_cast< SimpleNode *> (get_node( node_itr ));
642  Real residue_energy = thisnode->one_body_energy();
643  for( EdgeListIter edge_iter = thisnode->upper_edge_list_begin();
644  edge_iter != thisnode->upper_edge_list_end(); ++edge_iter){
645  residue_energy += (static_cast< SimpleEdge *>( *edge_iter ))->get_current_energy();
646  }
647  //TR.Debug << node_itr << ": total residue energy is " << residue_energy << std::endl;
648  total_energy += residue_energy;
649  }
650  return total_energy;
651 
652 }
653 
655  return new SimpleNode( this, node_index );
656 }
657 
659  return new SimpleEdge( this, index1, index2 );
660 }
661 
663 {
664  delete edge;
665 }
666 
667  /**
668 Edge* SimpleInteractionGraph::create_new_edge( Edge* example_edge ){
669  static_cast < SimpleEdge * >
670  return new SimpleEdge( example_edge );
671 }
672  **/
673 
674  /**
675 Real
676 SimpleInteractionGraph::total_alternate_energy() {
677  if( moved_ ){
678  //compute energies
679  moved_ = false;
680  }
681  return alternate_one_body_energy_ + alt_scsc_E + alt_bbsc_E + alt_scbb_E;
682 }
683  **/
684 
685 /**
686 bool
687 SimpleInteractionGraph::node_altered( Real const node_id ){
688  return node(node_id).is_altered();
689 }
690 **/ //needed?
691 
692 } //namespace interaction_graph
693 } //namespace pack
694 } //namespace core