23 #include <ObjexxFCL/FArray2D.hh>
25 #include <numeric/model_quality/rms.hh>
34 #include <ObjexxFCL/format.hh>
68 using namespace core::conformation::symmetry;
79 totals[ metal_placement ] = 9e9;
82 FArray2D<numeric::Real> sf4crd1(3,4);
83 FArray2D<numeric::Real> sf4crd2(3,4);
85 sf4crd1(1,1)= 0.000*
R; sf4crd1(2,1)= 0.000*
R; sf4crd1(3,1)= 1.000*
R;
86 sf4crd1(1,2)= 0.943*
R; sf4crd1(2,2)= 0.000*
R; sf4crd1(3,2)=-0.333*
R;
87 sf4crd1(1,3)=-0.471*
R; sf4crd1(2,3)= 0.816*
R; sf4crd1(3,3)=-0.333*
R;
88 sf4crd1(1,4)=-0.471*
R; sf4crd1(2,4)=-0.816*
R; sf4crd1(3,4)=-0.333*
R;
89 sf4crd2(1,1)= 0.943*
R; sf4crd2(2,1)= 0.000*
R; sf4crd2(3,1)=-0.333*
R;
90 sf4crd2(1,2)= 0.000*
R; sf4crd2(2,2)= 0.000*
R; sf4crd2(3,2)= 1.000*
R;
91 sf4crd2(1,3)=-0.471*
R; sf4crd2(2,3)= 0.816*
R; sf4crd2(3,3)=-0.333*
R;
92 sf4crd2(1,4)=-0.471*
R; sf4crd2(2,4)=-0.816*
R; sf4crd2(3,4)=-0.333*
R;
94 for(
Size i = 1; i <= mmres ; ++i ) {
96 for(
Size j = i+1; j <= mmres*nsub; ++j ) {
98 if( i%mmres == j%mmres )
continue;
100 for(
Size k = j+1; k <= mmres*nsub; ++k ) {
102 if( i%mmres == k%mmres )
continue;
103 if( j%mmres == k%mmres )
continue;
106 for(
Size l = k+1; l <= mmres*nsub; ++l ) {
108 if( i%mmres == l%mmres )
continue;
109 if( j%mmres == l%mmres )
continue;
110 if( k%mmres == l%mmres )
continue;
114 std::cerr <<
"MetalloPlacementEnergy.cc:112 (" << i <<
" " << j <<
" " << k <<
" " << l <<
")" << std::endl;
128 if( (com-a).dot(a-aa) < 0.0 || (com-
b).dot(b-ba) < 0.0 || (com-
c).dot(c-ca) < 0.0 || (com-d).dot(d-da) < 0.0 ) {
129 std::cerr <<
"MetalloPlacementEnergy.cc:127 ( fail dot prod )" << std::endl;
135 bool collision =
false;
136 for(
Size ir = 1; ir <= mmres*nsub; ++ir) {
146 std::cerr <<
"MetalloPlacementEnergy.cc:144 (" <<
"fail collision" <<
")" << std::endl;
150 FArray2D<core::Real> crd(3,4);
151 crd(1,1) = a.x(); crd(2,1) = a.y(); crd(3,1) = a.z();
152 crd(1,2) = b.x(); crd(2,2) = b.y(); crd(3,2) = b.z();
153 crd(1,3) = c.x(); crd(2,3) = c.y(); crd(3,3) = c.z();
154 crd(1,4) = d.x(); crd(2,4) = d.y(); crd(3,4) = d.z();
156 core::Real rms1 = numeric::model_quality::rms_wrapper(4,sf4crd1,crd);
157 core::Real rms2 = numeric::model_quality::rms_wrapper(4,sf4crd2,crd);
163 Size nt = min((i-1)%mmres,min((j-1)%mmres,min((k-1)%mmres,(l-1)%mmres)))+1;
164 Size ct = mmres - max((i-1)%mmres,max((j-1)%mmres,max((k-1)%mmres,(l-1)%mmres))) ;
165 score += com.length() / 2.0;
166 Real tailpen = -0.5*( max(0.0,4.0-nt) + max(0.0,4.0-ct) );
169 if( score < totals[ metal_placement ] ) {
170 std::cerr <<
"metal_placement " << score <<
" " << tailpen <<
" " << com.length() / 2.0 << std::endl;
171 totals[ metal_placement ] = score;