xdrf2pdb Adam's PBC correction
[unres.git] / source / xdrfpdb / src-M / xdrf2pdb.F
index 503d7d7..1286f99 100644 (file)
@@ -6,6 +6,7 @@
       real*4 coord(3,2*maxres)
       real*4 prec,time,potE,uconst,t_bath,qfrag(100)
       real*8 etot
+      real*8 cm(3,maxchain),shift_coord(3,maxchain),ccm(3),ccm_prev(3)
       character*80 arg,seqfile,pdbfile
       character*3 sequenc(maxres)
       character*50 tytul
       external rescode
       logical iblnk
       external iblnk
+      logical previous,change
+      integer lmin(maxchain),lshift(maxchain)
       
+      previous=.false.
       ifreq=1
       is=1
       ie=1000000000
-      if (iargc().lt.3) then
-        print '(2a)',
-     &    "Usage: xdrf2pdb one/three seqfile cxfile [freq]",
-     &    " [start] [end] [pdbfile]"
+      if (iargc().lt.6) then
+       print '(2a)',
+     & "Usage: xdrf2pdb one/three seqfile boxx boxy boxz cxfile [freq]",
+     &" [start] [end] [pdbfile]"
         stop
       endif
       call getarg(1,onethree)
           itype(i)=rescode(i,sequenc(i),0)
         enddo
       endif
+      call seq2chains(nres,itype,nchain,chain_length,chain_border,
+     &  ireschain)
+      print *,"nchain",nchain
+      print *,"chain_border, chain_length"
+      nrestot=0
+      do i=1,nchain
+        nrestot=nrestot+chain_length(i)
+        print *,chain_border(1,i),chain_border(2,i),chain_length(i)
+      enddo
+      print *,"nrestot",nrestot
       call getarg(3,arg)
+      read(arg,*) boxsize(1)
+      call getarg(4,arg)
+      read(arg,*) boxsize(2)
+      call getarg(5,arg)
+      read(arg,*) boxsize(3)
+      call getarg(6,arg)
       iext = index(arg,'.cx') - 1
       if (iext.lt.0) then
         print *,"Error - not a cx file"
         stop
       endif
-      if (iargc().gt.3) then
-        call getarg(4,cfreq)
+      if (iargc().gt.6) then
+        call getarg(7,cfreq)
         read (cfreq,*) ifreq
       endif
-      if (iargc().gt.4) then
-        call getarg(5,cfreq)
+      if (iargc().gt.7) then
+        call getarg(8,cfreq)
         read (cfreq,*) is
       endif
-      if (iargc().gt.5) then
-        call getarg(6,cfreq)
+      if (iargc().gt.8) then
+        call getarg(9,cfreq)
         read (cfreq,*) ie
       endif
-      if (iargc().gt.6) then
-        call getarg(7,pdbfile)
+      if (iargc().gt.9) then
+        call getarg(10,pdbfile)
       else
         pdbfile=arg(:iext)//'.pdb'
       endif
 
        isize=0
        call xdrf3dfcoord(ixdrf, coord, isize, prec, iret)
-
-
 c       write (*,'(e15.8,2e15.5,f12.5,$)') time,potE,uconst,t_bath
 c       write (*,'(i4,$)') nss,(ihpb(j),jhpb(j),j=1,nss)
 c       write (*,'(i4,20f7.4)') nfrag,(qfrag(i),i=1,nfrag)
@@ -149,6 +167,116 @@ c       write (*,'(8f10.5)') ((coord(k,j),k=1,3),j=1,isize)
              c(j,i+nres)=coord(j,ii+nres)
            enddo
          enddo
