Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
AntibodyClass.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
6 // (c) under license. The Rosetta software is developed by the contributing
7 // (c) members of the Rosetta Commons. For more information, see
8 // (c) http://www.rosettacommons.org. Questions about this can be addressed to
9 // (c) University of Washington UW TechTransfer,email:license@u.washington.edu.
10 
11 /// @file
12 /// @brief
13 /// @author Aroop Sircar
14 
15 // Rosetta Headers
17 #include <core/pose/PDBInfo.hh>
18 #include <core/pose/Pose.hh>
19 #include <core/scoring/rms_util.hh>
20 #include <core/types.hh>
21 #include <basic/Tracer.hh>
22 
24 #include <protocols/loops/Loop.hh>
25 #include <protocols/loops/Loops.hh>
26 
28 #include <core/pose/util.hh>
29 #include <utility/vector1.hh>
30 
31 //Auto Headers
32 #include <core/pose/util.tmpl.hh>
33 
34 
35 static basic::Tracer TR("antibody");
36 
37 namespace protocols{
38  namespace antibody{
39 
40  /// default constructor
42  camelid_ = false;
43  current_start = 0;
44  current_end = 0;
45  kinked_ = false;
46  extended_ = false;
47 
48  for( core::Size i = 1; i <= 3; i++ )
49  cdrl_[i][1] = cdrl_[i][2] = cdrh_[i][1] = cdrh_[i][2] = 0;
50  for( core::Size i = 1; i <= 7; i++ )
51  lfr_[i][1] = lfr_[i][2] = 0;
52  for( core::Size i = 1; i <= 6; i++ )
53  hfr_[i][1] = hfr_[i][2] = 0;
54  }
55 
56 
57  /// constructor with arguments
59  camelid_ = false;
60  Fv = pose_in;
61  set_defaults();
62  current_start = 0;
63  current_end = 0;
64 
66  kinked_ = false;
67  extended_ = false;
69  }
70 
71  /// constructor with arguments
72  Antibody::Antibody( core::pose::Pose& pose_in, bool camelid ) {
73  camelid_ = camelid;
74  Fv = pose_in;
75  set_defaults();
76  current_start = 0;
77  current_end = 0;
78 
80  kinked_ = false;
81  extended_ = false;
83  }
84 
85  /// constructor with arguments
87  core::pose::Pose& pose_in,
88  std::string cdr_name ) {
89  camelid_ = false;
90  Fv = pose_in;
91 
92  if( !camelid_ ) {
93  if( cdr_name == "l1" ) {
94  cdrl_[1][1] = Fv.pdb_info()->pdb2pose( 'L', 24 );
95  cdrl_[1][2] = Fv.pdb_info()->pdb2pose( 'L', 34 );
96  current_start = cdrl_[1][1];
97  current_end = cdrl_[1][2];
98  }
99  else if( cdr_name == "l2" ) {
100  cdrl_[2][1] = Fv.pdb_info()->pdb2pose( 'L', 50 );
101  cdrl_[2][2] = Fv.pdb_info()->pdb2pose( 'L', 56 );
102  current_start = cdrl_[2][1];
103  current_end = cdrl_[2][2];
104  }
105  else if( cdr_name == "l3" ) {
106  cdrl_[3][1] = Fv.pdb_info()->pdb2pose( 'L', 89 );
107  cdrl_[3][2] = Fv.pdb_info()->pdb2pose( 'L', 97 );
108  current_start = cdrl_[3][1];
109  current_end = cdrl_[3][2];
110  }
111  }
112  if( cdr_name == "h1" ) {
113  cdrh_[1][1] = Fv.pdb_info()->pdb2pose( 'H', 26 );
114  cdrh_[1][2] = Fv.pdb_info()->pdb2pose( 'H', 35 );
115  current_start = cdrh_[1][1];
116  current_end = cdrh_[1][2];
117  }
118  else if( cdr_name == "h2" ) {
119  cdrh_[2][1] = Fv.pdb_info()->pdb2pose( 'H', 50 );
120  cdrh_[2][2] = Fv.pdb_info()->pdb2pose( 'H', 65 );
121  current_start = cdrh_[2][1];
122  current_end = cdrh_[2][2];
123  }
124  else if( cdr_name == "h3" ) {
125  cdrh_[3][1] = Fv.pdb_info()->pdb2pose( 'H', 95 );
126  cdrh_[3][2] = Fv.pdb_info()->pdb2pose( 'H', 102 );
127  current_start = cdrh_[3][1];
128  current_end = cdrh_[3][2];
129  }
130  else {
131  current_start = 0;
132  current_end = 0;
133  }
134  } // constructor with arguments
135 
136 
137  void
139  if( !camelid_ ) {
140  lfr_[1][1] = Fv.pdb_info()->pdb2pose( 'L', 4 );
141  lfr_[1][2] = Fv.pdb_info()->pdb2pose( 'L', 6 );
142  lfr_[2][1] = Fv.pdb_info()->pdb2pose( 'L', 10 );
143  lfr_[2][2] = Fv.pdb_info()->pdb2pose( 'L', 23 );
144  cdrl_[1][1] = Fv.pdb_info()->pdb2pose( 'L', 24 );
145  cdrl_[1][2] = Fv.pdb_info()->pdb2pose( 'L', 34 );
146  lfr_[3][1] = Fv.pdb_info()->pdb2pose( 'L', 35 );
147  lfr_[3][2] = Fv.pdb_info()->pdb2pose( 'L', 38 );
148  lfr_[4][1] = Fv.pdb_info()->pdb2pose( 'L', 45 );
149  lfr_[4][2] = Fv.pdb_info()->pdb2pose( 'L', 49 );
150  cdrl_[2][1] = Fv.pdb_info()->pdb2pose( 'L', 50 );
151  cdrl_[2][2] = Fv.pdb_info()->pdb2pose( 'L', 56 );
152  lfr_[5][1] = Fv.pdb_info()->pdb2pose( 'L', 57 );
153  lfr_[5][2] = Fv.pdb_info()->pdb2pose( 'L', 66 );
154  lfr_[6][1] = Fv.pdb_info()->pdb2pose( 'L', 71 );
155  lfr_[6][2] = Fv.pdb_info()->pdb2pose( 'L', 88 );
156  cdrl_[3][1] = Fv.pdb_info()->pdb2pose( 'L', 89 );
157  cdrl_[3][2] = Fv.pdb_info()->pdb2pose( 'L', 97 );
158  lfr_[7][1] = Fv.pdb_info()->pdb2pose( 'L', 98 );
159  lfr_[7][2] = Fv.pdb_info()->pdb2pose( 'L', 104 );
160  }
161  hfr_[1][1] = Fv.pdb_info()->pdb2pose( 'H', 5 );
162  hfr_[1][2] = Fv.pdb_info()->pdb2pose( 'H', 6 );
163  hfr_[2][1] = Fv.pdb_info()->pdb2pose( 'H', 10 );
164  hfr_[2][2] = Fv.pdb_info()->pdb2pose( 'H', 25 );
165  cdrh_[1][1] = Fv.pdb_info()->pdb2pose( 'H', 26 );
166  cdrh_[1][2] = Fv.pdb_info()->pdb2pose( 'H', 35 );
167  hfr_[3][1] = Fv.pdb_info()->pdb2pose( 'H', 36 );
168  hfr_[3][2] = Fv.pdb_info()->pdb2pose( 'H', 39 );
169  hfr_[4][1] = Fv.pdb_info()->pdb2pose( 'H', 46 );
170  hfr_[4][2] = Fv.pdb_info()->pdb2pose( 'H', 49 );
171  cdrh_[2][1] = Fv.pdb_info()->pdb2pose( 'H', 50 );
172  cdrh_[2][2] = Fv.pdb_info()->pdb2pose( 'H', 65 );
173  hfr_[5][1] = Fv.pdb_info()->pdb2pose( 'H', 66 );
174  hfr_[5][2] = Fv.pdb_info()->pdb2pose( 'H', 94 );
175  cdrh_[3][1] = Fv.pdb_info()->pdb2pose( 'H', 95 );
176  cdrh_[3][2] = Fv.pdb_info()->pdb2pose( 'H', 102 );
177  hfr_[6][1] = Fv.pdb_info()->pdb2pose( 'H', 103 );
178  hfr_[6][2] = Fv.pdb_info()->pdb2pose( 'H', 110 );
179 
180 
181  cdr_h3_cut_ = cdrh_[3][1] + 1;
182 
185  } // set_defaults
186 
187  void
189  Fv = pose_in;
190  camelid_ = false;
191  set_defaults();
192  current_start = 0;
193  current_end = 0;
194 
195  update_sequence();
196  kinked_ = false;
197  extended_ = false;
199  } // set_Fv
200 
201  void
202  Antibody::set_Fv( core::pose::Pose& pose_in, bool camelid ) {
203  Fv = pose_in;
204  camelid_ = camelid;
205  set_defaults();
206  current_start = 0;
207  current_end = 0;
208 
209  update_sequence();
210  kinked_ = false;
211  extended_ = false;
213  } // set_Fv
214 
215  void
217 
218  core::Size begin(0), end(0), size(0), cut(0);
219 
220  std::string cdr_name[6] = { "l1", "l2", "l3", "h1", "h2", "h3" };
221 
222  core::Size cdr_total( 6 );
223 
224  for( core::Size i = 0; i < cdr_total; i++ ) {
225  if( cdr_name[i] == "l1" ) {
226  begin = cdrl_[1][1];
227  end = cdrl_[1][2];
228  }
229  else if( cdr_name[i] == "l2" ) {
230  begin = cdrl_[2][1];
231  end = cdrl_[2][2];
232  }
233  else if( cdr_name[i] == "l3" ) {
234  begin = cdrl_[3][1];
235  end = cdrl_[3][2];
236  }
237  else if( cdr_name[i] == "h1" ) {
238  begin = cdrh_[1][1];
239  end = cdrh_[1][2];
240  }
241  else if( cdr_name[i] == "h2" ) {
242  begin = cdrh_[2][1];
243  end = cdrh_[2][2];
244  }
245  else if( cdr_name[i] == "h3" ) {
246  begin = cdrh_[3][1];
247  end = cdrh_[3][2] + 1; // for the extra stem residue
248  }
249 
250  //if( flank_relax && cdr_name[i] == "h3" ) {
251  // begin = begin - h3_flank;
252  // end = end + h3_flank;
253  //}
254  size = ( end - begin ) + 1;
255  cut = begin + core::Size( size / 2 );
256  if( cdr_name[i] == "h3" )
257  cut = cdr_h3_cut_;
258  if( !camelid_ )
259  all_cdr_loops.add_loop( begin, end, cut, 0, false);
260  else {
261  if( (cdr_name[i] == "h1") || (cdr_name[i] == "h2") ||
262  (cdr_name[i] == "h3") )
263  all_cdr_loops.add_loop( begin, end, cut, 0, false);
264  }
265  }
267  } // populate_all_cdrs
268 
269  void
271  for( core::Size i = 1; i <= Fv.total_residue(); ++i )
272  Fv_sequence_.push_back( Fv.residue(i).name1() );
273  }
274 
275  void
277  if( camelid_ )
279  else
281  return;
282  } // detect_CDR_H3_stem_type
283 
284  void
286  TR << "AC Detecting Camelid CDR H3 Stem Type" << std::endl;
287 
288  // extract single letter aa codes for the chopped loop residues
289  utility::vector1< char > cdr_h3_sequence;
290  for( core::Size ii = cdrh_[3][1] - 2; ii <= (cdrh_[3][2] + 1); ++ii )
291  cdr_h3_sequence.push_back( Fv_sequence_[ii] );
292 
293  // Rule for extended
294  if( ( ( cdrh_[3][2] - cdrh_[3][1] ) + 1 ) >= 12 ) {
295  if( ( ( cdr_h3_sequence[ cdr_h3_sequence.size() - 3 ] == 'Y' ) ||
296  ( cdr_h3_sequence[ cdr_h3_sequence.size() - 3 ] == 'W' ) ||
297  ( cdr_h3_sequence[ cdr_h3_sequence.size() - 3 ] == 'F' ) ) &&
298  ( cdr_h3_sequence[ cdr_h3_sequence.size() - 2 ] != 'H' ) &&
299  ( cdr_h3_sequence[ cdr_h3_sequence.size() - 1 ] != 'G' ) )
300  extended_ = true;
301  }
302 
303  if( !extended_ ) {
304  kinked_ = true;
305  if( ( cdr_h3_sequence[ cdr_h3_sequence.size() - 3 ] == 'R' ) ||
306  ( cdr_h3_sequence[ cdr_h3_sequence.size() - 2 ] == 'Y' ) ||
307  (( ( cdr_h3_sequence[ cdr_h3_sequence.size() - 1 ] != 'Y' ) ||
308  ( cdr_h3_sequence[ cdr_h3_sequence.size() - 1 ] != 'W' ) ) &&
309  ( ( cdr_h3_sequence[ cdr_h3_sequence.size() - 2 ] != 'Y' ) ||
310  ( cdr_h3_sequence[ cdr_h3_sequence.size() - 2 ] != 'W' ) ) &&
311  ( ( cdr_h3_sequence[ cdr_h3_sequence.size() - 3 ] != 'Y' ) ||
312  ( cdr_h3_sequence[ cdr_h3_sequence.size() - 3 ] != 'W' ) )) )
313  kinked_ = false;
314  }
315 
316 
317  TR << "AC Finished Detecting Camelid CDR H3 Stem Type: "
318  << "Kink: " << kinked_ << " Extended: " << extended_ << std::endl;
319 
320  return;
321 
322  } // detect_camelid_CDR_H3_stem_type()
323 
324 
325  void
327  TR << "AC Detecting Regular CDR H3 Stem Type" << std::endl;
328 
329  bool is_H3( false );
330 
331  // extract single letter aa codes for the chopped loop residues
332  utility::vector1< char > cdr_h3_sequence;
333  for( core::Size ii = cdrh_[3][1] - 2; ii <= (cdrh_[3][2] + 1); ++ii )
334  cdr_h3_sequence.push_back( Fv_sequence_[ii] );
335 
336  // Rule 1a for standard kink
337  if( cdr_h3_sequence[ cdr_h3_sequence.size() - 2 ] != 'D') {
338  kinked_ = true;
339  is_H3 = true;
340  }
341 
342  // Rule 1b for standard extended form
343  if( ( cdr_h3_sequence[ cdr_h3_sequence.size() - 2 ] == 'D')
344  && ( (cdr_h3_sequence[2] != 'K') &&
345  (cdr_h3_sequence[2] != 'R') ) && (is_H3 != true)) {
346  extended_ = true;
347  is_H3 = true;
348  }
349 
350  if( !is_H3 ) {
351  // Rule 1b extension for special kinked form
352  bool is_basic( false ); // Special basic residue exception flag
353  for(core::Size ii = 3; ii <= core::Size(cdr_h3_sequence.size() - 4);
354  ii++) {
355  if( cdr_h3_sequence[ii] == 'R' || cdr_h3_sequence[ii] == 'K') {
356  is_basic = true;
357  break;
358  }
359  }
360 
361  if( !is_basic ) {
362  core::Size L49_pose_number = Fv.pdb_info()->pdb2pose( 'L', 49 );
363  char aa_code_L49 = Fv.residue( L49_pose_number ).name1();
364  if( aa_code_L49 == 'R' || aa_code_L49 == 'K')
365  is_basic = true;
366  }
367  if( is_basic ) {
368  kinked_ = true;
369  is_H3 = true;
370  }
371  }
372 
373  // Rule 1c for kinked form with salt bridge
374  if( ( cdr_h3_sequence[ cdr_h3_sequence.size() - 2 ] == 'D') &&
375  ( (cdr_h3_sequence[2] == 'K') ||
376  (cdr_h3_sequence[2] == 'R') ) &&
377  ( (cdr_h3_sequence[1] != 'K') &&
378  (cdr_h3_sequence[1] != 'R') ) && (is_H3 != true) ) {
379  kinked_ = true;
380  is_H3 = true;
381  if( !is_H3 ) {
382  bool is_basic( false ); // Special basic residue exception flag
383  core::Size L46_pose_number = Fv.pdb_info()->pdb2pose( 'L', 46 );
384  char aa_code_L46 = Fv.residue( L46_pose_number ).name1();
385  if( aa_code_L46 == 'R' || aa_code_L46 == 'K')
386  is_basic = true;
387  if( is_basic ) {
388  extended_ = true;
389  is_H3 = true;
390  }
391  }
392  }
393 
394  // Rule 1d for extened form with salt bridge
395  if( ( cdr_h3_sequence[ cdr_h3_sequence.size() - 2 ] == 'D') &&
396  ( ( cdr_h3_sequence[ 2 ] == 'K') ||
397  (cdr_h3_sequence[2] == 'R')) &&
398  ( (cdr_h3_sequence[1] == 'K') ||
399  (cdr_h3_sequence[1] == 'R') ) && (is_H3 != true) ) {
400  extended_ = true;
401  is_H3 = true;
402  }
403 
404  TR << "AC Finished Detecting Regular CDR H3 Stem Type: "
405  << "Kink: " << kinked_ << " Extended: " << extended_ << std::endl;
406 
407  return;
408 
409  } // detect_regular_CDR_H3_stem_type()
410 
411  void
413  using namespace core::kinematics;
414 
416 
417  FoldTree f;
418  f.clear();
419 
420  core::Size jump_num = 0;
422  it_end=all_cdr_loops.end(),
423  it_next; it < it_end; ++it ) {
424 
425  it_next = it;
426  it_next++;
427 
428  if( it == all_cdr_loops.begin() )
429  f.add_edge( 1, it->start()-1, Edge::PEPTIDE );
430 
431  jump_num++;
432  f.add_edge( it->start()-1, it->stop()+1, jump_num );
433  f.add_edge( it->start()-1, it->cut(), Edge::PEPTIDE );
434  f.add_edge( it->cut()+1, it->stop()+1, Edge::PEPTIDE );
435  if( it == (it_end-1) )
436  f.add_edge( it->stop()+1, Fv.total_residue(), Edge::PEPTIDE);
437  else
438  f.add_edge( it->stop()+1, it_next->start()-1, Edge::PEPTIDE );
439  }
440 
441  f.reorder(1);
442  Fv.fold_tree( f );
443 
444  } // all_cdr_fold_tree()
445 
446  void
448 
451 
452  for( core::Size j = 1; j <= 6; j++ ) {
453  core::Size buffer_for_h3_end(0);
454  if( j == 6 ) buffer_for_h3_end = 1;
455  for( core::Size res_counter=hfr_[j][1] + buffer_for_h3_end,
456  nat_counter=native.hfr_[j][1] + buffer_for_h3_end;
457  res_counter <= hfr_[j][2]; res_counter++, nat_counter++ ) {
458  for( core::Size atm_counter=1; atm_counter <= 4; atm_counter++ ) {
459  core::id::AtomID const id1( atm_counter, res_counter );
460  core::id::AtomID const id2( atm_counter, nat_counter );
461  atom_map[ id1 ] = id2;
462  }
463  }
464  }
465 
466  core::scoring::superimpose_pose( Fv, native.Fv, atom_map );
467 
468  } // align_to_native()
469 
470 
471  } // namespace antibody
472 } // namespace protocols
473