Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SymDof.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 // This file is made available under the Rosetta Commons license.
5 // See http://www.rosettacommons.org/license
6 // (C) 199x-2007 University of Washington
7 // (C) 199x-2007 University of California Santa Cruz
8 // (C) 199x-2007 University of California San Francisco
9 // (C) 199x-2007 Johns Hopkins University
10 // (C) 199x-2007 University of North Carolina, Chapel Hill
11 // (C) 199x-2007 Vanderbilt University
12 
13 /// @brief Class to store ingformation about symmetrical dofs
14 /// @file core/conformation/symmetry/SymDof.cc
15 /// @author Ingemar Andre
16 
17 // Unit headers
19 
20 // Utility header
21 #include <utility/exit.hh>
22 // AUTO-REMOVED #include <utility/io/izstream.hh>
23 #include <utility/string_util.hh>
24 
25 #include <utility/vector1.hh>
26 #include <algorithm>
27 
28 namespace core {
29 namespace conformation {
30 namespace symmetry {
31 
33 {
34  for ( Size i=1; i<=6; ++i ) {
35  allowed_dof_jumps_.push_back(false);
36  lower_range_dof_jumps1_.push_back(0.0);
37  upper_range_dof_jumps1_.push_back(0.0);
38  lower_range_dof_jumps2_.push_back(0.0);
39  upper_range_dof_jumps2_.push_back(0.0);
40  has_range1_lower_.push_back(false);
41  has_range1_upper_.push_back(false);
42  has_range2_lower_.push_back(false);
43  has_range2_upper_.push_back(false);
44  jump_dir_.push_back( 1 );
45  }
46 
47 }
48 
49 SymDof::SymDof( SymDof const & src )
50 {
60  jump_dir_ = src.jump_dir_;
61 }
62 
63 SymDof &
64 SymDof::operator=( SymDof const & src ) {
65  if ( this != &src ) {
75  jump_dir_ = src.jump_dir_;
76  }
77  return *this;
78 }
79 
81 
82 // @details is df allowed to move?
83 bool
84 SymDof::allow_dof( int df ) const
85 {
86  assert( df >= X_DOF && df <= Z_ANGLE_DOF );
87  assert( allowed_dof_jumps_.size() == 6 );
88  return allowed_dof_jumps_[df];
89 
90 }
91 
92 bool
94 {
95  for (int i = X_DOF; i <= Z_ANGLE_DOF; ++i ) {
96  if ( allow_dof(i) ) return true;
97  }
98  return false;
99 }
100 
101 // @details the lower boundary of range1
103 SymDof::range1_lower( int df ) const
104 {
105  assert( df >= X_DOF && df <= Z_ANGLE_DOF );
106  assert( lower_range_dof_jumps1_.size() == 6 );
107  return lower_range_dof_jumps1_[df];
108 }
109 
110 // @details the upper boundary of range1
112 SymDof::range1_upper( int df ) const
113 {
114  assert( df >= X_DOF && df <= Z_ANGLE_DOF );
115  assert( upper_range_dof_jumps1_.size() == 6 );
116  return upper_range_dof_jumps1_[df];
117 }
118 
119 // @details the lower boundary of range2
121 SymDof::range2_lower( int df ) const
122 {
123  assert( df >= X_DOF && df <= Z_ANGLE_DOF );
124  assert( lower_range_dof_jumps2_.size() == 6 );
125  return lower_range_dof_jumps2_[df];
126 }
127 
128 // @details the upper boundary of range1
130 SymDof::range2_upper( int df ) const
131 {
132  assert( df >= X_DOF && df <= Z_ANGLE_DOF );
133  assert( upper_range_dof_jumps2_.size() == 6 );
134  return upper_range_dof_jumps2_[df];
135 }
136 
137 // details Have a range1 been specified?
138 bool
139 SymDof::has_range1( int df ) const
140 {
141  if ( has_range1_lower_[df] && has_range1_upper_[df] ) return true;
142  else return false;
143 }
144 
145 // details Have a range2 been specified?
146 bool
147 SymDof::has_range2( int df ) const
148 {
149  if ( has_range2_lower_[df] && has_range2_upper_[df] ) return true;
150  else return false;
151 }
152 
153 // @details has a lower boundary of range1 been specified?
154 bool
156 {
157  assert( df >= X_DOF && df <= Z_ANGLE_DOF );
158  return has_range1_lower_[df];
159 }
160 
161 // @details has a upper boundary of range1 been specified?
162 bool
164 {
165  assert( df >= X_DOF && df <= Z_ANGLE_DOF );
166  return has_range1_upper_[df];
167 }
168 
169 // @details has a lower boundary of range2 been specified?
170 bool
172 {
173  assert( df >= X_DOF && df <= Z_ANGLE_DOF );
174  return has_range2_lower_[df];
175 }
176 
177 // @details has a upper boundary of range2 been specified?
178 bool
180 {
181  assert( df >= X_DOF && df <= Z_ANGLE_DOF );
182  return has_range2_upper_[df];
183 }
184 
185 // @detail return the direction( upstream or downstream )
186 // of the jump for a dof
187 int
188 SymDof::jump_direction( int df ) const
189 {
190  assert( df >= X_DOF && df <= Z_ANGLE_DOF );
191  return jump_dir_[df];
192 }
193 
194 // @details function to parse a string describing dofs and parameters associated with them
195 // This function is used in reading symmetry_definition files. A typical line would look like this:
196 // set_dof BASEJUMP x(50) angle_x angle_y angle_z
197 // x, y, z are translations along the cartesian axis. angle_x, angle_y, angle_z are rotations around
198 // the cartesian exis.
199 // There are two ranges that can be specified enclosed by parenthesises ie. x(0-50:2-3)
200 void SymDof::read( std::string dof_line )
201 {
202  // replace parenthesis with space for easier parsing
203  std::replace( dof_line.begin(), dof_line.end(), ')', ' ' );
204  std::istringstream l( dof_line );
205  while ( true ) {
206  std::string j;
207  l >> j;
208  if ( l.fail() ) break;
209  // first read dof_type
210  int dof_type(0);
211  // Split for parsing
212  utility::vector1< std::string> split ( utility::string_split( j, '(' ) );
213  //std::cout<< dof_line <<" "<<j<<" "<<split[0]<<std::endl;
214  if ( split[1] == "x" ) dof_type = X_DOF;
215  if ( split[1] == "y" ) dof_type = Y_DOF;
216  if ( split[1] == "z" ) dof_type = Z_DOF;
217  if ( split[1] == "angle_x" ) dof_type = X_ANGLE_DOF;
218  if ( split[1] == "angle_y" ) dof_type = Y_ANGLE_DOF;
219  if ( split[1] == "angle_z" ) dof_type = Z_ANGLE_DOF;
220  if ( dof_type == 0 ) utility_exit_with_message("Dof type must be x,y,z,x_angle,y_angle,z_angle...");
221 
222  // Allow dof is true
224 
225  // Parse the rest
226  if ( split.size() == 2 ) {
227  utility::vector1< std::string> direction_split ( utility::string_split( split[2], ';' ) );
228  // Parse the range1
229  if ( direction_split.size() >= 1 ) {
230  utility::vector1< std::string> range_split ( utility::string_split( direction_split[ 1 ], ':' ) );
231  if ( range_split.size() >= 1 ) {
232  lower_range_dof_jumps1_[dof_type] = std::atof( range_split[1].c_str() );
233  has_range1_lower_[dof_type] = true;
234  if ( range_split.size() == 2 && range_split[1] != range_split[2] ) {
235  upper_range_dof_jumps1_[dof_type] = std::atof( range_split[2].c_str() );
236  has_range1_upper_[dof_type] = true;
237  } else {
239  }
240  }
241  }
242  // Parse the range2
243  if ( direction_split.size() >= 2 ) {
244  utility::vector1< std::string> range_split ( utility::string_split( direction_split[ 2 ], ':' ) );
245  if ( range_split.size() >= 1 ) {
246  lower_range_dof_jumps2_[dof_type] = std::atof( range_split[1].c_str() );
247  has_range2_lower_[dof_type] = true;
248  if ( range_split.size() == 2 && range_split[1] != range_split[2] ) {
249  upper_range_dof_jumps2_[dof_type] = std::atof( range_split[2].c_str() );
250  has_range2_upper_[dof_type] = true;
251  } else {
253  }
254  }
255  }
256  // Parse the jump direction. Either dof_type(n2c) or dof_type(c2n)
257  if ( direction_split.size() == 3 ) {
258  if ( direction_split[3] == "n2c" ) {
259  jump_dir_[dof_type] = 1;
260  } else if ( direction_split[3] == "c2n" ) {
261  jump_dir_[dof_type] = -1;
262  } else {
263  utility_exit_with_message("Unknown jump direction in Dof parsing...");
264  }
265  }
266  }
267  }
268 }
269 
270 std::ostream& operator<< ( std::ostream & s, const SymDof & dof )
271 {
272 
273  for ( Size i=1; i<=6; ++i ) {
274  if( dof.allow_dof(i) ) {
275  std::string dir ( "n2c" );
276  if ( dof.jump_direction(i) == -1 ) dir = "c2n";
277  if ( i == 1 ) s << "x";
278  if ( i == 2 ) s << "y";
279  if ( i == 3 ) s << "z";
280  if ( i == 4 ) s << "angle_x";
281  if ( i == 5 ) s << "angle_y";
282  if ( i == 6 ) s << "angle_z";
283  s << "(" << dof.range1_lower(i) << ":" << dof.range1_upper(i) << ";"
284  << dof.range2_lower(i) << ":" << dof.range2_upper(i) << ";" << dir << ")";
285  }
286  }
287 
288  return s;
289 }
290 
291 void
293 {
294  assert( dof_line.size() >= 3 );
295 
296  for ( Size i = 3; i <= dof_line.size(); ++i ) {
297  read(dof_line[i]);
298  }
299 }
300 
301 bool
303  SymDof const & a,
304  SymDof const & b
305 ) {
306  return
307  std::equal(a.allowed_dof_jumps_.begin(), a.allowed_dof_jumps_.end(), b.allowed_dof_jumps_.begin()) &&
308  std::equal(a.lower_range_dof_jumps1_.begin(), a.lower_range_dof_jumps1_.end(), b.lower_range_dof_jumps1_.begin()) &&
309  std::equal(a.upper_range_dof_jumps1_.begin(), a.upper_range_dof_jumps1_.end(), b.upper_range_dof_jumps1_.begin()) &&
310  std::equal(a.lower_range_dof_jumps2_.begin(), a.lower_range_dof_jumps2_.end(), b.lower_range_dof_jumps2_.begin()) &&
311  std::equal(a.upper_range_dof_jumps2_.begin(), a.upper_range_dof_jumps2_.end(), b.upper_range_dof_jumps2_.begin()) &&
312  std::equal(a.has_range1_lower_.begin(), a.has_range1_lower_.end(), b.has_range1_lower_.begin()) &&
313  std::equal(a.has_range1_upper_.begin(), a.has_range1_upper_.end(), b.has_range1_upper_.begin()) &&
314  std::equal(a.has_range2_lower_.begin(), a.has_range2_lower_.end(), b.has_range2_lower_.begin()) &&
315  std::equal(a.has_range2_upper_.begin(), a.has_range2_upper_.end(), b.has_range2_upper_.begin()) &&
316  std::equal(a.jump_dir_.begin(), a.jump_dir_.end(), b.jump_dir_.begin());
317 }
318 
319 bool
321  SymDof const & a,
322  SymDof const & b
323 ) {
324  return !(a == b);
325 }
326 
327 } // symmetry
328 } // conformation
329 } // core