Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
MultipleDomainMover.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 MultipleDomainMover
12 /// @detailed
13 /// @author Rhiju Das
14 
16 
19 #include <core/id/AtomID.hh>
20 #include <core/id/NamedAtomID.hh>
22 #include <core/kinematics/Jump.hh>
23 #include <core/kinematics/Stub.hh>
24 #include <core/pose/Pose.hh>
25 #include <core/types.hh>
26 #include <basic/Tracer.hh>
27 
29 
32 
33 
34 // Utility headers
35 #include <utility/vector1.hh>
36 
37 // ObjexxFCL Headers
38 #include <ObjexxFCL/FArray1D.hh>
39 
40 // Numeric headers
41 #include <numeric/random/random.hh>
42 #include <numeric/xyz.functions.hh>
43 
44 //C++ headers
45 #include <vector>
46 #include <string>
47 #include <sstream>
48 
49 using namespace core;
50 using basic::T;
51 
53 static numeric::random::RandomGenerator RG(1277320); // <- Magic number, do not change it!
54 
55 namespace protocols {
56 namespace rna {
57 
58 /////////////////////////////////////
59  MultipleDomainMover::MultipleDomainMover( pose::Pose const & pose, protocols::coarse_rna::CoarseRNA_LoopCloserOP rna_loop_closer ):
60  verbose_( false ),
61  rot_mag_( 10.0 ),
62  trans_mag_( 0.5 ),
63  num_domains_( 0 ),
64  rna_loop_closer_( rna_loop_closer )
65 {
66  Mover::type("MultipleDomainMover");
67  initialize( pose, rna_loop_closer_->allow_insert() );
68 }
69 
70 
71 ////////////////////////////////////////////////////////////////
72 void
74 {
75  apply_and_return_jump( pose );
76 }
77 
78 ///////////////////////////////////////////////////////////////////////////////
79  ////////////////////////
82  return "MultipleDomainMover";
83 }
84 
85 
86 ////////////////////////////////////////////////////////////////
87 Size
89 {
90  Size const n = static_cast<Size> ( RG.uniform() * num_domains_ ) + 1;
91  return apply_at_domain( pose, n );
92 }
93 
94 
95 ////////////////////////////////////////////////////////////////
96 Size
98 {
99  rb_movers_[ n ]->apply( pose );
100  slide_back_to_origin( pose );
101  return jump_numbers_[ n ];
102 }
103 
104 
105 ////////////////////////////////////////////////////////////////
106 void
108  // std::cout << "HELLO! " << pose.residue_type( pose.total_residue() ).name3() << std::endl;
109  if ( pose.residue_type( pose.total_residue() ).name3() != "XXX" /*virtual residue*/ ) return;
111  setup_ok_for_centroid_calculation( allow_insert );
113 }
114 
115 /////////////////////////////////////
116 void
118  randomize_orientations( pose );
120  close_all_loops( pose );
121  slide_back_to_origin( pose );
122 }
123 
124 /////////////////////////////////////
125 Vector
127 
128  Vector cen( 0.0, 0.0, 0.0 );
129  Size nres( 0 );
130  // Look at all residues except anchor (last residue).
131  for ( Size i = 1; i < pose.total_residue(); i++ ){
132  if ( ok_for_centroid_calculation_[ i ] ){
133  cen += pose.xyz( core::id::AtomID( 1, i ) );
134  nres += 1;
135  }
136  }
137  cen /= nres;
138  return cen;
139 }
140 
141 /////////////////////////////////////
142 void
144 
145  using namespace core::kinematics;
146 
147  if ( num_domains_ < 2 ) return;
148 
149  Vector cen = get_centroid( pose );
150  // std::cout << "CENTROID1: " << cen(1) << ' ' << cen(2) << ' ' << cen(3) << std::endl;
151 
152  for ( Size n = 1; n <= num_domains_; n++ ){
153  Size jumpno( jump_numbers_[ n ] );
154  Jump j( pose.jump( jumpno ) );
155  Stub stub = pose.conformation().upstream_jump_stub( jumpno );
156  Vector new_translation = j.get_translation() - stub.M.transposed() * cen;
157  j.set_translation( new_translation);
158  pose.set_jump( jumpno, j );
159  }
160 
161  // cen = get_centroid( pose );
162  // std::cout << "CENTROID2: " << cen(1) << ' ' << cen(2) << ' ' << cen(3) << std::endl;
163 
164 }
165 
166 
167 
168 /////////////////////////////////////
170 
171  using namespace protocols::moves;
172 
173  // create rigid body mover for segment 1
174  Size const virt_res = pose.total_residue();
175 
176  jump_numbers_.clear();
177  partner_.clear();
178 
179  for ( Size n = 1; n <= pose.fold_tree().num_jump(); n++ ) {
180  Size const i = pose.fold_tree().upstream_jump_residue( n );
181  Size const j = pose.fold_tree().downstream_jump_residue( n );
182  if ( i == virt_res || j == virt_res ){
183 
184  jump_numbers_.push_back( n );
185 
186  if ( i == virt_res ) {
187  //partner.push_back( rigid::partner_downstream );
188  partner_.push_back( rigid::partner_upstream );
189  } else {
190  partner_.push_back( rigid::partner_downstream );
191  //partner.push_back( rigid::partner_upstream );
192  }
193  }
194  }
195 
196  num_domains_ = jump_numbers_.size();
197 }
198 
199 /////////////////////////////////////
200 void
202  // Need to find jump number [Can try alternate constructor later]
204 
205  for ( Size i = 1; i <= allow_insert->nres(); i++) {
206  ok_for_centroid_calculation_.push_back( !allow_insert->get( core::id::AtomID( 2, i) ) );
207  if (verbose_) std::cout << "OK " << i << " " << ok_for_centroid_calculation_[ i ] << std::endl;
208  }
209 
210 }
211 
212 /////////////////////////////////////
213 void
215 
216  using namespace protocols::moves;
217 
218  for ( Size n = 1; n<= num_domains_; n++ ){
220  rb.apply( pose );
221  }
222 
223  if (verbose_) pose.dump_pdb( "random.pdb" );
224 
225 }
226 
227 
228 /////////////////////////////////////////////////////////////////////////////////////
229 // slide into contact - actually just try to get overlap at cutpoint_closed
230 ////////////////////////////////////////////////////////////////////////////////////
232 
233  using namespace core::kinematics;
234 
235  utility::vector1< bool > slid_into_contact( pose.total_residue(), false );
236 
237  for ( Size n = 2; n <= num_domains_; n++ ){ // no need to move domain 1.
238 
239  Size jumpno( jump_numbers_[ n ] );
240 
241  // find cutpoint_closed
242  rna_loop_closer_->apply_after_jump_change( pose, jumpno );
243  utility::vector1< Size > const & cutpos_list = rna_loop_closer_->cutpos_list();
244 
245  Size cutpoint_closed( 0 );
246  for (Size i = 1; i <= cutpos_list.size() ; i++ ){
247  if ( !slid_into_contact[ cutpos_list[ i ] ] ){
248  cutpoint_closed = cutpos_list[ i ]; break;
249  }
250  }
251  if (verbose_) std::cout << "CUTPOINT_CLOSED: " << cutpoint_closed << std::endl;
252  if ( cutpoint_closed == 0 ) continue;
253 
254  // find locations of overlap atoms. // figure out translation
255  Vector diff = pose.residue( cutpoint_closed ).xyz( "OVL1" ) - pose.residue( cutpoint_closed+1 ).xyz( " P " );
256  if ( verbose_) std::cout << "OLD VEC " << diff.length() << std::endl;
257  // apply translation
258  // This could be generalized. Note that this relies on one partner being
259  // the VRT residue at the origin!!!
260  Jump j( pose.jump( jumpno ) );
261  if (verbose_){
262  std::cout << "OLD JUMP " << j << std::endl;
263  std::cout << "UPSTREAM DOWNSTREAM " << pose.fold_tree().upstream_jump_residue( jumpno ) <<' ' << pose.fold_tree().downstream_jump_residue( jumpno ) << std::endl;
264  }
265 
266  ObjexxFCL::FArray1D< bool > const & partition_definition = rna_loop_closer_->partition_definition();
267  int sign_jump = ( partition_definition( cutpoint_closed ) == partition_definition( pose.fold_tree().downstream_jump_residue( jumpno ) ) ? -1: 1);
268 
269  Stub stub = pose.conformation().upstream_jump_stub( jumpno );
270  if (verbose_) std::cout << ' ' << stub.M.col_x()[0]<< ' ' << stub.M.col_x()[1]<< ' ' << stub.M.col_x()[2] << std::endl;
271  Vector new_translation = j.get_translation() + sign_jump * stub.M.transposed() * diff;
272  j.set_translation( new_translation );//+ Vector( 50.0, 0.0, 0.0 ) );
273  pose.set_jump_now( jumpno, j );
274  if (verbose_) std::cout << "NEW JUMP " << pose.jump( jumpno ) << std::endl;
275  Vector diff2 = pose.residue( cutpoint_closed ).xyz( "OVL1" ) - pose.residue( cutpoint_closed+1 ).xyz( " P " );
276  if (verbose_) std::cout << "NEW VEC " << diff2.length() << std::endl << std::endl;
277 
278  slid_into_contact[ cutpoint_closed ] = true;
279  }
280 
281  if (verbose_) pose.dump_pdb( "slide.pdb" );
282 
283 }
284 
285 //////////////////////////////////////////////////////////////////////////////////
286 void
288  for ( Size n = 2; n <= num_domains_; n++ ) {
289  rna_loop_closer_->apply_after_jump_change( pose, n );
290  }
291  if ( verbose_ ) pose.dump_pdb( "closed.pdb" );
292 }
293 
294 
295 
296 /////////////////////////////////////
297 void
299 
300  using namespace protocols::moves;
301 
302  rb_movers_.clear();
303 
304  std::cout << "NUM_DOMAINS: " << num_domains_ << std::endl;
305  for ( Size n = 1; n <= num_domains_; n++ ){
309  }
310 
311 }
312 
313 /////////////////////////////////////
314 void
315 MultipleDomainMover::update_rot_trans_mag( Real const & rot_mag, Real const & trans_mag ){
316  rot_mag_ = rot_mag;
317  trans_mag_ = trans_mag;
318  for ( Size n = 1; n <= num_domains_; n++ ){
319  rb_movers_[ n ]->rot_magnitude( rot_mag_ );
320  rb_movers_[ n ]->trans_magnitude( rot_mag_ );
321  }
322 }
323 
324 
325 
326 } // namespace rna
327 } // namespace protocols