14 #if (defined _WIN32) && (!defined WIN_PYROSETTA)
15 #define ZLIB_WINAPI // REQUIRED FOR WINDOWS
30 #include <numeric/xyzVector.hh>
33 #include <basic/Tracer.hh>
34 #include <utility/io/izstream.hh>
35 #include <utility/exit.hh>
42 #include <utility/vector1.hh>
46 namespace evaluation {
51 static basic::Tracer
tr(
"protocols.evaluation.PCA",basic::t_info);
63 for ( i =0 ; i<nr; ++i ) {
64 for ( k =0 ; k<nr; ++k )
65 tr.Debug << a[i][k] <<
" ";
80 for(j=0; j<natoms; j++) {
83 for(r=0; r<
DIM; r++) {
86 x[j][r]+=R[r][c]*x_old[c];
92 for (
int i=0; i<natoms; i++ ) {
93 for (
int j = 0; j<
DIM; j++ ) {
103 utility::io::izstream data( fn.c_str() );
105 std::cerr <<
"ERROR:: Unable to open PCA file: "
113 std::istringstream line_stream ( line );
116 line_stream >> tag1 >> nfit_ >> tag2 >> npca_ >> tag3 >> nvec_;
117 if ( nvec > 0 ) nvec_ = nvec;
118 xref_.dimension( 3, nfit_ );
119 xav_.dimension( 3, npca_ );
120 ifit_.resize( nfit_ );
121 ipca_.resize( npca_ );
122 eigvec_.dimension( 3, npca_, nvec_ );
125 if ( line !=
"AVERAGE" ) utility_exit_with_message(
" tag AVERAGE missing ");
126 read_structure( data, pose, ipca_, xav_,
"REFERENCE" );
127 read_structure( data, pose, ifit_, xref_,
"VECTORS" );
128 for (
Size i=1; i<=nvec_; i++ ) {
129 for (
Size k=1; k<=npca_; k++ ) {
131 std::istringstream line_stream( line );
132 line_stream >> eigvec_( 1, k, i) >> eigvec_( 2, k, i) >> eigvec_(3, k, i);
147 getline( data, line);
149 while ( line != endtag ) {
150 std::istringstream line_stream( line );
154 line_stream >> atomname >> resnr >> x1 >> x2 >> x3;
156 tr.Debug <<
"read PCA: " << atomname <<
" " << resnr <<
" " << x1 <<
" " << x2 <<
" " << x3 <<
"\n";
158 x( 1, ct ) = x1*10; x(2, ct) = x2*10; x(3, ct) = x3*10;
160 getline( data, line);
168 for (
Size k = 1; k <= dim; ++k ) {
170 for (
Size j = 1; j <= n; ++j ) {
174 transvec[k-1]=-temp1;
175 for (
Size j = 1; j <= n; ++j ) {
187 runtime_assert ( npca_ == nfit_ );
188 xgmx =
new rvec[ npca_ ];
189 xrefgmx =
new rvec[ npca_ ];
192 fill_coordinates( pose, ifit_, x );
197 for (
Size i = 1; i<=nfit_ ; i++) {
198 for (
Size d = 1; d<=3; d++ ) {
199 xgmx[i-1][d-1]= x(d, i)/10.0;
200 xrefgmx[i-1][d-1]=xref_(d,i)/10.0;
208 fill_coordinates( pose, ipca_, x );
210 for (
Size i = 1; i<=npca_ ; i++) {
211 for (
int d = 1; d<=3; d++ ) {
212 xgmx[i-1][d-1]= x(d, i);
215 add_vec( npca_, xgmx, transvec );
218 tr.Trace <<
"rotated and translated\n";
219 for (
Size i = 1; i<=npca_ ; i++) {
220 for (
Size d = 1; d<=3; d++ ) {
221 x(d, i) = xgmx[i-1][d-1];
222 tr.Trace << x(d, i)/10.0 <<
" ";
227 proj.resize( nvec_ );
228 for (
Size v = 1; v <= nvec_; v++ ) {
230 for (
Size k = 1; k <= npca_; k++ ) {
231 for (
Size d = 1; d <= 3; d++ ) {
232 proj[ v ]+= (x( d, k)-xav_( d, k)) * eigvec_( d, k, v)/10.0;
243 os << nfit_ <<
" " << npca_ <<
" " << nvec_ << std::endl;
244 os <<
"AVERAGE" << std::endl;
245 for (
Size i = 1; i <= npca_ ; i++ ) {
246 os << ipca_[i] <<
" " << xav_(1, i ) <<
" " << xav_(2,i ) <<
" " << xav_(3,i ) << std::endl;
249 for (
Size i = 1; i <= nfit_ ; i++ ) {
250 os << xref_( 1, i ) <<
" " << xref_( 2, i ) <<
" " << xref_( 3, i ) << std::endl;
253 for (
Size k = 1; k <= nvec_ ; k++ ) {
254 for (
Size i = 1; i <= npca_ ; i++ ) {
255 os << eigvec_( 1, i, k ) <<
" " << eigvec_( 2, i, k ) <<
" " << eigvec_( 3, i, k ) << std::endl;
270 x.redimension( 3, ind.size() );
271 for ( IndexVector::const_iterator it=ind.begin(), eit=ind.end(); it!=eit; ++it ) {
273 for (
int k = 0; k < 3; ++k ) {
274 x(k+1,natoms) = vec[k];
282 #define ROTATE(a,i,j,k,l) g=a[i][j];h=a[k][l];a[i][j]=g-s*(h+g*tau); \
283 a[k][l]=h+s*(g-h*tau);
304 double d[
DIM6 ],xnr,xpc;
310 for(i=0; i<
DIM6; i++) {
312 for(j=0; j<
DIM6; j++) {
319 for (
int i=0; i<
DIM;i++)
320 for (
int j=0; j<
DIM; j++) u[i][j]=0;
322 for(n=0;(n<natoms);n++) {
323 if ((mn = 1.0) != 0.0) {
324 for(c=0; (c<
DIM); c++) {
326 for(r=0; (r<
DIM); r++) {
336 for(r=0; r<
DIM6; r++)
338 if (r>=DIM && c<DIM) {
339 omega[r][
c]=u[r-
DIM][
c];
340 omega[
c][r]=u[r-
DIM][
c];
347 jacobi( omega,d,om,&irot);
361 for(i=0; i<
DIM6; i++)
367 for(i=0; i<
DIM; i++) {
368 vh[j][i]=sqrt(2.0)*om[i][index];
369 vk[j][i]=sqrt(2.0)*om[i+
DIM][index];
379 oprod(vh[0],vh[1],vh[2]);
380 oprod(vk[0],vk[1],vk[2]);
387 R[r][c] = vk[0][r]*vh[0][c] +
395 void PCA::jacobi(
double a[6][6],
double d[],
double v[6][6],
int *nrot)
399 double tresh,theta,tau,
t,sm,s,h,g,
c;
403 for (ip=0; ip<n; ip++) {
404 for (iq=0; iq<n; iq++) v[ip][iq]=0.0;
407 for (ip=0; ip<n;ip++) {
408 b[ip]=d[ip]=a[ip][ip];
412 for (i=1; i<=50; i++) {
414 for (ip=0; ip<n-1; ip++) {
415 for (iq=ip+1; iq<n; iq++)
416 sm += fabs(a[ip][iq]);
425 for (ip=0; ip<n-1; ip++) {
426 for (iq=ip+1; iq<n; iq++) {
427 g=100.0*fabs(a[ip][iq]);
428 if (i > 4 && fabs(d[ip])+g == fabs(d[ip])
429 && fabs(d[iq])+g == fabs(d[iq]))
431 else if (fabs(a[ip][iq]) > tresh) {
433 if (fabs(h)+g == fabs(h))
436 theta=0.5*h/(a[ip][iq]);
437 t=1.0/(fabs(theta)+sqrt(1.0+theta*theta));
438 if (theta < 0.0) t = -
t;
449 for (j=0; j<ip; j++) {
452 for (j=ip+1; j<iq; j++) {
455 for (j=iq+1; j<n; j++) {
458 for (j=0; j<n; j++) {
465 for (ip=0; ip<n; ip++) {