Ejemplo n.º 1
0
/* "dblock_projections2" CALCULATES THE PROJECTION
   FROM FULL RESIDUE SPACE TO RIGID BLOCK SPACE */
int dblock_projections2(dSparse_Matrix *PP,PDB_File *PDB,
			int nres,int nblx,int bmx)
{
  double **X,**I,**IC,*CM,*W,**A,**ISQT;
  double x,tr,dd,df;
  int *IDX,nbp,b,i,j,k,ii,jj,aa,bb,elm;


  /* INITIALIZE BLOCK ARRAYS */
  elm=0;
  X=dmatrix(1,bmx,1,3);
  IDX=ivector(1,bmx);
  CM=dvector(1,3);
  I=dmatrix(1,3,1,3);
  IC=dmatrix(1,3,1,3);
  W=dvector(1,3);
  A=dmatrix(1,3,1,3);
  ISQT=dmatrix(1,3,1,3);

  /* CYCLE THROUGH BLOCKS */
  for(b=1;b<=nblx;b++){

    /* CLEAR MATRICES */
    for(j=1;j<=3;j++){
      CM[j]=0.0;
      for(i=1;i<=3;i++) I[i][j]=0.0;
      for(i=1;i<=bmx;i++) X[i][j]=0.0;
    }

    /* STORE VALUES FOR CURRENT BLOCK */
    nbp=0;
    for(i=1;i<=nres;i++){
      if(PDB->atom[i].model==b){
	IDX[++nbp]=i;
	for(j=1;j<=3;j++){
	  x=(double)PDB->atom[i].X[j-1];
	  X[nbp][j]=x;
	  CM[j]+=x;
	}
      }
    }

    /* TRANSLATE BLOCK CENTER OF MASS TO ORIGIN */
    for(j=1;j<=3;j++) CM[j]/=(double)nbp;
    for(i=1;i<=nbp;i++)
      for(j=1;j<=3;j++)
	X[i][j]-=CM[j];

    /* CALCULATE INERTIA TENSOR */
    for(k=1;k<=nbp;k++){
      dd=0.0;
      for(j=1;j<=3;j++){
	df=X[k][j];
	dd+=df*df;
      }
      for(i=1;i<=3;i++){
	I[i][i]+=(dd-X[k][i]*X[k][i]);
	for(j=i+1;j<=3;j++){
	  I[i][j]-=X[k][i]*X[k][j];
	  I[j][i]=I[i][j];
	}
      }
    }

    /* DIAGONALIZE INERTIA TENSOR */
    for(i=1;i<=3;i++)
      for(j=1;j<=3;j++)
	IC[i][j]=I[i][j];
    dsvdcmp(IC,3,3,W,A);
    deigsrt(W,A,3);
    righthand2(W,A,3);

    /* FIND ITS SQUARE ROOT */
    for(i=1;i<=3;i++)
      for(j=1;j<=3;j++){
	dd=0.0;
	for(k=1;k<=3;k++)
	  dd+=A[i][k]*A[j][k]/sqrt(W[k]);
	ISQT[i][j]=dd;
      }

    /* UPDATE PP WITH THE RIGID MOTIONS OF THE BLOCK */
    tr=1.0/sqrt((double)nbp);
    for(i=1;i<=nbp;i++){

      /* TRANSLATIONS: 3*(IDX[i]-1)+1 = x-COORDINATE OF RESIDUE IDX[i];
	 6*(b-1)+1 = x-COORDINATE OF BLOCK b */
      for(j=1;j<=3;j++){
	elm++;
	PP->IDX[elm][1] = 3*(IDX[i]-1)+j;
	PP->IDX[elm][2] = 6*(b-1)+j;
	PP->X[elm] = tr;
      }

      /* ROTATIONS */
      if(nbp>1){
	for(ii=1;ii<=3;ii++){
	  for(jj=1;jj<=3;jj++){
	    if(jj==1) {aa=2; bb=3;}
	    else if(jj==2) {aa=3; bb=1;}
	    else {aa=1; bb=2;}
	    dd=ISQT[ii][aa]*X[i][bb]-ISQT[ii][bb]*X[i][aa];
	    elm++;
	    PP->IDX[elm][1] = 3*(IDX[i]-1)+jj;
	    PP->IDX[elm][2] = 6*(b-1)+3+ii;
	    PP->X[elm] = dd;
	  }
	}
      }
    }
  }
  free_dmatrix(X,1,bmx,1,3);
  free_ivector(IDX,1,bmx);
  free_dvector(CM,1,3);
  free_dmatrix(I,1,3,1,3);
  free_dmatrix(IC,1,3,1,3);
  free_dvector(W,1,3);
  free_dmatrix(A,1,3,1,3);
  free_dmatrix(ISQT,1,3,1,3);

  return elm;
}
Ejemplo n.º 2
0
void rotation(double *vo, double *vt, int n, symatrix &R)
{ int i,j,k;
  symatrix A(4),AT(4),C(4),W(3),W2(3),RS(3);
  double **B,**U,eval[5],gamma;
//  char s[100];    

  B = dmatrix(1,4,1,4);
  U = dmatrix(1,4,1,4);

  for (i = 1; i <= 4; i++)
    for (j = 1; j <= 4; j++) 
      B[i][j] = 0.0;
  
  for (i = 0; i < 4; i++) A.el(i,i) = 0.0;
   
  for (k = 0; k < n; k++)
  { 
    A.el(0,1) = vo[3*k+2] + vt[3*k+2];
    A.el(0,2) = -vo[3*k+1] - vt[3*k+1];
    A.el(1,2) = vo[3*k] + vt[3*k];
    for (i = 0; i < 3; i++) A.el(i,3) = vo[3*k+i] - vt[3*k+i];
    
    for (i = 1; i < 4; i++)
      for (j = 0; j < i; j++)
        A.el(i,j) = -A.el(j,i);

    AT = A.transpose();

    C = A * AT;

    for (i = 0; i < 4; i++)
      for (j = 0; j < 4; j++)
      { B[i+1][j+1] += C.el(i,j);
         }
    }

  djacobi(B,4,eval,U,&i);
  deigsrt(eval,U,4);

  R.identity();
  RS.identity();

  gamma = 2 * acos(U[4][4]);
  
  for (i = 0; i < 3; i++) W.el(i,i) = 0.0;
  W.el(0,1) = U[3][4] / sin(gamma/2);
  W.el(0,2) = -U[2][4] / sin(gamma/2);
  W.el(1,2) = U[1][4] / sin(gamma/2);
  for (i = 1; i < 3; i++)  
    for (j = 0; j < i; j++)
      W.el(i,j) = - W.el(j,i);
 
  W2 = W * W;

  for (i = 0; i < 3; i++)
  { W.multiply_col(i,sin(gamma));
    W2.multiply_col(i,1-cos(gamma));
    }  

  RS += (W + W2);

  RS = RS.transpose();

  for (i = 0; i < 3; i++)
    for (j = 0; j < 3; j++)
      R.el(i,j) = RS.el(i,j);

  free_dmatrix(B,1,4,1,4);
  free_dmatrix(U,1,4,1,4);
  }