Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
InterfaceSasaDefinitionCalculator.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/pose/metrics/simple_calculators/InterfaceSasaDefinitionCalculator.cc
11 /// @brief SasaCalculator class
12 /// @author John Karanicolas
13 
14 // Unit headers
16 #include <core/pose/Pose.hh>
17 #include <core/scoring/sasa.hh>
19 
20 #include <basic/options/option.hh>
21 
22 // Utility headers
23 #include <basic/MetricValue.hh>
24 #include <basic/Tracer.hh>
25 #include <utility/exit.hh>
26 #include <utility/stream_util.hh>
27 #include <utility/string_util.hh>
28 
29 #include <cassert>
30 
31 
32 // option key includes
33 
34 #include <basic/options/keys/pose_metrics.OptionKeys.gen.hh>
35 
36 #include <core/pose/util.hh>
37 #include <utility/vector1.hh>
38 
39 //Auto Headers
40 #include <core/pose/util.tmpl.hh>
41 
42 
43 using namespace core;
44 using namespace core::pose;
45 using namespace core::pose::metrics;
46 
47 namespace core{
48 namespace pose {
49 namespace metrics {
50 namespace simple_calculators {
51 
52 
53 void InterfaceSasaDefinitionCalculator::lookup( std::string const & key, basic::MetricValueBase * valptr ) const {
54 
55  if ( key == "delta_sasa" ) {
56  basic::check_cast( valptr, &delta_sasa_, "delta_sasa expects to return a Real" );
57  (static_cast<basic::MetricValue<Real> *>(valptr))->set( delta_sasa_ );
58 
59  } else if ( key == "frac_ch1_dsasa" ) {
60  basic::check_cast( valptr, &delta_sasa_, "frac_ch1_dsasa expects to return a Real" );
61  (static_cast<basic::MetricValue<Real> *>(valptr))->set( fraction_chain1_delta_sasa_ );
62 
63  } else if ( key == "frac_ch2_dsasa" ) {
64  basic::check_cast( valptr, &delta_sasa_, "frac_ch2_dsasa expects to return a Real" );
65  (static_cast<basic::MetricValue<Real> *>(valptr))->set( fraction_chain2_delta_sasa_ );
66 
67  } else if ( key == "delta_atom_sasa" ) {
68  basic::check_cast( valptr, &atom_delta_sasa_, "delta_atom_sasa expects to return a id::AtomID_Map< Real >" );
69  (static_cast<basic::MetricValue<id::AtomID_Map< Real > > *>(valptr))->set( atom_delta_sasa_ );
70 
71  } else if ( key == "delta_residue_sasa" ) {
72  basic::check_cast( valptr, &residue_delta_sasa_, "delta_residue_sasa expects to return a utility::vector1< Real >" );
73  (static_cast<basic::MetricValue< utility::vector1< Real > > *>(valptr))->set( residue_delta_sasa_ );
74 
75  } else if ( key == "interface_atoms" ) {
76  basic::check_cast( valptr, &interface_atoms_, "interface_atoms expects to return a id::AtomID_Map< bool >" );
77  (static_cast<basic::MetricValue<id::AtomID_Map< bool > > *>(valptr))->set( interface_atoms_ );
78 
79  } else if ( key == "interface_residues" ) {
80  basic::check_cast( valptr, &interface_residues_, "interface_residues expects to return a std::set< Size >" );
81  (static_cast<basic::MetricValue<std::set<Size> > *>(valptr))->set( interface_residues_ );
82 
83  } else if ( key == "first_chain_interface_residues" ) {
84  basic::check_cast( valptr, &chain1_interface_residues_, "first_chain_interface_residues expects to return a std::set< Size >" );
85  (static_cast<basic::MetricValue<std::set<Size> > *>(valptr))->set( chain1_interface_residues_ );
86 
87  } else if ( key == "second_chain_interface_residues" ) {
88  basic::check_cast( valptr, &chain2_interface_residues_, "second_chain_interface_residues expects to return a std::set< Size >" );
89  (static_cast<basic::MetricValue<std::set<Size> > *>(valptr))->set( chain2_interface_residues_ );
90 
91  } else if ( key == "num_interface_residues" ) {
92  basic::check_cast( valptr, &num_interface_residues_, "num_interface_residues expects to return a Size" );
93  (static_cast<basic::MetricValue<Size> *>(valptr))->set( num_interface_residues_ );
94 
95  } else if ( key == "num_first_chain_interface_residues" ) {
96  basic::check_cast( valptr, &num_chain1_interface_residues_, "num_first_chain_interface_residues expects to return a Size" );
97  (static_cast<basic::MetricValue<Size> *>(valptr))->set( num_chain1_interface_residues_ );
98 
99  } else if ( key == "num_second_chain_interface_residues" ) {
100  basic::check_cast( valptr, &num_chain2_interface_residues_, "num_second_chain_interface_residues expects to return a Size" );
101  (static_cast<basic::MetricValue<Size> *>(valptr))->set( num_chain2_interface_residues_ );
102 
103  } else if ( key == "first_chain_first_resnum" ) {
104  basic::check_cast( valptr, &ch1_begin_num_, "first_chain_first_resnum expects to return a Size" );
105  (static_cast<basic::MetricValue<Size> *>(valptr))->set( ch1_begin_num_ );
106 
107  } else if ( key == "first_chain_last_resnum" ) {
108  basic::check_cast( valptr, &ch1_end_num_, "first_chain_last_resnum expects to return a Size" );
109  (static_cast<basic::MetricValue<Size> *>(valptr))->set( ch1_end_num_ );
110 
111  } else if ( key == "second_chain_first_resnum" ) {
112  basic::check_cast( valptr, &ch2_begin_num_, "second_chain_first_resnum expects to return a Size" );
113  (static_cast<basic::MetricValue<Size> *>(valptr))->set( ch2_begin_num_ );
114 
115  } else if ( key == "second_chain_last_resnum" ) {
116  basic::check_cast( valptr, &ch2_end_num_, "second_chain_first_resnum expects to return a Size" );
117  (static_cast<basic::MetricValue<Size> *>(valptr))->set( ch2_end_num_ );
118 
119  } else {
120  basic::Error() << "This Calculator cannot compute metric " << key << std::endl;
121  utility_exit();
122  }
123 
124 }
125 
126 
127 std::string InterfaceSasaDefinitionCalculator::print( std::string const & key ) const {
128 
129  if ( key == "delta_sasa" ) {
130  return utility::to_string( delta_sasa_ );
131  } else if ( key == "frac_ch1_dsasa" ) {
132  return utility::to_string( fraction_chain1_delta_sasa_ );
133  } else if ( key == "frac_ch2_dsasa" ) {
134  return utility::to_string( fraction_chain2_delta_sasa_ );
135  } else if ( key == "delta_atom_sasa" ) {
136  basic::Error() << "No output operator, for metric " << key << std::endl;
137  utility_exit();
138  } else if ( key == "delta_residue_sasa" ) {
139  return utility::to_string( residue_delta_sasa_ );
140  } else if ( key == "interface_atoms" ) {
141  basic::Error() << "No output operator, for metric " << key << std::endl;
142  utility_exit();
143  } else if ( key == "interface_residues" ) {
144  basic::Error() << "No output operator, for metric " << key << std::endl;
145  utility_exit();
146  } else if ( key == "first_chain_interface_residues" ) {
147  basic::Error() << "No output operator, for metric " << key << std::endl;
148  utility_exit();
149  } else if ( key == "second_chain_interface_residues" ) {
150  basic::Error() << "No output operator, for metric " << key << std::endl;
151  utility_exit();
152  } else if ( key == "num_interface_residues" ) {
153  return utility::to_string( num_interface_residues_ );
154  } else if ( key == "num_first_chain_interface_residues" ) {
155  return utility::to_string( num_chain1_interface_residues_ );
156  } else if ( key == "num_second_chain_interface_residues" ) {
157  return utility::to_string( num_chain2_interface_residues_ );
158  } else if ( key == "first_chain_first_resnum" ) {
159  return utility::to_string( ch1_begin_num_ );
160  } else if ( key == "first_chain_last_resnum" ) {
161  return utility::to_string( ch1_end_num_ );
162  } else if ( key == "second_chain_first_resnum" ) {
163  return utility::to_string( ch2_begin_num_ );
164  } else if ( key == "second_chain_last_resnum" ) {
165  return utility::to_string( ch2_end_num_ );
166  }
167 
168  basic::Error() << "This Calculator cannot compute metric " << key << std::endl;
169  utility_exit();
170  return "";
171 
172 }
173 
174 
175 void InterfaceSasaDefinitionCalculator::recompute( Pose const & this_pose ) {
176 
177  verify_chain_setup( this_pose );
178 
179  Real const probe_radius( basic::options::option[basic::options::OptionKeys::pose_metrics::sasa_calculator_probe_radius] );
180  Real const atom_delta_sasa_thres(0.2); // atom must lose this much sasa to be buried by the interface
181  Real const residue_delta_sasa_thres(2); // residue must lose this much sasa to be buried by the interface
182 
183  // Build atom subsets for computing SASA
184  // note: we'll compute sasa ONLY for the chains of interest, ignoring any other chains which may be present!
185  id::AtomID_Map< bool > bound_atom_subset, chain1_atom_subset, chain2_atom_subset;
186  bound_atom_subset.clear();
187  chain1_atom_subset.clear();
188  chain2_atom_subset.clear();
189  core::pose::initialize_atomid_map( bound_atom_subset, this_pose, false );
190  core::pose::initialize_atomid_map( chain1_atom_subset, this_pose, false );
191  core::pose::initialize_atomid_map( chain2_atom_subset, this_pose, false );
192  for ( Size ir = ch1_begin_num_; ir <= ch1_end_num_; ++ir ) {
193  core::conformation::Residue const & irsd( this_pose.residue( ir ) );
194  for ( Size ia = 1; ia <= irsd.natoms(); ++ia ) {
195  id::AtomID const iid( ia, ir );
196  bound_atom_subset[ iid ] = true;
197  chain1_atom_subset[ iid ] = true;
198  }
199  }
200  for ( Size ir = ch2_begin_num_; ir <= ch2_end_num_; ++ir ) {
201  core::conformation::Residue const & irsd( this_pose.residue( ir ) );
202  for ( Size ia = 1; ia <= irsd.natoms(); ++ia ) {
203  id::AtomID const iid( ia, ir );
204  bound_atom_subset[ iid ] = true;
205  chain2_atom_subset[ iid ] = true;
206  }
207  }
208 
209  // Get the bound SASA, and the SASA for chain1/chain2 alone
210  id::AtomID_Map< Real > bound_atom_sasa, chain1_atom_sasa, chain2_atom_sasa;
211  utility::vector1< Real > bound_residue_sasa, chain1_residue_sasa, chain2_residue_sasa;
212  Real bound_sasa = core::scoring::calc_per_atom_sasa( this_pose, bound_atom_sasa, bound_residue_sasa, probe_radius, false, bound_atom_subset );
213  Real chain1_sasa = core::scoring::calc_per_atom_sasa( this_pose, chain1_atom_sasa, chain1_residue_sasa, probe_radius, false, chain1_atom_subset );
214  Real chain2_sasa = core::scoring::calc_per_atom_sasa( this_pose, chain2_atom_sasa, chain2_residue_sasa, probe_radius, false, chain2_atom_subset );
215 
216  // Fill in "delta_sasa" member data, and put together a lists of interface atoms and interface residues
217  delta_sasa_ = chain1_sasa + chain2_sasa - bound_sasa;
218 
219  //std::cerr << "total ch1 sasa is " << chain1_sasa << ", total ch2 sasa is " << chain2_sasa << ", bound sasa is " << bound_sasa << ", and delta sasa is " << delta_sasa_ << std::endl;
220  atom_delta_sasa_.clear();
221  core::pose::initialize_atomid_map( atom_delta_sasa_, this_pose, 0. );
222  interface_atoms_.clear();
223  core::pose::initialize_atomid_map( interface_atoms_, this_pose, false );
224  interface_residues_.clear();
225  chain1_interface_residues_.clear();
226  chain2_interface_residues_.clear();
227  residue_delta_sasa_.clear();
228  residue_delta_sasa_.assign( this_pose.total_residue(), 0. );
229 
230  core::Real delta_sasa_atomch1(0.0), delta_sasa_atomch2(0.0);
231 
232  for ( Size ir = ch1_begin_num_; ir <= ch1_end_num_; ++ir ) {
233  core::conformation::Residue const & irsd( this_pose.residue( ir ) );
234  for ( Size ia = 1; ia <= irsd.natoms(); ++ia ) {
235  id::AtomID const iid( ia, ir );
236  atom_delta_sasa_[iid] = chain1_atom_sasa[ iid ] - bound_atom_sasa[ iid ];
237  delta_sasa_atomch1 += atom_delta_sasa_[iid];
238  if ( atom_delta_sasa_[iid] > atom_delta_sasa_thres ) {
239  interface_atoms_[ iid ] = true;
240  }
241  }
242  residue_delta_sasa_[ir] = chain1_residue_sasa[ir] - bound_residue_sasa[ir];
243  if ( residue_delta_sasa_[ir] > residue_delta_sasa_thres ) {
244  interface_residues_.insert( ir );
245  chain1_interface_residues_.insert( ir );
246  }
247  }
248 
249  for ( Size ir = ch2_begin_num_; ir <= ch2_end_num_; ++ir ) {
250  core::conformation::Residue const & irsd( this_pose.residue( ir ) );
251  for ( Size ia = 1; ia <= irsd.natoms(); ++ia ) {
252  id::AtomID const iid( ia, ir );
253  atom_delta_sasa_[iid] = chain2_atom_sasa[ iid ] - bound_atom_sasa[ iid ];
254  delta_sasa_atomch2 += atom_delta_sasa_[iid];
255  if ( atom_delta_sasa_[iid] > atom_delta_sasa_thres ) {
256  interface_atoms_[ iid ] = true;
257  }
258  }
259  residue_delta_sasa_[ir] = chain2_residue_sasa[ir] - bound_residue_sasa[ir];
260  if ( residue_delta_sasa_[ir] > residue_delta_sasa_thres ) {
261  interface_residues_.insert( ir );
262  chain2_interface_residues_.insert( ir );
263  }
264  }
265 
266  fraction_chain1_delta_sasa_ = delta_sasa_atomch1 / chain1_sasa;
267  fraction_chain2_delta_sasa_ = delta_sasa_atomch2 / chain2_sasa;
268 
269  //std::cerr << "summing up atomd delta sasas, ch1 delta sasa is " << delta_sasa_atomch1 << " and ch2 delta sasa is " << delta_sasa_atomch2 << std::endl;
270  num_interface_residues_ = interface_residues_.size();
271  num_chain1_interface_residues_ = chain1_interface_residues_.size();
272  num_chain2_interface_residues_ = chain2_interface_residues_.size();
273 
274  return;
275 }
276 
277 } // simple_calculators
278 } // metrics
279 } // pose
280 } // core