Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
FlexbbInteractionGraph.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/flexpack/interaction_graph/FlexbbIteractionGraph.cc
11 /// @brief Declaration for flexible-backbone-packing interaction graph interface & base classes
12 /// @author Andrew Leaver-Fay (aleaverfay@gmail.com)
13 
14 /// Unit headers
16 
17 /// Package headers
19 
20 /// Project headers
22 #include <basic/Tracer.hh>
23 
24 /// C++ headers
25 #include <iostream>
26 
28 #include <utility/vector1.hh>
29 #include <ObjexxFCL/FArray1A.hh>
30 
31 
32 namespace protocols {
33 namespace flexpack {
34 namespace interaction_graph {
35 
36 using namespace ObjexxFCL;
37 
38 basic::Tracer TR( "protocols.flexpack.interaction_graph" );
39 
41  FlexbbInteractionGraph * owner,
42  int node_id,
43  int num_states
44 ) :
45  parent( owner, node_id, num_states ),
46  num_aa_types_( get_flexbbig_owner()->get_num_aa_types() ),
47  num_bb_( 1 ),
48  num_states_for_bb_( 1, num_states ),
49  state_offsets_for_bb_( 1, 0 ),
50  state_info_( num_states + 1 ),
51  one_body_energies_( num_states, 0.0 ),
52  current_state_( 0 ),
53  curr_state_one_body_energy_( 0.0 ),
54  curr_state_total_energy_( 0.0 ),
55  alternate_state_( 0 ),
56  alternate_state_one_body_energy_( 0.0 ),
57  alternate_state_total_energy_( 0.0 ),
58  alternate_state_is_being_considered_( false )
59 {
60  /// Default: for nodes without backbone moves, they will never have "set_num_states_per_backbone" called,
61  /// so set their state_info_ to the detaul backbone #1.
62  for ( int ii = 1; ii <= get_num_states(); ++ii ) {
63  state_info_[ ii ].set_bb( 1 );
64  }
65  //std::cout << "FlexbbNode ctor: num_aa_types_: " << num_aa_types_ << std::endl;
66 }
67 
69 
70 void
72  std::cout << "FlexbbNode " << get_node_index() << " #bb " << num_bb_
73  << " curr: " << current_state_ << " " << state_info_[ current_state_ ].get_aa_type()
74  << " " << state_info_[ current_state_ ].get_bb() << " energies: 1b: "
75  << curr_state_one_body_energy_ << " 2b: ";
76  for ( Size ii = 1; ii <= curr_state_two_body_energies_.size(); ++ii ) {
77  std::cout << curr_state_two_body_energies_[ ii ] << " ";
78  }
79  std::cout << std::endl;
80 }
81 
82 /// @details Requires that num_aa_types_ is set first; num_aa_types_ is currently set in the node's ctor.
83 void
85  assert( nbbconfs > 0 ); // cannot have fewer than 1 backbone conformation.
86  assert( num_aa_types_ != 0 );
87  num_bb_ = nbbconfs;
88  num_states_for_bb_.resize( nbbconfs, 0 );
89  state_offsets_for_bb_.resize( nbbconfs, 0 );
90  num_states_for_aa_for_bb_.dimension( num_aa_types_, nbbconfs );
92  state_offsets_for_aa_for_bb_.dimension( num_aa_types_, nbbconfs );
94  closest_state_on_alt_bb_.dimension( num_aa_types_, nbbconfs );
96 }
97 
98 /// @details precondition: num_bb_ must have been previously set and must be equal to the number
99 /// of backbones implicitly identified in num_states_for_bb by its size.
100 void
102 {
103  assert( num_states_for_bb_.size() == num_states_for_bb.size() );
104  assert( num_states_for_bb_.size() == state_offsets_for_bb_.size() );
105 
107  state_offsets_for_bb_[ 1 ] = 0;
108  for ( int ii = 2; ii <= num_bb_; ++ii ) {
109  state_offsets_for_bb_[ ii ] = state_offsets_for_bb_[ ii - 1 ] + num_states_for_bb_[ ii - 1 ];
110  }
111  int bbindex = 1;
112  for ( int ii = 1; ii <= get_num_states(); ++ii ) {
113  state_info_[ ii ].set_bb( bbindex );
114  if ( bbindex < num_bb_ && state_offsets_for_bb_[ bbindex + 1 ] == ii ) ++bbindex;
115  }
116 
117 }
118 
119 //int
120 //FlexbbNode::get_bb_for_state( int state ) const {
121 // return state_info_[ state ].get_bb();
122 //}
123 
124 int
126  return num_states_for_bb_[ bbconf ];
127 }
128 
129 int
131  return state_offsets_for_bb_[ bbconf ];
132 }
133 
134 void
136  utility::vector1< Size > & rotlist,
137  int rotamer_number_offset
138 ) const
139 {
140  Size const initial_size = rotlist.size();
141  int currbb = state_info_[ current_state_ ].get_bb();
142  if ( currbb == 0 ) currbb = 1;
143  rotlist.reserve( initial_size + num_states_for_bb_[ currbb ] );
144  for ( int ii = 1; ii <= num_states_for_bb_[ currbb ]; ++ii ) {
145  rotlist.push_back( rotamer_number_offset + state_offsets_for_bb_[ currbb ] + ii );
146  }
147 }
148 
149 void
151  utility::vector1< Size > & state_list,
152  int offset
153 ) const
154 {
155  Size const initial_size = state_list.size();
156  state_list.reserve( initial_size + get_num_states() );
157  for ( int ii = 1; ii <= get_num_states(); ++ii ) {
158  state_list.push_back( offset + ii );
159  }
160 }
161 
162 void
163 FlexbbNode::set_closest_states_on_other_bbs( ObjexxFCL::FArray2D_int const & closest_state_on_alt_bb )
164 {
166  for ( int ii = 1; ii <= get_num_states(); ++ii ) {
167  for ( int jj = 1; jj <= num_bb_; ++jj ) {
168  if ( state_info_[ ii ].get_bb() != jj && closest_state_on_alt_bb_( jj, ii ) == 0 ) {
169  TR << "Note state " << ii << " on FlexbbNode " << get_node_index() <<
170  " has no close alternate state on backbone " << jj << std::endl;
171  assert( state_info_[ closest_state_on_alt_bb_( jj, ii ) ].get_bb() == jj );
172  }
173  if ( closest_state_on_alt_bb_( jj, ii ) > get_num_states() ) {
174  std::cerr << "ALT STATE ON CLOSEST BB OUT OF RANGE: " << ii << " " << jj << " " << closest_state_on_alt_bb_( jj, ii ) << std::endl;
175  utility_exit();
176  }
177  }
178  }
179 }
180 
181 /// @details Precondition: num bb have already been set.
182 void
184 {
185  int state_index_for_aa = 1;
186  int last_aa = -1;
187  for ( int ii = 1; ii <= get_num_states(); ++ii ) {
188  assert( aatypes[ ii ] > 0 );
189  if ( aatypes[ ii ] != last_aa ) {
190  int temp_last_aa = last_aa;
191  last_aa = aatypes[ ii ];
192  if ( ii != 1 ) {
193  state_offsets_for_aa_for_bb_( last_aa, state_info_[ ii ].get_bb() ) =
194  state_offsets_for_aa_for_bb_( temp_last_aa, state_info_[ ii - 1 ].get_bb() )
195  + state_index_for_aa;
196  }
197  state_index_for_aa = 1;
198  }
199  state_info_[ ii ].set_aa_type( last_aa );
200  state_info_[ ii ].set_state_ind_for_this_aa_type( state_index_for_aa );
201  ++num_states_for_aa_for_bb_( last_aa, state_info_[ ii ].get_bb() );
202  }
203  //for ( Size ii = 1; ii <= num_bb_; ++ii ) {
204  // for ( Size jj = 1; jj <= num_aa_types_; ++jj ) {
205  // std::cout << get_node_index() << " " << ii << " " << jj << " " << num_states_for_aa_for_bb_( jj, ii ) << std::endl;
206  // }
207  //}
208 }
209 
210 FArray1A_int
212 {
213  return num_states_for_aa_for_bb_( 1, bb );
214 }
215 
216 
217 void
218 FlexbbNode::add_to_one_body_energies( FArray1< PackerEnergy > & energies )
219 {
220  assert( energies.size() == one_body_energies_.size() );
221  for ( Size ii = 1; ii <= one_body_energies_.size(); ++ii ) {
222  // if ( get_node_index() == 17 ) { std::cout << "FlexbbNode::add_to_one_body_energies " << ii << " " << energies( ii ) << " " << one_body_energies_[ ii ] << " " << one_body_energies_[ ii ] + energies( ii ) << std::endl; }
223  one_body_energies_[ ii ] += energies( ii );
224  }
225 }
226 
227 void
229 {
230  //if ( get_node_index() == 17 ) { std::cout << "FlexbbNode::add_to_one_body_energy " << state << " " << energy << " " << one_body_energies_[ state ] << " " << one_body_energies_[ state ] + energy << std::endl; }
231  one_body_energies_[ state ] += energy;
232 }
233 
234 /// @details Setter. This function is not called anywhere and should be removed...
235 void
237 {
238  one_body_energies_[ state ] = energy;
239 }
240 
242 {
243  std::fill( one_body_energies_.begin(), one_body_energies_.end(), 0.0f );
244 }
245 
247  return current_state_ == 0;
248 }
249 
250 
253 {
254  return one_body_energies_[ state ];
255 }
256 
257 void
259 {
261 }
262 
263 int
265 {
266  return current_state_;
267 }
268 
269 int
271 {
272  return state_info_[ current_state_ ].get_bb();
273 }
274 
275 void
277 {
278  nodes_states[ get_node_index() ] = current_state_;
279 }
280 
281 /// @details Edges must be informed of the alternate state for both
282 /// of their nodes; this should happen before any edge is asked for
283 /// an alternate-state energy.
284 bool
286 {
287  //std::cout << "Node " << get_node_index() << " inform_edges_of_alt_state_before_bbjump() " << std::endl;
289 
290  if (current_state_ == 0 || alternate_state_ == 0 ) return false;
291 
293 
294  for (int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
297  }
298 
299  return true;
300 }
301 
302 /// @details In a bbmove, did the backbone actually move? Should be called only
303 /// by the node who was initially contacted
304 //bool
305 //FlexbbNode::bb_move_actually_kept_original_bb() const {
306 // assert( node_contacted_by_graph_about_bb_move_ );
307 // return resolved_considered_bb_move_;
308 //}
309 
310 int
312 {
313  return num_states_for_aa_for_bb_( aa_type, bb );
314 }
315 
316 void
318 {
319  // stubbed out
320 }
321 
322 /// @details Numerical noise creeps in to the total_energy as energies are added and subtracted
323 /// due to neighbors accepting rotamer substitutions.
324 void
326 {
328  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
330  }
331 }
332 
333 unsigned int
335 {
336  unsigned int total = parent::count_dynamic_memory();
337  total += num_states_for_bb_.size() * sizeof( int );
338  total += state_offsets_for_bb_.size() * sizeof( int );
339  total += num_states_for_aa_for_bb_.size() * sizeof( int );
340  total += closest_state_on_alt_bb_.size() * sizeof( int );
341  return total;
342 }
343 
344 
346 {
348 
352 
353  std::fill( curr_state_two_body_energies_.begin(), curr_state_two_body_energies_.end(), 0.0 );
355  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
357  }
358 
359  return;
360 
361 }
362 
363 void
365 {
367  for (int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
369  }
370 
371 }
372 
373 
374 //bool
375 //FlexbbNode::energies_already_projected() const {
376  //std::cout << "energies already projected? " << get_node_index() << " " << projected_energies_for_bb_move_ << std::endl;
377  //bool temp = projected_energies_for_bb_move_;
378  //projected_energies_for_bb_move_ = true;
379  //return temp;
380 //}
381 
382 /*
383 void
384 FlexbbNode::reset_bbmove_bookkeeping_data() {
385  resolved_considered_bb_move_ = true;
386  told_edges_alt_state_for_bb_move_ = false;
387  projected_energies_for_bb_move_ = false;
388  node_contacted_by_graph_about_bb_move_ = false;
389 }
390 */
391 
392 void
394 {
396 }
397 
398 void
400 {
402  current_state_ = new_state;
403  current_state_info_ = state_info_[ new_state ];
404  alternate_state_ = new_state;
405  alternate_state_info_ = state_info_[ new_state ];
406  if ( new_state != 0 ) {
408  } else {
410  }
412 }
413 
414 void
416 {
417  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
420  }
421 }
422 
423 
425 {
427 
432 
433  std::copy( alternate_state_two_body_energies_.begin(),
436 
438 
439 }
440 
442 {
443  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
445  }
446 }
447 
449 {
450  for ( int ii = 1; ii <= get_num_incident_edges(); ++ii ) {
453  }
454  }
455 }
456 
457 //// EDGE
458 
460  FlexbbInteractionGraph * owner,
461  int first_node_ind,
462  int second_node_ind
463 ) :
464  parent( owner, first_node_ind, second_node_ind ),
465  nodes_part_of_same_flexseg_( get_flexbbig_owner()->nodes_from_same_flexseg( first_node_ind, second_node_ind ) ),
466  cur_energy_( 0.0 ),
467  alt_energy_( 0.0 ),
468  alt_e_up_to_date_( true ),
469  nodes_considering_bb_move_( false )
470 {
473  nodes_cur_state_[ 0 ] = 0;
474  nodes_cur_state_[ 1 ] = 0;
475  nodes_alt_state_[ 0 ] = 0;
476  nodes_alt_state_[ 1 ] = 0;
477 }
478 
480 
481 /// @details during backbone-moving rotamer substitutions, the nodes on
482 /// flexible segments must inform their edges of their new states.
483 void
485  int node_index,
486  int alternate_state,
487  FlexbbSparseMatrixIndex const & alt_state_info
488 )
489 {
490  alt_e_up_to_date_ = false;
491  int node_changed = which_node( node_index );
492 
493  assert( nodes_part_of_same_flexseg_ || ( nodes_cur_state_[ !node_changed ] == nodes_alt_state_[ !node_changed ] ));
494 
495  nodes_alt_state_[ node_changed ] = alternate_state;
496  nodes_alt_info_[ node_changed ] = alt_state_info;
497 
499  nodes_alt_info_[ node_changed ].get_bb() != nodes_cur_info_[ node_changed ].get_bb();
500 }
501 
502 void
504  int node_index,
505  int new_state,
506  FlexbbSparseMatrixIndex const & state_info
507 )
508 {
509  alt_e_up_to_date_ = false;
511 
512  int node_changed = which_node( node_index );
513  nodes_cur_state_[ node_changed ] = new_state;
514  nodes_cur_info_[ node_changed ] = state_info;
515  nodes_alt_state_[ node_changed ] = new_state;
516  nodes_alt_info_[ node_changed ] = state_info;
517 
518  cur_energy_ = -1234;
519  alt_energy_ = -1234;
520 }
521 
522 void
524 {
526  nodes_cur_info_[ 0 ] = nodes_alt_info_[ 0 ];
528  nodes_cur_info_[ 1 ] = nodes_alt_info_[ 1 ];
531 }
532 
533 void
535 {
537  nodes_alt_info_[ 0 ] = nodes_cur_info_[ 0 ];
539  nodes_alt_info_[ 1 ] = nodes_cur_info_[ 1 ];
542  alt_e_up_to_date_ = true;
543 }
544 
545 
546 unsigned int
548 {
550 }
551 
552 void
554 {
555  assert( alt_e_up_to_date_ );
556 
559  nodes_cur_info_[ 0 ] = nodes_alt_info_[ 0 ];
560  nodes_cur_info_[ 1 ] = nodes_alt_info_[ 1 ];
562 
564 }
565 
566 void
568 {
571  cur_energy_ = alt_energy_ = 0;
572  alt_e_up_to_date_ = true;
574 
575 }
576 
577 /// GRAPH
578 
581  parent( num_nodes ),
582  num_aa_types_( 0 ),
583  total_energy_current_state_assignment_( 0.0 ),
584  total_energy_alternate_state_assignment_( 0.0 ),
585  node_considering_alt_state_( 0 ),
586  flexseg_considering_alt_bb_( 0 ),
587  num_flexible_segments_( 0 ),
588  num_total_bb_( 0 ),
589  flexseg_for_moltenres_( num_nodes, 0 ),
590  enforce_bb_contiguity_( true ),
591  last_considered_backbone_sub_valid_( true ),
592  last_considered_backbone_sub_unresolved_( false ),
593  last_considered_fixedbb_sub_unresolved_( false ),
594  num_nodes_changing_state_( 0 ),
595  num_commits_since_last_update_( 0 )
596 {}
597 
598 void
600 {
601  using namespace rotamer_set;
602  using namespace core::conformation;
603  using namespace core;
604 
605  assert( dynamic_cast< FlexbbRotamerSets const * > ( & rot_sets ) );
606  rotamer_set::FlexbbRotamerSets const & flex_sets( static_cast< rotamer_set::FlexbbRotamerSets const & > ( rot_sets ) );
607 
608  /// Set Graph data:
609  /// 1. flexseg and bb id mappings.
610  set_num_flexsegs( flex_sets.nflexible_segments() );
612 
613  if ( num_flexible_segments_ != 0 ) { flexseg_bb_offset_[ 1 ] = 0; }
614  for ( int ii = 1; ii <= num_flexible_segments_; ++ii ) {
615  //flexseg_representative_[ ii ] = flex_sets.flexsegment_start_moltenresid( ii );
616  /// List all the moltenresidues in this flexible segment.
617  flexseg_members_[ ii ].resize( flex_sets.flexsegment_stop_moltenresid( ii ) - flex_sets.flexsegment_start_moltenresid( ii ) + 1 );
618  for ( Size jj = 1; jj <= flexseg_members_[ ii ].size(); ++jj ) {
619  flexseg_members_[ ii ][ jj ] = flex_sets.flexsegment_start_moltenresid( ii ) - 1 + jj;
620  }
621  Size const ii_nbb = flex_sets.nbbconfs_for_moltenres( flexseg_members_[ ii ][ 1 ] );
622  num_bb_alternatives_for_flexseg_[ ii ] = ii_nbb;
623  if ( ii > 1 ) {
625  }
626  }
627  int flexseg_id( 1 );
628  for ( int ii = 1; ii <= num_total_bb_; ++ii ) {
629  if ( flexseg_id < num_flexible_segments_ && ii > flexseg_bb_offset_[ flexseg_id + 1 ] ) {
630  ++flexseg_id;
631  }
632  flexseg_for_bb_[ ii ] = flexseg_id;
633  }
634  for ( int ii = 1; ii <= get_num_nodes(); ++ii ) {
635  flexseg_for_moltenres_[ ii ] = flex_sets.flexsegid_for_moltenres( ii );
636  }
637 
638  // 2. determine max # of residue types, asking the RotamerSets how many rotamer type groups they have
639  Size max_nresgroups = 0;
640  for ( Size ii = 1; ii <= flex_sets.nmoltenres(); ++ii ) {
641  for ( Size jj = 1; jj <= flex_sets.nbbconfs_for_moltenres( ii ); ++jj ) {
642  Size jj_nresgroups = flex_sets.rotset_for_moltenres( ii, jj )->get_n_residue_groups();
643  //std::cout << ii << " " << jj << " jj_nrestypes: " << jj_nrestypes << " " << flex_sets.rotset_for_moltenres( ii, jj ).get() << std::endl;
644  if ( jj_nresgroups > max_nresgroups ) max_nresgroups = jj_nresgroups;
645  }
646  }
647  //std::cout << "MAX_NRESTYPES: " << max_nrestypes << std::endl;
648  num_aa_types_ = max_nresgroups;
649 
650  /// 3. create nodes, inform them of their number of backbone conformations,
651  /// and break down their rotamers by amino acid type.
652  for ( Size ii = 1; ii <= flex_sets.nmoltenres(); ++ii ) {
653  Size const ii_num_states = flex_sets.nrotamers_for_moltenres( ii );
654  Size const ii_nbb = flex_sets.nbbconfs_for_moltenres( ii );
655  set_num_states_for_node( ii, ii_num_states ); // allocate the node.
658 
659  // figure out which residue-type group each rotamer is a member of
660  utility::vector1< int > aatype_for_state( ii_num_states, 0 );
661  Size curr_resgroup = 1;
662  Size count_for_resgroup = 1;
663  Size const ii_nresgroups = flex_sets.rotset_for_moltenres( ii )->get_n_residue_groups();
664  Size which_bb = 1;
665  for ( Size jj = 1; jj <= ii_num_states; ++jj ) {
666  if ( which_bb + 1 <= ii_nbb && jj == flex_sets.local_rotid_start_for_moltenres_in_bbconf( ii, which_bb + 1 ) + 1 ) {
667  ++which_bb;
668  curr_resgroup = 1;
669  count_for_resgroup = 1;
670  }
671  aatype_for_state[ jj ] = curr_resgroup;
672  ++count_for_resgroup;
673  while ( count_for_resgroup > flex_sets.rotset_for_moltenres( ii, which_bb )->get_n_rotamers_for_residue_group( curr_resgroup )) {
674  // increment curr_restype and skip over restypes with 0 rotamers
675  ++curr_resgroup;
676  count_for_resgroup = 1;
677  if ( curr_resgroup > ii_nresgroups ) break;
678  }
679  }
680  set_aatypes_for_node( ii, aatype_for_state );
681  }
682 
683  /// 4. Figure out for each rotamer on each residue with multiple backbone conformations
684  /// what the closest rotamer on would be for each alternate backbone conformation.
685  for ( int ii = 1; ii <= get_num_nodes(); ++ii ) {
686  Size const ii_nbb( get_flexbb_node( ii )->get_num_distinct_backbones() );
687  if ( ii_nbb == 1 ) continue;
688 
689  FArray2D_int best_match( ii_nbb, flex_sets.nrotamers_for_moltenres( ii ), 0 );
690  for ( Size jj = 1; jj <= ii_nbb; ++jj ) {
691  Size jjoffset = flex_sets.local_rotid_start_for_moltenres_in_bbconf( ii, jj );
692  FlexbbRotamerSetCOP jj_flexset( flex_sets.rotset_for_moltenres( ii, jj ));
693  for ( Size kk = 1; kk <= ii_nbb; ++kk ) {
694  FlexbbRotamerSetCOP kk_flexset( flex_sets.rotset_for_moltenres(ii, kk ));
695  if ( jj == kk ) continue; // skip diagonal.
696 
697  utility::vector1< Size > kk_rotamers_matching_ll;
698  for ( int ll = 1; ll <= get_flexbb_node( ii )->get_num_states_for_bb( jj ); ++ll ) {
699  if ( ll == 1 || jj_flexset->rotamer( ll )->name() != jj_flexset->rotamer( ll - 1 )->name() ) {
700  kk_rotamers_matching_ll.clear();
701  for ( Size mm = 1; mm <= kk_flexset->num_rotamers(); ++mm ) {
702  if ( jj_flexset->rotamer( ll )->name() == kk_flexset->rotamer( mm )->name() ) {
703  kk_rotamers_matching_ll.push_back( mm );
704  }
705  }
706  }
707  ResidueCOP llrotop = jj_flexset->rotamer( ll );
708  Residue const & llrot( *llrotop );
709 
710  /// Now iterate across the rotamers with the same name and compute rms.
711  Size best_match_index( 0 );
712  Real best_rms( 12345 );
713  for ( Size mm = 1; mm <= kk_rotamers_matching_ll.size(); ++mm ) {
714  Size const mm_rotid = kk_rotamers_matching_ll[ mm ];
715  ResidueCOP mmrotop = kk_flexset->rotamer( mm_rotid );
716  Residue const & mmrot( *mmrotop );
717  assert( llrot.name() == mmrot.name() );
718 
719  Real mm_rms( 0.0 );
720  for ( Size nn = 1; nn <= llrot.natoms(); ++nn ) {
721  mm_rms += llrot.xyz( nn ).distance_squared( mmrot.xyz( nn ));
722  }
723  if ( mm == 1 || best_rms > mm_rms ) {
724  best_match_index = mm_rotid;
725  best_rms = mm_rms;
726  }
727  }
728  best_match( kk, ll + jjoffset ) =
729  flex_sets.local_rotid_start_for_moltenres_in_bbconf( ii, kk ) + best_match_index;
730 
731  }
732  }
733  }
735 
736  }
737 }
738 
739 void
741 {
742  num_flexible_segments_ = num_flexsegs;
743  //flexseg_representative_.resize( num_flexible_segments_ );
745  //std::fill( flexseg_representative_.begin(), flexseg_representative_.end(), 0 );
747  std::fill( flexseg_bb_offset_.begin(), flexseg_bb_offset_.end(), 0 );
750 
751 }
752 
753 void
755 {
756  num_total_bb_ = num_backbones;
757  flexseg_for_bb_.resize( num_backbones );
758  std::fill( flexseg_for_bb_.begin(), flexseg_for_bb_.end(), 0 );
759  flexseg_bb_offset_.resize( num_backbones );
760  std::fill( flexseg_bb_offset_.begin(), flexseg_bb_offset_.end(), 0 );
761 }
762 
763 
764 bool
766 {
767  return flexseg_for_moltenres_[ node1 ] == flexseg_for_moltenres_[ node2 ];
768 }
769 
770 /// @details Only call once. -- depricated!
771 //void
772 //FlexbbInteractionGraph::set_representitive_node_for_flexseg( int flexseg, int node_index)
773 //{
774 // assert( flexseg_representative_[ flexseg ] == 0 );
775 // flexseg_representative_[ flexseg ] = node_index;
776 //}
777 
778 /// @details Must include initial backbone as well all the alternative backbones.
779 void
781 {
783 }
784 
785 void
787  int node, utility::vector1< int > const & states_per_bb
788 )
789 {
790  get_flexbb_node( node )->set_num_states_per_backbone( states_per_bb );
791 }
792 
793 int
795 {
796  return get_flexbb_node( node )->get_num_states_for_bb( bb );
797 }
798 
799 int
800 FlexbbInteractionGraph::get_bb_for_state( int node, int state ) const
801 {
802  return get_flexbb_node( node )->get_bb_for_state( state );
803 }
804 
805 void
807  int node_ind,
808  utility::vector1< int > const & aatypes
809 )
810 {
811  get_flexbb_node( node_ind )->set_amino_acid_types( aatypes );
812 }
813 
814 void
816  int node_ind,
817  FArray2D_int const & closest_states
818 )
819 {
820  get_flexbb_node( node_ind )->set_closest_states_on_other_bbs( closest_states );
821 }
822 
823 /*
824 void
825 FlexbbInteractionGraph::set_edge_connecting_nodes_on_same_flexseg( int node1, int node2 )
826 {
827  FlexbbEdge * edge = find_flexbb_edge( node1, node2 );
828  if ( ! edge && std::abs( node1 - node2 ) == 1 ) {
829  add_edge( node1, node2 );
830  edge = find_flexbb_edge( node1, node2 );
831  } else if ( !edge ) {
832  return;
833  }
834 
835  edge->set_nodes_from_same_flexseg( true );
836 
837 }
838 */
839 
840 void
842  Subsitution move_mode,
843  utility::vector1< Size > & rotlist
844 ) const
845 {
846  rotlist.clear();
847  for ( int ii = 1; ii <= get_num_nodes(); ++ii ) {
848  if ( move_mode == SC_ONLY ) {
850  } else {
851  get_flexbb_node( ii )->get_all_states( rotlist, get_node_state_offset( ii ) );
852  }
853  }
854 }
855 
856 void
858  utility::vector1< Size > & bblist
859 ) const
860 {
861  bblist.resize( num_total_bb_ );
862  for ( Size ii = 1; ii <= bblist.size(); ++ii ) {
863  bblist[ ii ] = ii;
864  }
865 }
866 
867 /// @brief Is the backbone conformation (in the global enumertion of backbone conformations) already
868 /// assigned to the network? False if any residue on the flexible segment that this bbid corresponds to
869 /// is assigned state 0.
870 bool
872 {
873  int flexsegid = flexseg_for_bb_[ bbid ];
874  //int representative_node = flexseg_representative_[ flexsegid ];
875  int representative_node = flexseg_members_[ flexsegid ][ 1 ];
876  return bbid == get_flexbb_node( representative_node )->get_backbone_for_current_state();
877 }
878 
879 /// @brief FlexbbNodes will ask: am I allowed to have a state that breaks the backbone?
880 /// There are brief periods when the backbone is "broken" as the graph assigns new states to
881 /// nodes on the same flexible segment.
882 bool
884 {
885  return enforce_bb_contiguity_;
886 }
887 
888 /// @brief I don't remember what this is for... prev: increment_count_nodes_in_moving_fragment
889 void
891 {
893 }
894 
895 unsigned int
897 {
898  unsigned int total = parent::count_dynamic_memory();
899  //total += flexseg_representative_.size() * sizeof( int );
900  total += flexseg_members_.size() * sizeof( utility::vector1< Size > );
901  for ( Size ii = 1; ii <= flexseg_members_.size(); ++ii ) {
902  total += flexseg_members_[ ii ].size() * sizeof( Size );
903  }
904  total += num_bb_alternatives_for_flexseg_.size() * sizeof( int );
905  total += flexseg_for_bb_.size() * sizeof( int );
906  total += flexseg_bb_offset_.size() * sizeof( int );
907  return total;
908 }
909 
910 void
912 {
915 
918  }
919 }
920 
921 void
923 {
924  enforce_bb_contiguity_ = setting;
925 }
926 
927 
928 void
930 {
932 }
933 
934 void
936 {
937  /// The node contacted by the graph about the backbone move
938  /// does not invoke increment on this count. Therefore,
939  /// the count for the number of changing nodes starts at one.
941 }
942 
943 int
945 {
947 }
948 
950 {
951  //PackerEnergy prev = total_energy_current_state_assignment_;
953  for (int ii = 1; ii <= get_num_nodes(); ++ii) {
956  }
957  for (std::list<EdgeBase*>::iterator
958  iter = get_edge_list_begin();
959  iter != get_edge_list_end(); ++iter) {
961  cast_flexbb_edge(*iter)->cur_energy();
962  }
964  //std::cout << "Updated current energy totals: " << total_energy_current_state_assignment_ << " delta: " << total_energy_current_state_assignment_ - prev << std::endl;
965 }
966 
967 
968 }
969 }
970 }
971