Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
CentroidDisulfideEnergyContainer.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 sw=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file core/scoring/disulfides/ConstraintsEnergyContainer.cc
11 /// @brief Constraints Energy Container class implementation
12 /// @author Spencer Bliven <blivens@u.washington.edu>
13 
14 // Unit headers
16 
17 // Package headers
19 
20 // Project headers
26 #include <core/pose/Pose.hh>
27 #include <basic/Tracer.hh>
28 
29 // STL Headers
30 #include <cassert>
31 
33 #include <utility/vector1.hh>
34 
35 
36 namespace core {
37 namespace scoring {
38 namespace disulfides {
39 
40 static basic::Tracer TR("core.scoring.disulfides.CentroidDisulfideEnergyContainer");
41 
42 /// @brief constructor
45  Size focused_residue,
46  Size disulfide_index
47  ) :
48  owner_( owner ),
49  focused_residue_( focused_residue ),
50  disulfide_index_( disulfide_index )
51 {}
52 
53 /// @brief constructor, default to no disulfide bond
56  )
57 :
58  owner_( owner ),
59  focused_residue_( CentroidDisulfideEnergyContainer::NO_DISULFIDE ),
60  disulfide_index_( CentroidDisulfideEnergyContainer::NO_DISULFIDE )
61 {}
62 
64 {}
65 
66 /// @brief Assignment
69 {
70  assert( &(dynamic_cast< CentroidDisulfideNeighborIterator const & > ( rhs )) );
71  CentroidDisulfideNeighborIterator const & drni_rhs = static_cast< CentroidDisulfideNeighborIterator const & > ( rhs );
72 
73  owner_ = drni_rhs.owner_;
76  return *this;
77 }
78 
79 /// @note Incrementing an iterator in a list with exactly one element moves that
80 /// iterator off the end of the list.
83 {
87  return *this;
88 }
89 
90 bool
92 {
93  assert( &( dynamic_cast< CentroidDisulfideNeighborIterator const & > ( rhs )) );
94  CentroidDisulfideNeighborIterator const & drni_rhs = static_cast< CentroidDisulfideNeighborIterator const & > ( rhs );
95 
96  return ( owner_ == drni_rhs.owner_ &&
97  focused_residue_ == drni_rhs.focused_residue_ &&
98  disulfide_index_ == drni_rhs.disulfide_index_ );
99 }
100 
101 bool
103 {
104  assert( &( dynamic_cast< CentroidDisulfideNeighborIterator const & > ( rhs )) );
105  CentroidDisulfideNeighborIterator const & drni_rhs = static_cast< CentroidDisulfideNeighborIterator const & > ( rhs );
106  return ( owner_ != drni_rhs.owner_ ||
107  focused_residue_ != drni_rhs.focused_residue_ ||
108  disulfide_index_ != drni_rhs.disulfide_index_ );
109 }
110 
111 /// @brief Get the higher-numbered residue for this disulfide bond
112 Size
114 {
116  return owner_->upper_neighbor_id( disulfide_index_ );
117 }
118 
119 /// @brief Get the lower-numbered residue for this disulfide bond
120 Size
122 {
124  return owner_->lower_neighbor_id( disulfide_index_ );
125 }
126 
127 /// @brief Which residue are we looking for disulfide bonds to?
128 Size
130 {
131  return focused_residue_;
132 }
133 
134 /// @brief Which residue is disulfide bonded to the current residue?
135 Size
137 {
138  return owner_->other_neighbor_id( disulfide_index_, focused_residue_ );
139 }
140 
141 /// @brief Save the specified energies for this disulfide to the
142 /// CentroidDisulfideEnergyContainer associated with this iterator.
143 void
145 {
147  owner_->save_energy( disulfide_index_, emap );
148 }
149 
150 /// @brief Get the energies for the current disulfide bond from the
151 /// CentroidDisulfideEnergyContainer associated with this iterator.
152 void
154 {
156  owner_->retrieve_energy( disulfide_index_, emap );
157 }
158 
159 /// @brief Add some energies to the totals already in CentroidDisulfideEnergyContainer
160 void
162 {
164  owner_->accumulate_energy( disulfide_index_, emap );
165 }
166 
168 {
170  owner_->mark_energy_computed( disulfide_index_ );
171 }
172 
174 {
176  owner_->mark_energy_uncomputed( disulfide_index_ );
177 }
178 
179 
180 bool
182 {
184  return owner_->energy_computed( disulfide_index_ );
185 }
186 
187 ////////////////////////////////////////////////////////////////////////
188 ///// Disulfide Residue Neighbor Constant Iterator class implementation
189 ////////////////////////////////////////////////////////////////////////
190 
193  Size focused_residue,
194  Size disulfide_index
195  ) :
196  owner_( owner ),
197  focused_residue_( focused_residue ),
198  disulfide_index_( disulfide_index )
199 {}
200 
203  ) :
204  owner_( owner ),
205  focused_residue_( CentroidDisulfideEnergyContainer::NO_DISULFIDE ),
206  disulfide_index_( CentroidDisulfideEnergyContainer::NO_DISULFIDE )
207 {}
208 
210 {}
211 
214 {
215  assert( &(dynamic_cast< CentroidDisulfideNeighborConstIterator const & > ( rhs )) );
216  CentroidDisulfideNeighborConstIterator const & drni_rhs = static_cast< CentroidDisulfideNeighborConstIterator const & > ( rhs );
217 
218  owner_ = drni_rhs.owner_;
221  return *this;
222 
223 }
224 
227 {
231  return *this;
232 }
233 
234 /// @brief returns true if the two edge-list iterators are equal
235 bool
237 {
238  assert( &( dynamic_cast< CentroidDisulfideNeighborConstIterator const & > ( rhs )) );
239  CentroidDisulfideNeighborConstIterator const & drni_rhs = static_cast< CentroidDisulfideNeighborConstIterator const & > ( rhs );
240 
241  return ( owner_ == drni_rhs.owner_ &&
242  focused_residue_ == drni_rhs.focused_residue_ &&
243  disulfide_index_ == drni_rhs.disulfide_index_ );
244 }
245 
246 
247 /// @brief returns true if the two edge-list iterators are not equal
248 bool
250 {
251  assert( &( dynamic_cast< CentroidDisulfideNeighborConstIterator const & > ( rhs )) );
252  CentroidDisulfideNeighborConstIterator const & drni_rhs = static_cast< CentroidDisulfideNeighborConstIterator const & > ( rhs );
253  return ( owner_ != drni_rhs.owner_ ||
254  focused_residue_ != drni_rhs.focused_residue_ ||
255  disulfide_index_ != drni_rhs.disulfide_index_ );
256 }
257 
258 Size
260 {
262  return owner_->upper_neighbor_id( disulfide_index_ );
263 }
264 
265 Size
267 {
269  return owner_->lower_neighbor_id( disulfide_index_ );
270 }
271 
272 
273 Size
275 {
276  return focused_residue_;
277 }
278 
279 Size
281 {
282  return owner_->other_neighbor_id( disulfide_index_, focused_residue_ );
283 }
284 
285 /// @brief overwrites the three constraint-energy positions in the emap with
286 /// the three contraint energies stored on the edge pointed to by the edge iter.
287 /// Does not zero out the other positions in the emap.
288 void
290 {
292  owner_->retrieve_energy( disulfide_index_, emap );
293 }
294 
295 /// @brief accumulates the three constraint-energy positions in the emap with
296 /// the three contraint energies stored on the edge pointed to by the edge iter.
297 /// Does not touch the other positions in the emap.
298 void
300 {
302  owner_->accumulate_energy( disulfide_index_, emap );
303 }
304 
305 bool
307 {
309  return owner_->energy_computed( disulfide_index_ );
310 }
311 
312 
313 /////////////////////////////////////////////////////
314 /// Disulfide Energy Container Class Implementation
315 /////////////////////////////////////////////////////
316 
318 
319 
321 {}
322 
323 bool
325 {
326  return num_disulfides() == 0;
327 }
328 
329 
331 {
332  find_disulfides( pose );
333 }
334 
335 void
337 {
338  if ( disulfides_changed( pose ) ) find_disulfides( pose );
339 }
340 
342 {}
343 
346 {
348  if ( !empty() ) {
349  dec->disulfide_atom_indices_ = disulfide_atom_indices_;
350  dec->disulfide_residue_types_ = disulfide_residue_types_;
351  dec->resid_2_disulfide_index_ = resid_2_disulfide_index_;
352  dec->disulfide_partners_ = disulfide_partners_;
353  dec->disulfide_info_ = disulfide_info_;
354  }
355  return dec;
356 }
357 
360 {
361  assert( !empty() );
362  if ( resid_2_disulfide_index_[ resid ] != NO_DISULFIDE ) {
363  return new CentroidDisulfideNeighborConstIterator( this, resid, resid_2_disulfide_index_[ resid ] );
364  }
365  else {
366  return new CentroidDisulfideNeighborConstIterator( this );
367  }
368 }
369 
372 {
373  assert( !empty() );
374  return new CentroidDisulfideNeighborConstIterator( this );
375 }
376 
379 {
380  assert( !empty() );
381  if ( resid_2_disulfide_index_[ resid ] != NO_DISULFIDE &&
382  (Size) resid < other_neighbor_id( resid_2_disulfide_index_[ resid ], resid ) ) {
383  return new CentroidDisulfideNeighborConstIterator( this, resid, resid_2_disulfide_index_[ resid ] );
384  }
385  else {
386  return new CentroidDisulfideNeighborConstIterator( this );
387  }
388 }
389 
392 {
393  assert( !empty() );
394  return new CentroidDisulfideNeighborConstIterator( this );
395 }
396 
399 {
400  assert( !empty() );
401  if ( resid_2_disulfide_index_[ resid ] != NO_DISULFIDE ) {
402  return new CentroidDisulfideNeighborIterator( this, resid, resid_2_disulfide_index_[ resid ] );
403  }
404  else {
405  return new CentroidDisulfideNeighborIterator( this );
406  }
407 }
408 
411 {
412  assert( !empty() );
413  return new CentroidDisulfideNeighborIterator( this );
414 }
415 
418 {
419  if ( resid_2_disulfide_index_[ resid ] != NO_DISULFIDE &&
420  (Size) resid < other_neighbor_id( resid_2_disulfide_index_[ resid ], resid ) ) {
421  return new CentroidDisulfideNeighborIterator( this, resid, resid_2_disulfide_index_[ resid ] );
422  }
423  else {
424  return new CentroidDisulfideNeighborIterator( this );
425  }
426 }
427 
430 {
431  assert( !empty() );
432  return new CentroidDisulfideNeighborIterator( this );
433 }
434 
435 bool
437 {
438  if ( empty() ) return false;
439  return resid_2_disulfide_index_[ res1id ] != NO_DISULFIDE &&
440  resid_2_disulfide_index_[ res2id ] != NO_DISULFIDE &&
441  resid_2_disulfide_index_[ res1id ] == resid_2_disulfide_index_[ res2id ];
442 }
443 
444 bool
446 {
447  if ( empty() ) return false;
448  return resid_2_disulfide_index_[ resid ] != NO_DISULFIDE;
449 }
450 
451 Size
453 {
454  return other_neighbor_id( resid_2_disulfide_index_[ resid ], resid );
455 }
456 
457 
458 // Mutators
459 void
461 {
462  disulfide_info_[ disulfide_index ].first.dslfc_cen_dst() = emap[ dslfc_cen_dst ];
463  disulfide_info_[ disulfide_index ].first.dslfc_cb_dst() = emap[ dslfc_cb_dst ];
464  disulfide_info_[ disulfide_index ].first.dslfc_ang() = emap[ dslfc_ang ];
465  disulfide_info_[ disulfide_index ].first.dslfc_cb_dih() = emap[ dslfc_cb_dih ];
466  disulfide_info_[ disulfide_index ].first.dslfc_bb_dih() = emap[ dslfc_bb_dih ];
467 }
468 
469 void
471 {
472  disulfide_info_[ disulfide_index ].second = true;
473 }
474 
475 void
477 {
478  disulfide_info_[ disulfide_index ].second = false;
479 }
480 
481 // Accessors
483 {
484  return disulfide_partners_[ disulfide_index ].first;
485 }
486 
488 {
489  return disulfide_partners_[ disulfide_index ].second;
490 }
491 
493 {
494  assert( disulfide_partners_[ disulfide_index ].first == resid ||
495  disulfide_partners_[ disulfide_index ].second == resid );
496  return ( resid == disulfide_partners_[ disulfide_index ].first ?
497  disulfide_partners_[ disulfide_index ].second :
498  disulfide_partners_[ disulfide_index ].first );
499 }
500 
501 DisulfideAtomIndices const &
503 {
504  Size const disulfide_index( resid_2_disulfide_index_[ resid ] );
505  assert( disulfide_index != NO_DISULFIDE );
506  assert( disulfide_partners_[ disulfide_index ].first == resid ||
507  disulfide_partners_[ disulfide_index ].second == resid );
508  return ( resid == disulfide_partners_[ disulfide_index ].first ?
509  disulfide_atom_indices_[ disulfide_index ].first :
510  disulfide_atom_indices_[ disulfide_index ].second );
511 }
512 
513 
514 DisulfideAtomIndices const &
516 {
517  Size const disulfide_index( resid_2_disulfide_index_[ resid ] );
518  assert( disulfide_index != NO_DISULFIDE );
519  assert( disulfide_partners_[ disulfide_index ].first == resid ||
520  disulfide_partners_[ disulfide_index ].second == resid );
521  return ( resid == disulfide_partners_[ disulfide_index ].first ?
522  disulfide_atom_indices_[ disulfide_index ].second :
523  disulfide_atom_indices_[ disulfide_index ].first );
524 }
525 
526 
528 {
529  emap[ dslfc_cen_dst ] += disulfide_info_[ disulfide_index ].first.dslfc_cen_dst();
530  emap[ dslfc_cb_dst ] += disulfide_info_[ disulfide_index ].first.dslfc_cb_dst();
531  emap[ dslfc_ang ] += disulfide_info_[ disulfide_index ].first.dslfc_ang();
532  emap[ dslfc_cb_dih ] += disulfide_info_[ disulfide_index ].first.dslfc_cb_dih();
533  emap[ dslfc_bb_dih ] += disulfide_info_[ disulfide_index ].first.dslfc_bb_dih();
534 }
535 
537 {
538  emap[ dslfc_cen_dst ] = disulfide_info_[ disulfide_index ].first.dslfc_cen_dst();
539  emap[ dslfc_cb_dst ] = disulfide_info_[ disulfide_index ].first.dslfc_cb_dst();
540  emap[ dslfc_ang ] = disulfide_info_[ disulfide_index ].first.dslfc_ang();
541  emap[ dslfc_cb_dih ] = disulfide_info_[ disulfide_index ].first.dslfc_cb_dih();
542  emap[ dslfc_bb_dih ] = disulfide_info_[ disulfide_index ].first.dslfc_bb_dih();
543 }
544 
546 {
547  return disulfide_info_[ disulfide_index ].second;
548 }
549 
550 
551 void
553 {
554  TR.Debug << "In find_disulfides():" << std::endl;
555 
556  disulfide_partners_.clear();
557  disulfide_atom_indices_.clear();
558  disulfide_info_.clear();
559  resid_2_disulfide_index_.resize( pose.total_residue() );
560  disulfide_residue_types_.resize( pose.total_residue() );
563 
564  Size count_disulfides( 0 );
565  for ( Size ii = 1; ii <= pose.total_residue(); ++ii ) {
566  conformation::Residue res = pose.residue( ii );
567  if ( res.aa() == chemical::aa_cys &&
570  pose.residue_type( ii ).has_atom_name( "CEN" )
571  ) {
572  ++count_disulfides;
573  Size const ii_connect_atom( res.atom_index( "CEN" ) );
574  Size other_res_ii( 0 );
575  for ( Size jj = 1; jj <= res.type().n_residue_connections(); ++jj ) {
576  if ( (Size) res.type().residue_connection( jj ).atomno() == ii_connect_atom ) {
577  other_res_ii = res.connect_map( jj ).resid();
578  break;
579  }
580  }
581  if ( other_res_ii == 0 ) {
582  TR.Error << "ERROR: Could not find disulfide partner for residue " << ii << std::endl;
583  utility_exit();
584  }
585  assert( other_res_ii > ii );
586  //Can only bond residues of the same residue type set (eg centroid to centroid)
587  assert( pose.residue_type(other_res_ii).residue_type_set().name() ==
588  pose.residue_type(ii).residue_type_set().name() );
589 
590  TR.Debug << "Found disulf between " << ii << " and " << other_res_ii << std::endl;
591 
592  resid_2_disulfide_index_[ ii ] = count_disulfides;
593  resid_2_disulfide_index_[ other_res_ii ] = count_disulfides;
594  disulfide_residue_types_[ ii ] = & ( pose.residue_type( ii ));
595  disulfide_residue_types_[ other_res_ii ] = chemical::ResidueTypeCOP( & ( pose.residue_type( other_res_ii )));
596  disulfide_partners_.push_back( std::pair< Size, Size >( ii, other_res_ii ) );
597  disulfide_atom_indices_.push_back( std::pair< DisulfideAtomIndices, DisulfideAtomIndices > (
598  DisulfideAtomIndices( pose.residue(ii ) ), DisulfideAtomIndices( pose.residue( other_res_ii ) ) ));
600  disulfide_info_.push_back( std::pair< CentroidDisulfideEnergyComponents, bool > ( temp, false ) );
601 
602  assert(! empty());
603  }
604  }
605  TR.Debug << "Found " << num_disulfides() << " DS" << std::endl;
606 }
607 
608 // we could do something like keep a flag for when minimization is occurring and assume that
609 // disulfide connectivity information does not change during the course of minimization...
610 bool
612 {
613  Size const total_residue( pose.total_residue() );
614  if ( resid_2_disulfide_index_.size() != total_residue ) return true;
615 
616  for ( Size ii = 1; ii <= total_residue; ++ii ) {
617  if ( resid_2_disulfide_index_[ ii ] != NO_DISULFIDE ) {
618  conformation::Residue res = pose.residue( ii );
619  if ( res.aa() != chemical::aa_cys ||
620  disulfide_residue_types_[ ii ]() != & (pose.residue_type( ii )) ||
621  /// subsumed by residue type check ! pose.residue( ii ).has_variant_type( chemical::DISULFIDE ) ||
622  ! pose.residue_type( ii ).has_atom_name( "CEN" ) || // not centroid
623  res.connect_map(
625  res.atom_index( "CEN" ) ) ).resid() !=
627  return true;
628  }
629  } else if ( pose.residue( ii ).aa() == chemical::aa_cys &&
631  return true;
632  }
633  }
634  return false;
635 }
636 
638 {
639  return disulfide_partners_.size();
640 }
641 
642 
643 }
644 }
645 }
646