+         do ichain=1,nchain
+c           print *,"ichain",ichain
+           do j=1,3
+             cm(j,ichain)=0.0d0
+           enddo
+           do i=chain_border(1,ichain),chain_border(2,ichain)
+c             print *,i,c(:,i)
+             do j=1,3
+               cm(j,ichain)=cm(j,ichain)+c(j,i)
+             enddo
+           enddo
+           do j=1,3
+             cm(j,ichain)=cm(j,ichain)/chain_length(ichain)
+           enddo
+         enddo
+c         write (*,*) "CM"
+c         do i=1,nchain
+c           write (*,'(i5,3f10.5)') i,(cm(j,i),j=1,3)
+c         enddo
+         do j=1,3
+           lmin=0
+           sumodl_min=1.0d10
+           do i=0,3**nchain-1
+             ii=i
+             do ichain=1,nchain
+               lshift(ichain)=mod(ii,3)-1
+               ii=ii/3
+             enddo
+c             print '(10i3)',(lshift(ichain),ichain=1,nchain)
+             sumodl=0.0d0
+             do ichain=1,nchain
+               do jchain=1,ichain-1
+               sumodl=sumodl+dabs(cm(j,ichain)+lshift(ichain)*boxsize(j)
+     &             -cm(j,jchain)-lshift(jchain)*boxsize(j))
+               enddo
+             enddo
+c             print *,"sumodl",sumodl," sumodl_min",sumodl_min
+             if (sumodl.lt.sumodl_min) then
+               sumodl_min=sumodl
+               lmin=lshift
+             endif
+           enddo
+           do ichain=1,nchain
+             cm(j,ichain)=cm(j,ichain)+lmin(ichain)*boxsize(j)
+             shift_coord(j,ichain)=lmin(ichain)*boxsize(j)
+           enddo
+         enddo
+         do ichain=1,nchain
+           do j=1,3
+             ccm(j)=ccm(j)+cm(j,ichain)*chain_length(ichain)
+           enddo
+         enddo
+         do j=1,3
+           ccm(j)=ccm(j)/nrestot
+         enddo
+c         write (*,'(a,3f10.5)') "ccm     ",(ccm(j),j=1,3)
+c         write (*,'(a,3f10.5)') "ccm_prev",(ccm_prev(j),j=1,3)
+c         write (*,'(a,3f10.5)') "diff    ",(ccm(j)-ccm_prev(j),j=1,3)
+c         write (*,*) "shift_coord"
+c         do i=1,nchain
+c           write (*,'(i5,3f10.5)') i,(shift_coord(j,i),j=1,3)
+c         enddo
+#ifdef PREVIOUS
+         if (previous) then
+           do j=1,3
+             change=.true.
+             do while (change)
+             if (ccm(j)-ccm_prev(j).gt.boxsize(j)/2) then
+               do ichain=1,nchain
+                 shift_coord(j,ichain)=shift_coord(j,ichain)-boxsize(j)
+               enddo
+               ccm(j)=ccm(j)-boxsize(j)
+             else if (ccm(j)-ccm_prev(j).lt.-boxsize(j)/2) then
+               do ichain=1,nchain
+                 shift_coord(j,ichain)=shift_coord(j,ichain)+boxsize(j)
+               enddo
+               ccm(j)=ccm(j)+boxsize(j)
+             else
+               change=.false.
+             endif
+           enddo
+           enddo
+           do j=1,3
+             ccm_prev(j)=ccm(j)
+           enddo
+         else
+           previous=.true.
+           do j=1,3
+             ccm_prev(j)=ccm(j)
+           enddo
+         endif
+#else
+         do ichain=1,nchain
+           do j=1,3
+             shift_coord(j,ichain)=shift_coord(j,ichain)-ccm(j)
+           enddo
+         enddo 
+#endif
+c         write (*,*) "shift_coord"
+c         do i=1,nchain
+c           write (*,'(i5,3f10.5)') i,(shift_coord(j,i),j=1,3)
+c         enddo
+         do ichain=1,nchain
+           do i=chain_border(1,ichain),chain_border(2,ichain)
+             do j=1,3
+               c(j,i)=c(j,i)+shift_coord(j,ichain)
+               c(j,i+nres)=c(j,i+nres)+shift_coord(j,ichain)
+             enddo
+           enddo
+         enddo 
          etot=potE
          write (tytul,'(a,i6)') "Structure",kk
          call pdbout(etot,tytul,9)