Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
idealize.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/idealize/idealize.cc
11 /// @brief
12 /// @author
13 
14 // Unit Headers
16 
17 
18 // // Rosetta Headers
19 #include <core/types.hh>
20 
22 
24 // AUTO-REMOVED #include <core/conformation/ResidueFactory.hh>
26 
28 
32 
33 #include <core/pose/Pose.hh>
34 #include <core/pose/util.hh>
35 
37 #include <core/scoring/rms_util.hh>
38 // AUTO-REMOVED #include <core/scoring/constraints/ConstraintSet.hh>
39 // AUTO-REMOVED #include <core/scoring/constraints/AtomPairConstraint.hh>
40 // AUTO-REMOVED #include <core/scoring/constraints/CoordinateConstraint.hh>
41 // AUTO-REMOVED #include <core/scoring/constraints/HarmonicFunc.hh>
42 
43 #include <core/pose/PDBInfo.hh>
44 
45 // AUTO-REMOVED #include <basic/options/option.hh>
46 // AUTO-REMOVED #include <basic/options/keys/run.OptionKeys.gen.hh>
47 
48 #include <basic/basic.hh>
49 #include <basic/Tracer.hh> // tracer output
50 
52 // AUTO-REMOVED #include <core/conformation/symmetry/util.hh>
53 
56 
57 #include <ObjexxFCL/string.functions.hh>
58 
59 // Numeric headers
60 #include <numeric/random/random.hh>
61 
62 // ObjexxFCL headers
63 #include <ObjexxFCL/format.hh>
64 
66 #include <utility/vector1.hh>
67 
68 //Auto Headers
70 namespace protocols {
71 namespace idealize {
72 
73 using namespace core;
74 using namespace ObjexxFCL;
75 
76 static numeric::random::RandomGenerator RG(76223);
77 static basic::Tracer TR( "protocols.idealize" );
78 
79 /// helper
80 void
82  pose::Pose const & pose1,
83  pose::Pose const & pose2,
84  utility::vector1< bool > const & use_pos,
85  Real & avg_bb_angle_dev,
86  Real & max_bb_angle_dev,
87  Real & avg_chi_angle_dev,
88  Real & max_chi_angle_dev
89 ) {
90  using basic::subtract_degree_angles;
91 
92  avg_bb_angle_dev = 0.0;
93  max_bb_angle_dev = 0.0;
94 
95  avg_chi_angle_dev = 0.0;
96  max_chi_angle_dev = 0.0;
97 
98  Size nchi_dihedrals(0), nbb_dihedrals(0);
99 
100  for ( Size pos = 1; pos <= pose1.total_residue(); ++pos ) {
101  if ( ! use_pos[ pos ] ) continue;
102 
103  conformation::Residue const & rsd1( pose1.residue( pos ) );
104  conformation::Residue const & rsd2( pose2.residue( pos ) );
105 
106  if ( !rsd1.is_polymer() ) continue;
107 
108  Size const nbb ( rsd1.n_mainchain_atoms() );
109  Size const nchi( rsd1.nchi() );
110  runtime_assert( rsd2.is_polymer() && rsd2.nchi() == nchi && rsd2.n_mainchain_atoms() == nbb );
111 
112  // first the bb dev's
113  for ( Size i=1; i<= nbb; ++i ) {
114  if ( ( i == 1 && rsd1.is_lower_terminus() ) ||
115  ( i >= nbb-1 && rsd1.is_upper_terminus() ) ) {
116  continue;
117  }
118  Real const dev( std::abs( subtract_degree_angles( rsd1.mainchain_torsion( i ), rsd2.mainchain_torsion(i) ) ) );
119  //if ( dev > 0.01 ) std::cout << "bbdev: " << pos << ' ' << pose1.residue(pos).name1() << ' ' << i << ' ' <<
120  // dev << ' ' << rsd1.mainchain_torsion( i ) << ' ' << rsd2.mainchain_torsion(i) << std::endl;
121  avg_bb_angle_dev += dev;
122  ++nbb_dihedrals;
123  max_bb_angle_dev = std::max( max_bb_angle_dev, dev );
124  }
125 
126  for ( Size i=1; i<= nchi; ++i ) {
127  Real const dev( std::abs( subtract_degree_angles( rsd1.chi( i ), rsd2.chi( i ) ) ) );
128  avg_chi_angle_dev += dev;
129  ++nchi_dihedrals;
130  max_chi_angle_dev = std::max( max_chi_angle_dev, dev );
131  }
132  }
133 
134  avg_bb_angle_dev /= nbb_dihedrals;
135  avg_chi_angle_dev /= nchi_dihedrals;
136  TR.flush();
137 }
138 
139 // positions within window of the idealized positions will move during minimization
140 void
142  pose::Pose & pose,
143  utility::vector1< Size > pos_list, // local copy
144  scoring::ScoreFunction const & scorefxn,
145  bool const fast,
146  bool const chainbreaks
147 ) {
148  using namespace optimization;
149  using namespace optimization::symmetry;
150  using namespace id;
151  using namespace ObjexxFCL::fmt;
153 
154  Size const window_width( 3 ); // window: from pos-window_width to pos+window_width
155 
156 
157  pose::Pose const start_pose( pose );
158  Size const nres ( pose.total_residue() );
159 
160  // keep chainbreaks if they exist
161  if (chainbreaks) {
162 
163  // squared distance at which bond is considered discontinuous
164  Real const chain_break_cutoff = { 4.0 };
165 
166  // find chain breaks to add cut points
167  bool new_cutpoint = false;
168  pose::PDBInfoCOP pdbinfo = pose.pdb_info();
169  kinematics::FoldTree f( pose.fold_tree() );
170  for ( Size i = 1; i < nres; ++i ) {
171  if ( f.is_cutpoint(i) ) continue;
172  bool chain_break = false;
173  Size j = i+1;
174  if ( pdbinfo->number(i)+1 != pdbinfo->number(j) ) {
175  TR.Info << "non-sequential at res nums " << i << '-' << j << std::endl;
176  TR.Info << "non-sequential pdb res nums " << pdbinfo->number(i) << pdbinfo->chain(i) <<
177  '-' << pdbinfo->number(j) << pdbinfo->chain(j) << std::endl;
178  chain_break = true;
179  } else {
180  conformation::Residue const & rsd = pose.residue(i);
181  conformation::Residue const & next_rsd = pose.residue(j);
182  if (rsd.is_polymer() && next_rsd.is_polymer()) {
183  Real dist_squared = rsd.atom( rsd.upper_connect_atom() ).xyz().distance_squared(next_rsd.atom( next_rsd.lower_connect_atom() ).xyz());
184  if (dist_squared > chain_break_cutoff) {
185  TR.Info << "chain break at res nums: " << i << '-' << j << ' ' << std::sqrt(dist_squared) << std::endl;
186  TR.Info << "chain break pdb res nums: " << pdbinfo->number(i) << pdbinfo->chain(i) <<
187  '-' << pdbinfo->number(j) << pdbinfo->chain(j) << std::endl;
188  chain_break = true;
189  } else if ( dist_squared < 0.1 ) {
190  TR.Info << "zero length bond at res nums: " << i << '-' << j << std::endl;
191  TR.Info << "zero length bond pdb res nums: " << pdbinfo->number(i) << pdbinfo->chain(i) <<
192  '-' << pdbinfo->number(j) << pdbinfo->chain(j) << std::endl;
193  chain_break = true;
194  }
195  }
196  }
197  if ( chain_break ) {
198  // add cutpoint
199  f.new_jump( i, j, i );
202  new_cutpoint = true;
203  TR.Info << "added cutpoint at: " << i << std::endl;
204  }
205  }
206  if (new_cutpoint) pose.fold_tree( f );
207  }
208 
209  Size const njump( pose.num_jump() );
210 
211  // setup the minimizer options
212  MinimizerOptions options( "dfpmin", 0.001, true /*use_nblist*/, false /*deriv_check*/ );
213  //MinimizerOptions options( "dfpmin", 0.001, true /*use_nblist*/, true /*deriv_check*/, true );
214  kinematics::MoveMap final_mm;
215 
216  bool const lastjumpmin (
217  pose.residue( nres ).aa() == core::chemical::aa_vrt &&
218  pose.fold_tree().upstream_jump_residue( njump ) == int(nres)
219  );
220 
221  TR.Info << "lastjumpmin: " << lastjumpmin << std::endl;
222  utility::vector1< bool > idealized( nres, false );
223 
224  // get symmetry info
227  TR.Info << "setting up symmetric idealize " << std::endl;
229  dynamic_cast<core::conformation::symmetry::SymmetricConformation &> ( pose.conformation()) );
230  symm_info = SymmConf.Symmetry_Info();
231  }
232 
233  while ( !pos_list.empty() ) {
234  Size const seqpos( pos_list[ static_cast< Size >( RG.uniform() * pos_list.size() + 1 ) ] );
235  pos_list.erase( std::find( pos_list.begin(), pos_list.end(), seqpos ) );
236 
237  // idealize the mainchain + sidechain
238  //pose.dump_pdb( "pre_idl_"+right_string_of(seqpos,4,'0')+".pdb" );
239  if( seqpos > (Size)pose.conformation().size() ){ continue; }
241  //pose.dump_pdb( "post_idl_"+right_string_of(seqpos,4,'0')+".pdb" );
242  idealized[ seqpos ] = true;
243 
244  // setup the window of positions to minimize, also records flexible positions for the final minimize
246  for ( Size i=seqpos; i >= seqpos-window_width; --i ) {
247  window.push_back( i );
248  if ( i == 1 || pose.residue(i).is_lower_terminus() ) break;
249  }
250  for ( Size i=seqpos; i <= seqpos+window_width; ++i ) {
251  window.push_back( i );
252  if ( i == nres || pose.residue(i).is_upper_terminus() ) break;
253  }
254 
255 
256  kinematics::MoveMap local_mm;
257  local_mm.set_chi( seqpos, true );
258  final_mm.set_chi( seqpos, true );
259  for ( Size ii=1; ii<= window.size(); ++ii ) {
260  Size const i( window[ ii ] );
261  local_mm.set_bb( i, true );
262  final_mm.set_bb( i, true );
263  // disallow proline PHI
264  if ( pose.residue(i).aa() == chemical::aa_pro ) local_mm.set( TorsionID( phi_torsion, BB, i ), false );
265  if ( pose.residue(i).aa() == chemical::aa_pro ) final_mm.set( TorsionID( phi_torsion, BB, i ), false );
266  }
267 
268  // if jumpmin
269  if ( lastjumpmin ) local_mm.set_jump( pose.num_jump(), true );
270 
271  // special case for symmetry
272  // - make mm symmetric
273  // - allow symmjumps to minimize
274  if (symm_info) {
275  local_mm.set_jump( true );
277  }
278 
279  // dont minimize or calculate stats after each idealization in fast mode
280  if ( fast ) {
281  TR.Info << "forced ideal geometry on seqpos " << seqpos << std::endl;
282  continue;
283  }
284 
285  Real max_bb_angle_dev, avg_bb_angle_dev, max_chi_angle_dev, avg_chi_angle_dev;
286 
287  dihedral_distance( pose, start_pose, idealized, avg_bb_angle_dev, max_bb_angle_dev,
288  avg_chi_angle_dev, max_chi_angle_dev );
289 
290  TR.Info << "premin: (pos,rmsd,avg-bb,max-bb,avg-chi,max-chi,score) " <<
291  I( 4, seqpos ) << ' ' << pose.residue(seqpos).name1() << F( 9, 3, all_atom_rmsd( pose, start_pose ) ) <<
292  F(9,3,avg_bb_angle_dev) << F(9,3,max_bb_angle_dev) <<
293  F(9,3,avg_chi_angle_dev) << F(9,3,max_chi_angle_dev) <<
294  F(12,3,scorefxn( pose ) ) << std::endl;
295 
296  if (symm_info)
297  SymAtomTreeMinimizer().run( pose, local_mm, scorefxn, options );
298  else
299  AtomTreeMinimizer().run( pose, local_mm, scorefxn, options );
300  //pose.dump_pdb( "post_min_"+right_string_of(seqpos,4,'0')+".pdb" );
301 
302  dihedral_distance( pose, start_pose, idealized, avg_bb_angle_dev, max_bb_angle_dev,
303  avg_chi_angle_dev, max_chi_angle_dev );
304 
305  TR.Info << "postmin: (pos,rmsd,avg-bb,max-bb,avg-chi,max-chi,score) " <<
306  I(4,seqpos) << ' ' << pose.residue(seqpos).name1() << F(9,3,all_atom_rmsd(pose,start_pose)) <<
307  F(9,3,avg_bb_angle_dev) << F(9,3,max_bb_angle_dev) <<
308  F(9,3,avg_chi_angle_dev) << F(9,3,max_chi_angle_dev) <<
309  F(12,3,scorefxn( pose ) ) << std::endl;
310  scorefxn.show( TR, pose );
311  }
312 
313  if ( lastjumpmin ) final_mm.set_jump( pose.num_jump(), true );
314 
315  // special case for symmetry
316  // - make mm symmetric
317  // - allow symmjumps to minimize
318  if (symm_info) {
319  final_mm.set_jump( true );
321  }
322 
323  // final minimize
324  Real max_bb_angle_dev, avg_bb_angle_dev, max_chi_angle_dev, avg_chi_angle_dev;
325  dihedral_distance( pose, start_pose, idealized, avg_bb_angle_dev, max_bb_angle_dev,
326  avg_chi_angle_dev, max_chi_angle_dev );
327 
328  TR.Info << "pre-finalmin: (pos,rmsd,avg-bb,max-bb,avg-chi,max-chi,score) " <<
329  F(9,3,all_atom_rmsd(pose,start_pose)) <<
330  F(9,3,avg_bb_angle_dev) << F(9,3,max_bb_angle_dev) <<
331  F(9,3,avg_chi_angle_dev) << F(9,3,max_chi_angle_dev) <<
332  F(12,3,scorefxn( pose ) ) << std::endl;
333 
334  if (symm_info)
335  SymAtomTreeMinimizer().run( pose, final_mm, scorefxn, options );
336  else
337  AtomTreeMinimizer().run( pose, final_mm, scorefxn, options );
338 
339  dihedral_distance( pose, start_pose, idealized, avg_bb_angle_dev, max_bb_angle_dev,
340  avg_chi_angle_dev, max_chi_angle_dev );
341 
342  TR.Info << "post-finalmin: (pos,rmsd,avg-bb,max-bb,avg-chi,max-chi,score) " <<
343  F(9,3,all_atom_rmsd(pose,start_pose)) <<
344  F(9,3,avg_bb_angle_dev) << F(9,3,max_bb_angle_dev) <<
345  F(9,3,avg_chi_angle_dev) << F(9,3,max_chi_angle_dev) <<
346  F(12,3,scorefxn( pose ) ) << std::endl;
347 
348  scorefxn.show( TR.Info, pose );
349  TR.Info << std::endl;
350 
351  TR.flush();
352 } // basic_idealize
353 
354 } // namespace idealize
355 } // namespace protocols