20 #include <basic/options/option.hh>
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>
34 #include <basic/options/keys/pose_metrics.OptionKeys.gen.hh>
37 #include <utility/vector1.hh>
44 using namespace core::pose;
45 using namespace core::pose::metrics;
50 namespace simple_calculators {
53 void InterfaceSasaDefinitionCalculator::lookup(
std::string const & key, basic::MetricValueBase * valptr )
const {
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_ );
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_ );
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_ );
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_ );
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_ );
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_ );
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_ );
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_ );
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_ );
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_ );
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_ );
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_ );
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_ );
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_ );
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_ );
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_ );
120 basic::Error() <<
"This Calculator cannot compute metric " << key << std::endl;
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;
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;
143 }
else if ( key ==
"interface_residues" ) {
144 basic::Error() <<
"No output operator, for metric " << key << std::endl;
146 }
else if ( key ==
"first_chain_interface_residues" ) {
147 basic::Error() <<
"No output operator, for metric " << key << std::endl;
149 }
else if ( key ==
"second_chain_interface_residues" ) {
150 basic::Error() <<
"No output operator, for metric " << key << std::endl;
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_ );
168 basic::Error() <<
"This Calculator cannot compute metric " << key << std::endl;
175 void InterfaceSasaDefinitionCalculator::recompute(
Pose const & this_pose ) {
177 verify_chain_setup( this_pose );
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);
181 Real const residue_delta_sasa_thres(2);
186 bound_atom_subset.
clear();
187 chain1_atom_subset.
clear();
188 chain2_atom_subset.
clear();
192 for (
Size ir = ch1_begin_num_; ir <= ch1_end_num_; ++ir ) {
194 for (
Size ia = 1; ia <= irsd.natoms(); ++ia ) {
196 bound_atom_subset[ iid ] =
true;
197 chain1_atom_subset[ iid ] =
true;
200 for (
Size ir = ch2_begin_num_; ir <= ch2_end_num_; ++ir ) {
202 for (
Size ia = 1; ia <= irsd.natoms(); ++ia ) {
204 bound_atom_subset[ iid ] =
true;
205 chain2_atom_subset[ iid ] =
true;
217 delta_sasa_ = chain1_sasa + chain2_sasa - bound_sasa;
220 atom_delta_sasa_.clear();
222 interface_atoms_.clear();
224 interface_residues_.clear();
225 chain1_interface_residues_.clear();
226 chain2_interface_residues_.clear();
227 residue_delta_sasa_.clear();
230 core::Real delta_sasa_atomch1(0.0), delta_sasa_atomch2(0.0);
232 for (
Size ir = ch1_begin_num_; ir <= ch1_end_num_; ++ir ) {
234 for (
Size ia = 1; ia <= irsd.natoms(); ++ia ) {
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;
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 );
249 for (
Size ir = ch2_begin_num_; ir <= ch2_end_num_; ++ir ) {
251 for (
Size ia = 1; ia <= irsd.natoms(); ++ia ) {
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;
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 );
266 fraction_chain1_delta_sasa_ = delta_sasa_atomch1 / chain1_sasa;
267 fraction_chain2_delta_sasa_ = delta_sasa_atomch2 / chain2_sasa;
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();