Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
CartSCMinMultifunc.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 core/pack/scmin/CartSCMinMultifunc.cc
11 /// @brief Class for interfacing with the minimizer during sidechain minimization.
12 /// @author Andrew Leaver-Fay (aleaverfay@gmail.com)
13 
14 // Unit headers
16 
17 // Package Headers
20 
21 // Project Headers
22 #include <core/types.hh>
26 #include <core/optimization/cartesian_minimize.hh> // VectorQuad, tors->cart conversions
27 
28 // Utility headers
29 #include <utility/vector1.hh>
30 #include <utility/pointer/ReferenceCount.hh>
31 
32 // Numeric headers
33 #include <numeric/constants.hh>
34 
35 #include <core/kinematics/Jump.hh>
39 
40 
41 namespace core {
42 namespace pack {
43 namespace scmin {
44 
45 
47  pose::Pose & p,
49  scoring::ScoreFunction const & sfxn,
50  scoring::MinimizationGraph & mingraph,
51  SCMinMinimizerMap & scminmap
52 ) :
53  pose_( p ),
54  bg_residues_( bg_residues ),
55  sfxn_( sfxn ),
56  g_( mingraph ),
57  scminmap_(dynamic_cast<CartSCMinMinimizerMap&>( scminmap )),
58  scoretypes_( sfxn_.get_nonzero_weighted_scoretypes() )
59 {
60 }
61 
63 
64 
65 //fpd same as AtomTree version
66 //fpd - new logic is in assign_dofs_to_mobile_residues
67 Real
69 {
70  using namespace scoring;
71 
73 
74  /// 1. setup for scoring -- nodes first
75  for ( Size ii = 1, iiend = scminmap_.nactive_residues(); ii <= iiend; ++ii ) {
76  Size const iiresid = scminmap_.active_residue( ii );
78  }
79  /// edges second.
80  for ( Size ii = 1, iiend = scminmap_.nactive_residues(); ii <= iiend; ++ii ) {
81  Size const iiresid = scminmap_.active_residue( ii );
82  conformation::Residue const & iires( scminmap_.residue( iiresid ) );
84  edgeit = g_.get_node( iiresid )->edge_list_begin(),
85  edgeit_end = g_.get_node( iiresid )->edge_list_end();
86  edgeit != edgeit_end; ++edgeit ) {
87  Size const jjresid = (*edgeit)->get_other_ind( iiresid );
88  bool const jjmoving = scminmap_.dm()( jjresid ) == 0;
89  if ( jjmoving && iiresid > jjresid ) continue;
90  conformation::Residue const & jjres( jjmoving ? scminmap_.residue( jjresid ) : *bg_residues_[ jjresid ] );
91 
92  MinimizationEdge & minedge = static_cast< MinimizationEdge & > ( (**edgeit) );
93  if ( iiresid < jjresid ) {
94  minedge.setup_for_scoring( iires, jjres, pose_, sfxn_ );
95  } else {
96  minedge.setup_for_scoring( jjres, iires, pose_, sfxn_ );
97  }
98 
99  }
100  }
101 
102  //emap.zero( scoretypes_ );
103  EnergyMap emap;
104  /// 2. score function evaluation -- 1body & 2body energies only
105  for ( Size ii = 1, iiend = scminmap_.nactive_residues(); ii <= iiend; ++ii ) {
106  Size const iiresid = scminmap_.active_residue( ii );
108  }
109  for ( Size ii = 1, iiend = scminmap_.nactive_residues(); ii <= iiend; ++ii ) {
110  Size const iiresid = scminmap_.active_residue( ii );
111  conformation::Residue const & iires( scminmap_.residue( iiresid ) );
113  edgeit = g_.get_node( iiresid )->const_edge_list_begin(),
114  edgeit_end = g_.get_node( iiresid )->const_edge_list_end();
115  edgeit != edgeit_end; ++edgeit ) {
116  Size const jjresid = (*edgeit)->get_other_ind( iiresid );
117  bool const jjmoving = scminmap_.dm()( jjresid ) == 0;
118  if ( jjmoving && iiresid > jjresid ) continue;
119  conformation::Residue const & jjres( jjmoving ? scminmap_.residue( jjresid ) : *bg_residues_[ jjresid ] );
120  MinimizationEdge const & minedge = static_cast< MinimizationEdge const & > ( (**edgeit) );
121 
122  if ( iiresid < jjresid ) {
123  eval_res_pair_energy_for_minedge( minedge, iires, jjres, pose_, sfxn_, emap );
124  } else {
125  eval_res_pair_energy_for_minedge( minedge, jjres, iires, pose_, sfxn_, emap );
126  }
127  }
128  }
129  return sfxn_.weights().dot( emap, scoretypes_ );
130 }
131 
132 
133 //fpd only logic change in stages 3 & 4
134 void
135 CartSCMinMultifunc::dfunc( Multivec const & chi, Multivec & dE_dx ) const
136 {
137  using namespace scoring;
140 
141  /// 1. setup for derivatives -- nodes first
142  for ( Size ii = 1, iiend = scminmap_.nactive_residues(); ii <= iiend; ++ii ) {
143  Size const iiresid = scminmap_.active_residue( ii );
145  }
146  /// edges second.
147  for ( Size ii = 1, iiend = scminmap_.nactive_residues(); ii <= iiend; ++ii ) {
148  Size const iiresid = scminmap_.active_residue( ii );
149  conformation::Residue const & iires( scminmap_.residue( iiresid ) );
151  edgeit = g_.get_node( iiresid )->edge_list_begin(),
152  edgeit_end = g_.get_node( iiresid )->edge_list_end();
153  edgeit != edgeit_end; ++edgeit ) {
154  Size const jjresid = (*edgeit)->get_other_ind( iiresid );
155  bool const jjmoving = scminmap_.dm()( jjresid ) == 0;
156  if ( jjmoving && iiresid > jjresid ) continue;
157  conformation::Residue const & jjres( jjmoving ? scminmap_.residue( jjresid ) : *bg_residues_[ jjresid ] );
158  MinimizationEdge & minedge = static_cast< MinimizationEdge & > ( (**edgeit) );
159  if ( iiresid < jjresid ) {
160  minedge.setup_for_derivatives( iires, jjres, pose_, sfxn_ );
161  } else {
162  minedge.setup_for_derivatives( jjres, iires, pose_, sfxn_ );
163  }
164  }
165  }
166 
167  /// 2a. Evaluate 1body atom derivatives for the active nodes
168  for ( Size ii = 1, iiend = scminmap_.nactive_residues(); ii <= iiend; ++ii ) {
169  Size const iiresid = scminmap_.active_residue( ii );
170  conformation::Residue const & iirsd = scminmap_.residue( iiresid );
171  MinimizationNode const & minnode( * g_.get_minimization_node( iiresid ) );
172  eval_atom_derivatives_for_minnode( minnode, iirsd, pose_,
173  sfxn_.weights(), scminmap_.atom_derivatives( iiresid ) );
174  }
175  /// 2b. Evaluate 2body atom derivatives for the active nodes
176  for ( Size ii = 1, iiend = scminmap_.nactive_residues(); ii <= iiend; ++ii ) {
177  Size const iiresid = scminmap_.active_residue( ii );
178  MinimizationNode const & iiminnode( * g_.get_minimization_node( iiresid ) );
179  conformation::Residue const & iires( scminmap_.residue( iiresid ) );
181  edgeit = g_.get_node( iiresid )->edge_list_begin(),
182  edgeit_end = g_.get_node( iiresid )->edge_list_end();
183  edgeit != edgeit_end; ++edgeit ) {
184  Size const jjresid = (*edgeit)->get_other_ind( iiresid );
185  bool const jjmoving = scminmap_.dm()( jjresid ) == 0;
186  if ( jjmoving && iiresid > jjresid ) continue;
187 
188  conformation::Residue const & jjres( jjmoving ? scminmap_.residue( jjresid ) : *bg_residues_[ jjresid ] );
189  MinimizationNode const & jjminnode( * g_.get_minimization_node( jjresid ) );
190  MinimizationEdge const & minedge = static_cast< MinimizationEdge const & > ( (**edgeit) );
191  if ( iiresid < jjresid ) {
192  eval_atom_derivatives_for_minedge( minedge, iires, jjres,
193  iiminnode.res_min_data(), jjminnode.res_min_data(), pose_, sfxn_.weights(),
194  scminmap_.atom_derivatives( iiresid ), scminmap_.atom_derivatives( jjresid ));
195  } else {
196  eval_atom_derivatives_for_minedge( minedge, jjres, iires,
197  jjminnode.res_min_data(), iiminnode.res_min_data(), pose_, sfxn_.weights(),
198  scminmap_.atom_derivatives( jjresid ), scminmap_.atom_derivatives( iiresid ));
199  }
200  }
201  }
202 
203 
204  /// 3. Accumulate the atom derivatives into the DOF_Node f1/f2s
205  for ( Size ii = 1, iiend = scminmap_.n_dof_nodes(); ii <= iiend; ++ii ) {
206  id::AtomID const & atom_id( scminmap_.get_atom(ii) );
207  Vector F2 = scminmap_.atom_derivatives( atom_id.rsd() )[ atom_id.atomno() ].f2();
208  dE_dx[3*ii-2] = F2[0];
209  dE_dx[3*ii-1] = F2[1];
210  dE_dx[3*ii ] = F2[2];
211  }
212 
213  /// 4. get torsional derivs & convert to cartesian
214  id::DOF_ID junk;
215  for ( Size ii = 1, iiend = scminmap_.nactive_residues(); ii <= iiend; ++ii ) {
216  Size const iiresid = scminmap_.active_residue( ii );
217  conformation::Residue const & iires( scminmap_.residue( iiresid ) );
218 
219  // loop through chis -- some of this logic might be better moved to scminminimizermap
220  for ( Size jj = 1; jj <= iires.nchi(); ++jj ) {
221  id::TorsionID torid(iiresid, id::CHI, jj);
222  chemical::AtomIndices const &chi_atoms = iires.chi_atoms( jj );
223 
224  Real dofderiv = eval_dof_deriv_for_minnode(
225  *g_.get_minimization_node( iiresid ),
226  scminmap_.residue( iiresid ),
227  pose_, junk, torid, sfxn_, sfxn_.weights() );
228 
229  optimization::VectorQuad coords(
230  iires.xyz(chi_atoms[1]),
231  iires.xyz(chi_atoms[2]),
232  iires.xyz(chi_atoms[3]),
233  iires.xyz(chi_atoms[4]) );
235  optimization::tors_deriv_to_cartesian( dofderiv, coords, grads );
236 
237  Size kkatmidx1 = scminmap_.get_atom_index(id::AtomID(chi_atoms[1], iiresid)); // returns 0 if this atom is fixed
238  Size kkatmidx2 = scminmap_.get_atom_index(id::AtomID(chi_atoms[2], iiresid));
239  Size kkatmidx3 = scminmap_.get_atom_index(id::AtomID(chi_atoms[3], iiresid));
240  Size kkatmidx4 = scminmap_.get_atom_index(id::AtomID(chi_atoms[4], iiresid));
241  if (kkatmidx1>0) {
242  dE_dx[3*kkatmidx1-2] += grads.get<0>().x();
243  dE_dx[3*kkatmidx1-1] += grads.get<0>().y();
244  dE_dx[3*kkatmidx1 ] += grads.get<0>().z();
245  }
246  if (kkatmidx2>0) {
247  dE_dx[3*kkatmidx2-2] += grads.get<1>().x();
248  dE_dx[3*kkatmidx2-1] += grads.get<1>().y();
249  dE_dx[3*kkatmidx2 ] += grads.get<1>().z();
250  }
251  if (kkatmidx3>0) {
252  dE_dx[3*kkatmidx3-2] += grads.get<2>().x();
253  dE_dx[3*kkatmidx3-1] += grads.get<2>().y();
254  dE_dx[3*kkatmidx3 ] += grads.get<2>().z();
255  }
256  if (kkatmidx4>0) {
257  dE_dx[3*kkatmidx4-2] += grads.get<3>().x();
258  dE_dx[3*kkatmidx4-1] += grads.get<3>().y();
259  dE_dx[3*kkatmidx4 ] += grads.get<3>().z();
260  }
261  }
262 
263  // TODO if bb is allowed to move, add in contributions from bb torsions
264  }
265 }
266 
267 bool
269  return false;
270 }
271 
272 
273 void
274 CartSCMinMultifunc::dump( Multivec const & /*vars*/, Multivec const & /*vars2*/ ) const
275 {}
276 
277 
278 
279 } // namespace scmin
280 } // namespace pack
281 } // namespace core