Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
EnergyPerResidueFilter.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 protocols/simple_filters/EnergyerResidueFilter.cc
11 /// @brief
12 /// @author Sarel Fleishman (sarelf@u.washington.edu), Jacob Corn (jecorn@u.washington.edu)
13 
16 
18 #include <ObjexxFCL/FArray1D.hh>
19 #include <ObjexxFCL/format.hh>
20 #include <basic/Tracer.hh>
21 #include <utility/tag/Tag.hh>
24 #include <core/pose/selection.hh>
26 #include <core/scoring/Energies.hh>
30 #include <core/pose/Pose.hh>
31 #include <core/pose/PDBInfo.hh>
34 #include <core/scoring/Energies.hh>
37 
38 namespace protocols {
39 namespace simple_filters {
40 
41 static basic::Tracer energy_per_residue_filter_tracer( "protocols.simple_filters.EnergyPerResidueFilter" );
42 
45 
47 EnergyPerResidueFilterCreator::keyname() const { return "EnergyPerResidue"; }
48 
50  core::Size const resnum,
52  core::scoring::ScoreType const score_type,
53  core::Real const threshold,
54  bool const whole_interface,
55  core::Size const rb_jump,
56  core::Real const interface_distance_cutoff,
57  bool const bb_bb
58  ) :
59  filters::Filter( "EnergyPerResidue" ),
60  resnum_( resnum ),
61  score_type_( score_type ),
62  threshold_( threshold ),
63  whole_interface_ ( whole_interface ),
64  rb_jump_ ( rb_jump ),
65  interface_distance_cutoff_ ( interface_distance_cutoff ),
66  bb_bb_ ( bb_bb )
67  {
68  using namespace core::scoring;
69 
70  if( scorefxn ) scorefxn_ = new core::scoring::ScoreFunction( *scorefxn );
71  if( score_type_ != total_score ) {
72  core::Real const old_weight( scorefxn_->get_weight( score_type_ ) );
73  scorefxn_->reset();
74  scorefxn_->set_weight( score_type_, old_weight );
75 
76  }
77  }
79  //utility::pointer::ReferenceCount(),
80  Filter( init ), resnum_( init.resnum_ ),
81  score_type_( init.score_type_ ),
82  threshold_( init.threshold_ ),
84  rb_jump_ (init.rb_jump_),
86  bb_bb_ ( init.bb_bb_ )
87 {
88  using namespace core::scoring;
90 }
91 
94  return scorefxn_;
95 }
96 
97 void
100 }
101 
104  return score_type_;
105 }
106 
107 void
110 }
111 
114  return threshold_;
115 }
116 
117 void
119  threshold_ = th;
120 }
121 
122 bool
124  return bb_bb_;
125 }
126 
127 void
129  bb_bb_ = b_b;
130 }
131 
134  return resnum_;
135 }
136 
137 void
139  resnum_ = rn;
140 }
141 
143 
144 void
146 {
147  using namespace core::scoring;
148 
149  std::string const scorefxn_name( tag->getOption<std::string>( "scorefxn", "score12" ) );
150  scorefxn_ = new ScoreFunction( *(data.get< ScoreFunction * >( "scorefxns", scorefxn_name ) ));
151  score_type_ = core::scoring::score_type_from_name( tag->getOption<std::string>( "score_type", "total_score" ) );
152  threshold_ = tag->getOption<core::Real>( "energy_cutoff", 0.0 );
153  whole_interface_ = tag->getOption<bool>( "whole_interface" , 0 );
154  rb_jump_ = tag->getOption<core::Size>( "jump_number", 1 );
155  interface_distance_cutoff_ = tag->getOption<core::Real>( "interface_distance_cutoff" , 8.0 );
156  bb_bb_ = tag->getOption< bool >("bb_bb", false );
157 
158  if (whole_interface_==1 ) {
159  resnum_ = 1;
160  energy_per_residue_filter_tracer<<"energies for all interface residues with a distance cutoff of "
161  << interface_distance_cutoff_ << " A will be calculated \n"
162  << "jump_number is set to "<< rb_jump_
163  << "\n and scorefxn " <<scorefxn_name <<" will be used" <<std::endl;
164  }
165  else {
166  resnum_ = core::pose::get_resnum( tag, pose );
167  energy_per_residue_filter_tracer<<"EnergyPerResidueFilter for residue "<<resnum_<<" of score_type "<<score_type_<<" with cutoff "<<threshold_<<std::endl;
168  }
169 }
170 
171 bool
173 {
174  using namespace core::scoring;
175 
176  if ( whole_interface_) {
177  if ( pose.conformation().num_chains() < 2 ) {
178  energy_per_residue_filter_tracer << "pose must contain at least two chains!" << std::endl;
179  return false;
180 
181  }
182  else {
183  energy_per_residue_filter_tracer<<" \n \t --------- computing ---------- \n \t-------- interface energies --------\n \t \t------------------- \n" << std::endl;
184  return true;
185  }
186  }
187 
188  else {
189 
190  core::Real const energy( compute( pose ) );
191  energy_per_residue_filter_tracer<<"Scoretype "<<name_from_score_type( score_type_ )<<" for residue: " << pose.pdb_info()->number(resnum_)<<" " <<pose.residue( resnum_).name3() <<" is "<<energy<<". ";
192  bool const pass( energy <= threshold_ );
193  if( pass ) energy_per_residue_filter_tracer<<"passing."<<std::endl;
194  else energy_per_residue_filter_tracer<<"failing."<<std::endl;
195 
196  return pass;
197  }
198 }
199 
200 
201 void
202 EnergyPerResidueFilter::report( std::ostream & out, core::pose::Pose const & pose ) const {
203  using namespace core::scoring;
204  using ObjexxFCL::FArray1D_bool;
205 
206  if( whole_interface_ ) {
207  core::pose::Pose in_pose = pose;
208  FArray1D_bool partner1_( in_pose.total_residue(), false );
209  in_pose.fold_tree().partition_by_jump( rb_jump_, partner1_);
211  in_pose.update_residue_neighbors();
212  interface_obj.distance( interface_distance_cutoff_ );
213  interface_obj.calculate( in_pose );
214  (*scorefxn_)( in_pose );
215 
216  out<<ObjexxFCL::fmt::A(9, "chain")<<
217  ObjexxFCL::fmt::A( 9, "res")<<
218  ObjexxFCL::fmt::A( 9, "AA")<<
219  ObjexxFCL::fmt::A( 9, "total")<<
220  ObjexxFCL::fmt::A( 9, "contact")<<
221  ObjexxFCL::fmt::A( 9, "fa_atr")<<
222  ObjexxFCL::fmt::A( 9, "fa_rep")<<
223  ObjexxFCL::fmt::A( 9, "hb_bb_sc")<<
224  ObjexxFCL::fmt::A( 9, "hb_sc")<<
225  ObjexxFCL::fmt::A( 9, "fa_sol")<<
226  ObjexxFCL::fmt::A( 9, "fa_dun")<<
227  ObjexxFCL::fmt::A( 9, "fa_pair")<<"\n";
228  for ( core::Size resnum_ = 1; resnum_ <= pose.total_residue(); ++resnum_) {
229  if ( !in_pose.residue(resnum_).is_protein() ) continue;
230  if( interface_obj.is_interface( resnum_ ) ) { // in interface
231 
233  core::Real weighted_fa_atr=( (*scorefxn_)[ ScoreType( fa_atr) ] ) * ( in_pose.energies().residue_total_energies( resnum_ )[ ScoreType( fa_atr ) ]);
234  core::Real weighted_fa_rep=( (*scorefxn_)[ ScoreType( fa_rep) ] ) * ( in_pose.energies().residue_total_energies( resnum_ )[ ScoreType( fa_rep) ]);
235  core::Real weighted_hbond_bb_sc=( (*scorefxn_)[ ScoreType( hbond_bb_sc) ] ) * ( in_pose.energies().residue_total_energies( resnum_ )[ ScoreType( hbond_bb_sc ) ]);
236  core::Real weighted_hbond_sc=( (*scorefxn_)[ ScoreType( hbond_sc) ] ) * ( in_pose.energies().residue_total_energies( resnum_ )[ ScoreType( hbond_sc ) ]);
237  core::Real weighted_fa_sol=( (*scorefxn_)[ ScoreType( fa_sol) ] ) * ( in_pose.energies().residue_total_energies( resnum_ )[ ScoreType( fa_sol ) ]);
238  core::Real weighted_contact_score = weighted_fa_atr + weighted_fa_rep + weighted_hbond_bb_sc + weighted_hbond_sc + weighted_fa_sol;
239 
240  core::Real weighted_fa_dun=( (*scorefxn_)[ ScoreType( fa_dun) ] ) * ( in_pose.energies().residue_total_energies( resnum_ )[ ScoreType( fa_dun ) ]);
241  core::Real weighted_fa_pair=( (*scorefxn_)[ ScoreType( fa_pair ) ] ) * ( in_pose.energies().residue_total_energies( resnum_ )[ ScoreType( fa_pair ) ]);
242 
243  out<<
244  ObjexxFCL::fmt::A (9 , in_pose.pdb_info()->chain( resnum_) )<<
245  ObjexxFCL::fmt::I(9,0, in_pose.pdb_info()->number(resnum_))<<
246  ObjexxFCL::fmt::A (9,in_pose.residue( resnum_).name3())
247  <<ObjexxFCL::fmt::F (9 , 3, total) <<" "
248  <<ObjexxFCL::fmt::F (9 , 3, weighted_contact_score)<<" "
249  <<ObjexxFCL::fmt::F (9 , 3, weighted_fa_atr) <<" "
250  <<ObjexxFCL::fmt::F (9 , 3, weighted_fa_rep) <<" "
251  <<ObjexxFCL::fmt::F (9 , 3, weighted_hbond_bb_sc )<<" "
252  <<ObjexxFCL::fmt::F (9 , 3, weighted_hbond_sc )<<" "
253  <<ObjexxFCL::fmt::F (9 , 3, weighted_fa_sol )<<" "
254  <<ObjexxFCL::fmt::F (9 , 3, weighted_fa_dun )<<" "
255  <<ObjexxFCL::fmt::F (9 , 3, weighted_fa_pair )<<"\n";
256 
257 
258  }
259  }
260  }
261 
262  else
263  {
264  core::Real const energy( compute( pose ) );
265  out<<"Scoretype "<<name_from_score_type( score_type_ )<<" is "<<energy<<". ";
266  bool const pass( energy <= threshold_ );
267  if( pass ) out<<"passing."<<'\n';
268  else out<<"failing."<<'\n';
269  }
270 }
271 
272 
275 {
276  using namespace core::scoring;
277 
278  core::Real const energy( compute( pose ) );
279  return( energy );
280 }
281 
284 {
285  using namespace core::scoring;
286 
287  core::pose::Pose in_pose = pose;
288  if( ( (*scorefxn_)[ interchain_env ] > 0.0 )
289  && ( (*scorefxn_)[ interchain_vdw ] > 0.0 )
290  && ( (*scorefxn_)[fa_rep] == 0.0 )
291  && ( (*scorefxn_)[fa_atr] == 0.0 ) )
292  {
293  if( in_pose.is_fullatom() ) {
295  }
296  }
297  else {
298  if( in_pose.is_centroid() ) {
300  }
301  }
302 
303  in_pose.update_residue_neighbors();
304  (*scorefxn_)( in_pose );
305  core::Real weighted_score;
306  if( score_type_ == total_score ) weighted_score = in_pose.energies().residue_total_energies( resnum_ )[ ScoreType( score_type_ )];
307  else {
308 
309  if( bb_bb_ ){
310  energy_per_residue_filter_tracer << "decomposing bb hydrogen bond terms" << std::endl;
312  energy_options->hbond_options().decompose_bb_hb_into_pair_energies(true);
313  scorefxn_->set_energy_method_options(*energy_options);
314  }
315 
316  core::Real const weight( (*scorefxn_)[ ScoreType( score_type_ ) ] );
317  core::Real const score( in_pose.energies().residue_total_energies( resnum_ )[ ScoreType( score_type_ ) ]);
318  weighted_score = weight * score ;
319  }
320  return( weighted_score );
321 }
322 
323 }
324 }