--- /dev/null
+ subroutine match_contact(ishif1,ishif2,nc_match,nc_match1_max,
+ & ncont_ref,icont_ref,ncont,icont,jfrag,n_shif1,n_shif2,
+ & nc_frac,nc_req_set,istr,llocal,lprn)
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'COMMON.IOUNITS'
+ integer ncont_ref,icont_ref(2,maxcont),ncont,icont(2,maxcont),
+ & ishift,ishif2,nc_match
+ double precision nc_frac
+ logical llocal,lprn
+ nc_match_max=0
+ do i=1,ncont_ref
+ nc_match_max=nc_match_max+
+ & min0(icont_ref(2,i)-icont_ref(1,i)-1,3)
+ enddo
+ if (istr.eq.3) then
+ nc_req=0
+ else if (nc_req_set.eq.0) then
+ nc_req=nc_match_max*nc_frac
+ else
+ nc_req = dmin1(nc_match_max*nc_frac+0.5d0,
+ & dfloat(nc_req_set)+1.0d-7)
+ endif
+c write (iout,*) "match_contact: nc_req:",nc_req
+c write (iout,*) "nc_match_max",nc_match_max
+c write (iout,*) "jfrag",jfrag," n_shif1",n_shif1,
+c & " n_shif2",n_shif2
+C Match current contact map against reference contact map; exit, if at least
+C half of the contacts match
+ call ncont_match(nc_match,nc_match1,0,0,ncont_ref,icont_ref,
+ & ncont,icont,jfrag,llocal,lprn)
+ nc_match1_max=nc_match1
+ if (lprn .and. nc_match.gt.0) write (iout,*)
+ & "Shift:",0,0," nc_match1",nc_match1,
+ & " nc_match=",nc_match," req'd",nc_req
+ if (nc_req.gt.0 .and. nc_match.ge.nc_req .or.
+ & nc_req.eq.0 .and. nc_match.eq.1) then
+ ishif1=0
+ ishif2=0
+ return
+ endif
+C If sufficient matches are not found, try to shift contact maps up to three
+C positions.
+ if (n_shif1.gt.0) then
+ do is=1,n_shif1
+C The following four tries help to find shifted beta-sheet patterns
+C Shift "left" strand backward
+ call ncont_match(nc_match,nc_match1,-is,0,ncont_ref,
+ & icont_ref,ncont,icont,jfrag,llocal,lprn)
+ if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1
+ if (lprn .and. nc_match.gt.0) write (iout,*)
+ & "Shift:",-is,0," nc_match1",nc_match1,
+ & " nc_match=",nc_match," req'd",nc_req
+ if (nc_req.gt.0 .and. nc_match.ge.nc_req .or.
+ & nc_req.eq.0 .and. nc_match.eq.1) then
+ ishif1=-is
+ ishif2=0
+ return
+ endif
+C Shift "left" strand forward
+ call ncont_match(nc_match,nc_match1,is,0,ncont_ref,
+ & icont_ref,ncont,icont,jfrag,llocal,lprn)
+ if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1
+ if (lprn .and. nc_match.gt.0) write (iout,*)
+ & "Shift:",is,0," nc_match1",nc_match1,
+ & " nc_match=",nc_match," req'd",nc_req
+ if (nc_req.gt.0 .and. nc_match.ge.nc_req .or.
+ & nc_req.eq.0 .and. nc_match.eq.1) then
+ ishif1=is
+ ishif2=0
+ return
+ endif
+ enddo
+ if (nc_req.eq.0) return
+C Shift "right" strand backward
+ do is=1,n_shif1
+ call ncont_match(nc_match,nc_match1,0,-is,ncont_ref,
+ & icont_ref,ncont,icont,jfrag,llocal,lprn)
+ if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1
+ if (lprn .and. nc_match.gt.0) write (iout,*)
+ & "Shift:",0,-is," nc_match1",nc_match1,
+ & " nc_match=",nc_match," req'd",nc_req
+ if (nc_match.ge.nc_req) then
+ ishif1=0
+ ishif2=-is
+ return
+ endif
+C Shift "right" strand upward
+ call ncont_match(nc_match,nc_match1,0,is,ncont_ref,
+ & icont_ref,ncont,icont,jfrag,llocal,lprn)
+ if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1
+ if (lprn .and. nc_match.gt.0) write (iout,*)
+ & "Shift:",0,is," nc_match1",nc_match1,
+ & " nc_match=",nc_match," req'd",nc_req
+ if (nc_match.ge.nc_req) then
+ ishif1=0
+ ishif2=is
+ return
+ endif
+ enddo ! is
+C Now try to shift both residues in contacts.
+ do is=1,n_shif1
+ do js=1,is
+ if (js.ne.is) then
+ call ncont_match(nc_match,nc_match1,-is,-js,ncont_ref,
+ & icont_ref,ncont,icont,jfrag,llocal,lprn)
+ if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1
+ if (lprn .and. nc_match.gt.0) write (iout,*)
+ & "Shift:",-is,-js," nc_match1",nc_match1,
+ & " nc_match=",nc_match," req'd",nc_req
+ if (nc_match.ge.nc_req) then
+ ishif1=-is
+ ishif2=-js
+ return
+ endif
+ call ncont_match(nc_match,nc_match1,is,js,ncont_ref,
+ & icont_ref,ncont,icont,jfrag,llocal,lprn)
+ if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1
+ if (lprn .and. nc_match.gt.0) write (iout,*)
+ & "Shift:",is,js," nc_match1",nc_match1,
+ & " nc_match=",nc_match," req'd",nc_req
+ if (nc_match.ge.nc_req) then
+ ishif1=is
+ ishif2=js
+ return
+ endif
+c
+ call ncont_match(nc_match,nc_match1,-js,-is,ncont_ref,
+ & icont_ref,ncont,icont,jfrag,llocal,lprn)
+ if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1
+ if (lprn .and. nc_match.gt.0) write (iout,*)
+ & "Shift:",-js,-is," nc_match1",nc_match1,
+ & " nc_match=",nc_match," req'd",nc_req
+ if (nc_match.ge.nc_req) then
+ ishif1=-js
+ ishif2=-is
+ return
+ endif
+c
+ call ncont_match(nc_match,nc_match1,js,is,ncont_ref,
+ & icont_ref,ncont,icont,jfrag,llocal,lprn)
+ if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1
+ if (lprn .and. nc_match.gt.0) write (iout,*)
+ & "Shift:",js,is," nc_match1",nc_match1,
+ & " nc_match=",nc_match," req'd",nc_req
+ if (nc_match.ge.nc_req) then
+ ishif1=js
+ ishif2=is
+ return
+ endif
+ endif
+c
+ if (is+js.le.n_shif1) then
+ call ncont_match(nc_match,nc_match1,-is,js,ncont_ref,
+ & icont_ref,ncont,icont,jfrag,llocal,lprn)
+ if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1
+ if (lprn .and. nc_match.gt.0) write (iout,*)
+ & "Shift:",-is,js," nc_match1",nc_match1,
+ & " nc_match=",nc_match," req'd",nc_req
+ if (nc_match.ge.nc_req) then
+ ishif1=-is
+ ishif2=js
+ return
+ endif
+c
+ call ncont_match(nc_match,nc_match1,js,-is,ncont_ref,
+ & icont_ref,ncont,icont,jfrag,llocal,lprn)
+ if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1
+ if (lprn .and. nc_match.gt.0) write (iout,*)
+ & "Shift:",js,-is," nc_match1",nc_match1,
+ & " nc_match=",nc_match," req'd",nc_req
+ if (nc_match.ge.nc_req) then
+ ishif1=js
+ ishif2=-is
+ return
+ endif
+ endif
+c
+ enddo !js
+ enddo !is
+ endif
+
+ if (n_shif2.gt.0) then
+ do is=1,n_shif2
+ call ncont_match(nc_match,nc_match1,-is,-is,ncont_ref,
+ & icont_ref,ncont,icont,jfrag,llocal,lprn)
+ if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1
+ if (lprn .and. nc_match.gt.0) write (iout,*)
+ & "Shift:",-is,-is," nc_match1",nc_match1,
+ & " nc_match=",nc_match," req'd",nc_req
+ if (nc_match.ge.nc_req) then
+ ishif1=-is
+ ishif2=-is
+ return
+ endif
+ call ncont_match(nc_match,nc_match1,is,is,ncont_ref,
+ & icont_ref,ncont,icont,jfrag,llocal,lprn)
+ if (nc_match1.gt.nc_match1_max) nc_match1_max=nc_match1
+ if (lprn .and. nc_match.gt.0) write (iout,*)
+ & "Shift:",is,is," nc_match1",nc_match1,
+ & " nc_match=",nc_match," req'd",nc_req
+ if (nc_match.ge.nc_req) then
+ ishif1=is
+ ishif2=is
+ return
+ endif
+ enddo
+ endif
+C If this point is reached, the contact maps are different.
+ nc_match=0
+ ishif1=0
+ ishif2=0
+ return
+ end
+c-------------------------------------------------------------------------
+ subroutine ncont_match(nc_match,nc_match1,ishif1,ishif2,
+ & ncont_ref,icont_ref,ncont,icont,jfrag,llocal,lprn)
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'DIMENSIONS.ZSCOPT'
+ include 'DIMENSIONS.COMPAR'
+ include 'COMMON.IOUNITS'
+ include 'COMMON.INTERACT'
+ include 'COMMON.GEO'
+ include 'COMMON.COMPAR'
+ logical llocal,lprn
+ integer ncont_ref,icont_ref(2,maxcont),ncont,icont(2,maxcont),
+ & icont_match(2,maxcont),ishift,ishif2,nang_pair,
+ & iang_pair(2,maxres)
+C Compare the contact map against the reference contact map; they're stored
+C in ICONT and ICONT_REF, respectively. The current contact map can be shifted.
+ if (lprn) write (iout,'(80(1h*))')
+ nc_match=0
+ nc_match1=0
+c Check the local structure by comparing dihedral angles.
+c write (iout,*) "ncont_match: ncont_ref",ncont_ref," llocal",llocal
+ if (llocal .and. ncont_ref.eq.0) then
+c If there are no contacts just compare the dihedral angles and exit.
+ call angnorm(jfrag,ishif1,ishif2,ang_cut1(jfrag),diffang,fract,
+ & lprn)
+ if (lprn) write (iout,*) "diffang:",diffang*rad2deg,
+ & " ang_cut:",ang_cut(jfrag)*rad2deg," fract",fract
+ if (diffang.le.ang_cut(jfrag) .and. fract.ge.frac_min(jfrag))
+ & then
+ nc_match=1
+ else
+ nc_match=0
+ endif
+ return
+ endif
+ nang_pair=0
+ do i=1,ncont
+ ic1=icont(1,i)+ishif1
+ ic2=icont(2,i)+ishif2
+c write (iout,*) "i",i," ic1",ic1," ic2",ic2
+ if (ic1.lt.nnt .or. ic2.gt.nct) goto 10
+ do j=1,ncont_ref
+ if (ic1.eq.icont_ref(1,j).and.ic2.eq.icont_ref(2,j)) then
+ nc_match=nc_match+min0(icont_ref(2,j)-icont_ref(1,j)-1,3)
+ nc_match1=nc_match1+1
+ icont_match(1,nc_match1)=ic1
+ icont_match(2,nc_match1)=ic2
+c call add_angpair(icont(1,i),icont_ref(1,j),
+c & nang_pair,iang_pair)
+c call add_angpair(icont(2,i),icont_ref(2,j),
+c & nang_pair,iang_pair)
+ if (lprn) write (iout,*) "Contacts:",icont(1,i),icont(2,i),
+ & " match",icont_ref(1,j),icont_ref(2,j),
+ & " shifts",ishif1,ishif2
+ goto 10
+ endif
+ enddo
+ 10 continue
+ enddo
+ if (lprn) then
+ write (iout,*) "nc_match",nc_match," nc_match1",nc_match1
+ write (iout,*) "icont_match"
+ do i=1,nc_match1
+ write (iout,*) icont_match(1,i),icont_match(2,i)
+ enddo
+ endif
+ if (llocal .and. nc_match.gt.0) then
+ call angnorm2(jfrag,ishif1,ishif2,nc_match1,icont_match,lprn,
+ & ang_cut1(jfrag),diffang,fract)
+ if (lprn) write (iout,*) "diffang:",diffang*rad2deg,
+ & " ang_cut:",ang_cut(jfrag)*rad2deg,
+ & " ang_cut1",ang_cut1(jfrag)*rad2deg
+ if (diffang.gt.ang_cut(jfrag)
+ & .or. fract.lt.frac_min(jfrag)) nc_match=0
+ endif
+c if (nc_match.gt.0) then
+c diffang = angnorm1(nang_pair,iang_pair,lprn)
+c if (diffang.gt.ang_cut(jfrag)) nc_match=0
+c endif
+ if (lprn) write (iout,*) "ishif1",ishif1," ishif2",ishif2,
+ & " diffang",rad2deg*diffang," nc_match",nc_match
+ return
+ end
+c------------------------------------------------------------------------------
+ subroutine match_secondary(jfrag,isecstr,nsec_match,lprn)
+c This subroutine compares the secondary structure (isecstr) of fragment jfrag
+c conformation considered to that of the reference conformation.
+c Returns the number of equivalent residues (nsec_match).
+ implicit real*8 (a-h,o-z)
+ include 'DIMENSIONS'
+ include 'DIMENSIONS.ZSCOPT'
+ include 'DIMENSIONS.COMPAR'
+ include 'COMMON.IOUNITS'
+ include 'COMMON.CHAIN'
+ include 'COMMON.PEPTCONT'
+ include 'COMMON.COMPAR'
+ logical lprn
+ integer isecstr(maxres)
+ npart = npiece(jfrag,1)
+ nsec_match=0
+ if (lprn) then
+ write (iout,*) "match_secondary jfrag",jfrag," ifrag",
+ & (ifrag(1,i,jfrag),ifrag(2,i,jfrag),i=1,npart)
+ write (iout,'(80i1)') (isec_ref(j),j=1,nres)
+ write (iout,'(80i1)') (isecstr(j),j=1,nres)
+ endif
+ do i=1,npart
+ do j=ifrag(1,i,jfrag),ifrag(2,i,jfrag)
+c The residue has equivalent conformational state to that of the reference
+c structure, if:
+c a) the conformational states are equal or
+c b) the reference state is a coil and that of the conformation considered
+c is a strand or
+c c) the conformational state of the conformation considered is a strand
+c and that of the reference conformation is a coil.
+c 10/28/02 - case (b) deleted.
+ if (isecstr(j).eq.isec_ref(j) .or.
+c & isecstr(j).eq.0 .and. isec_ref(j).eq.1 .or.
+ & isec_ref(j).eq.0 .and. isecstr(j).eq.1)
+ & nsec_match=nsec_match+1
+ enddo
+ enddo
+ return
+ end