Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
md.cc
Go to the documentation of this file.
1 
2 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
3 // vi: set ts=2 noet:
4 //
5 // (c) Copyright Rosetta Commons Member Institutions.
6 // (c) This file is part of the Rosetta software suite and is made available under license.
7 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
8 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
9 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
10 
11 /// @file Mike Tyka
12 /// @brief
13 ///
14 
15 /// Note: This is an extremely crude and slow implementation of cartesian MD in rosetta.
16 /// I make no promises as to this codes correctness. use at own risk.
17 /// Nor is this code efficient. Nor is it intended for production simulations.
18 
19 
20 // Unit headers
22 // AUTO-REMOVED #include <core/optimization/AtomTreeMinimizer.hh>
23 
24 // Package headers
25 #include <core/id/AtomID.hh>
27 // AUTO-REMOVED #include <core/optimization/Multifunc.hh>
32 // AUTO-REMOVED #include <core/kinematics/AtomTree.hh>
33 // AUTO-REMOVED #include <core/kinematics/DomainMap.hh>
34 
35 // Project headers
36 #include <core/pose/Pose.hh>
37 #include <core/scoring/Energies.hh>
41 // AUTO-REMOVED #include <core/scoring/NeighborList.hh>
42 // AUTO-REMOVED #include <core/scoring/hbonds/hbonds.hh>
43 // AUTO-REMOVED #include <core/scoring/hbonds/HBondSet.hh>
44 // AUTO-REMOVED #include <core/io/pdb/file_data.hh>
45 
46 // // ObjexxFCL headers
47 // AUTO-REMOVED #include <ObjexxFCL/FArray2D.hh>
48 #include <ObjexxFCL/string.functions.hh>
49 #include <ObjexxFCL/format.hh>
50 
51 // // Numeric headers
52 // AUTO-REMOVED #include <numeric/conversions.hh>
53 // AUTO-REMOVED #include <numeric/random/random.hh>
54 
55 #include <iostream>
56 #include <fstream>
57 // AUTO-REMOVED #include <core/optimization/MinimizerOptions.hh>
58 
59 #include <basic/Tracer.hh>
60 
61 #include <utility/vector1.hh>
62 #include <numeric/NumericTraits.hh>
63 #include <numeric/random/random.fwd.hh>
64 
65 
66 using namespace ObjexxFCL;
67 using namespace ObjexxFCL::fmt;
68 
69 namespace protocols {
70 namespace cartesian {
71 
72 static basic::Tracer TR("core.optimization.md");
73 
74 float sqr(float t){ return t*t; }
75 
76 
77 MolecularDynamics::MolecularDynamics(
78  core::pose::PoseOP & inputpose,
79  core::scoring::ScoreFunction const & scorefxn
80 ):
81 pose( inputpose )
82 {
83 
84  scorefxn( *pose );
85  mm.set_bb ( true );
86  mm.set_chi( true );
87  min_map.setup( *pose, mm );
89 
90  pose->energies().set_use_nblist( *pose, dmap, true );
91  scorefxn.setup_for_minimizing( *pose, min_map );
92 
94  createBondList( );
95  createAngleList( );
98 
99 }
100 
101 
102 
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
114 
115 
116 
117 
118 
119 
120 
122 {
123  using namespace core;
124 
125  Size const nres( pose->total_residue() );
126  cartom.clear();
127  for ( Size ir = 1; ir <= nres; ++ir ) {
128  conformation::Residue const & rsd( pose->residue( ir ) );
129  for (Size i = 1; i <= rsd.natoms(); i++ ){
130  id::AtomID atom_id( i, ir );
131  CartesianAtom atom;
132  atom.index = i;
133  atom.res = ir;
134  atom.atom_id = atom_id;
135 
136  atom.force = core::Vector(0,0,0);
137  atom.velocity = core::Vector(0,0,0);
138  atom.position = pose->xyz( atom_id );
139 
140  atom.old_force = core::Vector(0,0,0);
141  atom.old_velocity = core::Vector(0,0,0);
142  atom.old_position = core::Vector(0,0,0);
143 
144  atom.mass = 12.001; // assume carbon for now, we can be more accurate later.
145  cartom.push_back(atom);
146  }
147  }
148 
149 }
150 
152 {
153  using namespace core;
154 
155  for ( Size i = 1; i <= cartom.size(); i ++ ){
156  cartom[i].position = pose->xyz( cartom[i].atom_id );
157  }
158 }
159 
160 
161 
163 {
164  using namespace core;
165 
166  for ( Size i = 1; i <= cartom.size(); i ++ ){
167  pose->set_xyz( cartom[i].atom_id, cartom[i].position );
168  }
169 }
170 
171 
173 {
174  using namespace core;
175 
176  for ( Size i = 1; i <= cartom.size(); i ++ ){
177  cartom[i].force = core::Vector( 0,0,0 );
178  }
179 }
180 
182  const core::id::AtomID &id1
183 )
184 {
185  using namespace core;
186 
187  int number=-1; int i;
188  for ( i = 1; i <= (int)cartom.size(); i ++ ){
189  if( (cartom[i].atom_id.rsd() == id1.rsd() ) &&
190  (cartom[i].atom_id.atomno() == id1.atomno() )
191  ) { number = i; break; }
192  }
193  if( i > (int)cartom.size()) number = -1;
194  return number;
195 }
196 
198  core::scoring::ScoreFunction const & scorefxn
199 )
200 {
201  using namespace core;
202 
203  using namespace core::optimization;
204  Size const nres( pose->total_residue() );
205  scorefxn.setup_for_derivatives( *pose);
206  int count = 1;
207  for ( Size ir = 1; ir <= nres; ++ir ) {
208  conformation::Residue const & rsd( pose->residue( ir ) );
209  for (Size i = 1; i <= rsd.natoms(); i++ ){
210  id::AtomID atom_id( i, ir );
211  core::Vector F1(0,0,0),F2(0,0,0);
212  scorefxn.eval_npd_atom_derivative( atom_id, *pose, min_map.domain_map(), F1, F2 );
213  cartom[count].force = F2;
214  count += 1;
215  }
216  }
217 
218  //std::cout << "Get cartesian derivates \n";
219  // Now handle torsonal derivatives aka dEdphi
220 
221 
222  // now loop over the torsions in the map (the map MUST be a map of everything!)
223 
224  int imap( 1 ); // for indexing into de_dvars( imap )
225  for ( MinimizerMap::iterator it=min_map.begin(), ite=min_map.end();
226  it != ite; ++it, ++imap ) {
227  using namespace id;
228 
229  DOF_Node const & dof_node( **it );
230 
231  // NOTE: deriv is in the units of the degree of freedom as
232  // represented internally, without any scale factors applied
233  // ie the units returned by pose->get_atom_tree_torsion(...)
234  //
235  //
236  // type -- units
237  // -------------------
238  // PHI -- radians
239  // THETA -- radians
240  // D -- angstroms
241  // RB1-3 -- angstroms
242  // RB4-6 -- degrees (!)
243 
244  Real deriv = 0.0;
245 
246  /*kinematics::tree::Atom const & atom
247  ( pose->atom_tree().atom( dof_node.atom_id() ) );*/
248 
249  // eg rama,Paa,dunbrack,and torsional constraints
250  deriv = scorefxn.eval_dof_derivative
251  ( dof_node.dof_id(), dof_node.torsion_id(), *pose );
252  // deriv /= min_map.torsion_scale_factor( dof_node );
253 
254 
255  if( deriv == 0 ) continue;
256  // work out which atoms are involved !
257  AtomID id1;
258  AtomID id2;
259  AtomID id3;
260  AtomID id4;
261 
262  pose->conformation().get_torsion_angle_atom_ids(
263  dof_node.torsion_id(),
264  id1,id2,id3,id4 );
265 
266  // std::cout << " " << id1.atomno() << " " << id2.atomno() << " " << id3.atomno() << " " << id4.atomno() << " -- ";
267 
268  // work out the inices in the cartom array !
269  //Size i;
270  int no1= findCartomAtom( id1 ); if( no1 < 0 ) std::cerr << "ERROR ERROR ERROR id1 \n";
271  int no2= findCartomAtom( id2 ); if( no2 < 0 ) std::cerr << "ERROR ERROR ERROR id2 \n";
272  int no3= findCartomAtom( id3 ); if( no3 < 0 ) std::cerr << "ERROR ERROR ERROR id3 \n";
273  int no4= findCartomAtom( id4 ); if( no4 < 0 ) std::cerr << "ERROR ERROR ERROR id4 \n";
274 // int no2=-1; for ( i = 1; i <= cartom.size(); i ++ ) if( cartom[i].atom_id == id2 ) { no2 = i; break; } if( i > cartom.size()) std::cerr << "ERROR ERROR ERROR no2 \n";
275 // int no3=-1; for ( i = 1; i <= cartom.size(); i ++ ) if( cartom[i].atom_id == id3 ) { no3 = i; break; } if( i > cartom.size()) std::cerr << "ERROR ERROR ERROR no3 \n";
276 // int no4=-1; for ( i = 1; i <= cartom.size(); i ++ ) if( cartom[i].atom_id == id4 ) { no4 = i; break; } if( i > cartom.size()) std::cerr << "ERROR ERROR ERROR no4 \n";
277 
278 
279  //std::cout << " " << cartom[no1].atom_id.rsd() << " " << cartom[no2].atom_id.rsd()
280  // << " " << cartom[no3].atom_id.rsd() << " " << cartom[no4].atom_id.rsd();
281  //std::cout << " " << deriv << " ";
282 
283 
284  // convert to cartesian derivatives on those atoms using the usual MD code - lift from PD
285 
286 
287  //float epot_dihedral_this=0;
288  float /*phi,*/ sin_phi, cos_phi;
289  core::Vector vti_vta, vta_vtb, vtb_vtj;
290  core::Vector nrml1, nrml2, nrml3;
291  float inv_nrml1_mag, inv_nrml2_mag, inv_nrml3_mag;
292 
293  core::Vector dcosdnrml1;
294  core::Vector dcosdnrml2;
295  core::Vector dsindnrml3;
296  core::Vector dsindnrml2;
297  core::Vector f, fi, fab, fj;
298 
299 
300  vti_vta.x() = cartom[no1].position.x() - cartom[no2].position.x();
301  vti_vta.y() = cartom[no1].position.y() - cartom[no2].position.y();
302  vti_vta.z() = cartom[no1].position.z() - cartom[no2].position.z();
303 
304  vta_vtb.x() = cartom[no2].position.x() - cartom[no3].position.x();
305  vta_vtb.y() = cartom[no2].position.y() - cartom[no3].position.y();
306  vta_vtb.z() = cartom[no2].position.z() - cartom[no3].position.z();
307 
308  vtb_vtj.x() = cartom[no3].position.x() - cartom[no4].position.x();
309  vtb_vtj.y() = cartom[no3].position.y() - cartom[no4].position.y();
310  vtb_vtj.z() = cartom[no3].position.z() - cartom[no4].position.z();
311 
312  fi.x() = 0;
313  fi.y() = 0;
314  fi.z() = 0;
315  fab.x() = 0;
316  fab.y() = 0;
317  fab.z() = 0;
318  fj.x() = 0;
319  fj.y() = 0;
320  fj.z() = 0;
321 
322  nrml1.x() = (vti_vta.y() * vta_vtb.z() - vti_vta.z() * vta_vtb.y());
323  nrml1.y() = (vti_vta.z() * vta_vtb.x() - vti_vta.x() * vta_vtb.z());
324  nrml1.z() = (vti_vta.x() * vta_vtb.y() - vti_vta.y() * vta_vtb.x());
325 
326  nrml2.x() = (vta_vtb.y() * vtb_vtj.z() - vta_vtb.z() * vtb_vtj.y());
327  nrml2.y() = (vta_vtb.z() * vtb_vtj.x() - vta_vtb.x() * vtb_vtj.z());
328  nrml2.z() = (vta_vtb.x() * vtb_vtj.y() - vta_vtb.y() * vtb_vtj.x());
329 
330  nrml3.x() = (vta_vtb.y() * nrml1.z() - vta_vtb.z() * nrml1.y());
331  nrml3.y() = (vta_vtb.z() * nrml1.x() - vta_vtb.x() * nrml1.z());
332  nrml3.z() = (vta_vtb.x() * nrml1.y() - vta_vtb.y() * nrml1.x());
333 
334  inv_nrml1_mag = 1.0 / sqrt(sqr(nrml1.x()) + sqr(nrml1.y()) + sqr(nrml1.z()));
335  inv_nrml2_mag = 1.0 / sqrt(sqr(nrml2.x()) + sqr(nrml2.y()) + sqr(nrml2.z()));
336  inv_nrml3_mag = 1.0 / sqrt(sqr(nrml3.x()) + sqr(nrml3.y()) + sqr(nrml3.z()));
337 
338  cos_phi = (nrml1.x() * nrml2.x() + nrml1.y() * nrml2.y() + nrml1.z() * nrml2.z()) * inv_nrml1_mag * inv_nrml2_mag;
339  sin_phi = (nrml3.x() * nrml2.x() + nrml3.y() * nrml2.y() + nrml3.z() * nrml2.z()) * inv_nrml3_mag * inv_nrml2_mag;
340 
341  nrml2.x() *= inv_nrml2_mag;
342  nrml2.y() *= inv_nrml2_mag;
343  nrml2.z() *= inv_nrml2_mag;
344 
345  //phi = -atan2(sin_phi, cos_phi); // set but never used ~Labonte
346 
347  if(fabs(sin_phi) > 0.1) {
348  nrml1.x() *= inv_nrml1_mag;
349  nrml1.y() *= inv_nrml1_mag;
350  nrml1.z() *= inv_nrml1_mag;
351 
352  dcosdnrml1.x() = inv_nrml1_mag * (nrml1.x() * cos_phi - nrml2.x());
353  dcosdnrml1.y() = inv_nrml1_mag * (nrml1.y() * cos_phi - nrml2.y());
354  dcosdnrml1.z() = inv_nrml1_mag * (nrml1.z() * cos_phi - nrml2.z());
355 
356  dcosdnrml2.x() = inv_nrml2_mag * (nrml2.x() * cos_phi - nrml1.x());
357  dcosdnrml2.y() = inv_nrml2_mag * (nrml2.y() * cos_phi - nrml1.y());
358  dcosdnrml2.z() = inv_nrml2_mag * (nrml2.z() * cos_phi - nrml1.z());
359 
360  } else {
361  nrml3.x() *= inv_nrml3_mag;
362  nrml3.y() *= inv_nrml3_mag;
363  nrml3.z() *= inv_nrml3_mag;
364 
365  dsindnrml3.x() = inv_nrml3_mag * (nrml3.x() * sin_phi - nrml2.x());
366  dsindnrml3.y() = inv_nrml3_mag * (nrml3.y() * sin_phi - nrml2.y());
367  dsindnrml3.z() = inv_nrml3_mag * (nrml3.z() * sin_phi - nrml2.z());
368 
369  dsindnrml2.x() = inv_nrml2_mag * (nrml2.x() * sin_phi - nrml3.x());
370  dsindnrml2.y() = inv_nrml2_mag * (nrml2.y() * sin_phi - nrml3.y());
371  dsindnrml2.z() = inv_nrml2_mag * (nrml2.z() * sin_phi - nrml3.z());
372  }
373 
374  //dihedral.phi = phi;
375 
376  deriv *= -1;
377 
378  // forces
379  if(fabs(sin_phi) > 0.1) {
380  deriv /= sin_phi;
381  fi.x() += deriv * (vta_vtb.y() * dcosdnrml1.z() - vta_vtb.z() * dcosdnrml1.y());
382  fi.y() += deriv * (vta_vtb.z() * dcosdnrml1.x() - vta_vtb.x() * dcosdnrml1.z());
383  fi.z() += deriv * (vta_vtb.x() * dcosdnrml1.y() - vta_vtb.y() * dcosdnrml1.x());
384 
385  fj.x() += deriv * (vta_vtb.z() * dcosdnrml2.y() - vta_vtb.y() * dcosdnrml2.z());
386  fj.y() += deriv * (vta_vtb.x() * dcosdnrml2.z() - vta_vtb.z() * dcosdnrml2.x());
387  fj.z() += deriv * (vta_vtb.y() * dcosdnrml2.x() - vta_vtb.x() * dcosdnrml2.y());
388 
389  fab.x() += deriv * (vti_vta.z() * dcosdnrml1.y() - vti_vta.y() * dcosdnrml1.z() + vtb_vtj.y() * dcosdnrml2.z() - vtb_vtj.z() * dcosdnrml2.y());
390  fab.y() += deriv * (vti_vta.x() * dcosdnrml1.z() - vti_vta.z() * dcosdnrml1.x() + vtb_vtj.z() * dcosdnrml2.x() - vtb_vtj.x() * dcosdnrml2.z());
391  fab.z() += deriv * (vti_vta.y() * dcosdnrml1.x() - vti_vta.x() * dcosdnrml1.y() + vtb_vtj.x() * dcosdnrml2.y() - vtb_vtj.y() * dcosdnrml2.x());
392 
393  } else {
394  deriv /= -cos_phi;
395 
396  fi.x() += deriv * ((vta_vtb.y() * vta_vtb.y() + vta_vtb.z() * vta_vtb.z()) * dsindnrml3.x() - vta_vtb.x() * vta_vtb.y() * dsindnrml3.y() - vta_vtb.x() * vta_vtb.z() * dsindnrml3.z());
397  fi.y() += deriv * ((vta_vtb.z() * vta_vtb.z() + vta_vtb.x() * vta_vtb.x()) * dsindnrml3.y() - vta_vtb.y() * vta_vtb.z() * dsindnrml3.z() - vta_vtb.y() * vta_vtb.x() * dsindnrml3.x());
398  fi.z() += deriv * ((vta_vtb.x() * vta_vtb.x() + vta_vtb.y() * vta_vtb.y()) * dsindnrml3.z() - vta_vtb.z() * vta_vtb.x() * dsindnrml3.x() - vta_vtb.z() * vta_vtb.y() * dsindnrml3.y());
399 
400  fj.x() += deriv * (dsindnrml2.y() * vta_vtb.z() - dsindnrml2.z() * vta_vtb.y());
401  fj.y() += deriv * (dsindnrml2.z() * vta_vtb.x() - dsindnrml2.x() * vta_vtb.z());
402  fj.z() += deriv * (dsindnrml2.x() * vta_vtb.y() - dsindnrml2.y() * vta_vtb.x());
403 
404  fab.x() += deriv * (-(vta_vtb.y() * vti_vta.y() + vta_vtb.z() * vti_vta.z()) * dsindnrml3.x()
405  + (2.0 * vta_vtb.x() * vti_vta.y() - vti_vta.x() * vta_vtb.y()) * dsindnrml3.y()
406  + (2.0 * vta_vtb.x() * vti_vta.z() - vti_vta.x() * vta_vtb.z()) * dsindnrml3.z() + dsindnrml2.z() * vtb_vtj.y() - dsindnrml2.y() * vtb_vtj.z());
407  fab.y() += deriv * (-(vta_vtb.z() * vti_vta.z() + vta_vtb.x() * vti_vta.x()) * dsindnrml3.y()
408  + (2.0 * vta_vtb.y() * vti_vta.z() - vti_vta.y() * vta_vtb.z()) * dsindnrml3.z()
409  + (2.0 * vta_vtb.y() * vti_vta.x() - vti_vta.y() * vta_vtb.x()) * dsindnrml3.x() + dsindnrml2.x() * vtb_vtj.z() - dsindnrml2.z() * vtb_vtj.x());
410  fab.z() += deriv * (-(vta_vtb.x() * vti_vta.x() + vta_vtb.y() * vti_vta.y()) * dsindnrml3.z()
411  + (2.0 * vta_vtb.z() * vti_vta.x() - vti_vta.z() * vta_vtb.x()) * dsindnrml3.x()
412  + (2.0 * vta_vtb.z() * vti_vta.y() - vti_vta.z() * vta_vtb.y()) * dsindnrml3.y() + dsindnrml2.y() * vtb_vtj.x() - dsindnrml2.x() * vtb_vtj.y());
413  }
414 
415 // fi.mul(PhysicsConst::invAngstrom);
416 // fab.mul(PhysicsConst::invAngstrom);
417 // fj.mul(PhysicsConst::invAngstrom);
418 
419  // add to cartesian derivatives
420 
421  // std::cout << fi.x() << " " ;
422  // std::cout << fi.y() << " " ;
423  // std::cout << fi.z() << " " ;
424  // std::cout << " | ";
425  // std::cout << fab.x() - fi.x() << " " ;
426  // std::cout << fab.y() - fi.y() << " " ;
427  // std::cout << fab.z() - fi.z() << " " ;
428  // std::cout << " | ";
429  // std::cout << fj.x() - fab.x() << " " ;
430  // std::cout << fj.y() - fab.y() << " " ;
431  // std::cout << fj.z() - fab.z() << " " ;
432  // std::cout << " | ";
433  // std::cout << fj.x() << " " ;
434  // std::cout << fj.y() << " " ;
435  // std::cout << fj.z() << " " ;
436  // std::cout << std::endl;
437 
438 
439  cartom[no1].force.x() += fi.x();
440  cartom[no1].force.y() += fi.y();
441  cartom[no1].force.z() += fi.z();
442 
443  cartom[no2].force.x() += fab.x() - fi.x();
444  cartom[no2].force.y() += fab.y() - fi.y();
445  cartom[no2].force.z() += fab.z() - fi.z();
446 
447  cartom[no3].force.x() += fj.x() - fab.x();
448  cartom[no3].force.y() += fj.y() - fab.y();
449  cartom[no3].force.z() += fj.z() - fab.z();
450 
451  cartom[no4].force.x() -= fj.x();
452  cartom[no4].force.y() -= fj.y();
453  cartom[no4].force.z() -= fj.z();
454 
455  //epot_dihedral += epot_dihedral_this;
456 
457  // DONE
458 
459  } // loop over map
460 
461 
462 
463 }
464 
465 
466 
467 
468 
470 {
471  using namespace core;
472 
473  Size const nres( pose->total_residue() );
474  bondlist.clear();
475 
476  for ( Size i = 1; i <= cartom.size(); i ++ ){
477  // for each atom get neighbours within the residue;
478  conformation::Residue const & rsd( pose->residue( cartom[i].atom_id.rsd() ) );
479  core::chemical::AtomIndices indices = rsd.bonded_neighbor( cartom[i].atom_id.atomno() );
480  for ( Size j = 1; j <= indices.size(); j++ ){
481  if( int(indices[j]) < int(cartom[i].atom_id.atomno()) ) continue;
482  //std::cout << indices[j] << " ";
483  MD_Bond newbond;
484  newbond.atom_id_1 = cartom[i].atom_id;
485  newbond.atom_id_2 = id::AtomID( indices[j], cartom[i].atom_id.rsd() );
486  newbond.index1 = -1;
487  newbond.index2 = -1;
488 
489  bondlist.push_back( newbond );
490  }
491  }
492 
493  // add residue bonds!
494  for ( Size ir = 1; ir < nres; ++ir ) {
495  conformation::Residue const & rsd1( pose->residue( ir ) );
496  conformation::Residue const & rsd2( pose->residue( ir+1 ) );
497 
498  if( !rsd1.is_bonded( rsd2 ) ) continue;
499 
500  //`nstd::cout << "RES " << ir << std::endl;
501 
502  int atom1 = rsd1.connect_atom( rsd2 );
503  int atom2 = rsd2.connect_atom( rsd1 );
504 
505  MD_Bond newbond;
506  newbond.atom_id_1 = id::AtomID( atom1, ir );
507  newbond.atom_id_2 = id::AtomID( atom2, ir+1 );
508  newbond.index1 = atom1;
509  newbond.index2 = atom2;
510 
511  bondlist.push_back( newbond );
512  }
513 
514  // post process the list
515  // find all the indices
516  for ( Size i = 1; i <= bondlist.size(); i ++ ){
517  bondlist[i].index1 = -1;
518  bondlist[i].index2 = -1;
519  for ( Size j = 1; j <= cartom.size(); j ++ ){
520  if( bondlist[i].atom_id_1 == cartom[j].atom_id ) bondlist[i].index1 = j;
521  if( bondlist[i].atom_id_2 == cartom[j].atom_id ) bondlist[i].index2 = j;
522  }
523  if( bondlist[i].index1 <= 0) std::cout << "CODE ERROR!\n";
524  if( bondlist[i].index2 <= 0) std::cout << "CODE ERROR!\n";
525 
526  // measure length
527 
528  bondlist[i].length = pose->xyz( bondlist[i].atom_id_1 ).distance( pose->xyz( bondlist[i].atom_id_2 ) );
529 /*
530  std::cout <<
531  bondlist[i].atom_id_1.rsd() << " " <<
532  bondlist[i].atom_id_1.atomno() << " " <<
533  bondlist[i].index1 << " " <<
534  bondlist[i].atom_id_2.rsd() << " " <<
535  bondlist[i].atom_id_2.atomno() << " " <<
536  bondlist[i].index2 << " " <<
537  bondlist[i].length << " " <<
538  std::endl;
539 */
540 
541  }
542 
543 
544 
545 }
546 
547 
549 {
550  using namespace core;
551 
552  //Size const nres( pose->total_residue() );
553  anglelist.clear();
554 
555  for ( Size i = 1; i <= bondlist.size(); i ++ ){
556  for ( Size j = 1; j <= bondlist.size(); j ++ ){
557  if(i == j) continue;
558 
559  MD_Angle newangle;
560  if( bondlist[i].index1 == bondlist[j].index1 ){
561  newangle.index1 = bondlist[i].index2;
562  newangle.index2 = bondlist[i].index1;
563  newangle.index3 = bondlist[j].index2;
564  } else
565  if( bondlist[i].index1 == bondlist[j].index2 ){
566  newangle.index1 = bondlist[i].index2;
567  newangle.index2 = bondlist[i].index1;
568  newangle.index3 = bondlist[j].index1;
569  } else
570  if( bondlist[i].index2 == bondlist[j].index1 ){
571  newangle.index1 = bondlist[i].index1;
572  newangle.index2 = bondlist[i].index2;
573  newangle.index3 = bondlist[j].index2;
574  } else
575  if( bondlist[i].index2 == bondlist[j].index2 ){
576  newangle.index1 = bondlist[i].index1;
577  newangle.index2 = bondlist[i].index2;
578  newangle.index3 = bondlist[j].index1;
579  } else
580  continue;
581 
582  if( newangle.index1 > newangle.index3 ) continue;
583 
584  newangle.atom_id_1 = cartom[ newangle.index1 ].atom_id;
585  newangle.atom_id_2 = cartom[ newangle.index2 ].atom_id;
586  newangle.atom_id_3 = cartom[ newangle.index3 ].atom_id;
587  newangle.length = pose->xyz( newangle.atom_id_1 ).distance( pose->xyz( newangle.atom_id_3 ) );
588  /*
589  std::cout <<
590  newangle.atom_id_1.rsd() << " " <<
591  newangle.atom_id_1.atomno() << " " <<
592  newangle.index1 << " " <<
593  newangle.atom_id_2.rsd() << " " <<
594  newangle.atom_id_2.atomno() << " " <<
595  newangle.index2 << " " <<
596  newangle.atom_id_3.rsd() << " " <<
597  newangle.atom_id_3.atomno() << " " <<
598  newangle.index3 << " " <<
599  newangle.length << " " <<
600  std::endl;
601 */
602  anglelist.push_back( newangle );
603  }
604  }
605 
606 
607 
608 }
609 
611  const core::conformation::Residue &rsd1,
612  const core::conformation::Residue &rsd2,
613  const core::conformation::Residue &rsd3,
614  const core::conformation::Residue &rsd4,
615  std::string name1,
616  std::string name2,
617  std::string name3,
618  std::string name4
619 ){
620  using namespace core;
621 
622 
623  MD_HarmonicDihedral newdihed;
624  newdihed.atom_id_1 = id::AtomID( rsd1.atom_index( name1 ) ,rsd1.seqpos() );
625  newdihed.atom_id_2 = id::AtomID( rsd2.atom_index( name2 ) ,rsd2.seqpos() );
626  newdihed.atom_id_3 = id::AtomID( rsd3.atom_index( name3 ) ,rsd3.seqpos() );
627  newdihed.atom_id_4 = id::AtomID( rsd4.atom_index( name4 ) ,rsd4.seqpos() );
628  newdihed.index1 = findCartomAtom( newdihed.atom_id_1 );
629  newdihed.index2 = findCartomAtom( newdihed.atom_id_2 );
630  newdihed.index3 = findCartomAtom( newdihed.atom_id_3 );
631  newdihed.index4 = findCartomAtom( newdihed.atom_id_4 );
632 
633  if( (newdihed.index1 < 0) ) std::cout << "Can't find" << name1 << std::endl;
634  if( (newdihed.index2 < 0) ) std::cout << "Can't find" << name2 << std::endl;
635  if( (newdihed.index3 < 0) ) std::cout << "Can't find" << name3 << std::endl;
636  if( (newdihed.index4 < 0) ) std::cout << "Can't find" << name4 << std::endl;
637  if(
638  (newdihed.index1 < 0) ||
639  (newdihed.index2 < 0) ||
640  (newdihed.index3 < 0) ||
641  (newdihed.index4 < 0)
642  ){
643  std::cout
644  << name1 << " "
645  << name2 << " "
646  << name3 << " "
647  << name4 << " "
648  << newdihed.atom_id_1.rsd() << " "
649  << newdihed.atom_id_2.rsd() << " "
650  << newdihed.atom_id_3.rsd() << " "
651  << newdihed.atom_id_4.rsd() << " "
652  << newdihed.atom_id_1.atomno() << " "
653  << newdihed.atom_id_2.atomno() << " "
654  << newdihed.atom_id_3.atomno() << " "
655  << newdihed.atom_id_4.atomno() << " "
656  << std::endl;
657  exit(0);
658  }
659 
660  newdihed.angle = 0;
661  return newdihed;
662 }
663 
664 
665 
667  const core::conformation::Residue &rsd,
668  std::string name1,
669  std::string name2,
670  std::string name3,
671  std::string name4
672 ){
673  using namespace core;
674 
675  MD_HarmonicDihedral newdihed;
676  newdihed.atom_id_1 = id::AtomID( rsd.atom_index( name1 ) ,rsd.seqpos() );
677  newdihed.atom_id_2 = id::AtomID( rsd.atom_index( name2 ) ,rsd.seqpos() );
678  newdihed.atom_id_3 = id::AtomID( rsd.atom_index( name3 ) ,rsd.seqpos() );
679  newdihed.atom_id_4 = id::AtomID( rsd.atom_index( name4 ) ,rsd.seqpos() );
680  newdihed.index1 = findCartomAtom( newdihed.atom_id_1 );
681  newdihed.index2 = findCartomAtom( newdihed.atom_id_2 );
682  newdihed.index3 = findCartomAtom( newdihed.atom_id_3 );
683  newdihed.index4 = findCartomAtom( newdihed.atom_id_4 );
684 
685  if( (newdihed.index1 < 0) ) std::cout << "Can't find" << name1 << std::endl;
686  if( (newdihed.index2 < 0) ) std::cout << "Can't find" << name2 << std::endl;
687  if( (newdihed.index3 < 0) ) std::cout << "Can't find" << name3 << std::endl;
688  if( (newdihed.index4 < 0) ) std::cout << "Can't find" << name4 << std::endl;
689  if(
690  (newdihed.index1 < 0) ||
691  (newdihed.index2 < 0) ||
692  (newdihed.index3 < 0) ||
693  (newdihed.index4 < 0)
694  ){
695  std::cout
696  << name1 << " "
697  << name2 << " "
698  << name3 << " "
699  << name4 << " "
700  << newdihed.atom_id_1.rsd() << " "
701  << newdihed.atom_id_2.rsd() << " "
702  << newdihed.atom_id_3.rsd() << " "
703  << newdihed.atom_id_4.rsd() << " "
704  << newdihed.atom_id_1.atomno() << " "
705  << newdihed.atom_id_2.atomno() << " "
706  << newdihed.atom_id_3.atomno() << " "
707  << newdihed.atom_id_4.atomno() << " "
708  << std::endl;
709  exit(0);
710  }
711 
712  newdihed.angle = 0;
713  return newdihed;
714 }
715 
716 /// Yes i know this is hard coded stuff. Read warning at the top of this file.
718 {
719  using namespace core;
720  int ir;
721  for( ir = 1; ir < (int)pose->total_residue(); ir ++ ){
722  const conformation::Residue &rsd = pose->residue( ir );
723 
724 
725  if( ( !(rsd.aa() == chemical::aa_pro) ) &&
726  ( ir != 1 ) &&
727  ( ir < ( (int)pose->total_residue() - 1 ) )
728  ){
729 
730  dihedrallist.push_back( createDihedral(
731  pose->residue( ir - 1 ),
732  pose->residue( ir ),
733  pose->residue( ir ),
734  pose->residue( ir ),
735  "C", "CA", "N", "H" ) );
736 
737  dihedrallist.push_back( createDihedral(
738  pose->residue( ir ),
739  pose->residue( ir + 1 ),
740  pose->residue( ir ),
741  pose->residue( ir ),
742  "CA", "N", "C", "O" ) );
743 
744  }
745 
746  //if( rsd.aa() == chemical::aa_ala )
747  //if( rsd.aa() == chemical::aa_cys )
748  if( rsd.aa() == chemical::aa_asp ){
749  //std::cout << "Preparring ASP\n";
750  dihedrallist.push_back( createDihedral( rsd, "CB", "OD1", "CG", "OD2" ) );
751  }
752  if( rsd.aa() == chemical::aa_glu ){
753  //std::cout << "Preparring ASP\n";
754  dihedrallist.push_back( createDihedral( rsd, "CG", "OE1", "CD", "OE2" ) );
755  }
756  if( rsd.aa() == chemical::aa_phe ){
757  //std::cout << "Preparring PHE\n";
758 
759  // Ring Dihedrals
760  dihedrallist.push_back( createDihedral( rsd, "CB", "CG", "CD2", "HD2" ) );
761 
762  dihedrallist.push_back( createDihedral( rsd, "HE2", "CE2", "CZ", "HZ" ) );
763  dihedrallist.push_back( createDihedral( rsd, "HZ", "CZ", "CE1","HE1" ) );
764  dihedrallist.push_back( createDihedral( rsd, "HE1", "CE1","CD1", "HD1" ) );
765  dihedrallist.push_back( createDihedral( rsd, "HD1", "CD1", "CG", "CB" ) );
766 
767  dihedrallist.push_back( createDihedral( rsd, "CD1", "CG", "CD2", "HD2" ) );
768  dihedrallist.push_back( createDihedral( rsd, "CG", "CD2","CE2", "HE2" ) );
769  dihedrallist.push_back( createDihedral( rsd, "CD2", "CE2", "CZ", "HZ" ) );
770  dihedrallist.push_back( createDihedral( rsd, "CE2", "CZ", "CE1","HE1" ) );
771  dihedrallist.push_back( createDihedral( rsd, "CZ", "CE1","CD1", "HD1" ) );
772  dihedrallist.push_back( createDihedral( rsd, "CE1", "CD1", "CG", "CB" ) );
773 
774  dihedrallist.push_back( createDihedral( rsd, "CB", "CG", "CD2", "CE2" ) );
775  dihedrallist.push_back( createDihedral( rsd, "HD2", "CD2","CE2", "CZ" ) );
776  dihedrallist.push_back( createDihedral( rsd, "HE2", "CE2", "CZ", "CE1" ) );
777  dihedrallist.push_back( createDihedral( rsd, "HZ", "CZ", "CE1","CD1" ) );
778  dihedrallist.push_back( createDihedral( rsd, "HE1", "CE1","CD1", "CG" ) );
779  dihedrallist.push_back( createDihedral( rsd, "HD1", "CD1", "CG", "CD2" ) );
780 
781  // Impropers
782  dihedrallist.push_back( createDihedral( rsd, "CG", "CE2", "CD2", "HD2" ) );
783  dihedrallist.push_back( createDihedral( rsd, "CD2", "CZ", "CE2", "HE2" ) );
784  dihedrallist.push_back( createDihedral( rsd, "CZ", "CD2", "CE2", "HE2" ) );
785  dihedrallist.push_back( createDihedral( rsd, "CE1", "CE2", "CZ", "HZ" ) );
786  dihedrallist.push_back( createDihedral( rsd, "CD1", "CZ", "CE1", "HE1" ) );
787  dihedrallist.push_back( createDihedral( rsd, "CG", "CE1", "CD1", "HD1" ) );
788  dihedrallist.push_back( createDihedral( rsd, "CD1", "CD2", "CG", "CB" ) );
789  }
790 
791  //if( rsd.aa() == chemical::aa_gly )
792  if( rsd.aa() == chemical::aa_his ){
793 
794  if( rsd.has( "HE2" ) ){
795  dihedrallist.push_back( createDihedral( rsd, "CE1", "CD2", "NE2","HE2" ) );
796  dihedrallist.push_back( createDihedral( rsd, "CG", "NE2","CD2", "HD2" ) );
797  dihedrallist.push_back( createDihedral( rsd, "ND1", "NE2", "CE1", "HE1" ) );
798  dihedrallist.push_back( createDihedral( rsd, "ND1", "CD2", "CG", "CB" ) );
799 
800  dihedrallist.push_back( createDihedral( rsd, "CB", "CG", "CD2","HD2" ) );
801  dihedrallist.push_back( createDihedral( rsd, "HD2","CD2", "NE2","HE2" ) );
802  dihedrallist.push_back( createDihedral( rsd, "HE2", "NE2", "CE1", "HE1" ) );
803  dihedrallist.push_back( createDihedral( rsd, "HE1", "CE1", "ND1","CG" ) );
804 
805  dihedrallist.push_back( createDihedral( rsd, "CB", "CG", "CD2","NE2" ) );
806  dihedrallist.push_back( createDihedral( rsd, "HD2","CD2", "NE2","CE1" ) );
807  dihedrallist.push_back( createDihedral( rsd, "HE2", "NE2", "CE1", "ND1" ) );
808  }else{
809  // HD1 torsions misssing - fix this - mike
810  dihedrallist.push_back( createDihedral( rsd, "CG", "NE2","CD2", "HD2" ) );
811  dihedrallist.push_back( createDihedral( rsd, "ND1", "NE2", "CE1", "HE1" ) );
812  dihedrallist.push_back( createDihedral( rsd, "ND1", "CD2", "CG", "CB" ) );
813 
814  dihedrallist.push_back( createDihedral( rsd, "CB", "CG", "CD2","HD2" ) );
815  dihedrallist.push_back( createDihedral( rsd, "HE1", "CE1", "ND1","CG" ) );
816 
817  dihedrallist.push_back( createDihedral( rsd, "CB", "CG", "CD2","NE2" ) );
818  dihedrallist.push_back( createDihedral( rsd, "HD2","CD2", "NE2","CE1" ) );
819 
820 
821 
822  }
823  }
824  //if( rsd.aa() == chemical::aa_ile )
825  //if( rsd.aa() == chemical::aa_lys )
826  //if( rsd.aa() == chemical::aa_leu )
827  //if( rsd.aa() == chemical::aa_met )
828  if( rsd.aa() == chemical::aa_asn ){
829  //std::cout << "Preparring ASN\n";
830  dihedrallist.push_back( createDihedral( rsd, "CB", "ND2", "CG", "OD1" ) );
831  dihedrallist.push_back( createDihedral( rsd, "CG", "1HD2", "ND2", "2HD2" ) );
832 
833  dihedrallist.push_back( createDihedral( rsd, "OD1", "CG", "ND2", "1HD2" ) );
834  dihedrallist.push_back( createDihedral( rsd, "OD1", "CG", "ND2", "2HD2" ) );
835  dihedrallist.push_back( createDihedral( rsd, "CB", "CG", "ND2", "1HD2" ) );
836  dihedrallist.push_back( createDihedral( rsd, "CB", "CG", "ND2", "2HD2" ) );
837 
838  }
839  //if( rsd.aa() == chemical::aa_pro )
840  if( rsd.aa() == chemical::aa_gln ){
841  //std::cout << "Preparring GLN\n";
842  dihedrallist.push_back( createDihedral( rsd, "CG", "NE2", "CD", "OE1" ) );
843  dihedrallist.push_back( createDihedral( rsd, "CD", "1HE2", "NE2", "2HE2" ) );
844 
845  dihedrallist.push_back( createDihedral( rsd, "OE1", "CG", "NE2", "1HE2" ) );
846  dihedrallist.push_back( createDihedral( rsd, "OE1", "CG", "NE2", "2HE2" ) );
847  dihedrallist.push_back( createDihedral( rsd, "CG", "CD", "NE2", "1HE2" ) );
848  dihedrallist.push_back( createDihedral( rsd, "CG", "CD", "NE2", "2HE2" ) );
849  }
850  if( rsd.aa() == chemical::aa_arg ){
851  //std::cout << "Preparring ARG\n";
852  dihedrallist.push_back( createDihedral( rsd, "NE", "NH1", "CZ", "NH2" ) );
853  dihedrallist.push_back( createDihedral( rsd, "CD", "CZ", "NE", "HE" ) );
854  dihedrallist.push_back( createDihedral( rsd, "CZ", "1HH1", "NH1", "2HH1" ) );
855  dihedrallist.push_back( createDihedral( rsd, "CZ", "1HH2", "NH2", "2HH2" ) );
856 
857  dihedrallist.push_back( createDihedral( rsd, "NH1", "CZ", "NH2", "1HH2" ) );
858  dihedrallist.push_back( createDihedral( rsd, "NH1", "CZ", "NH2", "2HH2" ) );
859  dihedrallist.push_back( createDihedral( rsd, "NE", "CZ", "NH2", "1HH2" ) );
860  dihedrallist.push_back( createDihedral( rsd, "NE", "CZ", "NH2", "2HH2" ) );
861 
862  dihedrallist.push_back( createDihedral( rsd, "NH2", "CZ", "NH1", "1HH1" ) );
863  dihedrallist.push_back( createDihedral( rsd, "NH2", "CZ", "NH1", "2HH1" ) );
864  dihedrallist.push_back( createDihedral( rsd, "NE", "CZ", "NH1", "1HH1" ) );
865  dihedrallist.push_back( createDihedral( rsd, "NE", "CZ", "NH1", "2HH1" ) );
866 
867  dihedrallist.push_back( createDihedral( rsd, "NH2", "CZ", "NE", "CD" ) );
868  dihedrallist.push_back( createDihedral( rsd, "NH2", "CZ", "NE", "HE" ) );
869  dihedrallist.push_back( createDihedral( rsd, "NH1", "CZ", "NE", "CD" ) );
870  dihedrallist.push_back( createDihedral( rsd, "NH2", "CZ", "NE", "HE" ) );
871 
872 
873 
874  };
875  //if( rsd.aa() == chemical::aa_ser )
876  //if( rsd.aa() == chemical::aa_thr
877  //if( rsd.aa() == chemical::aa_val )
878  if( rsd.aa() == chemical::aa_trp ){
879 
880  //std::cout << "Preparring TRP\n";
881 
882  dihedrallist.push_back( createDihedral( rsd, "CD1", "CE2", "NE1", "HE1" ) );
883  dihedrallist.push_back( createDihedral( rsd, "CE2", "CH2", "CZ2", "HZ2" ) );
884  dihedrallist.push_back( createDihedral( rsd, "CZ2", "CZ3", "CH2", "HH2" ) );
885  dihedrallist.push_back( createDihedral( rsd, "CH2", "CE3", "CZ3", "HZ3" ) );
886  dihedrallist.push_back( createDihedral( rsd, "CZ3", "CD2", "CE3", "HE3" ) );
887  dihedrallist.push_back( createDihedral( rsd, "CG", "NE1", "CD1", "HD1" ) );
888  dihedrallist.push_back( createDihedral( rsd, "CD1", "CD2", "CG", "CB" ) );
889 
890  dihedrallist.push_back( createDihedral( rsd, "CB", "CG", "CD1", "HD1" ) );
891  dihedrallist.push_back( createDihedral( rsd, "HD1", "CD1", "NE1", "HE1" ) );
892  dihedrallist.push_back( createDihedral( rsd, "HE1", "NE1", "CE2", "CZ2" ) );
893  dihedrallist.push_back( createDihedral( rsd, "NE1", "CE2", "CZ2", "HZ2" ) );
894  dihedrallist.push_back( createDihedral( rsd, "CE2", "CZ2", "CH2", "HH2" ) );
895  dihedrallist.push_back( createDihedral( rsd, "HH2", "CH2", "CZ3", "HZ3" ) );
896  dihedrallist.push_back( createDihedral( rsd, "HZ3", "CZ3", "CE3", "HE3" ) );
897  dihedrallist.push_back( createDihedral( rsd, "HE3", "CE3", "CD2", "CG" ) );
898  dihedrallist.push_back( createDihedral( rsd, "CE3", "CD2", "CG", "CB" ) );
899 
900  dihedrallist.push_back( createDihedral( rsd, "CB", "CG", "CD1", "NE1" ) );
901  dihedrallist.push_back( createDihedral( rsd, "HD1", "CD1", "NE1", "CE2" ) );
902  dihedrallist.push_back( createDihedral( rsd, "HE1", "NE1", "CE2", "CD2" ) );
903  dihedrallist.push_back( createDihedral( rsd, "NE1", "CE2", "CZ2", "CH2" ) );
904  dihedrallist.push_back( createDihedral( rsd, "CE2", "CZ2", "CH2", "CZ3" ) );
905  dihedrallist.push_back( createDihedral( rsd, "HH2", "CH2", "CZ3", "CE3" ) );
906  dihedrallist.push_back( createDihedral( rsd, "HZ3", "CZ3", "CE3", "CD2" ) );
907  dihedrallist.push_back( createDihedral( rsd, "HE3", "CE3", "CD2", "CE2" ) );
908  dihedrallist.push_back( createDihedral( rsd, "CE3", "CD2", "CG", "CD1" ) );
909 
910 
911  dihedrallist.push_back( createDihedral( rsd, "CD2", "CE2", "CZ2", "CH2" ) );
912  dihedrallist.push_back( createDihedral( rsd, "CE2", "CZ2", "CH2", "CZ3" ) );
913  dihedrallist.push_back( createDihedral( rsd, "CZ2", "CH2", "CZ3", "CE3" ) );
914  dihedrallist.push_back( createDihedral( rsd, "CH2", "CZ3", "CE3", "CD2" ) );
915  dihedrallist.push_back( createDihedral( rsd, "CZ3", "CE3", "CD2", "CE2" ) );
916  dihedrallist.push_back( createDihedral( rsd, "CE3", "CD2", "CE2", "CZ2" ) );
917 
918 
919  }
920 
921  if( rsd.aa() == chemical::aa_tyr ){
922  //std::cout << "Preparring TYR\n";
923 
924  // Ring Dihedrals
925  dihedrallist.push_back( createDihedral( rsd, "CB", "CG", "CD2", "HD2" ) );
926  dihedrallist.push_back( createDihedral( rsd, "HD2", "CD2","CE2", "HE2" ) );
927  dihedrallist.push_back( createDihedral( rsd, "HE2", "CE2", "CZ", "OH" ) );
928  dihedrallist.push_back( createDihedral( rsd, "OH", "CZ", "CE1","HE1" ) );
929  dihedrallist.push_back( createDihedral( rsd, "HE1", "CE1","CD1", "HD1" ) );
930  dihedrallist.push_back( createDihedral( rsd, "HD1", "CD1", "CG", "CB" ) );
931 
932  dihedrallist.push_back( createDihedral( rsd, "CD1", "CG", "CD2", "HD2" ) );
933  dihedrallist.push_back( createDihedral( rsd, "CG", "CD2","CE2", "HE2" ) );
934  dihedrallist.push_back( createDihedral( rsd, "CD2", "CE2", "CZ", "OH" ) );
935  dihedrallist.push_back( createDihedral( rsd, "CE2", "CZ", "CE1","HE1" ) );
936  dihedrallist.push_back( createDihedral( rsd, "CZ", "CE1","CD1", "HD1" ) );
937  dihedrallist.push_back( createDihedral( rsd, "CE1", "CD1", "CG", "CB" ) );
938 
939  dihedrallist.push_back( createDihedral( rsd, "CB", "CG", "CD2", "CE2" ) );
940  dihedrallist.push_back( createDihedral( rsd, "HD2", "CD2","CE2", "CZ" ) );
941  dihedrallist.push_back( createDihedral( rsd, "HE2", "CE2", "CZ", "CE1" ) );
942  dihedrallist.push_back( createDihedral( rsd, "OH", "CZ", "CE1","CD1" ) );
943  dihedrallist.push_back( createDihedral( rsd, "HE1", "CE1","CD1", "CG" ) );
944  dihedrallist.push_back( createDihedral( rsd, "HD1", "CD1", "CG", "CD2" ) );
945 
946  // Impropers
947  dihedrallist.push_back( createDihedral( rsd, "CG", "CE2", "CD2", "HD2" ) );
948  dihedrallist.push_back( createDihedral( rsd, "CD2", "CZ", "CE2", "HE2" ) );
949  dihedrallist.push_back( createDihedral( rsd, "CZ", "CD2", "CE2", "HE2" ) );
950  dihedrallist.push_back( createDihedral( rsd, "CE1", "CE2", "CZ", "OH" ) );
951  dihedrallist.push_back( createDihedral( rsd, "CD1", "CZ", "CE1", "HE1" ) );
952  dihedrallist.push_back( createDihedral( rsd, "CG", "CE1", "CD1", "HD1" ) );
953  dihedrallist.push_back( createDihedral( rsd, "CD1", "CD2", "CG", "CB" ) );
954 
955 
956  }
957 
958 
959 
960  }
961 
962 }
963 
964 
965 
967  using namespace core;
968  for ( Size i = 1; i <= dihedrallist.size(); i ++ ){
969 
970  // work out which atoms are involved !
971  int no1 = dihedrallist[i].index1;
972  int no2 = dihedrallist[i].index2;
973  int no3 = dihedrallist[i].index3;
974  int no4 = dihedrallist[i].index4;
975 
976  //std::cout << no1 << " " << no2 << " " << no3 << " " << no4 << " "
977  // << std::endl;
978 
979  //float epot_dihedral_this=0;
980  float phi, sin_phi, cos_phi;
981  core::Vector vti_vta, vta_vtb, vtb_vtj;
982  core::Vector nrml1, nrml2, nrml3;
983  float inv_nrml1_mag, inv_nrml2_mag, inv_nrml3_mag;
984 
985  core::Vector dcosdnrml1;
986  core::Vector dcosdnrml2;
987  core::Vector dsindnrml3;
988  core::Vector dsindnrml2;
989 
990  vti_vta.x() = cartom[no1].position.x() - cartom[no2].position.x();
991  vti_vta.y() = cartom[no1].position.y() - cartom[no2].position.y();
992  vti_vta.z() = cartom[no1].position.z() - cartom[no2].position.z();
993 
994  vta_vtb.x() = cartom[no2].position.x() - cartom[no3].position.x();
995  vta_vtb.y() = cartom[no2].position.y() - cartom[no3].position.y();
996  vta_vtb.z() = cartom[no2].position.z() - cartom[no3].position.z();
997 
998  vtb_vtj.x() = cartom[no3].position.x() - cartom[no4].position.x();
999  vtb_vtj.y() = cartom[no3].position.y() - cartom[no4].position.y();
1000  vtb_vtj.z() = cartom[no3].position.z() - cartom[no4].position.z();
1001 
1002  nrml1.x() = (vti_vta.y() * vta_vtb.z() - vti_vta.z() * vta_vtb.y());
1003  nrml1.y() = (vti_vta.z() * vta_vtb.x() - vti_vta.x() * vta_vtb.z());
1004  nrml1.z() = (vti_vta.x() * vta_vtb.y() - vti_vta.y() * vta_vtb.x());
1005 
1006  nrml2.x() = (vta_vtb.y() * vtb_vtj.z() - vta_vtb.z() * vtb_vtj.y());
1007  nrml2.y() = (vta_vtb.z() * vtb_vtj.x() - vta_vtb.x() * vtb_vtj.z());
1008  nrml2.z() = (vta_vtb.x() * vtb_vtj.y() - vta_vtb.y() * vtb_vtj.x());
1009 
1010  nrml3.x() = (vta_vtb.y() * nrml1.z() - vta_vtb.z() * nrml1.y());
1011  nrml3.y() = (vta_vtb.z() * nrml1.x() - vta_vtb.x() * nrml1.z());
1012  nrml3.z() = (vta_vtb.x() * nrml1.y() - vta_vtb.y() * nrml1.x());
1013 
1014  inv_nrml1_mag = 1.0 / sqrt(sqr(nrml1.x()) + sqr(nrml1.y()) + sqr(nrml1.z()));
1015  inv_nrml2_mag = 1.0 / sqrt(sqr(nrml2.x()) + sqr(nrml2.y()) + sqr(nrml2.z()));
1016  inv_nrml3_mag = 1.0 / sqrt(sqr(nrml3.x()) + sqr(nrml3.y()) + sqr(nrml3.z()));
1017 
1018  cos_phi = (nrml1.x() * nrml2.x() + nrml1.y() * nrml2.y() + nrml1.z() * nrml2.z()) * inv_nrml1_mag * inv_nrml2_mag;
1019  sin_phi = (nrml3.x() * nrml2.x() + nrml3.y() * nrml2.y() + nrml3.z() * nrml2.z()) * inv_nrml3_mag * inv_nrml2_mag;
1020 
1021  nrml2.x() *= inv_nrml2_mag;
1022  nrml2.y() *= inv_nrml2_mag;
1023  nrml2.z() *= inv_nrml2_mag;
1024 
1025  phi = -atan2(sin_phi, cos_phi);
1026  dihedrallist[i].angle = phi;
1027  }
1028 
1029 }
1030 
1031 
1032 
1033 
1034 
1036 {
1037  using namespace core;
1038 
1039  float k = 600;
1040  for ( Size i = 1; i <= bondlist.size(); i ++ ){
1041 
1042  core::Vector f2 = pose->xyz( bondlist[i].atom_id_1 ) - pose->xyz( bondlist[i].atom_id_2 );
1043  float length = pose->xyz( bondlist[i].atom_id_1 ).distance( pose->xyz( bondlist[i].atom_id_2 ) );
1044 
1045  totalepot += 0.5 * k * sqr(length - bondlist[i].length);
1046 
1047  float deriv = k * (length - bondlist[i].length);
1048 
1049  f2 *= deriv / length;
1050 
1051  cartom[ bondlist[i].index1].force += f2;
1052  cartom[ bondlist[i].index2].force -= f2;
1053  }
1054 
1055 
1056 }
1057 
1058 
1060 {
1061  using namespace core;
1062 
1063  float k = 600;
1064  for ( Size i = 1; i <= anglelist.size(); i ++ ){
1065 
1066  core::Vector f2 = pose->xyz( anglelist[i].atom_id_1 ) - pose->xyz( anglelist[i].atom_id_3 );
1067  float length = pose->xyz( anglelist[i].atom_id_1 ).distance( pose->xyz( anglelist[i].atom_id_3 ) );
1068 
1069  totalepot += 0.5 * k * sqr(length - anglelist[i].length);
1070 
1071  float deriv = k * (length - anglelist[i].length);
1072 
1073  f2 *= deriv / length;
1074 
1075  cartom[ anglelist[i].index1 ].force += f2;
1076  cartom[ anglelist[i].index3 ].force -= f2;
1077  }
1078 
1079 }
1080 
1081 
1082 
1084  float &totalepot
1085 )
1086 {
1087  using namespace core;
1088 
1089  // float totene_b4 = totalepot;
1090 
1091  float k = 200;
1092  for ( Size i = 1; i <= dihedrallist.size(); i ++ ){
1093 
1094 
1095  // work out which atoms are involved !
1096 
1097  int no1 = dihedrallist[i].index1;
1098  int no2 = dihedrallist[i].index2;
1099  int no3 = dihedrallist[i].index3;
1100  int no4 = dihedrallist[i].index4;
1101 
1102 
1103  //float epot_dihedral_this=0;
1104  float phi, sin_phi, cos_phi;
1105  core::Vector vti_vta, vta_vtb, vtb_vtj;
1106  core::Vector nrml1, nrml2, nrml3;
1107  float inv_nrml1_mag, inv_nrml2_mag, inv_nrml3_mag;
1108 
1109  core::Vector dcosdnrml1(0,0,0);
1110  core::Vector dcosdnrml2(0,0,0);
1111  core::Vector dsindnrml3(0,0,0);
1112  core::Vector dsindnrml2(0,0,0);
1113  core::Vector f, fi, fab, fj;
1114 
1115 
1116  vti_vta.x() = cartom[no1].position.x() - cartom[no2].position.x();
1117  vti_vta.y() = cartom[no1].position.y() - cartom[no2].position.y();
1118  vti_vta.z() = cartom[no1].position.z() - cartom[no2].position.z();
1119 
1120  vta_vtb.x() = cartom[no2].position.x() - cartom[no3].position.x();
1121  vta_vtb.y() = cartom[no2].position.y() - cartom[no3].position.y();
1122  vta_vtb.z() = cartom[no2].position.z() - cartom[no3].position.z();
1123 
1124  vtb_vtj.x() = cartom[no3].position.x() - cartom[no4].position.x();
1125  vtb_vtj.y() = cartom[no3].position.y() - cartom[no4].position.y();
1126  vtb_vtj.z() = cartom[no3].position.z() - cartom[no4].position.z();
1127 
1128  fi.x() = 0;
1129  fi.y() = 0;
1130  fi.z() = 0;
1131  fab.x() = 0;
1132  fab.y() = 0;
1133  fab.z() = 0;
1134  fj.x() = 0;
1135  fj.y() = 0;
1136  fj.z() = 0;
1137 
1138  nrml1.x() = (vti_vta.y() * vta_vtb.z() - vti_vta.z() * vta_vtb.y());
1139  nrml1.y() = (vti_vta.z() * vta_vtb.x() - vti_vta.x() * vta_vtb.z());
1140  nrml1.z() = (vti_vta.x() * vta_vtb.y() - vti_vta.y() * vta_vtb.x());
1141 
1142  nrml2.x() = (vta_vtb.y() * vtb_vtj.z() - vta_vtb.z() * vtb_vtj.y());
1143  nrml2.y() = (vta_vtb.z() * vtb_vtj.x() - vta_vtb.x() * vtb_vtj.z());
1144  nrml2.z() = (vta_vtb.x() * vtb_vtj.y() - vta_vtb.y() * vtb_vtj.x());
1145 
1146  nrml3.x() = (vta_vtb.y() * nrml1.z() - vta_vtb.z() * nrml1.y());
1147  nrml3.y() = (vta_vtb.z() * nrml1.x() - vta_vtb.x() * nrml1.z());
1148  nrml3.z() = (vta_vtb.x() * nrml1.y() - vta_vtb.y() * nrml1.x());
1149 
1150  inv_nrml1_mag = 1.0 / sqrt(sqr(nrml1.x()) + sqr(nrml1.y()) + sqr(nrml1.z()));
1151  inv_nrml2_mag = 1.0 / sqrt(sqr(nrml2.x()) + sqr(nrml2.y()) + sqr(nrml2.z()));
1152  inv_nrml3_mag = 1.0 / sqrt(sqr(nrml3.x()) + sqr(nrml3.y()) + sqr(nrml3.z()));
1153 
1154  cos_phi = (nrml1.x() * nrml2.x() + nrml1.y() * nrml2.y() + nrml1.z() * nrml2.z()) * inv_nrml1_mag * inv_nrml2_mag;
1155  sin_phi = (nrml3.x() * nrml2.x() + nrml3.y() * nrml2.y() + nrml3.z() * nrml2.z()) * inv_nrml3_mag * inv_nrml2_mag;
1156 
1157  nrml2.x() *= inv_nrml2_mag;
1158  nrml2.y() *= inv_nrml2_mag;
1159  nrml2.z() *= inv_nrml2_mag;
1160 
1161  phi = -atan2(sin_phi, cos_phi);
1162 
1163  if(fabs(sin_phi) > 0.1) {
1164  nrml1.x() *= inv_nrml1_mag;
1165  nrml1.y() *= inv_nrml1_mag;
1166  nrml1.z() *= inv_nrml1_mag;
1167 
1168  dcosdnrml1.x() = inv_nrml1_mag * (nrml1.x() * cos_phi - nrml2.x());
1169  dcosdnrml1.y() = inv_nrml1_mag * (nrml1.y() * cos_phi - nrml2.y());
1170  dcosdnrml1.z() = inv_nrml1_mag * (nrml1.z() * cos_phi - nrml2.z());
1171 
1172  dcosdnrml2.x() = inv_nrml2_mag * (nrml2.x() * cos_phi - nrml1.x());
1173  dcosdnrml2.y() = inv_nrml2_mag * (nrml2.y() * cos_phi - nrml1.y());
1174  dcosdnrml2.z() = inv_nrml2_mag * (nrml2.z() * cos_phi - nrml1.z());
1175 
1176  } else {
1177  nrml3.x() *= inv_nrml3_mag;
1178  nrml3.y() *= inv_nrml3_mag;
1179  nrml3.z() *= inv_nrml3_mag;
1180 
1181  dsindnrml3.x() = inv_nrml3_mag * (nrml3.x() * sin_phi - nrml2.x());
1182  dsindnrml3.y() = inv_nrml3_mag * (nrml3.y() * sin_phi - nrml2.y());
1183  dsindnrml3.z() = inv_nrml3_mag * (nrml3.z() * sin_phi - nrml2.z());
1184 
1185  dsindnrml2.x() = inv_nrml2_mag * (nrml2.x() * sin_phi - nrml3.x());
1186  dsindnrml2.y() = inv_nrml2_mag * (nrml2.y() * sin_phi - nrml3.y());
1187  dsindnrml2.z() = inv_nrml2_mag * (nrml2.z() * sin_phi - nrml3.z());
1188  }
1189 
1190  double diff = phi - dihedrallist[i].angle;
1191  if(diff < -numeric::NumericTraits< double >::pi() ) diff += 2*numeric::NumericTraits< double >::pi();
1192  if(diff < -numeric::NumericTraits< double >::pi() ) diff += 2*numeric::NumericTraits< double >::pi();
1193  if(diff > numeric::NumericTraits< double >::pi() ) diff -= 2*numeric::NumericTraits< double >::pi();
1194  if(diff > numeric::NumericTraits< double >::pi() ) diff -= 2*numeric::NumericTraits< double >::pi();
1195  totalepot += k * sqr(diff);
1196  double deriv = -2.0 * k * diff;
1197  //std::cout << "BAH! " << phi << " " << dihedrallist[i].angle << " " << diff << " " << deriv << " " << numeric::NumericTraits< double >::pi() << std::endl;
1198  // forces
1199  if(fabs(sin_phi) > 0.1) {
1200  deriv /= sin_phi;
1201  fi.x() += deriv * (vta_vtb.y() * dcosdnrml1.z() - vta_vtb.z() * dcosdnrml1.y());
1202  fi.y() += deriv * (vta_vtb.z() * dcosdnrml1.x() - vta_vtb.x() * dcosdnrml1.z());
1203  fi.z() += deriv * (vta_vtb.x() * dcosdnrml1.y() - vta_vtb.y() * dcosdnrml1.x());
1204 
1205  fj.x() += deriv * (vta_vtb.z() * dcosdnrml2.y() - vta_vtb.y() * dcosdnrml2.z());
1206  fj.y() += deriv * (vta_vtb.x() * dcosdnrml2.z() - vta_vtb.z() * dcosdnrml2.x());
1207  fj.z() += deriv * (vta_vtb.y() * dcosdnrml2.x() - vta_vtb.x() * dcosdnrml2.y());
1208 
1209  fab.x() += deriv * (vti_vta.z() * dcosdnrml1.y() - vti_vta.y() * dcosdnrml1.z() + vtb_vtj.y() * dcosdnrml2.z() - vtb_vtj.z() * dcosdnrml2.y());
1210  fab.y() += deriv * (vti_vta.x() * dcosdnrml1.z() - vti_vta.z() * dcosdnrml1.x() + vtb_vtj.z() * dcosdnrml2.x() - vtb_vtj.x() * dcosdnrml2.z());
1211  fab.z() += deriv * (vti_vta.y() * dcosdnrml1.x() - vti_vta.x() * dcosdnrml1.y() + vtb_vtj.x() * dcosdnrml2.y() - vtb_vtj.y() * dcosdnrml2.x());
1212 
1213  } else {
1214  deriv /= -cos_phi;
1215 
1216  fi.x() += deriv * ((vta_vtb.y() * vta_vtb.y() + vta_vtb.z() * vta_vtb.z()) * dsindnrml3.x() - vta_vtb.x() * vta_vtb.y() * dsindnrml3.y() - vta_vtb.x() * vta_vtb.z() * dsindnrml3.z());
1217  fi.y() += deriv * ((vta_vtb.z() * vta_vtb.z() + vta_vtb.x() * vta_vtb.x()) * dsindnrml3.y() - vta_vtb.y() * vta_vtb.z() * dsindnrml3.z() - vta_vtb.y() * vta_vtb.x() * dsindnrml3.x());
1218  fi.z() += deriv * ((vta_vtb.x() * vta_vtb.x() + vta_vtb.y() * vta_vtb.y()) * dsindnrml3.z() - vta_vtb.z() * vta_vtb.x() * dsindnrml3.x() - vta_vtb.z() * vta_vtb.y() * dsindnrml3.y());
1219 
1220  fj.x() += deriv * (dsindnrml2.y() * vta_vtb.z() - dsindnrml2.z() * vta_vtb.y());
1221  fj.y() += deriv * (dsindnrml2.z() * vta_vtb.x() - dsindnrml2.x() * vta_vtb.z());
1222  fj.z() += deriv * (dsindnrml2.x() * vta_vtb.y() - dsindnrml2.y() * vta_vtb.x());
1223 
1224  fab.x() += deriv * (-(vta_vtb.y() * vti_vta.y() + vta_vtb.z() * vti_vta.z()) * dsindnrml3.x()
1225  + (2.0 * vta_vtb.x() * vti_vta.y() - vti_vta.x() * vta_vtb.y()) * dsindnrml3.y()
1226  + (2.0 * vta_vtb.x() * vti_vta.z() - vti_vta.x() * vta_vtb.z()) * dsindnrml3.z() + dsindnrml2.z() * vtb_vtj.y() - dsindnrml2.y() * vtb_vtj.z());
1227  fab.y() += deriv * (-(vta_vtb.z() * vti_vta.z() + vta_vtb.x() * vti_vta.x()) * dsindnrml3.y()
1228  + (2.0 * vta_vtb.y() * vti_vta.z() - vti_vta.y() * vta_vtb.z()) * dsindnrml3.z()
1229  + (2.0 * vta_vtb.y() * vti_vta.x() - vti_vta.y() * vta_vtb.x()) * dsindnrml3.x() + dsindnrml2.x() * vtb_vtj.z() - dsindnrml2.z() * vtb_vtj.x());
1230  fab.z() += deriv * (-(vta_vtb.x() * vti_vta.x() + vta_vtb.y() * vti_vta.y()) * dsindnrml3.z()
1231  + (2.0 * vta_vtb.z() * vti_vta.x() - vti_vta.z() * vta_vtb.x()) * dsindnrml3.x()
1232  + (2.0 * vta_vtb.z() * vti_vta.y() - vti_vta.z() * vta_vtb.y()) * dsindnrml3.y() + dsindnrml2.y() * vtb_vtj.x() - dsindnrml2.x() * vtb_vtj.y());
1233  }
1234 
1235 // fi.mul(PhysicsConst::invAngstrom);
1236 // fab.mul(PhysicsConst::invAngstrom);
1237 // fj.mul(PhysicsConst::invAngstrom);
1238 
1239  // add to cartesian derivatives
1240 
1241  cartom[no1].force.x() += fi.x();
1242  cartom[no1].force.y() += fi.y();
1243  cartom[no1].force.z() += fi.z();
1244 
1245  cartom[no2].force.x() += fab.x() - fi.x();
1246  cartom[no2].force.y() += fab.y() - fi.y();
1247  cartom[no2].force.z() += fab.z() - fi.z();
1248 
1249  cartom[no3].force.x() += fj.x() - fab.x();
1250  cartom[no3].force.y() += fj.y() - fab.y();
1251  cartom[no3].force.z() += fj.z() - fab.z();
1252 
1253  cartom[no4].force.x() -= fj.x();
1254  cartom[no4].force.y() -= fj.y();
1255  cartom[no4].force.z() -= fj.z();
1256 
1257  }
1258 
1259 }
1260 
1262 {
1263  using namespace core;
1264  //std::cout << "setup_for_scoring" << std::endl;
1265  Size const nres( pose->total_residue() );
1266 
1267  scorefxn.setup_for_derivatives( *pose);
1268  cartom.clear();
1269  for ( Size ir = 1; ir <= nres; ++ir ) {
1270  // get the appropriate residue from the pose->
1271  conformation::Residue const & rsd( pose->residue( ir ) );
1272 
1273  //std::cout << "Res: " << ir << " " << rsd.natoms() << std::endl;
1274 
1275  // iterate across neighbors within 12 angstroms
1276  for (Size i = 1; i <= rsd.natoms(); i++ ){
1277  id::AtomID atom_id( i, ir );
1278 
1279  CartesianAtom atom;
1280  core::Vector F1(0,0,0),F2(0,0,0);
1281  scorefxn.eval_npd_atom_derivative( atom_id, *pose, min_map.domain_map(), F1, F2 );
1282  atom.index = i;
1283  atom.res = ir;
1284  atom.atom_id = atom_id;
1285  atom.force = F2;
1286  atom.old_force = core::Vector(0,0,0);
1287  atom.old_velocity = core::Vector(0,0,0);
1288  atom.old_position = core::Vector(0,0,0);
1289  cartom.push_back(atom);
1290 
1291  }
1292 
1293  }
1294 
1295 
1296 
1297 }
1298 
1299 
1300 
1302 {
1303  using namespace core;
1304  double sigma;
1305  //int natom = cartom.size();
1306 
1307  for ( Size i = 1; i <= cartom.size(); i ++ )
1308  {
1309  sigma = sqrt( 1.38065E-23 * tgtTemp / (cartom[i].mass * 1.66053878E-27) );
1310  cartom[i].velocity.x() = numeric::random::gaussian() * sigma;
1311  cartom[i].velocity.y() = numeric::random::gaussian() * sigma;
1312  cartom[i].velocity.z() = numeric::random::gaussian() * sigma;
1313  }
1314 }
1315 
1316 
1318  float &ekin,
1319  float &Temp
1320 )
1321 {
1322  using namespace core;
1323  ekin = 0;
1324 
1325  for ( Size i = 1; i <= cartom.size(); i ++ )
1326  {
1327  ekin += (0.5 * cartom[i].mass * 1.66053878E-27 * inner_product(cartom[i].velocity,cartom[i].velocity));
1328  }
1329 
1330  // Calculate Temperature from K = 2NkBT/2
1331  Temp = 2.0 * ekin / (3 * cartom.size() * 8.31 / 6.022E23 ); //
1332 
1333 }
1334 
1335 
1337  float &kin,
1338  float &temp
1339 )
1340 {
1341  using namespace core;
1342 
1343  //int i;
1344  double t;
1345  //double t2;
1346  double tinvmass;
1347  core::Vector dr, dv;
1348  core::Vector t2a;
1349 
1350  t = 1E-15;
1351  //t2 = sqr(t); // set but never used ~Labonte
1352 
1353  float forcemul = -( 1E10 / 6.0221418E23 * 4184.0);
1354 
1355  for ( Size i = 1; i <= cartom.size(); i ++ )
1356  {
1357  tinvmass = t / (6.0 * (cartom[i].mass * 1.66053878E-27 ) ); // t div 6m
1358 
1359  // finish change in velocity using a(n+1)
1360  dv.x() = ((2.0) * cartom[i].force.x() * forcemul ) * tinvmass;
1361  dv.y() = ((2.0) * cartom[i].force.y() * forcemul ) * tinvmass;
1362  dv.z() = ((2.0) * cartom[i].force.z() * forcemul ) * tinvmass;
1363  cartom[i].velocity += dv;
1364  }
1365 
1366  calcKineticEnergy( kin, temp ); //calculate instanteneous temperature & pressure
1367 
1368  kin *= 6.0221418E23 / 4184.0;
1369 
1370  //applyThermostat(); //adjust velocities according to Thermostat
1371 
1372  // predict new positions
1373  for ( Size i = 1; i <= cartom.size(); i ++ )
1374  {
1375  tinvmass = t / (6.0 * cartom[i].mass * 1.66053878E-27 ); // t div 6m
1376 
1377  // change in position
1378  dr.x() = t * (cartom[i].velocity.x() + (4.0 * cartom[i].force.x() - cartom[i].old_force.x()) * forcemul* tinvmass);
1379  dr.y() = t * (cartom[i].velocity.y() + (4.0 * cartom[i].force.y() - cartom[i].old_force.y()) * forcemul* tinvmass);
1380  dr.z() = t * (cartom[i].velocity.z() + (4.0 * cartom[i].force.z() - cartom[i].old_force.z()) * forcemul* tinvmass);
1381 
1382  dr /= 1E-10;
1383 
1384  dv.x() = (5.0 * cartom[i].force.x() - cartom[i].old_force.x()) * forcemul* tinvmass;
1385  dv.y() = (5.0 * cartom[i].force.y() - cartom[i].old_force.y()) * forcemul* tinvmass;
1386  dv.z() = (5.0 * cartom[i].force.z() - cartom[i].old_force.z()) * forcemul* tinvmass;
1387 
1388  //update positions and speeds.
1389  //std::cout << dr.x() << " " << dr.z() << " "<< dr.z() << " " << std::endl;
1390  cartom[i].position += dr;
1391  cartom[i].velocity += dv;
1392 
1393  // save current force as next Step's old force
1394  cartom[i].old_force = cartom[i].force;
1395  }
1396 
1397 
1398 }
1399 
1400 
1402  double T,
1403  float &kin,
1404  float &temp
1405 )
1406 {
1407  using namespace core;
1408  //int i;
1409  core::Vector dr, dv;
1410  double t = 1E-15;
1411  double tinvmass;
1412  float forcemul = -( 1E10 / 6.0221418E23 * 4184.0);
1413 
1414  double gamma = 10E12;
1415  double gammat = gamma * t;
1416  double gt = gammat; // these are the consecutive powers for the series expnsions
1417  double gt2 = gt * gt;
1418  double gt3 = gt * gt2;
1419  double gt4 = gt2 * gt2;
1420  double gt5 = gt2 * gt3;
1421  double gt6 = gt3 * gt3;
1422  double gt7 = gt3 * gt4;
1423  double gt8 = gt4 * gt4;
1424  double gt9 = gt4 * gt5;
1425 
1426  double c0; // langevin coefficients
1427  double c1;
1428  double c2;
1429 
1430  double egammat;
1431  double varv;
1432  double varr;
1433  double crv;
1434 
1435  double kTdivm;
1436  double sigmav;
1437  double sigmar;
1438  double n1x, n2x;
1439  double n1y, n2y;
1440  double n1z, n2z;
1441  core::Vector deltav;
1442  core::Vector deltar;
1443 
1444  if(gammat > 0.05) {
1445  // when the friction coeffcient is relatively large, run langevin dynamics
1446  // the parameters must be calculated using exponential functions
1447  c0 = exp(-gammat); // langevin coefficients
1448  c1 = (1 - c0) / gammat;
1449  c2 = (1 - c1) / gammat;
1450 
1451  egammat = exp(-gammat);
1452  varv = (1.0 - sqr(egammat));
1453  varr = (2.0 * gammat - 3.0 + (4.0 - egammat) * egammat);
1454  crv = sqr(1.0 - egammat) / (sqrt(varv * varr));
1455  } else {
1456  // when the friction coeffcient is in the midrange we can approximate the paramters
1457  // by taylor expansion which is a little faster
1458  c0 =
1459  1 - gt + 0.5 * gt2 - gt3 / 6.0 + gt4 / 24.0 - gt5 / 120.0 + gt6 / 720.0 - gt7 / 5040.0 + gt8 / 40320.0 -
1460  gt9 / 362880.0;
1461  c1 =
1462  1 - (0.5 * gt - gt2 / 6.0 + gt3 / 24.0 - gt4 / 120.0 + gt5 / 720.0 - gt6 / 5040.0 + gt7 / 40320.0 -
1463  gt8 / 362880.0);
1464  c2 =
1465  0.5 - gt / 6.0 + gt2 / 24.0 - gt3 / 120.0 + gt4 / 720.0 - gt5 / 5040.0 + gt6 / 40320.0 - gt7 / 362880.0;
1466 
1467  varr = 2.0 * gt3 / 3.0 - gt4 / 2.0 + 7.0 * gt5 / 30.0 - gt6 / 12.0
1468  + 31.0 * gt7 / 1260.0 - gt8 / 160.0 + 127.0 * gt9 / 90720.0;
1469  varv = 2.0 * gt - 2.0 * gt2 + 4.0 * gt3 / 3.0 - 2.0 * gt4 / 3.0 + 4.0 * gt5 / 15.0
1470  - 4.0 * gt6 / 45.0 + 8.0 * gt7 / 315.0 - 2.0 * gt8 / 315.0 + 4.0 * gt9 / 2835.0;
1471  crv = sqrt(3.0) * (0.5 - 3.0 * gt / 16.0 - 17.0 * gt2 / 1280.0 + 17.0 * gt3 / 6144.0
1472  + 40967.0 * gt4 / 34406400.0 - 57203.0 * gt5 / 275251200.0 -
1473  1429487.0 * gt6 / 13212057600.0);
1474  }
1475 
1476  //if(Step > 0) {
1477  for ( Size i = 1; i <= cartom.size(); i ++ )
1478  {
1479  tinvmass = t / (cartom[i].mass * 1.66053878E-27); // t div m
1480 
1481  // finish change in velocity using a(n+1)
1482  dv.x() = (1.0 - c0 / c1) * cartom[i].force.x() * forcemul * tinvmass / gammat;
1483  dv.y() = (1.0 - c0 / c1) * cartom[i].force.y() * forcemul * tinvmass / gammat;
1484  dv.z() = (1.0 - c0 / c1) * cartom[i].force.z() * forcemul * tinvmass / gammat;
1485  cartom[i].velocity += dv;
1486  }
1487  //}
1488 
1489  // The velocities are now "real", i.e. finished and thus now is the time
1490  // to calculate the kinetic energy and apply any barostat
1491  // note no other thermostats are called here because
1492  // langevin dynamics regultes the temperature itself - thermostat
1493  // is built-in so to speak
1494  calcKineticEnergy( kin, temp);
1495  kin *= 6.0221418E23 / 4184.0;
1496 
1497  //if(Step < (Steps - 1)) {
1498  for ( Size i = 1; i <= cartom.size(); i ++ )
1499  {
1500  tinvmass = t / (cartom[i].mass * 1.66053878E-27); // t div m
1501 
1502  kTdivm = 1.38065E-23 * T / (cartom[i].mass * 1.66053878E-27);
1503  sigmav = sqrt(kTdivm * varv);
1504  sigmar = sqrt(kTdivm * varr) / gamma;
1505 
1506  n1x = numeric::random::gaussian();
1507  n2y = numeric::random::gaussian();
1508  n2x = numeric::random::gaussian();
1509  n1z = numeric::random::gaussian();
1510  n1y = numeric::random::gaussian();
1511  n2z = numeric::random::gaussian();
1512 
1513  deltav = core::Vector(sigmav * (crv * n1x + sqrt(1.0 - sqr(crv)) * n2x),
1514  sigmav * (crv * n1y + sqrt(1.0 - sqr(crv)) * n2y),
1515  sigmav * (crv * n1z + sqrt(1.0 - sqr(crv)) * n2z));
1516  deltar = core::Vector(sigmar * n1x, sigmar * n1y, sigmar * n1z);
1517 
1518  // change in position
1519  dr.x() = t * (c1 * cartom[i].velocity.x() + c2 * cartom[i].force.x() * forcemul * tinvmass) + deltar.x();
1520  dr.y() = t * (c1 * cartom[i].velocity.y() + c2 * cartom[i].force.y() * forcemul * tinvmass) + deltar.y();
1521  dr.z() = t * (c1 * cartom[i].velocity.z() + c2 * cartom[i].force.z() * forcemul * tinvmass) + deltar.z();
1522  dr *= 1E10;
1523 
1524  // finish change in velocity using a(n+1)
1525  dv.x() = (c0 * c2) * cartom[i].force.x() * forcemul * tinvmass / c1 + deltav.x();
1526  dv.y() = (c0 * c2) * cartom[i].force.y() * forcemul * tinvmass / c1 + deltav.y();
1527  dv.z() = (c0 * c2) * cartom[i].force.z() * forcemul * tinvmass / c1 + deltav.z();
1528 
1529  cartom[i].position += dr;
1530  cartom[i].velocity *= c0;
1531  cartom[i].velocity += dv;
1532  }
1533  //}
1534 
1535 
1536 }
1537 
1538 
1539 
1541  int Step,
1542  float &current_energy,
1543  float &m_OldEnergy
1544  )
1545 {
1546  using namespace core;
1547 
1548  core::Vector f;
1549  static double m_StepMultiplier = 1.0;
1550  float StepSize = 0.000001;
1551  float forcemul = 1; // ( 1E10 / 6.0221418E23 * 4184.0);
1552  //static bool backstep = false;
1553 
1554  //std::cout << "-----> " << m_StepMultiplier << std::endl;
1555  if(Step != 0) {
1556  if((current_energy < m_OldEnergy)) { // energy did go down on last Step
1557 
1558  //if( !backstep ){
1559  double fmagold, fmagnew, gamma;
1560  m_StepMultiplier *= 1.2;
1561  //std::cout << "ENERGY_IMPROVEMENT\n";
1562  fmagold = 0;
1563  fmagnew = 0;
1564  for ( Size i = 1; i <= cartom.size(); i ++ ) { // calculate the inner dots of the current force
1565  fmagold += cartom[i].old_force.dot( cartom[i].old_force );
1566  core::Vector ftemp = cartom[i].old_force - cartom[i].force;
1567  fmagnew += ftemp.dot( cartom[i].force );
1568  }
1569 
1570  //b = ( (gnew - gprev)*(new) / prev^2
1571 
1572  if(fmagold != 0)
1573  gamma = fmagnew / fmagold;
1574  else
1575  gamma = 0;
1576 
1577  if (gamma < 0 ) gamma = 0;
1578  std::cout << "gamma: " << gamma << std::endl;
1579 
1580  //gamma = 0;
1581  for ( Size i = 1; i <= cartom.size(); i ++ ) { // save positions & forces
1582  cartom[i].velocity = cartom[i].old_velocity; // set to old direction
1583  cartom[i].velocity *= gamma; // multiply the old direction with gamma
1584  cartom[i].velocity -= cartom[i].force * forcemul; // and add current force to make current direction
1585  cartom[i].velocity *= 1;
1586  cartom[i].old_position = cartom[i].position; // save position
1587  cartom[i].old_force = cartom[i].force * forcemul; // save old forces
1588  cartom[i].old_velocity = cartom[i].velocity;; // save old directions
1589  }
1590  m_OldEnergy = current_energy;
1591  //backstep = false; // set but never used ~Labonte
1592  //} else {
1593  // std::cout << "BACKSTEP\n";
1594 
1595  //}
1596  } else { // we went up the other side
1597  //std::cout << "ENERGY_UP\n" << current_energy << " " << m_OldEnergy << " ";
1598 
1599  m_StepMultiplier *= 0.5 / 1.2;
1600  for ( Size i = 1; i <= cartom.size(); i ++ ) {
1601  cartom[i].position = cartom[i].old_position; // restore old position
1602  //cartom[i].force = cartom[i].old_force / forcemul; // restore old forces
1603  }
1604  //m_OldEnergy += 1; // no idea what this is !?
1605 
1606  //backstep = true; // set but never used ~Labonte
1607  //return;
1608 
1609  }
1610  } else { // this block is for Step == 0 - its just a standard SD Step
1611  for ( Size i = 1; i < cartom.size(); i++ ) {
1612  cartom[i].old_position = cartom[i].position; // save position (old position = current position)
1613  cartom[i].old_force = cartom[i].force * forcemul; // save old forces
1614  cartom[i].old_velocity = -cartom[i].force * forcemul; // save old directions, equal to old force
1615  cartom[i].velocity = -cartom[i].force * forcemul; // save old directions, equal to old force
1616  }
1617  m_OldEnergy = current_energy;
1618  }
1619 
1620  for ( Size i = 1; i <= cartom.size(); i ++ ) {
1621  f = cartom[i].velocity;
1622  f *= StepSize * m_StepMultiplier;
1623  //if( sqr(f.x()) + sqr(f.y()) + sqr (f.z()) > 0.2 )
1624  // std::cout << "DISP: " << i << f.x() << " " << f.y() << " " << f.z() << std::endl;
1625  cartom[i].position += f;
1626  }
1627 
1628 }
1629 
1630 
1631 
1632 
1634  core::scoring::ScoreFunction const & scorefxn
1635 )
1636 {
1637  using namespace core;
1638 
1639  const int Steps = 400;
1640  int Step = 0;
1641  float kin = 0;
1642  //float temp = 0;
1643  float pot = 0;
1644  int mcount = 1;
1645 
1646  std::ofstream pdbfile;
1647  std::string filename ( "min.pdb" );
1648  pdbfile.open( filename.c_str() , std::ios::out );
1649 
1650  float cov_epot=0;
1651  //float startTemp = 100;
1652  //float TargetTemp=startTemp;
1653 
1654  float current_energy;
1655  float m_OldEnergy;
1656 
1657  for( Step = 0; Step < Steps; Step ++ ){
1658  pose::Pose pose2( *pose);
1659  current_energy = scorefxn( pose2 );
1660  pot = current_energy;
1661  cov_epot = 0;
1662 
1663  zeroForces( );
1664  getCartesianDerivatives( scorefxn );
1665  doBondDerivatives( cov_epot );
1666  doAngleDerivatives( cov_epot );
1667  doDihedralDerivatives( cov_epot );
1668  current_energy += cov_epot;
1669 
1670  std::cout << Step << " " << pot << " " << cov_epot << " " << kin << " " << pot+kin << std::endl;
1671 
1672  if(Step == 0 ) m_OldEnergy = current_energy;
1673  applyForces_ConjugateGradient( Step, current_energy, m_OldEnergy );
1674 
1676 
1677  //if( ( Step % 50 ) == 0 ){
1678  pdbfile << "MODEL " << I(5, mcount ) << std::endl;
1679  pose->dump_pdb( pdbfile );
1680  pdbfile << "ENDMDL" << std::endl;
1681  mcount++;
1682  //}
1683  pdbfile.flush();
1684  }
1685 
1686  pdbfile.close();
1687 
1688 
1689 }
1690 
1691 
1692 
1693 
1694 
1696  int Steps,
1697  float startTemp,
1698  float endTemp
1699 ){
1700  using namespace core;
1701  setInitialSpeeds(startTemp);
1702 
1703  int Step = 0;
1704  float kin = 0;
1705  float temp = 0;
1706  float pot = 0;
1707  int mcount = 1;
1708 
1709  std::ofstream pdbfile;
1710  std::string filename ( "md." + right_string_of(startTemp,4,'0') + ".pdb" );
1711  pdbfile.open( filename.c_str() , std::ios::out );
1712 
1713  float cov_epot=0;
1714  float TargetTemp=startTemp;
1715  for( Step = 0; Step < Steps; Step ++ ){
1716  pose::Pose pose2(*pose);
1717  pot += scorefxn( pose2 );
1718  if( ( Step % 20 ) == 0 ){
1719  std::cout << Step << " " << pot << " " << cov_epot << " " << kin << " " << pot+kin+cov_epot << " " << temp << "(" << TargetTemp << ")" << std::endl;
1720  }
1721  //zeroForces( cartom );
1722  getCartesianDerivatives( scorefxn );
1723  pot = 0;
1724  cov_epot = 0;
1725  doBondDerivatives(cov_epot );
1726  doAngleDerivatives( cov_epot);
1727  doDihedralDerivatives( cov_epot );
1728 
1729  float ratio = (float)Step/(float)Steps;
1730  TargetTemp = std::max(0.01, ratio*endTemp + (1.0-ratio)*startTemp );
1731  applyForces_LangevinIntegration( TargetTemp , kin, temp );
1732  //applyForces_BeeMan( cartom, kin, temp );
1733 
1735 
1736  if( ( Step % 100 ) == 0 ){
1737  pdbfile << "MODEL " << I(5, mcount ) << std::endl;
1738  pose->dump_pdb( pdbfile );
1739  pdbfile << "ENDMDL" << std::endl;
1740  mcount++;
1741  }
1742  pdbfile.flush();
1743  }
1744 
1745  pdbfile.close();
1746 
1747 
1748 }
1749 
1750 
1751 
1752 
1753 
1754 
1755 
1756 
1757 
1758 
1759 
1760 
1761 
1762 
1763 
1764 
1765 
1766 
1767 
1768 
1769 
1770 
1771 
1772 
1773 
1774 
1775 
1776 
1777 
1779 {
1780  using namespace core;
1781 
1782  // score it !
1783  Real start_score = scorefxn( *pose );
1784  scorefxn.show(std::cout, *pose);
1785  std::cout << "STARTSCORE: " << start_score << std::endl;
1786 /*
1787  Residue rsd_mod = pose->residue(4);
1788 
1789  std::cout << rsd_mod.xyz(4).z() << std::endl;
1790  // move an atom
1791  Vector test = rsd_mod.xyz(4).xyz();
1792  Vector dd(0,0,0.1); yy
1793  Vector newvec;
1794 
1795  newvec = rsd_mod.xyz(4) + dd;
1796  pose->residue(4).atom(3).set_xyz(4, newvec);
1797 
1798  pose->set_residue
1799  pose->set_xyz( id, pose->xyz( id ) + dx );
1800 
1801  scorefxn( *pose );
1802  scorefxn.show(std::cout, *pose);
1803  std::cout << pose->residue(4).atom(3).xyz().z() << std::endl;
1804 */
1805  const float dd = 0.00001;
1806  Vector dx(dd,0,0);
1807  Vector dy(0,dd,0);
1808  Vector dz(0,0,dd);
1809 
1812 
1813 
1814  std::cout << "Calculating derivatives \n";
1815 
1817  getCartesianDerivatives( scorefxn );
1818 
1819 
1820  //int cend = clock();
1821  pose->energies().reset_nblist();
1822  std::cout << "STARTSCORE: --------- " << std::endl;
1823  start_score = scorefxn( *pose );
1824  scorefxn.show(std::cout, *pose);
1825 
1826 
1827 
1828  //std::cout << "setup_for_scoring" << std::endl;
1829  Size const nres( pose->total_residue() );
1830 
1831  for ( Size ir = 1; ir <= nres; ++ir ) {
1832  // get the appropriate residue from the pose->
1833  conformation::Residue const & rsd( pose->residue( ir ) );
1834  std::cout << "IR: " << ir << std::endl;
1835  // iterate across neighbors within 12 angstroms
1836  for (Size i = 1; i <= rsd.natoms(); i++ ){
1837  id::AtomID atom_id( i, ir );
1838 
1839  pose->energies().clear();
1840  start_score = scorefxn( *pose );
1841 
1842  Real new_score;
1843  Real deriv;
1844  Vector deriv_vector;
1845  Vector safepos = pose->xyz( atom_id );
1846  pose->set_xyz( atom_id, safepos + dx );
1847  pose->energies().clear();
1848  new_score = scorefxn( *pose );
1849  deriv = (new_score - start_score)/dd;
1850  deriv_vector.x(deriv);
1851 
1852  pose->set_xyz( atom_id, safepos + dy );
1853  pose->energies().clear();
1854  new_score = scorefxn( *pose );
1855  deriv = (new_score - start_score)/dd;
1856  deriv_vector.y(deriv);
1857 
1858 
1859  pose->set_xyz( atom_id, safepos + dz );
1860  pose->energies().clear();
1861  new_score = scorefxn( *pose );
1862  deriv = (new_score - start_score)/dd;
1863  deriv_vector.z(deriv);
1864  pose->set_xyz( atom_id, safepos );
1865 
1866  numeriv.push_back( deriv_vector );
1867  }
1868 
1869  }
1870 
1871 
1872  for( Size i = 1; i < cartom.size(); i++ ){
1873 
1874  if( ( fabs( cartom[i].force.x() - numeriv[i].x() ) > 0.1 ) ||
1875  ( fabs( cartom[i].force.y() - numeriv[i].y() ) > 0.1 ) ||
1876  ( fabs( cartom[i].force.z() - numeriv[i].z() ) > 0.1 ) ) {
1877  std::cout << "DRV: "
1878  << cartom[i].res << " "
1879  << cartom[i].index << " "
1880  << cartom[i].force.x() << " "
1881  << cartom[i].force.y() << " "
1882  << cartom[i].force.z() << " "
1883  << numeriv[i].x() << " "
1884  << numeriv[i].y() << " "
1885  << numeriv[i].z() << " "
1886  << std::endl;
1887 
1888 
1889  }else{
1890  std::cout << "DRVT: "
1891  << cartom[i].res << " "
1892  << cartom[i].index << " "
1893  << cartom[i].force.x() << " "
1894  << cartom[i].force.y() << " "
1895  << cartom[i].force.z() << " "
1896  << numeriv[i].x() << " "
1897  << numeriv[i].y() << " "
1898  << numeriv[i].z() << " "
1899  << std::endl;
1900 
1901 
1902  }
1903 
1904  }
1905 
1906 
1907 }
1908 
1909 
1910 
1911 
1912 
1913 
1914 
1915 
1916 
1917 
1918 } // namespace optimization
1919 } // namespace core