subroutine gen_rand_conf_mchain(nstart0,*) C Generate random conformation or chain cut and regrowth. implicit none include 'DIMENSIONS' include 'COMMON.CHAIN' include 'COMMON.LOCAL' include 'COMMON.VAR' include 'COMMON.INTERACT' include 'COMMON.IOUNITS' include 'COMMON.MCM' include 'COMMON.GEO' include 'COMMON.CONTROL' logical overlap_mchain,back,fail integer nstart,nstart0 integer i,ii,iii,j,k,it,it1,it2,nit,niter,nsi,maxsi,maxnit integer igr,iequi,ichain,nnres double precision aux double precision gen_theta,gen_phi,dist,ran_number,scalar c write (iout,*) 'gen_rand_conf_mchain: maxgen=',maxgen nstart=nstart0 maxsi=100 c write (iout,*) 'Gen_Rand_conf_mchain: nstart=',nstart, c & " nchain_group",nchain_group DO IGR=1,NCHAIN_GROUP DO IEQUI=1,NEQUIV(IGR) ichain=iequiv(iequi,igr) i=chain_border1(1,ichain)+nstart-1 if (nstart.eq.1) then do j=1,3 c(j,i)=ran_number(-15.0d0,15.0d0) dc(j,i-1)=c(j,i) enddo endif if (nstart.le.2) then do j=1,3 dc_norm(j,i)=ran_number(-1.0d0,1.0d0) enddo aux=dsqrt(scalar(dc_norm(1,i),dc_norm(1,i))) do j=1,3 dc_norm(j,i)=dc_norm(j,i)/aux enddo if (itype(i).eq.ntyp1) then do j=1,3 dc(j,i)=1.9d0*dc_norm(j,i) enddo else do j=1,3 dc(j,i)=3.8d0*dc_norm(j,i) enddo endif do j=1,3 c(j,i+1)=c(j,i)+dc(j,i) enddo endif c if (nstart.lt.5) then if (nstart.le.2) then it1=iabs(itype(i+2)) phi(i+3)=gen_phi(i+3,iabs(itype(i+1)),iabs(itype(i+2))) c write(iout,*)'phi(4)=',rad2deg*phi(4) theta(i+2)=gen_theta(iabs(itype(i+2)),pi,phi(i+3)) if (it1.ne.10) then nsi=0 fail=.true. do while (fail.and.nsi.le.maxsi) call gen_side(it1,theta(i+2),alph(i+1),omeg(i+1),fail) nsi=nsi+1 enddo if (nsi.gt.maxsi) then write (iout,'(a,i7,a,i7,a,i7,a,i7)') & 'Problem in SC rotamer generation, residue',ii, & ' chain',ichain,' chain group',igr,'. Increase MAXSI.' return1 endif endif ! it1.ne.10 call orig_frame_chain(i) else c call orig_frame_chain(i-1) c write (iout,*) "calling refsys",i call refsys(i,i-1,i-2,prod(1,1,i-1), & prod(1,2,i-1),prod(1,3,i-1),fail) c write (iout,*) "after refsys",i #ifdef DEBUG write (iout,*) "dc_norm(:",i-1,") and prod" do j=1,3 write (iout,*) j,dc_norm(j,i-1),(prod(j,k,i-1),k=1,3) enddo #endif endif ENDDO nstart=nstart+1 ii=nstart maxnit=5000 nit=0 niter=0 back=.false. nnres=chain_border1(2,iequiv(1,igr))- & chain_border1(1,iequiv(1,igr))+1 #ifdef DEBUG write (iout,*) "chain group",igr," chains", & (iequiv(j,igr),j=1,nequiv(igr)) write (iout,*) "ii",ii," nnres",nnres #endif do while (ii.le. nnres .and. niter.lt.maxgen) ichain=iequiv(1,igr) i=ii-1+chain_border1(1,ichain) #ifdef DEBUG write (iout,*) "ii",ii," nnres",nnres," ichain",ichain," i",i, & "niter",niter," back",back," nstart",nstart #endif if (ii.lt.nstart) then c if(iprint.gt.1) then write (iout,'(/80(1h*)/2a/80(1h*))') & 'Generation procedure went down to ', & 'chain beginning. Cannot continue...' write (*,'(/80(1h*)/2a/80(1h*))') & 'Generation procedure went down to ', & 'chain beginning. Cannot continue...' c endif return1 endif it1=iabs(itype(i-1)) it2=iabs(itype(i-2)) it=iabs(itype(i)) if (it.eq.ntyp1 .and. it1.eq.ntyp1) then vbld(i)=ran_number(3.8d0,10.0d0) vbld_inv(i)=1.0d0/vbld(i) endif #ifdef DEBUG write (iout,*) 'Gen_Rand_Conf: i=',i,' it=',it,' it1=',it1, & ' it2=',it2,' nit=',nit,' niter=',niter,' maxgen=',maxgen #endif phi(i)=gen_phi(i,it2,it1) phi(i+1)=gen_phi(i+1,it1,it) #ifdef DEBUG write (iout,*) "phi",i,phi(i)," phi",i+1,phi(i+1) #endif do iequi=2,nequiv(igr) iii=ii+chain_border1(1,iequiv(iequi,igr)) phi(iii)=phi(i+1) enddo #ifdef CHUJ if (back) then phi(i)=gen_phi(i+1,it2,it1) #ifdef DEBUG write(iout,*) 'phi(',i,')=',phi(i)," type",it1,it2,it #endif theta(i-1)=gen_theta(it2,phi(i-1),phi(i)) if (theta(i-1).gt.2.68780478d0) theta(i-1)=2.68780478d0 do iequi=2,nequiv(igr) iii=ii-1+chain_border1(1,iequiv(iequi,igr)) phi(iii)=phi(i+1) theta(iii-1)=theta(i-1) enddo if (it2.ne.10 .and. it2.ne.ntyp1) then nsi=0 fail=.true. do while (fail.and.nsi.le.maxsi) call gen_side(it2,theta(i-1),alph(i-2),omeg(i-2),fail) nsi=nsi+1 enddo do iequi=2,nequiv(igr) iii=ii-3+chain_border1(1,iequiv(iequi,igr)) alph(iii)=alph(i-2) omeg(iii)=omeg(i-2) enddo #ifdef DEBUG write (iout,*) "alpha",alph(i)," omeg",omeg(i)," fail",fail #endif if (nsi.gt.maxsi) then write (iout,'(a,i7,a,i7,a,i7,a,i7)') & 'Problem in SC rotamer generation, residue',ii, & ' chain',ichain,' chain group',igr,'. Increase MAXSI.' return1 endif endif c call locate_next_res(i-1) endif #endif if (it1.ne.ntyp1) then theta(i)=gen_theta(it1,phi(i),phi(i+1)) if (theta(i).gt.2.68780478d0) theta(i)=2.68780478d0 else theta(i)=ran_number(1.326d0,2.548d0) endif #ifdef DEBUG write (iout,*) "ii",ii," i",i," it1",it1, & " theta",theta(i)," phi", & phi(i),phi(i+1) #endif if (it1.ne.10 .and. it1.ne.ntyp1) then nsi=0 fail=.true. do while (fail.and.nsi.le.maxsi) c theta(i)=gen_theta(it1,phi(i),phi(i+1)) call gen_side(it1,theta(i),alph(i-1),omeg(i-1),fail) nsi=nsi+1 enddo #ifdef DEBUG write (iout,*) "alpha",alph(i)," omeg",omeg(i)," fail",fail #endif c write (iout,*) "After forward SC generation:",nsi,maxsi if (nsi.gt.maxsi) then write (iout,'(a,i7,a,i7,a,i7,a,i7)') & 'Problem in SC rotamer generation, residue',ii, & ' chain',ichain,' chain group',igr,'. Increase MAXSI.' return1 endif endif do iequi=2,nequiv(igr) iii=ii-1+chain_border1(1,iequiv(iequi,igr)) theta(iii)=theta(i) phi(iii)=phi(i) alph(iii-1)=alph(i-1) omeg(iii-1)=omeg(i-1) enddo DO IEQUI=1,NEQUIV(IGR) ichain=iequiv(iequi,igr) i=ii-1+chain_border1(1,ichain) #ifdef CHUJ if (back) call locate_next_res(i-1) #endif call locate_next_res(i) #ifdef DEBUG write (iout,*) "i",i," ii",ii," ichain",ichain write (iout,*) theta(i)*rad2deg,phi(i)*rad2deg, & alph(i-1)*rad2deg,omeg(i-1)*rad2deg write (iout,*) (c(j,i),j=1,3),(c(j,i+nres-1),j=1,3) #endif if (overlap_mchain(i-1,ii-1,ichain,igr)) then #ifdef DEBUG write (iout,*) "***********overlap",i-1," nit",nit #endif if (nit.lt.maxnit) then back=.true. nit=nit+1 exit else #ifdef DEBUG write (iout,*) "***********overlap maxnit exceeded",nit #endif nit=0 if (ii.gt.3) then back=.true. ii=ii-1 c write (iout,*) "ii",ii exit else write (iout,'(a,i7,a,i7,a,i7,a,i7)') & 'Cannot generate non-overlaping conformation, residue',ii, & ' chain',ichain,' chain group',igr,'. Increase MAXNIT.' return1 endif endif else c write (iout,*) "No overlap",i-1 back=.false. c nit=0 c i=i+1 endif ENDDO if (.not.back) then #ifdef DEBUG write (iout,*) "++++++++++Successful generation",igr,ichain,ii #endif ii=ii+1 nit=0 endif back=.false. c write (iout,*) "ii",ii niter=niter+1 enddo if (niter.ge.maxgen) then write (iout,'(a,2i7,a,i7,a,i7,a,i7)') & 'Too many trials in conformation generation',niter,maxgen, & ' chain group',igr,' chain',ichain,' residue',ii return1 endif ENDDO do i=2,nres if (itype(i).eq.ntyp1) then do j=1,3 dc(j,i-1)=c(j,i)-c(j,i-1) enddo endif enddo return end c------------------------------------------------------------------------- logical function overlap_mchain(i,ii,ichain,igr) implicit none include 'DIMENSIONS' include 'COMMON.IOUNITS' include 'COMMON.CHAIN' include 'COMMON.INTERACT' include 'COMMON.FFIELD' double precision redfac /0.5D0/,redfacp /0.8d0/,redfacscp /0.8d0/ integer i,ii,ichain,igr,j,jj,jchain,jgr,k,iti,itj,iteli,itelj double precision rcomp double precision dist logical lprn /.false./ overlap_mchain=.false. iti=iabs(itype(i)) if (iti.gt.ntyp) return C Check for SC-SC overlaps. cd print *,'nnt=',nnt,' nct=',nct #ifdef DEBUG write (iout,*) "overlap_mchain i",i," ii",ii," ichain",ichain, & " igr",igr," iti",iti #endif do j=nnt,nct if (itype(j).eq.ntyp1) cycle jchain=ireschain(j) c write (iout,*) "overlap_mchain j",j," jj",jj," jchain",jchain, c & " itype",itype(j) jgr=mapchain(jchain) jj=j-chain_border1(1,jchain)+1 itj=iabs(itype(j)) c write (iout,*) "jgr",jgr if(igr.eq.jgr.and.jj.gt.ii .or. ichain.eq.jchain .and. j.gt.i-1 & .or. jgr.gt.igr .and. jj.gt.nran_start) cycle if (j.lt.i-1 .or. ipot.ne.4) then rcomp=sigmaii(iti,itj) else rcomp=sigma(iti,itj) endif cd print *,'j=',j if (dist(nres+i,nres+j).lt.redfac*rcomp) then overlap_mchain=.true. if (lprn) write(iout,*)'overlap_mchain, SC-SC: i=',i,' j=',j, & ' ichain',ichain,' jchain',jchain, & ' dist=',dist(nres+i,nres+j),' rcomp=', & rcomp*redfac return endif enddo #ifdef CHUJ C Check for overlaps between the added peptide group and the preceding C SCs. iteli=itel(i) if (iteli.gt.0) then do j=1,3 c(j,maxres2+1)=0.5D0*(c(j,i)+c(j,i+1)) enddo do j=nnt,nct itj=iabs(itype(j)) if (itj.eq.ntyp1) cycle jchain=ireschain(j) jgr=mapchain(jchain) jj=j-chain_border1(1,jchain)+1 if(igr.eq.jgr.and.jj.gt.ii .or. ichain.eq.jchain .and. j.gt.i-2 & .or. jgr.gt.igr .and. jj.gt.nran_start) cycle cd print *,'overlap_mchain, p-Sc: i=',i,' j=',j, cd & ' dist=',dist(nres+j,maxres2+1) if (dist(j,maxres2+1).lt.4.0D0*redfacscp) then if (lprn) write (iout,*) 'overlap_mchain, p-SC: i=',i,' j=',j, & ' ichain',ichain,' jchain',jchain, & ' dist=',dist(nres+j,maxres2+1),' rcomp=', & 4.0d0*redfac overlap_mchain=.true. return endif enddo endif C Check for p-p overlaps #endif iteli=itel(i) if (iteli.eq.0) return do j=1,3 c(j,maxres2+1)=0.5D0*(c(j,i)+c(j,i+1)) enddo c do j=nnt,i-2 do j=nnt,nct itelj=itel(j) if (itelj.eq.0) cycle do k=1,3 c(k,maxres2+2)=0.5D0*(c(k,j)+c(k,j+1)) enddo jchain=ireschain(j) jgr=mapchain(jchain) c if(iteli.ne.0.and.itelj.ne.0)then c write (iout,*) i,j,dist(maxres2+1,maxres2+2),rpp(iteli,itelj) jj=j-chain_border1(1,jchain)+1 c write (iout,*) "jgr",jgr if(igr.eq.jgr.and.jj.gt.ii .or. ichain.eq.jchain .and. j.gt.i-2 & .or. jgr.gt.igr .and. jj.gt.nran_start) cycle #ifdef DEBUG write (iout,*)'overlap_mchain, p-p: i=',i,' j=',j,' igr',igr, & ' jgr',jgr,' ichain',ichain,' jchain',jchain, & ' dist=',dist(maxres2+1,maxres2+2) #endif if (dist(maxres2+1,maxres2+2).lt.rpp(iteli,itelj)*redfacp) then if (lprn) write (iout,*) 'overlap_mchain, p-p: i=',i,' j=',j, & ' ichain',ichain,' jchain',jchain, & ' dist=',dist(maxres2+1,maxres2+2),' rcomp=', & rpp(iteli,itelj)*redfacp overlap_mchain=.true. return endif c endif enddo return end