Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ABEGOManager.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/util/ABEGOManager.cc
11 /// @brief class for ABEGO
12 /// @author Nobuyasu Koga ( nobuyasu@uw.edu )
13 
15 #include <core/pose/Pose.hh>
16 #include <utility/exit.hh>
17 #include <basic/Tracer.hh>
18 #include <cmath>
19 #include <utility/vector1.hh>
20 
21 static basic::Tracer TR( "core.util.ABEGOManager" );
22 
23 namespace core {
24 namespace util {
25 
26 // @brief Auto-generated virtual destructor
28 
29 /// @brief add line to specify abego region
30 void
31 ABEGO::add_line( Real const slope, Real const intercept, bool const region )
32 {
33  lines_.push_back( Line( slope, intercept, region ) );
34 }
35 
36 /// @breif check input torsion angles is compatible with defined abego
37 bool
38 ABEGO::check_rama2( Real const & phi, Real const & psi )
39 {
40  for( Size ii=1; ii<=lines_.size(); ii++ ) {
41  Real sign( psi - lines_[ ii ].slope * phi - lines_[ ii ].intercept );
42  if( (sign >= 0 && lines_[ ii ].region) || (sign < 0 && ! lines_[ ii ].region) ) {
43  } else {
44  return false;
45  }
46  }
47  return true;
48 }
49 
50 /// @brief check input torsion angles is compatible with defined abego
51 bool
52 ABEGO::check_rama( Real const & phi, Real const & psi, Real const & omega )
53 {
54  if( name() == 'X' ) {
55  return true;
56  }
57 
58  if ( cis_omega_ ) {
59 
60  return ( fabs( omega ) < 90.0 );
61 
62  } else {
63 
64  if( fabs( omega ) < 90.0 ) return false;
65 
66  Real psii = psi;
67  if ( (psi < -75.0 && phi < 0) || (psi < -100.0 && phi >= 0) ) {
68  psii = psi + 360.0;
69  }
70 
71  if ( phi >= phi_min_ && phi < phi_max_ &&
72  psii >= psi_min_ && psii < psi_max_ ) {
73 
74  if( lines_.size() < 1 ) {
75  return true;
76  } else {
77  return check_rama2( phi, psii );
78  }
79 
80  } else {
81  return false;
82  }
83  }
84 }
85 
86 /// @brief default constructor
87 ABEGOManager::ABEGOManager() : utility::pointer::ReferenceCount()
88 {
89  initialize();
90 }
91 
92 /// @brief copy constructor
93 ABEGOManager::ABEGOManager( ABEGOManager const & rval ) : utility::pointer::ReferenceCount(),
94  totnum_abego_( rval.totnum_abego_ ),
95  name2abego_( rval.name2abego_ )
96 {}
97 
98 /// @brief intialize ABEGOManager
99 void
101 {
102  ABEGO A( 'A', -180.0, 0.0, -75.0, 50.0, false );
103  ABEGO B( 'B', -180.0, 0.0, 50.0, 285.5, false );
104  ABEGO E( 'E', 0.0, 180.5, 100.0, 260.5, false );
105  ABEGO G( 'G', 0.0, 180.5, -100.0, 100.0, false );
106  ABEGO O( 'O', 0.0, 0.0, 0.0, 0.0, true );
107 
108  ABEGO S( 'S', -180.0, 0.0, 100.0, 195.0, false );
109  S.add_line( -1.6, 4, false );
110 
111  ABEGO P( 'P', -180.0, 0.0, 100.0, 195.0, false );
112  P.add_line( -1.6, 4, true );
113 
114  ABEGO D( 'D', -180.0, 0.0, 195.0, 285.5, false );
115  ABEGO Z( 'Z', -180.0, -100.0, 50.0, 100.0, false );
116  ABEGO Y( 'Y', -100.0, 0.0, 50.0, 100.0, false );
117 
118  ABEGO M( 'M', -180.0, -90.0, -75.0, 50.0, false );
119  ABEGO N( 'N', -90.0, 0.0, -75.0, 50.0, false );
120 
121  // X represents all torsion space ( the following parameters are no meaning. )
122  ABEGO X( 'X', 0.0, 0.0, 0.0, 0.0, false );
123 
124  name2abego_[ 1 ] = A;
125  name2abego_[ 2 ] = B;
126  name2abego_[ 3 ] = E;
127  name2abego_[ 4 ] = G;
128  name2abego_[ 5 ] = O;
129  name2abego_[ 6 ] = S;
130  name2abego_[ 7 ] = P;
131  name2abego_[ 8 ] = D;
132  name2abego_[ 9 ] = Z;
133  name2abego_[ 10 ] = Y;
134  name2abego_[ 11 ] = M;
135  name2abego_[ 12 ] = N;
136  name2abego_[ 13 ] = X;
137 
138  totnum_abego_ = 13;
139 
140 }
141 
142 /// @brief check input torsion angle are in a given abego region
143 bool
144 ABEGOManager::check_rama( char const & symbol, Real const & phi, Real const & psi, Real const & omega )
145 {
146  Size idx = symbol2index( symbol );
147  return name2abego_[ idx ].check_rama( phi, psi, omega );
148 }
149 
150 
151 /// @brief get abego
152 Size
153 ABEGOManager::torsion2index( Real const phi, Real const psi, Real const omega, Size const level )
154 {
155  switch( level ) {
156  case 1:
157  return torsion2index_level1( phi, psi, omega );
158  case 2:
159  return torsion2index_level2( phi, psi, omega );
160  case 3:
161  return torsion2index_level3( phi, psi, omega );
162  case 4:
163  return torsion2index_level4( phi, psi, omega );
164  default :
165  TR << " [ERROR] Unrecognized level " << level << std::endl;
166  runtime_assert( false );
167  return 0;
168  }
169 }
170 
171 
172 /// @brief get abegeo index from torsion angles: ABEGO
173 Size
175 {
176  if ( fabs( omega ) < 90.0 ) {
177  return 5; // cis-omega
178  } else if ( phi >= 0.0 ) {
179  if ( -100.0 <= psi && psi < 100.0 ) {
180  return 4; // alpha-L
181  } else {
182  return 3; // E
183  }
184  } else {
185  if ( -75.0 <= psi && psi < 50.0 ) {
186  return 1; // helical
187  } else {
188  return 2; // beta
189  }
190  }
191  return 0;
192 }
193 
194 
195 /// @brief get abego index from torsion angles: ABEGOD
196 Size
198 {
199  if ( fabs( omega ) < 90.0 ) {
200  return 5; // cis-omega
201  } else if ( phi >= 0.0 ) {
202  if ( -100.0 <= psi && psi < 100.0 ) {
203  return 4; // alpha-L
204  } else {
205  return 3; // E
206  }
207  } else {
208 
209  if ( -75.0 <= psi && psi < 50.0 ) {
210  return 1; //helical
211  } else {
212 
213  Real ppsi;
214  if( psi < -75.0 ) {
215  ppsi = psi + 360.0;
216  } else {
217  ppsi = psi;
218  }
219  if( ppsi >= 195.0 ) {
220  return 8; // D
221  } else {
222  return 2; // B
223  }
224 
225  }
226 
227  }
228  return 0;
229 }
230 
231 /// @brief get abego index from torsion angles: ASPZYD
232 Size
234 {
235  if ( fabs( omega ) < 90.0 ) {
236  return 5; // cis-omega
237  } else if ( phi >= 0.0 ) {
238  if ( -100.0 <= psi && psi < 100.0 ) {
239  return 4; // alpha-L
240  } else {
241  return 3; // E
242  }
243  } else {
244  if ( -75.0 <= psi && psi < 50.0 ) {
245  return 1; //helical
246  } else if ( 50.0 <= psi && psi < 100.0 ) {
247  if( phi >= -100 ) {
248  return 10; // Y
249  } else {
250  return 9; // Z
251  }
252  } else {
253  Real ppsi;
254  if( psi < -75.0 ) {
255  ppsi = psi + 360.0;
256  } else {
257  ppsi = psi;
258  }
259  if( ppsi >= 195.0 ) {
260  return 8; // D
261  } else {
262  Real sign( ppsi - ( -1.6*phi + 4.0 ) );
263  if( sign >= 0 ) {
264  return 7; // P
265  } else {
266  return 6; // S
267  }
268  }
269  }
270  }
271  return 0;
272 }
273 
274 /// @brief get abego index from torsion angles: MNSPZYD
275 Size
277 {
278  if ( fabs( omega ) < 90.0 ) {
279  return 5; // cis-omega
280  } else if ( phi >= 0.0 ) {
281  if ( -100.0 <= psi && psi < 100.0 ) {
282  return 4; // alpha-L
283  } else {
284  return 3; // E
285  }
286  } else {
287  if ( -75.0 <= psi && psi < 50.0 ) {
288  if( phi >= -90.0 ) {
289  return 12; // N
290  } else {
291  return 11; // M
292  }
293  } else if ( 50.0 <= psi && psi < 100.0 ) {
294  if( phi >= -100 ) {
295  return 10; // Y
296  } else {
297  return 9; // Z
298  }
299  } else {
300  Real ppsi;
301  if( psi < -75.0 ) {
302  ppsi = psi + 360.0;
303  } else {
304  ppsi = psi;
305  }
306 
307  if( ppsi >= 195.0 ) {
308  return 8; // D
309  } else {
310  Real sign( ppsi - ( -1.6*phi + 4.0 ) );
311  if( sign >= 0 ) {
312  return 7; // P
313  } else {
314  return 6; // S
315  }
316  }
317  }
318  }
319  return 0;
320 }
321 
322 /// @brief transform abego index to symbol
323 char
325 {
326  switch( idx ) {
327  case 1:
328  return 'A';
329  case 2:
330  return 'B';
331  case 3:
332  return 'E';
333  case 4:
334  return 'G';
335  case 5:
336  return 'O';
337  case 6:
338  return 'S';
339  case 7:
340  return 'P';
341  case 8:
342  return 'D';
343  case 9:
344  return 'Z';
345  case 10:
346  return 'Y';
347  case 11:
348  return 'M';
349  case 12:
350  return 'N';
351  case 13:
352  return 'X';
353  default :
354  TR << " [ERROR] Unrecognized abego index: " << idx << std::endl;
355  runtime_assert( false );
356  return 0;
357  }
358 }
359 
360 
361 /// @brief transform abego symbol to index
362 Size
363 ABEGOManager::symbol2index( char const & symbol )
364 {
365  switch( symbol ) {
366  case 'A' :
367  case 'a' :
368  return 1;
369  case 'B' :
370  case 'b' :
371  return 2;
372  case 'E' :
373  case 'e' :
374  return 3;
375  case 'G' :
376  case 'g' :
377  return 4;
378  case 'O' :
379  case 'o' :
380  return 5;
381  case 'S' :
382  case 's' :
383  return 6;
384  case 'P' :
385  case 'p' :
386  return 7;
387  case 'D' :
388  case 'd' :
389  return 8;
390  case 'Z' :
391  case 'z' :
392  return 9;
393  case 'Y' :
394  case 'y' :
395  return 10;
396  case 'M' :
397  case 'm' :
398  return 11;
399  case 'N' :
400  case 'n' :
401  return 12;
402  case 'X' :
403  case 'x' :
404  return 13;
405  default :
406  TR << " [ERROR] Unrecognized abego index: " << symbol << std::endl;
407  runtime_assert( false );
408  return 0;
409  }
410 }
411 
412 
413 /// @brief get abego sequence from pose
415 ABEGOManager::get_symbols( Pose const & pose, Size const begin, Size const end, Size const level )
416 {
417  runtime_assert( begin >= 1 && end <= pose.total_residue() );
418 
420  for( Size i=begin; i<=end; i++ ) {
421  Size idx = torsion2index( pose.phi( i ), pose.psi( i ), pose.omega( i ), level );
422  std::ostringstream symbol;
423  symbol << index2symbol( idx );
424  symbols.push_back( symbol.str() );
425  }
426  return symbols;
427 }
428 
429 /// @brief get abego sequence from pose
431 ABEGOManager::get_symbols( Pose const & pose, Size const level )
432 {
433  return get_symbols( pose, 1, pose.total_residue(), level );
434 }
435 
436 
437 /// @brief get abego string
440 {
441  std::ostringstream output;
442  for( Size ii=1; ii<=abego.size(); ++ii ) {
443  Size length = abego[ ii ].length();
444  if( length > 1 ) {
445  std::ostringstream multi;
446  multi << "[";
447  for( Size jj=0; jj<abego[ ii ].length(); ++jj ) {
448  multi << abego[ ii ].at( jj );
449  }
450  multi << "]";
451  output << multi.str();
452  } else {
453  output << abego[ ii ].at( 0 );
454  }
455  }
456  return output.str();
457 }
458 
459 
460 /// @brief utility for getting abego
462 get_abego( core::pose::Pose const & pose, core::Size const level )
463 {
464  ABEGOManager am;
465  return am.get_symbols( pose, level );
466 }
467 
468 } // namespace util
469 } // namespace core
470