Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
RNA_HelixAssembler.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 relax_protocols
11 /// @brief protocols that are specific to RNA_HelixAssembler
12 /// @detailed
13 /// @author Rhiju Das
14 
16 #include <core/pose/Pose.hh>
17 // AUTO-REMOVED #include <core/io/pdb/pose_io.hh>
18 #include <utility/vector1.hh>
19 // AUTO-REMOVED #include <utility/io/izstream.hh>
20 // AUTO-REMOVED #include <core/sequence/Sequence.fwd.hh>
21 // AUTO-REMOVED #include <core/sequence/util.hh>
22 #include <core/chemical/AA.hh>
24 
29 #include <core/kinematics/Jump.hh>
31 // AUTO-REMOVED #include <core/scoring/ScoringManager.hh>
36 // AUTO-REMOVED #include <protocols/rna/RNA_StructureParameters.fwd.hh>
37 // AUTO-REMOVED #include <protocols/rna/RNA_StructureParameters.hh>
39 
40 //Minimizer stuff
43 #include <numeric/xyzVector.hh>
44 // AUTO-REMOVED #include <numeric/conversions.hh>
45 
46 #include <core/types.hh>
47 #include <basic/Tracer.hh>
48 
49 
50 // External library headers
51 // AUTO-REMOVED #include <ObjexxFCL/format.hh>
52 // AUTO-REMOVED #include <ObjexxFCL/string.functions.hh>
53 #include <numeric/random/random.hh>
54 
55 //C++ headers
56 #include <vector>
57 #include <string>
58 #include <sstream>
59 
61 
62 
63 using namespace core;
64 using basic::T;
65 
66 static basic::Tracer TR( "protocols.rna.HelixAssembler" ) ;
67 
69 
70 namespace protocols {
71 namespace rna {
72 
73 static numeric::random::RandomGenerator RG(17720); // <- Magic number, do not change it!
74 
75 RNA_HelixAssembler::RNA_HelixAssembler():
76  verbose_( true ),
77  random_perturbation_( false ),
78  minimize_all_( false ),
79  use_phenix_geo_( false ),
80  ideal_jump( "RT -0.994805 -0.0315594 0.0967856 -0.0422993 0.992919 -0.111004 -0.092597 -0.114522 -0.989096 6.34696 -0.449942 0.334582 " ),
81  rsd_set( core::chemical::ChemicalManager::get_instance()->residue_type_set( core::chemical::RNA ) ),
82  ALPHA_A_FORM( -64.11),
83  BETA_A_FORM( 176.33),
84  GAMMA_A_FORM( 53.08),
85  DELTA_A_FORM( 82.90),
86  EPSILON_A_FORM( -150.17),
87  ZETA_A_FORM( -71.45),
88  CHI_A_FORM( 79.43),
89  NU2_A_FORM( 38.82),
90  NU1_A_FORM( 95.34),
91  perturb_amplitude_( 10.0 ),
92  scorefxn( core::scoring::ScoreFunctionFactory::create_score_function( core::scoring::RNA_HIRES_WTS ) ),
93  model_and_remove_capping_residues_( true )
94 {
95  Mover::type("RNA_HelixAssembler");
96  // scorefxn->set_weight( core::scoring::atom_pair_constraint, 0.01 );
97  // scorefxn->set_weight( core::scoring::rna_torsion, 5.0 );
99  scorefxn->set_weight( core::scoring::rna_torsion, 20.0 );
100  //scorefxn->set_weight( core::scoring::fa_stack, 0.125 );
101 
102  // why are we getting clashes?
103  // scorefxn->set_weight( core::scoring::fa_rep, 1.0 );
104  // scorefxn->set_weight( core::scoring::fa_intra_rep, 0.1 );
105 
106 }
107 
109 {
110  return new RNA_HelixAssembler(*this);
111 }
112 
113 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
114 /// @details Apply the RNA HelixAssembler
115 ///
117 {
118  apply( pose, pose.sequence() );
119 }
120 
123  return "RNA_HelixAssembler";
124 }
125 
127 {
128  scorefxn = setting;
129 }
130 
131 
132 void RNA_HelixAssembler::use_phenix_geo( bool const setting )
133 {
134  use_phenix_geo_ = setting;
135  if (setting) {
137  } else {
139  }
140 }
141 ////////////////////////////////////////////////////////////////////////////////
142 void RNA_HelixAssembler::apply( core::pose::Pose & pose, std::string const & full_sequence )
143 {
144 
145  using namespace core::pose;
146  using namespace core::kinematics;
147 
148  Size seq_length( full_sequence.size() );
149  std::string sequence1( full_sequence.substr( 0, seq_length/2 ) );
150  std::string sequence2( full_sequence.substr( seq_length/2, seq_length ) );
151 
153  sequence1 = "g" + sequence1 + "c";
154  sequence2 = "g" + sequence2 + "c"; // will remove these base pairs later.
155  }
156 
157 
158  if ( verbose_ ) {
159  std::cout << "SEQ1 " << sequence1 << std::endl;
160  std::cout << "SEQ2 " << sequence2 << std::endl;
161  }
162 
163  Size const numres = sequence1.size();
164  assert( sequence2.size() == numres );
165 
166  Pose pose_scratch;
167  core::pose::make_pose_from_sequence( pose_scratch, sequence1.substr(0,1)+sequence2.substr( numres-1,numres) , *rsd_set );
168  pose = pose_scratch;
169 
170  /////////////////////////////////////
171  FoldTree f( 2 );
172  f.new_jump( 1, 2, 1);
173  f.set_jump_atoms( 1,
176  pose.fold_tree( f );
177 
178  /////////////////////////////////////
179  //Need sample jumps for a-u, g-c, g-u.
180  Jump j;
181  std::stringstream jump_stream( ideal_jump );
182  jump_stream >> j;
183  if (verbose_) std::cout << j << std::endl;
184 
185  pose.set_jump( 1, j );
186 
187  using namespace core::id;
188  set_Aform_torsions( pose, 1 );
189  set_Aform_torsions( pose, 2 );
190  // pose.dump_pdb( "helix_init.pdb" );
191 
192  for ( Size n = 2; n <= numres; n++ ) {
193  std::cout << "Building on base pair: " << n << std::endl;
194  build_on_base_pair( pose, n, sequence1[n-1], sequence2[numres-n]);
195  // pose.dump_pdb( "helix_extend"+string_of(n)+".pdb" );
196 
197  put_constraints_on_base_step( pose, n );
198 
199  minimize_base_step( pose, n );
200 
201  // pose.dump_pdb( "helix_min"+string_of(n)+".pdb" );
202  }
203 
204 
207  }
208 
209 }
210 
211 
212 //////////////////////////////////////////////////////
213 void
215 {
216  using namespace core::id;
217  pose.set_torsion( TorsionID( n, BB, 1), ALPHA_A_FORM);
218  pose.set_torsion( TorsionID( n, BB, 2), BETA_A_FORM);
219  pose.set_torsion( TorsionID( n, BB, 3), GAMMA_A_FORM);
220  pose.set_torsion( TorsionID( n, BB, 4), DELTA_A_FORM);
221  pose.set_torsion( TorsionID( n, BB, 5), EPSILON_A_FORM);
222  pose.set_torsion( TorsionID( n, BB, 6), ZETA_A_FORM);
223 
224  if (use_phenix_geo_) {
225  ideal_coord_.apply(pose, n);
226  pose.set_torsion( TorsionID( n, CHI, 1), CHI_A_FORM);
227  } else {
228  pose.set_torsion( TorsionID( n, CHI, 1), CHI_A_FORM);
229  pose.set_torsion( TorsionID( n, CHI, 2), NU2_A_FORM);
230  pose.set_torsion( TorsionID( n, CHI, 3), NU1_A_FORM);
231  }
232 }
233 
234 /////////////////////////////////////////////////
235 void
236 RNA_HelixAssembler::build_on_base_pair( pose::Pose & pose, Size const & n, char const & seq1, char const & seq2 ) {
237 
238  using namespace core::conformation;
239  using namespace core::chemical;
240  using namespace core::id;
241 
242  /////////////////////////////////////
243  ResidueOP rsd1( ResidueFactory::create_residue( *(rsd_set->aa_map( aa_from_oneletter_code( seq1 ) )[1] ) ) );
244  pose.append_polymer_residue_after_seqpos( *rsd1, n - 1, true /*build_ideal_geometry*/ );
245 
246 
247  ResidueOP rsd2( ResidueFactory::create_residue( *(rsd_set->aa_map( aa_from_oneletter_code( seq2 ) )[1] ) ) );
248  pose.prepend_polymer_residue_before_seqpos( *rsd2, n + 1, true /*build_ideal_geometry*/ );
249 
250  pose.set_torsion( TorsionID( n-1, BB, 5), EPSILON_A_FORM);
251  pose.set_torsion( TorsionID( n-1, BB, 6), ZETA_A_FORM);
252 
253  pose.set_torsion( TorsionID( n, BB, 1), ALPHA_A_FORM);
254  pose.set_torsion( TorsionID( n, BB, 2), BETA_A_FORM);
255  pose.set_torsion( TorsionID( n, BB, 3), GAMMA_A_FORM);
256  pose.set_torsion( TorsionID( n, BB, 4), DELTA_A_FORM);
257  pose.set_torsion( TorsionID( n, BB, 5), EPSILON_A_FORM);
258  pose.set_torsion( TorsionID( n, BB, 6), ZETA_A_FORM);
259 
260  pose.set_torsion( TorsionID( n+1, BB, 1), ALPHA_A_FORM);
261  pose.set_torsion( TorsionID( n+1, BB, 2), BETA_A_FORM);
262  pose.set_torsion( TorsionID( n+1, BB, 3), GAMMA_A_FORM);
263  pose.set_torsion( TorsionID( n+1, BB, 4), DELTA_A_FORM);
264  pose.set_torsion( TorsionID( n+1, BB, 5), EPSILON_A_FORM);
265  pose.set_torsion( TorsionID( n+1, BB, 6), ZETA_A_FORM);
266 
267  pose.set_torsion( TorsionID( n+2, BB, 1), ALPHA_A_FORM);
268 
269  if (use_phenix_geo_) {
270  ideal_coord_.apply(pose, n);
271  ideal_coord_.apply(pose, n+1);
272  pose.set_torsion( TorsionID( n, CHI, 1), CHI_A_FORM);
273  pose.set_torsion( TorsionID( n+1, CHI, 1), CHI_A_FORM);
274  } else {
275  pose.set_torsion( TorsionID( n, CHI, 1), CHI_A_FORM);
276  pose.set_torsion( TorsionID( n, CHI, 2), NU2_A_FORM);
277  pose.set_torsion( TorsionID( n, CHI, 3), NU1_A_FORM);
278  pose.set_torsion( TorsionID( n+1, CHI, 1), CHI_A_FORM);
279  pose.set_torsion( TorsionID( n+1, CHI, 2), NU2_A_FORM);
280  pose.set_torsion( TorsionID( n+1, CHI, 3), NU1_A_FORM);
281  }
282 
283  // perturb all torsion angles except those at sugar puckers (DELTA, NU1, NU2 )
284  if ( random_perturbation_ ) {
285  pose.set_torsion( TorsionID( n-1, BB, 5), EPSILON_A_FORM + perturb_amplitude_ * RG.gaussian() );
286  pose.set_torsion( TorsionID( n-1, BB, 6), ZETA_A_FORM + perturb_amplitude_ * RG.gaussian() );
287 
288  pose.set_torsion( TorsionID( n, BB, 1), ALPHA_A_FORM + perturb_amplitude_ * RG.gaussian() );
289  pose.set_torsion( TorsionID( n, BB, 2), BETA_A_FORM + perturb_amplitude_ * RG.gaussian() );
290  pose.set_torsion( TorsionID( n, BB, 3), GAMMA_A_FORM + perturb_amplitude_ * RG.gaussian() );
291  pose.set_torsion( TorsionID( n, BB, 5), EPSILON_A_FORM + perturb_amplitude_ * RG.gaussian() );
292  pose.set_torsion( TorsionID( n, BB, 6), ZETA_A_FORM + perturb_amplitude_ * RG.gaussian() );
293  pose.set_torsion( TorsionID( n, CHI, 1), CHI_A_FORM + perturb_amplitude_ * RG.gaussian() );
294 
295  pose.set_torsion( TorsionID( n+1, BB, 1), ALPHA_A_FORM + perturb_amplitude_ * RG.gaussian() );
296  pose.set_torsion( TorsionID( n+1, BB, 2), BETA_A_FORM + perturb_amplitude_ * RG.gaussian() );
297  pose.set_torsion( TorsionID( n+1, BB, 3), GAMMA_A_FORM + perturb_amplitude_ * RG.gaussian() );
298  pose.set_torsion( TorsionID( n+1, BB, 5), EPSILON_A_FORM + perturb_amplitude_ * RG.gaussian() );
299  pose.set_torsion( TorsionID( n+1, BB, 6), ZETA_A_FORM + perturb_amplitude_ * RG.gaussian() );
300  pose.set_torsion( TorsionID( n+1, CHI, 1), CHI_A_FORM + perturb_amplitude_ * RG.gaussian() );
301 
302  pose.set_torsion( TorsionID( n+2, BB, 1), ALPHA_A_FORM + perturb_amplitude_ * RG.gaussian() );
303  }
304 
305 }
306 
307 /////////////////////////////////////////////////////////////////////////////
308 void
310 
311  using namespace core::scoring;
312  using namespace core::optimization;
313 
314  Real const cst_weight = scorefxn->get_weight( atom_pair_constraint );
315  runtime_assert( cst_weight != 0 );
316 
317  AtomTreeMinimizer minimizer;
318  float const dummy_tol( 0.0000025);
319  bool const use_nblist( false );
320  MinimizerOptions options( "dfpmin", dummy_tol, use_nblist, false, false );
321  options.nblist_auto_update( true );
322 
324 
325  if (minimize_all_){
326  mm.set_bb( true );
327  mm.set_chi( true );
328  mm.set_jump( true );
329  } else {
330  mm.set_bb( false );
331  mm.set_chi( false );
332  mm.set_jump( false );
333  for (Size i = n-1; i <= n+2; i++ ) {
334  mm.set_bb( i, true );
335  mm.set_chi( i, true );
336  }
337  //mm.set_jump( true );
338  }
339 
340  minimizer.run( pose, mm, *scorefxn, options );
341 
342  scorefxn->set_weight( atom_pair_constraint, 0.0 );
343  minimizer.run( pose, mm, *scorefxn, options );
344  scorefxn->set_weight( atom_pair_constraint, cst_weight );
345 
346  (*scorefxn)( pose );
347 
348  // scorefxn->show( pose );
349 
350 }
351 
352 //////////////////////////////////////////////////////////////////
353 void
356  pairings.push_back( std::make_pair( n, n+1) );
357  pairings.push_back( std::make_pair( n-1, n+2) );
358 
360  pose.constraint_set( new_cst_set ); //blank out cst set.
361 
363 }
364 
365 //////////////////////////////////////////////////////
366 void
368 
369  using namespace core::kinematics;
370 
371  //Need to fix up fold_tree
372  Size const nres = pose.total_residue();
373  FoldTree f( nres );
374  f.new_jump( nres/2-1, nres/2+2, nres/2); // put jump across second-to-last base pair
375  f.set_jump_atoms( 1,
378  f.reorder( nres/2-1 ); // root cannot be deleted, I think, so place it at this second-to-last base pair.
379  pose.fold_tree( f );
380 
381 
382  // get rid of last base pair
383  pose.delete_polymer_residue( nres/2 );
384  pose.delete_polymer_residue( nres/2 );
385 
386  // get rid of first base pair
387  pose.delete_polymer_residue( 1 );
388  pose.delete_polymer_residue( pose.total_residue() );
389 
390 
391 }
392 
393 
394 } // namespace rna
395 } // namespace protocols