Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
CartesianMinimizerMap.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/kinematics/min.cc
11 /// @brief Kinematics
12 /// @author Phil Bradley
13 
14 // Unit headers
16 
17 
18 // Project headers
19 #include <core/pose/util.hh>
20 #include <core/pose/Pose.hh>
22 
23 // Numeric headers
24 // AUTO-REMOVED #include <numeric/conversions.hh>
25 
26 // C++ headers
27 #include <cstdlib>
28 
29 #include <core/id/DOF_ID_Map.hh>
30 #include <utility/vector1.hh>
31 
32 //Auto Headers
33 #include <core/pose/util.tmpl.hh>
34 
35 namespace core {
36 namespace optimization {
37 
38 
39 
40 /////////////////////////////////////////////////////////////////////////////
42  moving_atoms_.clear();
43  moving_dofids_.clear();
44  moving_torsionids_.clear();
45 }
46 
47 
48 /////////////////////////////////////////////////////////////////////////////
49 void
51  moving_atoms_.clear();
52  moving_dofids_.clear();
53  moving_torsionids_.clear();
54 
55  atom_derivatives_.resize( pose.total_residue() );
56  for ( Size ii = 1; ii <= pose.total_residue(); ++ii ) {
57  atom_derivatives_[ ii ].resize( pose.residue( ii ).natoms() );
58  }
59 }
60 
61 /////////////////////////////////////////////////////////////////////////////
62 void
64  pose::Pose const & pose,
65  Multivec & dofs
66 ) const {
67  runtime_assert(dofs.size() == 3*moving_atoms_.size());
68  Size natoms=moving_atoms_.size();
70  pose.batch_get_xyz( moving_atoms_, dofs_v );
71 
72  for(Size i=1; i<=natoms; ++i) {
73  dofs[i*3-2] = dofs_v[i].x();
74  dofs[i*3-1] = dofs_v[i].y();
75  dofs[i*3] = dofs_v[i].z();
76  }
77 }
78 
79 
80 /////////////////////////////////////////////////////////////////////////////
81 void
83  pose::Pose & pose,
84  Multivec const & dofs
85 ) const
86 {
87  runtime_assert(dofs.size() == 3*moving_atoms_.size());
88 
89  Size natoms=moving_atoms_.size();
91  for(Size i=1; i<=natoms; ++i) {
92  dofs_v[i].x() = dofs[i*3-2];
93  dofs_v[i].y() = dofs[i*3-1];
94  dofs_v[i].z() = dofs[i*3];
95  }
96  pose.batch_set_xyz( moving_atoms_, dofs_v );
97 }
98 
99 ////////////////////////////////////////////////////////////////////////////
100 
101 void
103  DOF_ID const & dof_id,
104  DOF_ID const &
105 ) {
106  // only care about torsional DOFs
107  if ( dof_id.type() == id::PHI )
108  moving_dofids_.push_back( dof_id );
109 }
110 
111 /////////////////////////////////////////////////////////////////////////////
112 void
114  AtomID const &,
115  DOF_ID const &
116 )
117 {
118  ; // do nothing
119 }
120 
121 /////////////////////////////////////////////////////////////////////////////
122 void
124 {
125  for ( Size ii = 1; ii <= atom_derivatives_.size(); ++ii ) {
126  for ( Size jj = 1; jj <= atom_derivatives_[ ii ].size(); ++jj ) {
127  atom_derivatives_[ ii ][ jj ].f1() = 0.0;
128  atom_derivatives_[ ii ][ jj ].f2() = 0.0;
129  }
130  }
131 }
132 
133 
134 
135 /////////////////////////////////////////////////////////////////////////////
136 // private
137 void
139 {
140  utility::vector1<id::DOF_ID> new_moving_dofids;
141 
142  // mapping from AtomTree DOF ID's to bb/chi torsion angle ids
144  pose::setup_dof_to_torsion_map( pose, dof_map );
145 
146  Size ndofs = moving_dofids_.size();
147  for ( Size i=1; i<=ndofs; ++i) {
148  DOF_ID const& dof_id( moving_dofids_[i] );
149  id::TorsionID const & tor_id( dof_map[ dof_id ] );
150 
151  if ( tor_id.valid() ) { // we don't care otherwise
152  // check atoms
153  id::AtomID id1,id2,id3,id4;
154  pose.conformation().get_torsion_angle_atom_ids( tor_id, id1,id2,id3,id4 );
155  if (atom_indices_.has(id1)
156  || atom_indices_.has(id2)
157  || atom_indices_.has(id3)
158  || atom_indices_.has(id4)) {
159  new_moving_dofids.push_back(dof_id);
160  moving_torsionids_.push_back(tor_id);
161  }
162  }
163  }
164 
165  moving_dofids_ = new_moving_dofids;
166 }
167 
168 
169 /////////////////////////////////////////////////////////////////////////////
170 
171 void
173  pose::Pose & pose,
174  kinematics::MoveMap const & mm
175 )
176 {
177  // this clears moving_atoms_
178  reset( pose );
179 
180  /////////////////////
181  // convert the allow_bb,allow_chi,allow_jump information
182  // in the MoveMap into a simple boolean mask over movable atoms
183  // because the movemap is designed with torsion-space refinement in mind,
184  // interpret the meaning as best as possible
185  // implicit DOFs and jumps don't make a lot of sense so ignore them
186  Size const n_res( pose.n_residue() );
188 
189  for ( Size i = 1; i <= n_res; ++i ) {
190  conformation::Residue const & rsd( pose.residue(i) );
191 
192  bool const bb_move( mm.get_bb(i) );
193  bool const chi_move( mm.get_chi(i) );
194 
195  // cartesian logic ...
196  // if (chi_move && !bb_move) sc atoms only
197  // if (bb_move) all atoms
198  if ( chi_move && !bb_move ) {
199  Size start1 = rsd.first_sidechain_atom();
200  Size stop1 = rsd.nheavyatoms();
201  Size start2 = rsd.first_sidechain_hydrogen();
202  Size stop2 = rsd.natoms();
203 
204  for ( Size j=start1; j<=stop1; ++j ) {
205  moving_atoms_.push_back( id::AtomID( j,i ) );
206  atom_indices_[ id::AtomID( j,i ) ] = moving_atoms_.size();
207  }
208  for ( Size j=start2; j<=stop2; ++j ) {
209  moving_atoms_.push_back( id::AtomID( j,i ) );
210  atom_indices_[ id::AtomID( j,i ) ] = moving_atoms_.size();
211  }
212  } else if (bb_move) {
213  Size start1 = 1;
214  Size stop1 = rsd.natoms();
215 
216  for ( Size j=start1; j<=stop1; ++j ) {
217  moving_atoms_.push_back( id::AtomID( j,i ) );
218  atom_indices_[ id::AtomID( j,i ) ] = moving_atoms_.size();
219  }
220  } // if ( chi_move )
221  } // i=1,n_res
222 
223  /////////////////////
224  // get a list of torsional DOFs which are implicitly moved by these xyzs
225  //TODO: be smarted about setting input movemap so we dont have to check every torsion later
226  kinematics::MoveMap move_map_torsional;
227  move_map_torsional.set_bb(true);
228  move_map_torsional.set_chi(true);
229  id::DOF_ID_Mask dof_mask(false);
230  pose::setup_dof_mask_from_move_map( move_map_torsional, pose, dof_mask );
231 
232  // fill the torsion list
233  DOF_ID tmp( id::BOGUS_DOF_ID );
234  pose.atom_tree().root()->setup_min_map( tmp, dof_mask, *this );
235 
236  // trim this list ensuring that at least one of the
237  // four atoms that define the torsion
238  // are in our movable set
240 
241  /////////////////////
242  // setup the domain_map which indicates what rsd pairs are fixed/moving
243  id::AtomID_Mask moving_dof, moving_xyz;
244  core::pose::initialize_atomid_map( moving_xyz, pose, false );
245  core::pose::initialize_atomid_map( moving_dof, pose, false );
246 
247  Size nmoving_atoms = moving_atoms_.size();
248  for (Size i=1; i<=nmoving_atoms; ++i) {
249  moving_xyz[ moving_atoms_[i] ] = true;
250  }
251 
252  domain_map_.dimension( pose.total_residue() );
253  pose.conformation().atom_tree().update_domain_map( domain_map_, moving_dof, moving_xyz );
254 }
255 
256 
257 } // namespace kinematics
258 } // namespace core