Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
RotamerSubsets.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/RotamerSet/RotamerSets.cc
11 /// @brief RotamerSets class implementation
12 /// @author Andrew Leaver-Fay (leaverfa@email.unc.edu)
13 
14 // Unit Headers
16 
17 // Package headers
20 
21 // Project headers
23 
24 
25 // Utility headers
26 #include <utility/vector0.hh>
27 #include <utility/vector1.hh>
28 
29 //Auto Headers
30 //#include <utility/integer_mapping.hh>
31 // C++
32 
33 
34 namespace core {
35 namespace pack {
36 namespace rotamer_set {
37 
39  FixbbRotamerSets & source,
40  utility::vector0< int > const & rotamer_subset
41 ) :
42  nmoltenres_( source.nmoltenres() ),
43  total_residue_( source.total_residue() ),
44  nrotamers_( rotamer_subset.size() ),
45  set_of_rotamer_sets_( nmoltenres_ ),
46  resid_2_moltenres_( source.resid_2_moltenres_vector() ),
47  moltenres_2_resid_( source.moltenres_2_resid_vector() ),
48  nrotamer_offsets_( nmoltenres_, 0 ),
49  moltenres_for_rotamer_( nrotamers_, 0 ),
50  nrotamers_for_moltenres_( nmoltenres_, 0 )
51 {
52  /*subset_mapping rotamer_subset_map( source.nrotamers() );
53  rotamer_subset_map.reserve_destination_size( rotamer_subset_map.size() );
54  for ( Size ii = 0; ii < rotamer_subset.size(); ++ii ) {
55  rotamer_subset_map.set_next_correspondence( rotamer_subset_map[ ii ] );
56  }*/
57 
58  for ( Size ii = 0; ii < rotamer_subset.size(); ++ii ) {
59  Size const ii_moltres = source.moltenres_for_rotamer( rotamer_subset[ ii ] );
60  ++nrotamers_for_moltenres_[ ii_moltres ];
61  moltenres_for_rotamer_[ ii + 1 ] = ii_moltres;
62  }
63 
65  for ( Size ii = 1; ii <= nmoltenres_; ++ii ) {
66  moltenres_subsets[ ii ].reserve( nrotamers_for_moltenres_[ ii ] );
67  if ( ii > 1 ) {
68  nrotamer_offsets_[ ii ] = nrotamer_offsets_[ ii - 1 ] + nrotamers_for_moltenres_[ ii - 1 ];
69  }
70  }
71 
72  for ( Size ii = 0; ii < rotamer_subset.size(); ++ii ) {
73  Size const ii_rot = rotamer_subset[ ii ];
74  Size const ii_moltres_id = source.moltenres_for_rotamer( ii_rot );
75  Size const ii_local_rotno = source.rotid_on_moltenresidue( ii_rot );
76  moltenres_subsets[ ii_moltres_id ].push_back( ii_local_rotno );
77  }
78 
79  for ( Size ii = 1; ii <= nmoltenres_; ++ii ) {
81  *source.rotamer_set_for_moltenresidue( ii ),
82  moltenres_subsets[ ii ]
83  );
84  }
85 }
86 
87 
89 
90 void
92 {
93  // count rotamers
94  nrotamers_ = 0;
95  for ( uint ii = 1; ii <= nmoltenres_; ++ii ) {
96  nrotamers_for_moltenres_[ ii ] = set_of_rotamer_sets_[ii]->num_rotamers();
97  nrotamers_ += set_of_rotamer_sets_[ii]->num_rotamers();
98  if ( ii > 1 ) { nrotamer_offsets_[ ii ] = nrotamer_offsets_[ii - 1] + set_of_rotamer_sets_[ii - 1]->num_rotamers(); }
99  else { nrotamer_offsets_[ ii ] = 0; }
100  }
101 
103  uint count_rots_for_moltenres = 1;
104  uint count_moltenres = 1;
105  for ( uint ii = 1; ii <= nrotamers_; ++ii ) {
106  moltenres_for_rotamer_[ ii ] = count_moltenres;
107  if ( count_rots_for_moltenres == nrotamers_for_moltenres_[ count_moltenres ] )
108  {
109  count_rots_for_moltenres = 1;
110  ++count_moltenres;
111  } else {
112  ++count_rots_for_moltenres;
113  }
114  }
115 }
116 
117 
120 {
121  return rotamer_set_for_moltenresidue( mresid )->num_rotamers();
122 }
123 
125 
127 
128 uint
129 RotamerSubsets::moltenres_2_resid( uint mresid ) const { return moltenres_2_resid_[ mresid ]; }
130 
131 uint
132 RotamerSubsets::resid_2_moltenres( uint resid ) const { return resid_2_moltenres_[ resid ]; }
133 
134 uint
136 
137 uint
139 
142 {
143  return rotamer_set_for_residue( res_for_rotamer( rotid ) )->rotamer( rotid_on_moltenresidue( rotid ) );
144 }
145 
147 RotamerSubsets::rotamer_for_moltenres( uint moltenres_id, uint rotamerid ) const
148 {
149  return rotamer_set_for_residue( moltenres_id )->rotamer( rotamerid );
150 }
151 
152 
153 uint
155 
158 
161 
163 RotamerSubsets::rotamer_set_for_moltenresidue( uint moltenresid ) const { return set_of_rotamer_sets_[ moltenresid ]; }
164 
165 
168 
169 /// convert rotid in full rotamer enumeration into rotamer id on its source residue
170 uint
172 {
173  return rotid - nrotamer_offsets_[ moltenres_for_rotamer_[ rotid ] ];
174 }
175 
176 /// convert moltenres rotid to id in full rotamer enumeration
177 uint
178 RotamerSubsets::moltenres_rotid_2_rotid( uint moltenres, uint moltenresrotid ) const
179 {
180  return moltenresrotid + nrotamer_offsets_[ moltenres ];
181 }
182 
183 
184 } // namespace rotamer_set
185 } // namespace pack
186 } // namespace core
187