Merge branch 'devel' into AFM
[unres.git] / source / wham / src-NEWSC / conf_compar.F
diff --git a/source/wham/src-NEWSC/conf_compar.F b/source/wham/src-NEWSC/conf_compar.F
new file mode 100755 (executable)
index 0000000..4b49345
--- /dev/null
@@ -0,0 +1,374 @@
+      subroutine conf_compar(jcon,lprn,print_class)
+      implicit real*8 (a-h,o-z)
+#ifdef MPI
+      include "mpif.h"
+#endif
+      include 'DIMENSIONS'
+      include 'DIMENSIONS.ZSCOPT'
+      include 'DIMENSIONS.COMPAR'
+      include 'DIMENSIONS.FREE'
+      include 'COMMON.CONTROL'
+      include 'COMMON.IOUNITS'
+      include 'COMMON.COMPAR'
+      include 'COMMON.CHAIN' 
+      include 'COMMON.INTERACT'
+      include 'COMMON.VAR'
+      include 'COMMON.PEPTCONT'
+      include 'COMMON.CONTACTS1'
+      include 'COMMON.HEADER'
+      include 'COMMON.FREE'
+      include 'COMMON.ENERGIES'
+#ifdef MPI
+      include 'COMMON.MPI'
+#endif
+      integer ilen
+      external ilen
+      logical lprn,print_class
+      integer ncont_frag(mmaxfrag),
+     & icont_frag(2,maxcont,mmaxfrag),ncontsc,
+     & icontsc(1,maxcont),nsccont_frag(mmaxfrag),
+     & isccont_frag(2,maxcont,mmaxfrag)
+      integer isecstr(maxres)
+      integer itemp(maxfrag)
+      character*4 liczba
+      double precision Epot
+c      print *,"Enter conf_compar",jcon
+      call angnorm12(rmsang)
+c Level 1: check secondary and supersecondary structure
+      call elecont(lprn,ncont,icont,nnt,nct)
+      call secondary2(lprn,.false.,ncont,icont,isecstr)
+      call contact(lprn,ncontsc,icontsc,nnt,nct)
+      if (lprn) write(iout,*) "Assigning electrostatic contacts"
+      call contacts_between_fragments(lprn,3,ncont,icont,ncont_frag,
+     &   icont_frag)
+      if (lprn) write(iout,*) "Assigning sidechain contacts"
+      call contacts_between_fragments(lprn,3,ncontsc,icontsc,
+     &   nsccont_frag,isccont_frag)
+      do i=1,nlevel
+        do j=1,isnfrag(nlevel+1)
+          iclass(j,i)=0
+        enddo
+      enddo
+      do j=1,nfrag(1)
+        ind = icant(j,j)
+        if (lprn) then
+          write (iout,'(80(1h=))') 
+          write (iout,*) "Level",1," fragment",j
+          write (iout,'(80(1h=))') 
+        endif
+        rmsfrag(j,1)=rmscalc(0,1,j,jcon,lprn)
+c Compare electrostatic contacts in the current conf with that in the native
+c structure.
+        if (lprn) write (iout,*) 
+     &    "Comparing electrostatic contact map and local structure" 
+        ncnat=ncont_frag_ref(ind)
+c        write (iout,*) "before match_contact:",nc_fragm(j,1),
+c     &   nc_req_setf(j,1)
+        call match_secondary(j,isecstr,nsec_match,lprn)
+        if (lprn) write (iout,*) "Fragment",j," nsec_match",
+     &    nsec_match," length",len_frag(j,1)," min_len",
+     &    frac_sec*len_frag(j,1)
+        if (nsec_match.lt.frac_sec*len_frag(j,1)) then
+          iclass(j,1)=0
+          if (lprn) write (iout,*) "Fragment",j,
+     &      " has incorrect secondary structure"
+        else
+          iclass(j,1)=1
+          if (lprn) write (iout,*) "Fragment",j,
+     &      " has correct secondary structure"
+        endif
+        if (ielecont(j,1).gt.0) then
+          call match_contact(ishif1,ishif2,nc_match,ncon_match,
+     &      ncont_frag_ref(ind),icont_frag_ref(1,1,ind),
+     &      ncont_frag(ind),icont_frag(1,1,ind),
+     &      j,n_shift(1,j,1),n_shift(2,j,1),nc_fragm(j,1),
+     &      nc_req_setf(j,1),istruct(j),.true.,lprn)
+        else if (isccont(j,1).gt.0) then
+          call match_contact(ishif1,ishif2,nc_match,ncon_match,
+     &      nsccont_frag_ref(ind),isccont_frag_ref(1,1,ind),
+     &      nsccont_frag(ind),isccont_frag(1,1,ind),
+     &      j,n_shift(1,j,1),n_shift(2,j,1),nc_fragm(j,1),
+     &      nc_req_setf(j,1),istruct(j),.true.,lprn)
+        else if (iloc(j).gt.0) then
+c          write (iout,*) "n_shif",n_shift(1,j,1),n_shift(2,j,1)
+          call match_contact(ishif1,ishif2,nc_match,ncon_match,
+     &      0,icont_frag_ref(1,1,ind),
+     &      ncont_frag(ind),icont_frag(1,1,ind),
+     &      j,n_shift(1,j,1),n_shift(2,j,1),nc_fragm(j,1),
+     &      0,istruct(j),.true.,lprn)
+c          write (iout,*) "n_shif",n_shift(1,j,1),n_shift(2,j,1)
+        else
+          ishif=0
+          nc_match=1
+        endif
+        if (lprn) write (iout,*) "ishif1",ishif1," ishif2",ishif2
+        ishif=ishif1
+        qfrag(j,1)=qwolynes(1,j)
+        if (iabs(ishif2).gt.iabs(ishif1)) ishif=ishif2
+        if (lprn) write (iout,*) "ishift",ishif," nc_match",nc_match
+c        write (iout,*) "j",j," ishif",ishif," rms",rmsfrag(j,1)
+        if (irms(j,1).gt.0) then
+          if (rmsfrag(j,1).le.rmscutfrag(1,j,1)) then
+            iclass_rms=2
+            ishifft_rms=0
+          else
+            ishiff=0
+            rms=1.0d2
+            iclass_rms=0
+            do while (rms.gt.rmscutfrag(1,j,1) .and. 
+     &         ishiff.lt.n_shift(1,j,1))
+              ishiff=ishiff+1
+              rms=rmscalc(-ishiff,1,j,jcon,lprn)
+c              write(iout,*)"jcon,i,j,ishiff",jcon,i,j,-ishiff,
+c     &          " rms",rms," rmscut",rmscutfrag(1,j,1)
+              if (lprn) write (iout,*) "rms",rmsfrag(j,1) 
+              if (rms.gt.rmscutfrag(1,j,1)) then
+                rms=rmscalc(ishiff,1,j,jcon,lprn)
+c                write (iout,*) "jcon,1,j,ishiff",jcon,1,j,ishiff,
+c     &           " rms",rms
+              endif
+              if (lprn) write (iout,*) "rms",rmsfrag(j,1) 
+            enddo
+c            write (iout,*) "After loop: rms",rms,
+c     &        " rmscut",rmscutfrag(1,j,1)
+c            write (iout,*) "iclass_rms",iclass_rms
+            if (rms.le.rmscutfrag(1,j,1)) then
+              ishifft_rms=ishiff
+              rmsfrag(j,1)=rms
+              iclass_rms=1
+            endif
+c            write (iout,*) "iclass_rms",iclass_rms
+          endif
+c          write (iout,*) "ishif",ishif
+          if (iabs(ishifft_rms).gt.iabs(ishif)) ishif=ishifft_rms
+        else
+          iclass_rms=1
+        endif
+c        write (iout,*) "ishif",ishif," iclass",iclass(j,1),
+c     &    " iclass_rms",iclass_rms
+        if (nc_match.gt.0 .and. iclass_rms.gt.0) then
+          if (ishif.eq.0) then
+            iclass(j,1)=iclass(j,1)+6
+          else
+            iclass(j,1)=iclass(j,1)+2
+          endif
+        endif
+        ncont_nat(1,j,1)=nc_match
+        ncont_nat(2,j,1)=ncon_match
+        ishifft(j,1)=ishif
+c        write (iout,*) "iclass",iclass(j,1)
+      enddo
+c Next levels: Check arrangements of elementary fragments.
+      do i=2,nlevel
+        do j=1,nfrag(i)
+        if (i .eq. 2) ind = icant(ipiece(1,j,i),ipiece(2,j,i))
+        if (lprn) then
+            write (iout,'(80(1h=))') 
+            write (iout,*) "Level",i," fragment",j
+            write (iout,'(80(1h=))') 
+        endif
+c If an elementary fragment doesn't exist, don't check higher hierarchy levels.
+        do k=1,npiece(j,i)
+          ik=ipiece(k,j,i)
+          if (iclass(ik,1).eq.0) then
+            iclass(j,i)=0
+            goto 12
+          endif
+        enddo
+        if (i.eq.2 .and. ielecont(j,i).gt.0) then
+          iclass_con=0
+          ishifft_con=0
+          if (lprn) write (iout,*) 
+     &     "Comparing electrostatic contact map: fragments",
+     &      ipiece(1,j,i),ipiece(2,j,i)," ind",ind
+          call match_contact(ishif1,ishif2,nc_match,ncon_match,
+     &     ncont_frag_ref(ind),icont_frag_ref(1,1,ind),
+     &     ncont_frag(ind),icont_frag(1,1,ind),
+     &     j,n_shift(1,j,i),n_shift(2,j,i),nc_fragm(j,i),
+     &     nc_req_setf(j,i),2,.false.,lprn)
+          ishif=ishif1
+          if (iabs(ishif2).gt.iabs(ishif1)) ishif=ishif2
+          if (nc_match.gt.0) then
+            if (ishif.eq.0) then
+              iclass_con=2
+            else
+              iclass_con=1
+            endif
+          endif
+          ncont_nat(1,j,i)=nc_match
+          ncont_nat(2,j,i)=ncon_match
+          ishifft_con=ishif
+        else if (i.eq.2 .and. isccont(j,i).gt.0) then
+          iclass_con=0
+          ishifft_con=0
+          if (lprn) write (iout,*) 
+     &     "Comparing sidechain contact map: fragments",
+     &    ipiece(1,j,i),ipiece(2,j,i)," ind",ind
+          call match_contact(ishif1,ishif2,nc_match,ncon_match,
+     &     nsccont_frag_ref(ind),isccont_frag_ref(1,1,ind),
+     &     nsccont_frag(ind),isccont_frag(1,1,ind),
+     &     j,n_shift(1,j,i),n_shift(2,j,i),nc_fragm(j,i),
+     &     nc_req_setf(j,i),2,.false.,lprn)
+          ishif=ishif1
+          if (iabs(ishif2).gt.iabs(ishif1)) ishif=ishif2
+          if (nc_match.gt.0) then
+            if (ishif.eq.0) then
+              iclass_con=2
+            else
+              iclass_con=1
+            endif
+          endif
+          ncont_nat(1,j,i)=nc_match
+          ncont_nat(2,j,i)=ncon_match
+          ishifft_con=ishif
+        else if (i.eq.2) then
+          iclass_con=2
+          ishifft_con=0
+        endif
+        if (i.eq.2) qfrag(j,2)=qwolynes(2,j)
+        if (lprn) write (iout,*) 
+     &    "Comparing rms: fragments",
+     &     (ipiece(k,j,i),k=1,npiece(j,i))
+        rmsfrag(j,i)=rmscalc(0,i,j,jcon,lprn)
+        if (irms(j,i).gt.0) then
+          iclass_rms=0
+          ishifft_rms=0
+          if (lprn) write (iout,*) "rms",rmsfrag(j,i)
+c          write (iout,*) "i",i," j",j," rmsfrag",rmsfrag(j,i),
+c     &     " rmscutfrag",rmscutfrag(1,j,i)
+          if (rmsfrag(j,i).le.rmscutfrag(1,j,i)) then
+            iclass_rms=2
+            ishifft_rms=0
+          else
+            ishif=0
+            rms=1.0d2
+            do while (rms.gt.rmscutfrag(1,j,i) .and. 
+     &         ishif.lt.n_shift(1,j,i))
+              ishif=ishif+1
+              rms=rmscalc(-ishif,i,j,jcon,lprn)
+c              print *,"jcon,i,j,ishif",jcon,i,j,-ishif," rms",rms
+              if (lprn) write (iout,*) "rms",rmsfrag(j,i) 
+              if (rms.gt.rmscutfrag(1,j,i)) then
+                rms=rmscalc(ishif,i,j,jcon,lprn)
+c                print *,"jcon,i,j,ishif",jcon,i,j,ishif," rms",rms
+              endif
+              if (lprn) write (iout,*) "rms",rms
+            enddo
+            if (rms.le.rmscutfrag(1,j,i)) then
+              ishifft_rms=ishif
+              rmsfrag(j,i)=rms
+              iclass_rms=1
+            endif
+          endif
+        endif
+        if (irms(j,i).eq.0 .and. ielecont(j,i).eq.0 .and. 
+     &    isccont(j,i).eq.0 ) then
+          write (iout,*) "Error: no measure of comparison specified:",
+     &      " level",i," part",j
+          stop
+        endif
+        if (lprn) 
+     &  write (iout,*) "iclass_con",iclass_con," iclass_rms",iclass_rms
+        if (i.eq.2) then
+          iclass(j,i) = min0(iclass_con,iclass_rms)
+          if (iabs(ishifft_rms).gt.iabs(ishifft_con)) then
+            ishifft(j,i)=ishifft_rms
+          else
+            ishifft(j,i)=ishifft_con
+          endif
+        else if (i.gt.2) then
+          iclass(j,i) = iclass_rms
+          ishifft(j,i)= ishifft_rms
+        endif
+   12   continue
+        enddo
+      enddo
+      rms_nat=rmsnat(jcon)
+      qnat=qwolynes(0,0)
+C Compute the structural class
+      iscor=0
+      IF (.NOT. BINARY) THEN
+      do i=1,nlevel
+        IF (I.EQ.1) THEN
+        do j=1,nfrag(i)
+          itemp(j)=iclass(j,i)
+        enddo
+        do kk=-1,1
+          do j=1,nfrag(i)
+            idig = 2*isnfrag(nlevel+1)-2*isnfrag(i)-kk*nfrag(i)-j
+            iex = 2**idig
+            im=mod(itemp(j),2)
+            itemp(j)=itemp(j)/2
+c            write (iout,*) "i",i," j",j," idig",idig," iex",iex,
+c     &        " iclass",iclass(j,i)," im",im
+            iscor=iscor+im*iex
+          enddo
+        enddo
+        ELSE
+        do j=1,nfrag(i)
+          idig = 2*isnfrag(nlevel+1)-2*isnfrag(i)-j
+          iex = 2**idig
+          if (iclass(j,i).gt.0) then
+            im=1
+          else
+            im=0
+          endif
+c          write (iout,*) "i",i," j",j," idig",idig," iex",iex,
+c     &      " iclass",iclass(j,i)," im",im
+          iscor=iscor+im*iex
+        enddo
+        do j=1,nfrag(i)
+          idig = 2*isnfrag(nlevel+1)-2*isnfrag(i)-nfrag(i)-j
+          iex = 2**idig
+          if (iclass(j,i).gt.1) then
+            im=1
+          else
+            im=0
+          endif
+c          write (iout,*) "i",i," j",j," idig",idig," iex",iex,
+c     &      " iclass",iclass(j,i)," im",im
+          iscor=iscor+im*iex
+        enddo
+        ENDIF
+      enddo
+      iscore=iscor
+      ENDIF
+      if (print_class) then
+#ifdef MPI
+          write(istat,'(i6,$)') jcon+indstart(me)-1
+          write (istat,'(f10.2,$)') (potE(jcon,k),k=1,nParmSet),
+     &     -entfac(jcon)
+#else
+          write(istat,'(i6,$)') jcon
+          write (istat,'(f10.2,$)') (potE(jcon,k),k=1,nParmSet),
+     &      -entfac(jcon)
+#endif
+          write (istat,'(f8.3,2f6.3,$)') 
+     &      rms_nat,qnat,rmsang/(nres-3)
+          do j=1,nlevel
+            write(istat,'(1x,$,20(i3,$))')
+     &        (ncont_nat(1,k,j),k=1,nfrag(j))
+            if (j.lt.3) then
+              write(istat,'(1x,$,20(f5.1,f5.2$))')
+     &          (rmsfrag(k,j),qfrag(k,j),k=1,nfrag(j))
+            else
+              write(istat,'(1x,$,20(f5.1$))')
+     &          (rmsfrag(k,j),k=1,nfrag(j))
+            endif
+            write(istat,'(1x,$,20(i1,$))')
+     &        (iclass(k,j),k=1,nfrag(j))
+          enddo
+          if (binary) then
+            write (istat,'("  ",$)')
+            do j=1,nlevel
+              write (istat,'(100(i1,$))')(iclass(k,j),
+     &           k=1,nfrag(j))
+              if (j.lt.nlevel) write(iout,'(".",$)')
+            enddo
+            write (istat,*)
+          else
+            write (istat,'(i10)') iscore
+          endif
+      endif
+      RETURN
+      END