Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
UnfoldedStateEnergyCalculatorMover.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 protocolsoped 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 src/protocols/UnfoldedStateEnergyCalculator/UnfoldedStateEnergyCalculatorMover.cc
11 /// @brief UnfoldedStateEnergyCalculatorMover class definitions
12 /// @author P. douglas Renfrew (renfrew@unc.edu)
13 
14 // Unit Headers
16 
17 // Package headers
18 
19 // Project headers
20 #include <core/types.hh>
21 
22 #include <core/pose/Pose.hh>
23 
27 
31 
34 
36 #include <core/scoring/Energies.hh>
37 
38 // Utility Headers
39 #include <utility/vector1.hh>
40 
41 // Numeric headers
42 #include <numeric/random/random.hh>
43 
45 #include <utility/vector0.hh>
46 
47 
48 // C++ Headers
49 
50 using namespace core;
51 using namespace core::pose;
52 using namespace core::chemical;
53 using namespace core::conformation;
54 using namespace utility;
55 
56 namespace protocols {
57 namespace unfolded_state_energy_calculator {
58 
59 ///@brief dtor
60 UnfoldedStateEnergyCalculatorMover::~UnfoldedStateEnergyCalculatorMover()
61 {}
62 
63 ///@brief cctor
64 UnfoldedStateEnergyCalculatorMover::UnfoldedStateEnergyCalculatorMover( UnfoldedStateEnergyCalculatorMover const & usecm ) :
65  //utility::pointer::ReferenceCount(),
66  Mover( "UnfoldedStateEnergyCalculatorMover" ),
67  job_dist_( usecm.job_dist_ ),
68  pack_scrfxn_( usecm.pack_scrfxn_ ),
69  score_scrfxn_( usecm.score_scrfxn_ ),
70  frag_length_( usecm.frag_length_ ),
71  mut_aa_( usecm.mut_aa_ ),
72  repack_fragments_( usecm.repack_fragments_ ),
73  native_sequence_( usecm.native_sequence_ )
74 {}
75 
76 ///@brief alternate ctor
78 #ifdef USEMPI
80 #else
82 #endif
85  core::Size frag_length,
86  std::string mut_aa,
87  bool repack_fragments,
88  bool native_sequence ):
89  Mover( "UnfoldedStateEnergyCalculatorMover" ),
90  job_dist_( job_dist ),
91  pack_scrfxn_( pack_scrfxn ),
92  score_scrfxn_( score_scrfxn ),
93  frag_length_( frag_length ),
94  mut_aa_( mut_aa ),
95  repack_fragments_( repack_fragments ),
96  native_sequence_( native_sequence )
97 {}
98 
101 {
102  return new UnfoldedStateEnergyCalculatorMover( *this );
103 }
104 
105 void
107 {
108 
109  // get number of protein residues
110  Size num_protein_res( 0 );
111  for ( Size i = 1; i < pose.total_residue(); ++i ) {
112  if ( pose.residue( i ).type().is_protein() )
113  num_protein_res++;
114  }
115  //std::cout << "NUM PROT RES: " << num_protein_res << std::endl; //debug
116 
117  // get number of fragments
118  Size frag_number( num_protein_res / frag_length_ );
119  //std::cout << "FRAG NUM: " << frag_number << std::endl; //debug
120 
121  // get central residue size
122  Size frag_cent_res_number( ( frag_length_ / 2 ) + 1 );
123  //std::cout << "FRAG NUM CENT RES: " << frag_cent_res_number << std::endl; //debug
124 
125  // check frag number
126  if ( frag_number == 0 ) {
127  return;
128  }
129 
130  // create fragments vector
131  vector1< Pose > fragments;
132 
133  // get residue type set and a copy of the residue to mutate to
134  ResidueTypeSetCAP rts( chemical::ChemicalManager::get_instance()->residue_type_set( "fa_standard" ) );
135  ResidueType const & mut_aa_type( rts->name_map( mut_aa_ ) );
136  ResidueOP mut_aa_res( ResidueFactory::create_residue( mut_aa_type ) );
137 
138  // create fragments
139  do {
140 
141  // generate a random start location within this structure; use a random number whose range does not include the termini.
142  Size frag_start( numeric::random::random_range( 1, num_protein_res - frag_length_ + 1 ) );
143 
144  // check fragment residues should be polymeric and on same chain (and central residue should be correct type if replace typr is turned on)
145  bool frag_check(true);
146 
147  // all residues should be on the same chain
148  for ( Size i( frag_start ); i <= frag_start + frag_length_; ++i ) {
149  if ( pose.chain( frag_start ) != pose.chain( i ) ) frag_check = false;
150  }
151 
152  // all residues should be polymeric
153  for ( Size i( frag_start ); i <= frag_start + frag_length_; ++i ) {
154  if ( !pose.residue( i ).type().is_polymer() ) frag_check = false;
155  }
156 
157  // all residues should not be nucleic acid
158  for ( Size i( frag_start ); i <= frag_start + frag_length_; ++i ) {
159  if ( pose.residue( i ).type().is_NA() ) frag_check = false;
160  }
161 
162  // if replace_res is on central residue should be the same type as the residue being replaced
163  // hardcoded for proteins, peptoids and beta peptides currently, don't know of a good way compare
164  // compatible properties
165 
166  if ( !native_sequence_ ) {
167  if ( pose.residue( frag_cent_res_number ).type().has_property("PROTEIN") && !mut_aa_type.has_property("PROTEIN") ) frag_check = false;
168  if ( pose.residue( frag_cent_res_number ).type().has_property("BETA_PEPTIDE") && !mut_aa_type.has_property("BETA_PEPTIDE") ) frag_check = false;
169  if ( pose.residue( frag_cent_res_number ).type().has_property("PEPTOID") && !mut_aa_type.has_property("PEPTOID") ) frag_check = false;
170  }
171 
172  // // DEBUG
173  // std::cout << "FRAG:\t" << fragments.size() << "\t" << frag_check << "\t" << std::flush;
174  // for ( Size i( frag_start ); i <= frag_start + frag_length_; ++i ) {
175  // std::cout << i << ":" << pose.residue( i ).type().name() << ":" << pose.residue( i ).chain() << "\t" << std::flush;
176  // }
177  // std::cout << std::endl;
178 
179  // if the fragment is bad
180  if ( !frag_check ) continue;
181 
182  // correct varient types (termini, disulfides, etc.)
183 
184  // create fragment pose
185  Pose frag_temp;
186  //std::cout << "BUILD FRAG START" << std::endl;
187  //std::cout << "DEBUG:\t" << frag_start << "\t" << pose.residue( frag_start ).type().name() << "\t" << pose.residue( frag_start ).chain() << std::endl;
188  frag_temp.append_residue_by_jump( pose.residue( frag_start ), 1 );
189  for ( Size i(frag_start + 1); i < frag_start + frag_length_; ++i ) {
190  //std::cout << "DEBUG:\t" << i << "\t" <<pose.residue( i ).type().name() << "\t" << pose.residue( i ).chain() << std::endl;
191  frag_temp.append_residue_by_bond( pose.residue( i ) );
192  }
193 
194  // mutate central residue if native_sequence flag is false
195  if ( !native_sequence_ ) {
196  frag_temp.replace_residue( frag_cent_res_number, *mut_aa_res, true );
197  }
198 
199  // add to vector of fragments
200  fragments.push_back( frag_temp);
201  } while ( fragments.size() < frag_number );
202 
203  // // DEBUG output pdbs of fragments
204  // for ( Size i( 1 ); i <= fragments.size(); ++i ) {
205  // std::stringstream outputfilename;
206  // outputfilename << "frag_" << i;
207  // for ( Size j( 1 ); j <= frag_length_; ++j ) {
208  // outputfilename << "_" << fragments[ i ].residue( j ).type().name3();
209  // }
210  // outputfilename << ".pdb";
211  // fragments[i].dump_pdb( outputfilename.str() );
212  // }
213 
214 
215  // check repack fragment central residues
216  if ( repack_fragments_ ) {
217  for ( Size i(1); i <= frag_number; ++i ) {
218 
219  // create packer task
220  pack::task::PackerTaskOP task( pack::task::TaskFactory::create_packer_task( fragments[ i ] ) );
221  task->initialize_from_command_line();
222 
223  // set all residues in fragment to only repack
224  for ( Size j(1); j <= frag_length_; ++j ) {
225  task->nonconst_residue_task( j ).restrict_to_repacking();
226  }
227 
228  // repack fragment
229  pack::pack_rotamers( fragments[ i ], *pack_scrfxn_, task);
230  }
231  }
232 
233  // // DEBUG output pdbs of fragments
234  // for ( Size i( 1 ); i <= fragments.size(); ++i ) {
235  // std::stringstream outputfilename;
236  // outputfilename << "pack_frag_" << i;
237  // for ( Size j( 1 ); j <= frag_length_; ++j ) {
238  // outputfilename << "_" << fragments[ i ].residue( j ).type().name3();
239  // }
240  // outputfilename << ".pdb";
241  // fragments[i].dump_scored_pdb( outputfilename.str(), *score_scrfxn_ );
242  // }
243 
244  // check fragment scores
245  for ( Size i(1); i <= frag_number; ++i ) {
246 
247  // clear energies
248  ( fragments[ i ] ).energies().clear();
249 
250  // score with scoring score function
251  ( *score_scrfxn_ )( fragments[ i ] );
252 
253  // send central residue energies to job distributor
254  job_dist_.add_unfolded_energy_data( fragments[ i ].residue(frag_cent_res_number).type().name3(), fragments[ i ].energies().residue_total_energies( frag_cent_res_number ) );
255 
256  }
257 
258  // send weights set to job distributor
259  job_dist_.set_energy_terms( ( *score_scrfxn_ ).weights() );
260 
261 }
262 
265  return "UnfoldedStateEnergyCalculatorMover";
266 }
267 
268 bool
270 {
271  return false;
272 }
273 
274 bool
276 {
277  return false;
278 }
279 
280 } // UnfoldedStateEnergyCalculator
281 } // protocols