From a4eea223bdfe81c9b7bd0a8b5dc1957c518ed2bd Mon Sep 17 00:00:00 2001 From: Cezary Czaplewski Date: Wed, 28 Mar 2012 23:55:24 +0200 Subject: [PATCH] new files for tmscore and reminimization --- source/unres/src_CSA/TMscore_subroutine.f | 536 +++++++++++++++++++++++++++++ source/unres/src_CSA/minim_mult.F | 120 +++++++ 2 files changed, 656 insertions(+) create mode 100644 source/unres/src_CSA/TMscore_subroutine.f create mode 100644 source/unres/src_CSA/minim_mult.F diff --git a/source/unres/src_CSA/TMscore_subroutine.f b/source/unres/src_CSA/TMscore_subroutine.f new file mode 100644 index 0000000..8e6ee9a --- /dev/null +++ b/source/unres/src_CSA/TMscore_subroutine.f @@ -0,0 +1,536 @@ +************************************************************************* +************************************************************************* +* This is a subroutine to compare two structures and find the +* superposition that has the maximum TM-score. +* Reference: Yang Zhang, Jeffrey Skolnick, Proteins 2004 57:702-10. +* +* Explanations: +* L1--Length of the first structure +* (x1(i),y1(i),z1(i))--coordinates of i'th residue at the first structure +* n1(i)--Residue sequence number of i'th residue at the first structure +* L2--Length of the second structure +* (x2(i),y2(i),z2(i))--coordinates of i'th residue at the second structure +* n2(i)--Residue sequence number of i'th residue at the second structure +* TM--TM-score of the comparison +* Rcomm--RMSD of two structures in the common aligned residues +* Lcomm--Length of the common aligned regions +* +* Note: +* 1, Always put native as the second structure, by which TM-score +* is normalized. +* 2, The returned (x1(i),y1(i),z1(i)) are the rotated structure after +* TM-score superposition. +************************************************************************* +************************************************************************* + subroutine TMscore(L1,x1,y1,z1,n1,L2,x2,y2,z2,n2,TM,Rcomm,Lcomm) + include 'DIMENSIONS' + PARAMETER(nmax=maxres) + common/stru/xt(nmax),yt(nmax),zt(nmax),xb(nmax),yb(nmax),zb(nmax) + common/nres/nresA(nmax),nresB(nmax),nseqA,nseqB + common/para/d,d0 + common/align/n_ali,iA(nmax),iB(nmax) + common/nscore/i_ali(nmax),n_cut ![1,n_ali],align residues for the score + dimension k_ali(nmax),k_ali0(nmax) + dimension L_ini(100),iq(nmax) + common/scores/score + double precision score,score_max + dimension xa(nmax),ya(nmax),za(nmax) + + dimension x1(nmax),y1(nmax),z1(nmax),n1(nmax) + dimension x2(nmax),y2(nmax),z2(nmax),n2(nmax) + +ccc RMSD: + double precision r_1(3,nmax),r_2(3,nmax),r_3(3,nmax),w(nmax) + double precision u(3,3),t(3),rms,drms !armsd is real + data w /nmax*1.0/ +ccc + +********* convert input data **************** + nseqA=L1 + do i=1,nseqA + xa(i)=x1(i) + ya(i)=y1(i) + za(i)=z1(i) + nresA(i)=n1(i) + enddo + nseqB=L2 + do i=1,L2 + xb(i)=x2(i) + yb(i)=y2(i) + zb(i)=z2(i) + nresB(i)=n2(i) + enddo + +****************************************************************** +* pickup the aligned residues: +****************************************************************** + k=0 + do i=1,nseqA + do j=1,nseqB + if(nresA(i).eq.nresB(j))then + k=k+1 + iA(k)=i + iB(k)=j + goto 205 + endif + enddo + 205 continue + enddo + n_ali=k !number of aligned residues + Lcomm=n_ali + if(n_ali.lt.1)then +c write(*,*)'There is no common residues in the input structures' + TM=0 + Rcomm=0 + return + endif + +************///// +* parameters: +***************** +*** d0-------------> + d0=1.24*(nseqB-15)**(1.0/3.0)-1.8 + if(d0.lt.0.5)d0=0.5 +*** d0_search -----> + d0_search=d0 + if(d0_search.gt.8)d0_search=8 + if(d0_search.lt.4.5)d0_search=4.5 +*** iterative parameters -----> + n_it=20 !maximum number of iterations + d_output=5 !for output alignment + n_init_max=6 !maximum number of L_init + n_init=0 + L_ini_min=4 + if(n_ali.lt.4)L_ini_min=n_ali + do i=1,n_init_max-1 + n_init=n_init+1 + L_ini(n_init)=n_ali/2**(n_init-1) + if(L_ini(n_init).le.L_ini_min)then + L_ini(n_init)=L_ini_min + goto 402 + endif + enddo + n_init=n_init+1 + L_ini(n_init)=L_ini_min + 402 continue + +****************************************************************** +* find the maximum score starting from local structures superposition +****************************************************************** + score_max=-1 !TM-score + do 333 i_init=1,n_init + L_init=L_ini(i_init) + iL_max=n_ali-L_init+1 + do 300 iL=1,iL_max !on aligned residues, [1,nseqA] + LL=0 + ka=0 + do i=1,L_init + k=iL+i-1 ![1,n_ali] common aligned + r_1(1,i)=xa(iA(k)) + r_1(2,i)=ya(iA(k)) + r_1(3,i)=za(iA(k)) + r_2(1,i)=xb(iB(k)) + r_2(2,i)=yb(iB(k)) + r_2(3,i)=zb(iB(k)) + LL=LL+1 + ka=ka+1 + k_ali(ka)=k + enddo + call u3b(w,r_1,r_2,LL,1,rms,u,t,ier) !u rotate r_1 to r_2 + if(i_init.eq.1)then !global superposition + armsd=dsqrt(rms/LL) + Rcomm=armsd + endif + do j=1,nseqA + xt(j)=t(1)+u(1,1)*xa(j)+u(1,2)*ya(j)+u(1,3)*za(j) + yt(j)=t(2)+u(2,1)*xa(j)+u(2,2)*ya(j)+u(2,3)*za(j) + zt(j)=t(3)+u(3,1)*xa(j)+u(3,2)*ya(j)+u(3,3)*za(j) + enddo + d=d0_search-1 + call score_fun !init, get scores, n_cut+i_ali(i) for iteration + if(score_max.lt.score)then + score_max=score + ka0=ka + do i=1,ka0 + k_ali0(i)=k_ali(i) + enddo + endif +*** iteration for extending ----------------------------------> + d=d0_search+1 + do 301 it=1,n_it + LL=0 + ka=0 + do i=1,n_cut + m=i_ali(i) ![1,n_ali] + r_1(1,i)=xa(iA(m)) + r_1(2,i)=ya(iA(m)) + r_1(3,i)=za(iA(m)) + r_2(1,i)=xb(iB(m)) + r_2(2,i)=yb(iB(m)) + r_2(3,i)=zb(iB(m)) + ka=ka+1 + k_ali(ka)=m + LL=LL+1 + enddo + call u3b(w,r_1,r_2,LL,1,rms,u,t,ier) !u rotate r_1 to r_2 + do j=1,nseqA + xt(j)=t(1)+u(1,1)*xa(j)+u(1,2)*ya(j)+u(1,3)*za(j) + yt(j)=t(2)+u(2,1)*xa(j)+u(2,2)*ya(j)+u(2,3)*za(j) + zt(j)=t(3)+u(3,1)*xa(j)+u(3,2)*ya(j)+u(3,3)*za(j) + enddo + call score_fun !get scores, n_cut+i_ali(i) for iteration + if(score_max.lt.score)then + score_max=score + ka0=ka + do i=1,ka + k_ali0(i)=k_ali(i) + enddo + endif + if(it.eq.n_it)goto 302 + if(n_cut.eq.ka)then + neq=0 + do i=1,n_cut + if(i_ali(i).eq.k_ali(i))neq=neq+1 + enddo + if(n_cut.eq.neq)goto 302 + endif + 301 continue !for iteration + 302 continue + 300 continue !for shift + 333 continue !for initial length, L_ali/M + +******** return the final rotation **************** + LL=0 + do i=1,ka0 + m=k_ali0(i) !record of the best alignment + r_1(1,i)=xa(iA(m)) + r_1(2,i)=ya(iA(m)) + r_1(3,i)=za(iA(m)) + r_2(1,i)=xb(iB(m)) + r_2(2,i)=yb(iB(m)) + r_2(3,i)=zb(iB(m)) + LL=LL+1 + enddo + call u3b(w,r_1,r_2,LL,1,rms,u,t,ier) !u rotate r_1 to r_2 + do j=1,nseqA + x1(j)=t(1)+u(1,1)*xa(j)+u(1,2)*ya(j)+u(1,3)*za(j) + y1(j)=t(2)+u(2,1)*xa(j)+u(2,2)*ya(j)+u(2,3)*za(j) + z1(j)=t(3)+u(3,1)*xa(j)+u(3,2)*ya(j)+u(3,3)*za(j) + enddo + TM=score_max + +c^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + return + END + +ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +c 1, collect those residues with dis