Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
FullatomDisulfideEnergyContainer.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 Andrew Leaver-Fay
13 
14 // Unit headers
16 
17 // Package headers
19 
20 // Project headers
24 #include <core/pose/Pose.hh>
28 
29 // STL Headers
30 #include <cassert>
31 
33 #include <utility/vector1.hh>
34 
35 namespace core {
36 namespace scoring {
37 namespace disulfides {
38 
41  Size focused_residue,
42  Size disulfide_index
43  ) :
44  owner_( owner ),
45  focused_residue_( focused_residue ),
46  disulfide_index_( disulfide_index )
47 {}
48 
51  ) :
52  owner_( owner ),
53  focused_residue_( FullatomDisulfideEnergyContainer::NO_DISULFIDE ),
54  disulfide_index_( FullatomDisulfideEnergyContainer::NO_DISULFIDE )
55 {}
56 
58 {}
59 
62 {
63  assert( &(dynamic_cast< DisulfResNeighbIterator const & > ( rhs )) );
64  DisulfResNeighbIterator const & drni_rhs = static_cast< DisulfResNeighbIterator const & > ( rhs );
65 
66  owner_ = drni_rhs.owner_;
69  return *this;
70 }
71 
72 // Incrementing an iterator in a list with exactly one element moves that
73 // iterator off the end of the list.
76 {
80  return *this;
81 }
82 
83 bool
85 {
86  assert( &( dynamic_cast< DisulfResNeighbIterator const & > ( rhs )) );
87  DisulfResNeighbIterator const & drni_rhs = static_cast< DisulfResNeighbIterator const & > ( rhs );
88 
89  return ( owner_ == drni_rhs.owner_ &&
90  focused_residue_ == drni_rhs.focused_residue_ &&
91  disulfide_index_ == drni_rhs.disulfide_index_ );
92 }
93 
94 bool
96 {
97  assert( &( dynamic_cast< DisulfResNeighbIterator const & > ( rhs )) );
98  DisulfResNeighbIterator const & drni_rhs = static_cast< DisulfResNeighbIterator const & > ( rhs );
99  return ( owner_ != drni_rhs.owner_ ||
100  focused_residue_ != drni_rhs.focused_residue_ ||
101  disulfide_index_ != drni_rhs.disulfide_index_ );
102 }
103 
104 
105 Size
107 {
109  return owner_->upper_neighbor_id( disulfide_index_ );
110 }
111 
112 Size
114 {
116  return owner_->lower_neighbor_id( disulfide_index_ );
117 }
118 
119 Size
121 {
122  return focused_residue_;
123 }
124 
125 Size
127 {
128  return owner_->other_neighbor_id( disulfide_index_, focused_residue_ );
129 }
130 
131 
132 void
134 {
136  owner_->save_energy( disulfide_index_, emap );
137 }
138 
139 
140 void
142 {
144  owner_->retrieve_energy( disulfide_index_, emap );
145 }
146 
147 
148 void
150 {
152  owner_->accumulate_energy( disulfide_index_, emap );
153 }
154 
156 {
158  owner_->mark_energy_computed( disulfide_index_ );
159 }
160 
162 {
164  owner_->mark_energy_uncomputed( disulfide_index_ );
165 }
166 
167 
168 bool
170 {
172  return owner_->energy_computed( disulfide_index_ );
173 }
174 
175 ////////////////////////////////////////////////////////////////////////
176 ///// Disulfide Residue Neighbor Constant Iterator class implementation
177 ////////////////////////////////////////////////////////////////////////
178 
181  Size focused_residue,
182  Size disulfide_index
183  ) :
184  owner_( owner ),
185  focused_residue_( focused_residue ),
186  disulfide_index_( disulfide_index )
187 {}
188 
191  ) :
192  owner_( owner ),
193  focused_residue_( FullatomDisulfideEnergyContainer::NO_DISULFIDE ),
194  disulfide_index_( FullatomDisulfideEnergyContainer::NO_DISULFIDE )
195 {}
196 
198 {}
199 
202 {
203  assert( &(dynamic_cast< DisulfResNeighbConstIterator const & > ( rhs )) );
204  DisulfResNeighbConstIterator const & drni_rhs = static_cast< DisulfResNeighbConstIterator const & > ( rhs );
205 
206  owner_ = drni_rhs.owner_;
209  return *this;
210 
211 }
212 
215 {
219  return *this;
220 }
221 
222 /// @brief returns true if the two edge-list iterators are equal
223 bool
225 {
226  assert( &( dynamic_cast< DisulfResNeighbConstIterator const & > ( rhs )) );
227  DisulfResNeighbConstIterator const & drni_rhs = static_cast< DisulfResNeighbConstIterator const & > ( rhs );
228 
229  return ( owner_ == drni_rhs.owner_ &&
230  focused_residue_ == drni_rhs.focused_residue_ &&
231  disulfide_index_ == drni_rhs.disulfide_index_ );
232 }
233 
234 
235 /// @brief returns true if the two edge-list iterators are not equal
236 bool
238 {
239  assert( &( dynamic_cast< DisulfResNeighbConstIterator const & > ( rhs )) );
240  DisulfResNeighbConstIterator const & drni_rhs = static_cast< DisulfResNeighbConstIterator const & > ( rhs );
241  return ( owner_ != drni_rhs.owner_ ||
242  focused_residue_ != drni_rhs.focused_residue_ ||
243  disulfide_index_ != drni_rhs.disulfide_index_ );
244 }
245 
246 Size
248 {
250  return owner_->upper_neighbor_id( disulfide_index_ );
251 }
252 
253 Size
255 {
257  return owner_->lower_neighbor_id( disulfide_index_ );
258 }
259 
260 
261 Size
263 {
264  return focused_residue_;
265 }
266 
267 Size
269 {
270  return owner_->other_neighbor_id( disulfide_index_, focused_residue_ );
271 }
272 
273 /// @brief overwrites the three constraint-energy positions in the emap with
274 /// the three contraint energies stored on the edge pointed to by the edge iter.
275 /// Does not zero out the other positions in the emap.
276 void
278 {
280  owner_->retrieve_energy( disulfide_index_, emap );
281 }
282 
283 /// @brief accumulates the three constraint-energy positions in the emap with
284 /// the three contraint energies stored on the edge pointed to by the edge iter.
285 /// Does not touch the other positions in the emap.
286 void
288 {
290  owner_->accumulate_energy( disulfide_index_, emap );
291 }
292 
293 bool
295 {
297  return owner_->energy_computed( disulfide_index_ );
298 }
299 
300 
301 /////////////////////////////////////////////////////
302 /// Disulfide Energy Container Class Implementation
303 /////////////////////////////////////////////////////
304 
306 
307 
309 {}
310 
311 bool
313 {
314  return num_disulfides() == 0;
315 }
316 
317 
319 {
320  find_disulfides( pose );
321 }
322 
323  void
325 {
326  if ( disulfides_changed( pose ) ) find_disulfides( pose );
327 }
328 
330 {}
331 
334 {
336  if ( !empty() ) {
337  dec->disulfide_atom_indices_ = disulfide_atom_indices_;
338  dec->disulfide_residue_types_ = disulfide_residue_types_;
339  dec->resid_2_disulfide_index_ = resid_2_disulfide_index_;
340  dec->disulfide_partners_ = disulfide_partners_;
341  dec->disulfide_info_ = disulfide_info_;
342  }
343  return dec;
344 }
345 
346 void
348 {
349  resid_2_disulfide_index_.resize( newsize, NO_DISULFIDE );
350 }
351 
354 {
355  assert( !empty() );
356  if ( resid <= (int) resid_2_disulfide_index_.size() && resid_2_disulfide_index_[ resid ] != NO_DISULFIDE ) {
357  return new DisulfResNeighbConstIterator( this, resid, resid_2_disulfide_index_[ resid ] );
358  }
359  else {
360  return new DisulfResNeighbConstIterator( this );
361  }
362 }
363 
366 {
367  assert( !empty() );
368  return new DisulfResNeighbConstIterator( this );
369 }
370 
373 {
374  assert( !empty() );
375  if ( resid <= (int)resid_2_disulfide_index_.size() &&
377  (Size) resid < other_neighbor_id( resid_2_disulfide_index_[ resid ], resid ) ) {
378  return new DisulfResNeighbConstIterator( this, resid, resid_2_disulfide_index_[ resid ] );
379  }
380  else {
381  return new DisulfResNeighbConstIterator( this );
382  }
383 }
384 
387 {
388  assert( !empty() );
389  return new DisulfResNeighbConstIterator( this );
390 }
391 
394 {
395  assert( !empty() );
396  if ( resid_2_disulfide_index_[ resid ] != NO_DISULFIDE ) {
397  return new DisulfResNeighbIterator( this, resid, resid_2_disulfide_index_[ resid ] );
398  }
399  else {
400  return new DisulfResNeighbIterator( this );
401  }
402 }
403 
406 {
407  assert( !empty() );
408  return new DisulfResNeighbIterator( this );
409 }
410 
413 {
414  if ( resid <= (int)resid_2_disulfide_index_.size() &&
416  (Size) resid < other_neighbor_id( resid_2_disulfide_index_[ resid ], resid ) ) {
417  return new DisulfResNeighbIterator( this, resid, resid_2_disulfide_index_[ resid ] );
418  }
419  else {
420  return new DisulfResNeighbIterator( this );
421  }
422 }
423 
426 {
427  assert( !empty() );
428  return new DisulfResNeighbIterator( this );
429 }
430 
431 bool
433 {
434  if ( empty() ) return false;
435  return resid_2_disulfide_index_[ res1id ] != NO_DISULFIDE &&
436  resid_2_disulfide_index_[ res2id ] != NO_DISULFIDE &&
437  resid_2_disulfide_index_[ res1id ] == resid_2_disulfide_index_[ res2id ];
438 }
439 
440 bool
442 {
443  if ( empty() ) return false;
444  return resid_2_disulfide_index_[ resid ] != NO_DISULFIDE;
445 }
446 
447 Size
449 {
450  return other_neighbor_id( resid_2_disulfide_index_[ resid ], resid );
451 }
452 
453 
454 // Mutators
455  void
457 {
458  disulfide_info_[ disulfide_index ].first.dslf_ss_dst() = emap[ dslf_ss_dst ];
459  disulfide_info_[ disulfide_index ].first.dslf_cs_ang() = emap[ dslf_cs_ang ];
460  disulfide_info_[ disulfide_index ].first.dslf_ss_dih() = emap[ dslf_ss_dih ];
461  disulfide_info_[ disulfide_index ].first.dslf_ca_dih() = emap[ dslf_ca_dih ];
462  disulfide_info_[ disulfide_index ].first.dslf_cbs_ds() = emap[ dslf_cbs_ds ];
463 }
464 
465  void
467 {
468  disulfide_info_[ disulfide_index ].second = true;
469 }
470 
471  void
473 {
474  disulfide_info_[ disulfide_index ].second = false;
475 }
476 
477 // Accessors
479 {
480  return disulfide_partners_[ disulfide_index ].first;
481 }
482 
484 {
485  return disulfide_partners_[ disulfide_index ].second;
486 }
487 
489 {
490  assert( disulfide_partners_[ disulfide_index ].first == resid ||
491  disulfide_partners_[ disulfide_index ].second == resid );
492  return ( resid == disulfide_partners_[ disulfide_index ].first ?
493  disulfide_partners_[ disulfide_index ].second :
494  disulfide_partners_[ disulfide_index ].first );
495 }
496 
497 DisulfideAtomIndices const &
499 {
500  Size const disulfide_index( resid_2_disulfide_index_[ resid ] );
501  assert( disulfide_index != NO_DISULFIDE );
502  assert( disulfide_partners_[ disulfide_index ].first == resid ||
503  disulfide_partners_[ disulfide_index ].second == resid );
504  return ( resid == disulfide_partners_[ disulfide_index ].first ?
505  disulfide_atom_indices_[ disulfide_index ].first :
506  disulfide_atom_indices_[ disulfide_index ].second );
507 }
508 
509 
510 DisulfideAtomIndices const &
512 {
513  Size const disulfide_index( resid_2_disulfide_index_[ resid ] );
514  assert( disulfide_index != NO_DISULFIDE );
515  assert( disulfide_partners_[ disulfide_index ].first == resid ||
516  disulfide_partners_[ disulfide_index ].second == resid );
517  return ( resid == disulfide_partners_[ disulfide_index ].first ?
518  disulfide_atom_indices_[ disulfide_index ].second :
519  disulfide_atom_indices_[ disulfide_index ].first );
520 }
521 
522 
524 {
525  emap[ dslf_ss_dst ] += disulfide_info_[ disulfide_index ].first.dslf_ss_dst();
526  emap[ dslf_cs_ang ] += disulfide_info_[ disulfide_index ].first.dslf_cs_ang();
527  emap[ dslf_ss_dih ] += disulfide_info_[ disulfide_index ].first.dslf_ss_dih();
528  emap[ dslf_ca_dih ] += disulfide_info_[ disulfide_index ].first.dslf_ca_dih();
529  emap[ dslf_cbs_ds ] += disulfide_info_[ disulfide_index ].first.dslf_cbs_ds();
530 }
531 
533 {
534  emap[ dslf_ss_dst ] = disulfide_info_[ disulfide_index ].first.dslf_ss_dst();
535  emap[ dslf_cs_ang ] = disulfide_info_[ disulfide_index ].first.dslf_cs_ang();
536  emap[ dslf_ss_dih ] = disulfide_info_[ disulfide_index ].first.dslf_ss_dih();
537  emap[ dslf_ca_dih ] = disulfide_info_[ disulfide_index ].first.dslf_ca_dih();
538  emap[ dslf_cbs_ds ] = disulfide_info_[ disulfide_index ].first.dslf_cbs_ds();
539 }
540 
542 {
543  return disulfide_info_[ disulfide_index ].second;
544 }
545 
546 
547 void
549 {
550  Size nres = pose.total_residue(), indep_res = pose.total_residue();
552  indep_res = core::pose::symmetry::symmetry_info(pose)->num_independent_residues();
553  nres = core::pose::symmetry::symmetry_info(pose)->num_total_residues_without_pseudo();
554  }
555 
556  disulfide_partners_.clear();
557  disulfide_atom_indices_.clear();
558  disulfide_info_.clear();
559  resid_2_disulfide_index_.resize( nres );
560  disulfide_residue_types_.resize( nres );
563 
564 
565  Size count_disulfides( 0 );
566  for ( Size ii = 1; ii <= indep_res; ++ii ) {
567  if ( pose.residue( ii ).aa() == chemical::aa_cys &&
570  pose.residue_type( ii ).has_atom_name( "SG" ) // full atom residue
571  ) {
572  ++count_disulfides;
573  Size const ii_connect_atom( pose.residue( ii ).atom_index( "SG" ) );
574  Size other_res( 0 );
575  for ( Size jj = pose.residue( ii ).type().n_residue_connections(); jj >= 1; --jj ) {
576  if ( (Size) pose.residue( ii ).type().residue_connection( jj ).atomno() == ii_connect_atom ) {
577  other_res = pose.residue( ii ).connect_map( jj ).resid();
578  break;
579  }
580  }
581  if ( other_res == 0 ) {
582  std::cerr << "ERROR: Could not find disulfide partner for residue " << ii << std::endl;
583  utility_exit();
584  }
585  assert( other_res > ii );
586 
587  resid_2_disulfide_index_[ ii ] = count_disulfides;
588  resid_2_disulfide_index_[ other_res ] = count_disulfides;
589  disulfide_residue_types_[ ii ] = & ( pose.residue_type( ii ));
590  disulfide_residue_types_[ other_res ] = chemical::ResidueTypeCOP( & ( pose.residue_type( other_res )));
591  disulfide_partners_.push_back( std::pair< Size, Size >( ii, other_res ) );
592  disulfide_atom_indices_.push_back( std::pair< DisulfideAtomIndices, DisulfideAtomIndices > (
593  DisulfideAtomIndices( pose.residue(ii ) ), DisulfideAtomIndices( pose.residue( other_res ) ) ));
595  disulfide_info_.push_back( std::pair< FullatomDisulfideEnergyComponents, bool > ( temp, false ) );
596  }
597  }
598 
599 }
600 
601 // we could do something like keep a flag for when minimization is occurring and assume that
602 // disulfide connectivity information does not change during the course of minimization...
603  bool
605 {
606  Size nres = pose.total_residue(), indep_res = pose.total_residue();
608  indep_res = core::pose::symmetry::symmetry_info(pose)->num_independent_residues();
609  nres = core::pose::symmetry::symmetry_info(pose)->num_total_residues_without_pseudo();
610  }
611  Size const total_residue( indep_res );
612  if ( resid_2_disulfide_index_.size() != nres ) return true;
613 
614  for ( Size ii = 1; ii <= total_residue; ++ii ) {
615  if ( resid_2_disulfide_index_[ ii ] != NO_DISULFIDE ) {
616  if ( pose.residue( ii ).aa() != chemical::aa_cys ||
617  disulfide_residue_types_[ ii ]() != & (pose.residue_type( ii )) ||
618  /// subsumed by residue type check ! pose.residue( ii ).has_variant_type( chemical::DISULFIDE ) ||
619  ! pose.residue_type( ii ).has_atom_name( "SG" ) || //no longer full atom
620  pose.residue( ii ).connect_map(
622  pose.residue( ii ).atom_index( "SG" ) ) ).resid() !=
624  return true;
625  }
626  } else if ( pose.residue( ii ).aa() == chemical::aa_cys &&
628  return true;
629  }
630  }
631  return false;
632 }
633 
635 {
636  return disulfide_partners_.size();
637 }
638 
640 {
641  return resid_2_disulfide_index_.size();
642 }
643 
644 }
645 }
646 }
647