15 #ifndef INCLUDED_core_scoring_rms_util_tmpl_HH
16 #define INCLUDED_core_scoring_rms_util_tmpl_HH
23 #include <numeric/model_quality/rms.hh>
25 #include <numeric/xyzVector.hh>
27 #include <ObjexxFCL/FArray1D.hh>
28 #include <ObjexxFCL/FArray2D.hh>
29 #include <ObjexxFCL/FArray1A.hh>
30 #include <ObjexxFCL/FArray2A.hh>
34 #include <platform/types.hh>
131 #include <utility/Bound.fwd.hh>
132 #include <utility/Bound.hh>
133 #include <utility/assert.hh>
134 #include <utility/down_cast.hh>
135 #include <utility/exit.hh>
136 #include <utility/stream_util.hh>
137 #include <utility/string_util.hh>
138 #include <utility/vector0_bool.hh>
139 #include <utility/vector1.fwd.hh>
140 #include <utility/vector1.hh>
141 #include <utility/vector1_bool.hh>
142 #include <utility/vectorL.fwd.hh>
143 #include <utility/vectorL.hh>
144 #include <utility/vectorL_Selector.hh>
145 #include <utility/vectorL_bool.hh>
146 #include <utility/file/FileName.fwd.hh>
147 #include <utility/file/FileName.hh>
148 #include <utility/file/PathName.fwd.hh>
149 #include <utility/file/PathName.hh>
150 #include <utility/keys/AutoKey.fwd.hh>
151 #include <utility/keys/AutoKey.hh>
152 #include <utility/keys/Key.fwd.hh>
153 #include <utility/keys/Key.hh>
154 #include <utility/keys/Key2Tuple.fwd.hh>
155 #include <utility/keys/Key2Tuple.hh>
156 #include <utility/keys/Key3Tuple.fwd.hh>
157 #include <utility/keys/Key3Tuple.hh>
158 #include <utility/keys/Key4Tuple.fwd.hh>
159 #include <utility/keys/Key4Tuple.hh>
160 #include <utility/keys/KeyLess.fwd.hh>
161 #include <utility/keys/KeyLookup.fwd.hh>
162 #include <utility/keys/KeyLookup.hh>
163 #include <utility/keys/NoClient.fwd.hh>
164 #include <utility/keys/NoClient.hh>
165 #include <utility/keys/SmallKeyVector.fwd.hh>
166 #include <utility/keys/SmallKeyVector.hh>
167 #include <utility/keys/UserKey.fwd.hh>
168 #include <utility/keys/VariantKey.fwd.hh>
169 #include <utility/keys/VariantKey.hh>
170 #include <utility/options/AnyOption.fwd.hh>
171 #include <utility/options/AnyOption.hh>
172 #include <utility/options/AnyVectorOption.fwd.hh>
173 #include <utility/options/AnyVectorOption.hh>
174 #include <utility/options/BooleanOption.fwd.hh>
175 #include <utility/options/BooleanOption.hh>
176 #include <utility/options/BooleanVectorOption.fwd.hh>
177 #include <utility/options/BooleanVectorOption.hh>
178 #include <utility/options/FileOption.fwd.hh>
179 #include <utility/options/FileOption.hh>
180 #include <utility/options/FileVectorOption.fwd.hh>
181 #include <utility/options/FileVectorOption.hh>
182 #include <utility/options/IntegerOption.fwd.hh>
183 #include <utility/options/IntegerOption.hh>
184 #include <utility/options/IntegerVectorOption.fwd.hh>
185 #include <utility/options/IntegerVectorOption.hh>
186 #include <utility/options/Option.fwd.hh>
187 #include <utility/options/Option.hh>
188 #include <utility/options/OptionCollection.fwd.hh>
189 #include <utility/options/OptionCollection.hh>
190 #include <utility/options/PathOption.fwd.hh>
191 #include <utility/options/PathOption.hh>
192 #include <utility/options/PathVectorOption.fwd.hh>
193 #include <utility/options/PathVectorOption.hh>
194 #include <utility/options/RealOption.fwd.hh>
195 #include <utility/options/RealOption.hh>
196 #include <utility/options/RealVectorOption.fwd.hh>
197 #include <utility/options/RealVectorOption.hh>
198 #include <utility/options/ScalarOption.fwd.hh>
199 #include <utility/options/ScalarOption.hh>
200 #include <utility/options/ScalarOption_T_.fwd.hh>
201 #include <utility/options/ScalarOption_T_.hh>
202 #include <utility/options/StringOption.fwd.hh>
203 #include <utility/options/StringOption.hh>
204 #include <utility/options/StringVectorOption.fwd.hh>
205 #include <utility/options/StringVectorOption.hh>
206 #include <utility/options/VariantOption.fwd.hh>
207 #include <utility/options/VariantOption.hh>
208 #include <utility/options/VectorOption.fwd.hh>
209 #include <utility/options/VectorOption.hh>
210 #include <utility/options/VectorOption_T_.fwd.hh>
211 #include <utility/options/VectorOption_T_.hh>
212 #include <utility/options/mpi_stderr.hh>
213 #include <utility/options/keys/AnyOptionKey.fwd.hh>
214 #include <utility/options/keys/AnyOptionKey.hh>
215 #include <utility/options/keys/AnyVectorOptionKey.fwd.hh>
216 #include <utility/options/keys/AnyVectorOptionKey.hh>
217 #include <utility/options/keys/BooleanOptionKey.fwd.hh>
218 #include <utility/options/keys/BooleanOptionKey.hh>
219 #include <utility/options/keys/BooleanVectorOptionKey.fwd.hh>
220 #include <utility/options/keys/BooleanVectorOptionKey.hh>
221 #include <utility/options/keys/FileOptionKey.fwd.hh>
222 #include <utility/options/keys/FileOptionKey.hh>
223 #include <utility/options/keys/FileVectorOptionKey.fwd.hh>
224 #include <utility/options/keys/FileVectorOptionKey.hh>
225 #include <utility/options/keys/IntegerOptionKey.fwd.hh>
226 #include <utility/options/keys/IntegerOptionKey.hh>
227 #include <utility/options/keys/IntegerVectorOptionKey.fwd.hh>
228 #include <utility/options/keys/IntegerVectorOptionKey.hh>
229 #include <utility/options/keys/OptionKey.fwd.hh>
230 #include <utility/options/keys/OptionKey.hh>
231 #include <utility/options/keys/OptionKeys.hh>
232 #include <utility/options/keys/PathOptionKey.fwd.hh>
233 #include <utility/options/keys/PathOptionKey.hh>
234 #include <utility/options/keys/PathVectorOptionKey.fwd.hh>
235 #include <utility/options/keys/PathVectorOptionKey.hh>
236 #include <utility/options/keys/RealOptionKey.fwd.hh>
237 #include <utility/options/keys/RealOptionKey.hh>
238 #include <utility/options/keys/RealVectorOptionKey.fwd.hh>
239 #include <utility/options/keys/RealVectorOptionKey.hh>
240 #include <utility/options/keys/ScalarOptionKey.fwd.hh>
241 #include <utility/options/keys/ScalarOptionKey.hh>
242 #include <utility/options/keys/StringOptionKey.fwd.hh>
243 #include <utility/options/keys/StringOptionKey.hh>
244 #include <utility/options/keys/StringVectorOptionKey.fwd.hh>
245 #include <utility/options/keys/StringVectorOptionKey.hh>
246 #include <utility/options/keys/VectorOptionKey.fwd.hh>
247 #include <utility/options/keys/VectorOptionKey.hh>
248 #include <utility/options/keys/all.hh>
249 #include <utility/pointer/ReferenceCount.fwd.hh>
250 #include <utility/pointer/ReferenceCount.hh>
251 #include <utility/pointer/access_ptr.fwd.hh>
252 #include <utility/pointer/access_ptr.hh>
253 #include <utility/pointer/owning_ptr.functions.hh>
254 #include <utility/pointer/owning_ptr.fwd.hh>
255 #include <utility/pointer/owning_ptr.hh>
256 #include <utility/signals/BufferedSignalHub.fwd.hh>
257 #include <utility/signals/BufferedSignalHub.hh>
258 #include <utility/signals/Link.fwd.hh>
259 #include <utility/signals/Link.hh>
260 #include <utility/signals/LinkUnit.fwd.hh>
261 #include <utility/signals/LinkUnit.hh>
262 #include <utility/signals/PausableSignalHub.fwd.hh>
263 #include <utility/signals/PausableSignalHub.hh>
264 #include <utility/signals/SignalHub.fwd.hh>
265 #include <utility/signals/SignalHub.hh>
266 #include <numeric/HomogeneousTransform.hh>
267 #include <numeric/NumericTraits.hh>
268 #include <numeric/constants.hh>
269 #include <numeric/conversions.hh>
270 #include <numeric/numeric.functions.hh>
271 #include <numeric/sphericalVector.fwd.hh>
272 #include <numeric/sphericalVector.hh>
273 #include <numeric/trig.functions.hh>
274 #include <numeric/types.hh>
275 #include <numeric/xyz.functions.fwd.hh>
276 #include <numeric/xyz.functions.hh>
277 #include <numeric/xyzMatrix.fwd.hh>
278 #include <numeric/xyzMatrix.hh>
279 #include <numeric/xyzVector.fwd.hh>
280 #include <numeric/internal/ColPointers.hh>
281 #include <numeric/internal/ColVectors.hh>
282 #include <numeric/internal/ColsPointer.hh>
283 #include <numeric/internal/RowPointers.hh>
284 #include <numeric/internal/RowVectors.hh>
285 #include <numeric/internal/RowsPointer.hh>
286 #include <ObjexxFCL/Dimension.fwd.hh>
287 #include <ObjexxFCL/Dimension.hh>
288 #include <ObjexxFCL/DimensionExpression.hh>
289 #include <ObjexxFCL/DynamicIndexRange.fwd.hh>
290 #include <ObjexxFCL/DynamicIndexRange.hh>
291 #include <ObjexxFCL/FArray.all.fwd.hh>
292 #include <ObjexxFCL/FArray.fwd.hh>
293 #include <ObjexxFCL/FArray.hh>
294 #include <ObjexxFCL/FArray1.all.fwd.hh>
295 #include <ObjexxFCL/FArray1.fwd.hh>
296 #include <ObjexxFCL/FArray1.hh>
297 #include <ObjexxFCL/FArray1A.fwd.hh>
298 #include <ObjexxFCL/FArray1D.fwd.hh>
299 #include <ObjexxFCL/FArray1P.fwd.hh>
300 #include <ObjexxFCL/FArray1P.hh>
301 #include <ObjexxFCL/FArray2.all.fwd.hh>
302 #include <ObjexxFCL/FArray2.fwd.hh>
303 #include <ObjexxFCL/FArray2.hh>
304 #include <ObjexxFCL/FArray2A.fwd.hh>
305 #include <ObjexxFCL/FArray2D.fwd.hh>
306 #include <ObjexxFCL/FArray2P.fwd.hh>
307 #include <ObjexxFCL/FArray2P.hh>
308 #include <ObjexxFCL/FArray3.all.fwd.hh>
309 #include <ObjexxFCL/FArray3.fwd.hh>
310 #include <ObjexxFCL/FArray3A.fwd.hh>
311 #include <ObjexxFCL/FArray3D.fwd.hh>
312 #include <ObjexxFCL/FArray3P.fwd.hh>
313 #include <ObjexxFCL/FArray4.all.fwd.hh>
314 #include <ObjexxFCL/FArray4.fwd.hh>
315 #include <ObjexxFCL/FArray4A.fwd.hh>
316 #include <ObjexxFCL/FArray4D.fwd.hh>
317 #include <ObjexxFCL/FArray4P.fwd.hh>
318 #include <ObjexxFCL/FArray5.all.fwd.hh>
319 #include <ObjexxFCL/FArray5.fwd.hh>
320 #include <ObjexxFCL/FArray5A.fwd.hh>
321 #include <ObjexxFCL/FArray5D.fwd.hh>
322 #include <ObjexxFCL/FArray5P.fwd.hh>
323 #include <ObjexxFCL/FArray6.all.fwd.hh>
324 #include <ObjexxFCL/FArray6.fwd.hh>
325 #include <ObjexxFCL/FArray6A.fwd.hh>
326 #include <ObjexxFCL/FArray6D.fwd.hh>
327 #include <ObjexxFCL/FArray6P.fwd.hh>
328 #include <ObjexxFCL/FArrayInitializer.fwd.hh>
329 #include <ObjexxFCL/FArrayInitializer.hh>
330 #include <ObjexxFCL/FArraySection.fwd.hh>
331 #include <ObjexxFCL/FArraySection.hh>
332 #include <ObjexxFCL/FArrayTraits.fwd.hh>
333 #include <ObjexxFCL/FArrayTraits.hh>
334 #include <ObjexxFCL/IndexRange.fwd.hh>
335 #include <ObjexxFCL/IndexRange.hh>
336 #include <ObjexxFCL/InitializerSentinel.hh>
337 #include <ObjexxFCL/KeyFArray1D.fwd.hh>
338 #include <ObjexxFCL/KeyFArray2D.fwd.hh>
339 #include <ObjexxFCL/KeyFArray3D.fwd.hh>
340 #include <ObjexxFCL/KeyFArray4D.fwd.hh>
341 #include <ObjexxFCL/KeyFArray5D.fwd.hh>
342 #include <ObjexxFCL/KeyFArray6D.fwd.hh>
343 #include <ObjexxFCL/Observer.fwd.hh>
344 #include <ObjexxFCL/Observer.hh>
345 #include <ObjexxFCL/ObserverMulti.hh>
346 #include <ObjexxFCL/ObserverSingle.hh>
347 #include <ObjexxFCL/ProxySentinel.hh>
348 #include <ObjexxFCL/SetWrapper.fwd.hh>
349 #include <ObjexxFCL/Star.fwd.hh>
350 #include <ObjexxFCL/Star.hh>
351 #include <ObjexxFCL/StaticIndexRange.fwd.hh>
352 #include <ObjexxFCL/StaticIndexRange.hh>
353 #include <ObjexxFCL/TypeTraits.hh>
354 #include <ObjexxFCL/char.functions.hh>
355 #include <ObjexxFCL/proxy_const_assert.hh>
356 #include <ObjexxFCL/string.functions.hh>
375 #include <basic/MetricValue.fwd.hh>
376 #include <basic/datacache/BasicDataCache.fwd.hh>
377 #include <basic/options/keys/OptionKeys.hh>
378 #include <basic/options/option.hh>
379 #include <boost/algorithm/string/erase.hpp>
380 #include <boost/bind.hpp>
381 #include <boost/foreach.hpp>
382 #include <boost/function.hpp>
383 #include <boost/functional/hash.hpp>
384 #include <boost/unordered/unordered_map.hpp>
387 #define foreach BOOST_FOREACH
397 std::list< core::Size >
const & subset_residues,
403 assert( nres1 == nres2 );
405 std::vector< core::Vector > p1_coords;
406 std::vector< core::Vector > p2_coords;
408 foreach(
Size i, subset_residues){
420 if ( predicate( pose1, pose2, i, j ) ) {
421 p1_coords.push_back( pose1.
residue(i).
xyz(j) );
422 p2_coords.push_back( pose2.
residue(i).
xyz(j) );
427 assert( p1_coords.size() == p2_coords.size() );
429 int const natoms = p1_coords.size();
430 ObjexxFCL::FArray2D< core::Real > p1a( 3, natoms );
431 ObjexxFCL::FArray2D< core::Real > p2a( 3, natoms );
432 for (
int i = 0; i < natoms; ++i ) {
433 for (
int k = 0; k < 3; ++k ) {
434 p1a(k+1,i+1) = p1_coords[i][k];
435 p2a(k+1,i+1) = p2_coords[i][k];
439 return numeric::model_quality::rms_wrapper( natoms, p1a, p2a );
461 std::list< core::Size > all_residues;
463 all_residues.push_back( n );
488 ObjexxFCL::FArray1D_bool
const & subset,
496 std::vector< core::Vector > p1_coords;
497 std::vector< core::Vector > p2_coords;
510 if ( predicate( pose1, pose2, i, j ) ) {
511 p1_coords.push_back( pose1.
residue(i).
xyz(j) );
512 p2_coords.push_back( pose2.
residue(i).
xyz(j) );
517 assert( p1_coords.size() == p2_coords.size() );
519 int const natoms = p1_coords.size();
520 ObjexxFCL::FArray2D< core::Real > p1a( 3, natoms );
521 ObjexxFCL::FArray2D< core::Real > p2a( 3, natoms );
522 for (
int i = 0; i < natoms; ++i ) {
523 for (
int k = 0; k < 3; ++k ) {
524 p1a(k+1,i+1) = p1_coords[i][k];
525 p2a(k+1,i+1) = p2_coords[i][k];
529 return numeric::model_quality::rms_wrapper( natoms, p1a, p2a );
555 assert( nres1 == nres2 );
569 if ( predicate( pose1, pose2, i, j ) ) {
571 sum2 += diff.length_squared();
576 return std::sqrt(sum2 / natoms);
588 ASSERT_ONLY(
core::Size const nres2 = residues2.size();)
589 assert( nres1 == nres2 );
598 assert( residues1[i]->natoms() == residues2[i]->natoms() );
599 }
else if ( num_atoms > residues2[i]->natoms() ){
600 num_atoms = residues2[i]->natoms();
603 if ( predicate( *residues1[i], *residues2[i], j ) ) {
604 core::Vector diff = residues1[i]->xyz(j) - residues2[i]->xyz(j);
605 sum2 += diff.length_squared();
610 return std::sqrt(sum2 / natoms);
633 ObjexxFCL::FArray1D_bool
const & subset,
639 assert( nres1 == nres2 );
654 if ( predicate( pose1, pose2, i, j ) ) {
656 sum2 += diff.length_squared();
662 return std::sqrt(sum2 / natoms);
676 assert( nres1 == nres2 );
682 Size res_count_atoms(0);
692 if ( predicate( pose1, pose2, i, j ) ) {
694 res_dev2 += diff.length_squared();
698 res_dev2 /= res_count_atoms;
699 if( res_dev2 > biggest_dev2 ) biggest_dev2 = res_dev2;
701 return std::sqrt( biggest_dev2 );
712 ObjexxFCL::FArray1D_bool
const & subset,
718 assert( nres1 == nres2 );
724 Size res_count_atoms(0);
734 if ( predicate( pose1, pose2, i, j ) ) {
736 res_dev2 += diff.length_squared();
740 res_dev2 /= res_count_atoms;
741 if( res_dev2 > biggest_dev2 ) biggest_dev2 = res_dev2;
744 return std::sqrt( biggest_dev2 );
751 ObjexxFCL::FArray2D< core::Real > & p1a,
752 ObjexxFCL::FArray2D< core::Real > & p2a,
762 std::vector< core::Vector > p1_coords;
763 std::vector< core::Vector > p2_coords;
765 for (
core::Size i = 1; i <= std::min( nres1, nres2 ); ++i ) {
769 if ( (*predicate)( pose1, pose2, i, j ) ) {
770 p1_coords.push_back( pose1.
residue(i).
xyz(j) );
771 p2_coords.push_back( pose2.residue(i).xyz(j) );
775 assert( p1_coords.size() == p2_coords.size() );
777 natoms = p1_coords.size();
778 p1a.dimension( 3, natoms );
779 p2a.dimension( 3, natoms );
780 for (
int i = 0; i < natoms; ++i ) {
781 for (
int k = 0; k < 3; ++k ) {
782 p1a(k+1,i+1) = p1_coords[i][k];
783 p2a(k+1,i+1) = p2_coords[i][k];
796 ObjexxFCL::FArray1D_bool
const & subset,
804 std::vector< core::Vector > p1_coords;
805 std::vector< core::Vector > p2_coords;
818 if ( predicate( native_pose, pose2, i, j ) ) {
819 p1_coords.push_back( native_pose.
residue(i).
xyz(j) );
820 p2_coords.push_back( pose2.
residue(i).
xyz(j) );
825 assert( p1_coords.size() == p2_coords.size() );
827 int const natoms = p1_coords.size();
828 ObjexxFCL::FArray2D< core::Real > p1a( 3, natoms );
829 ObjexxFCL::FArray2D< core::Real > p2a( 3, natoms );
830 for (
int i = 0; i < natoms; ++i ) {
831 for (
int k = 0; k < 3; ++k ) {
832 p1a(k+1,i+1) = p1_coords[i][k];
833 p2a(k+1,i+1) = p2_coords[i][k];
838 assert( dynamic_cast< core::conformation::symmetry::SymmetricConformation const * >( &pose2.
conformation() ) );
841 dynamic_cast<core::conformation::symmetry::SymmetricConformation const & > ( pose2.
conformation()) );
844 int const N ( symm_info->subunits() );
845 int const nres ( symm_info->num_total_residues_without_pseudo() );
846 FArray2D< core::Real > p1a_shuffle( 3, nres );
849 int const num_atoms_subunit (natoms);
850 std::vector< std::vector<int> > shuffle_map;
852 for (
int j=1; j <
int (shuffle_map.size()); j++ ){
853 for (
int i=0; i <
N; ++i ) {
854 int const begin ( shuffle_map.at(j).at(i)*num_atoms_subunit*3);
855 for (
int k = 0; k < num_atoms_subunit*3; ++k ) {
856 int const begin_shuffled (i*num_atoms_subunit*3);
857 p1a_shuffle[begin_shuffled+k] = p1a[begin+k];
860 Real rms_shuffle = numeric::model_quality::rms_wrapper( natoms, p1a_shuffle, p2a );
861 if ( rms_shuffle < rms ) {