implicit none include "DIMENSIONS" include "COMMON.CALC" integer i,j,k,l,ii,nf,n,uiparm(1) double precision x(maxene) double precision rmsave(maxT),fdum,rr external fdum,funclik double precision quot,quotl,f,T0 /300.0d0/ character*8 ename(maxene) common /names/ ename character*1 restyp(nbase) data restyp /'A','G','C','T','U'/ character maskchar(0:1) /' ','*'/ character*80 Naresfile,Fracfile double precision g(100) c print *,"start" read(1,*) nene,sigma2,wsq write (2,*) "nene",nene," nT",nT," sigma",sigma2 read(1,*) (ename(i),i=1,nene) read(1,*) (weight(i),i=1,nene) read(1,*) (iweight(i),i=1,nene) read(1,*) (mask(i),i=1,nene) do i=1,nnbase read(1,*) sig0(i),(weightel(3*(i-1)+j),maskel(3*(i-1)+j),j=1,3) enddo read(1,'(a)') Naresfile read(1,'(a)') Fracfile close(1) open(7,file=Naresfile,status='old') i=0 do c print *,"i=",i read(7,*,end=10,err=10) ii,(enetb(j,i+1),j=1,nene), & ((eletb(3*(j-1)+k,i+1),j=1,nnbase),k=1,3), & entfac(i+1), & qtab(i+1),rmstab(i+1),rgytab(i+1), & fpair(i+1),rr,fdup(i+1) i=i+1 enddo 10 continue nconf=i close(7) write (2,*) "nconf",nconf write (2,'(/"Initial energy-term weights (* optimized)")') write (2,'(i5,2x,a4,f10.5,1x,a1,i5)') & (j,ename(j),weight(j),maskchar(mask(j)),iweight(j),j=1,nene) ii=0 write (2,*) & "Initial base-dipole-interaction parameters (* optimizable)" do i=1,nbase do j=1,i ii=ii+1 write (2,'(2a2,f10.5,3(f10.5,1x,a1))') restyp(i),restyp(j), & sig0(ii),(weightel(3*(ii-1)+k),maskchar(maskel(3*(ii-1)+k)), & k=1,3) enddo enddo write (2,*) "sigma",sigma2," wsq",wsq sigma2=sigma2*sigma2 close(7) open(7,file=Fracfile,status='old') i=0 do read(7,*,end=11,err=11) temper(i+1),frac(i+1) i=i+1 enddo 11 continue nT=i close(7) write (2,*) "Fractions of base pairs" do i=1,nT write (2,'(i5,f8.1,f10.5)') i,temper(i),frac(i) enddo c Transfer weights to variables call w2x(n,x) write (2,*) "n",n c Compute the temperature scale factors do i=1,nT ft(1,i)=1.0d0 quot=temper(i)/T0 quotl=1.0d0 do l=2,2 quotl=quotl*quot fT(l,i)=1.12692801104297249644d0/ & dlog(dexp(quotl)+dexp(-quotl)) enddo enddo c do i=1,nT c write (2,'(i5,f8.3,f10.5)') (i,(ft(j,i),j=1,2),i=1,nT) c enddo call funclik(n,x,nf,f,uiparm,rmsave,fdum) write (2,*) "f",f write(2,'(/a3,a8,3a10)')" Nr"," Temp"," rmsave", & " fave"," fave(exp)" do i=1,nT write (2,'(i3,f8.1,3f10.5)') i,temper(i),rmsave(i), & fave(i),frac(i) enddo c call grad(n,x,nf,g,uiparm,rmsave,fdum) c write (2,*) "rmsave",(rmsave(i),i=1,nT),"f",f c stop call minsumsl(n,x,f) call funclik(n,x,nf,f,uiparm,rmsave,fdum) write (2,'(/"Final parameters (",i5,")")') n do i=1,n write (2,'(i5,f10.5)') i,x(i) enddo write (2,'(/"Energy-term weights (* optimized)")') write (2,'(i5,2x,a4,f10.5,1x,a1,i5)') & (j,ename(j),weight(j),maskchar(mask(j)),iweight(j),j=1,nene) write (2,*) "Base-dipole-interaction parameters (* optimized)" ii=0 do i=1,nbase do j=1,i ii=ii+1 write (2,'(2a2,f10.5,3(f10.5,1x,a1))') restyp(i),restyp(j), & sig0(ii),(weightel(3*(ii-1)+k),maskchar(maskel(3*(ii-1)+k)), & k=1,3) enddo enddo write (2,*) "f",f write(2,'(/a3,a8,3a10)')" Nr"," Temp"," rmsave", & " fave"," fave(exp)" do i=1,nT write (2,'(i3,f8.1,3f10.5)') i,temper(i),rmsave(i), & fave(i),frac(i) enddo c do i=10,30 c do k=10,30 c weight(6)=0.1d0*i c weight(1)=0.1d0*k c write (2,'(i5,2x,a4,f10.5,i5)') c & (j,ename(j),weight(j),iweight(j),j=1,nene) c call funclik(nene,weight,nf,f,uiparm,rmsave,fdum) c write (2,*) "f",f c enddo c enddo stop end c------------------------------------------------------------------------------- subroutine funclik(n,x,nf,f,uiparm,rmsave,ufparm) implicit none include "DIMENSIONS" include "COMMON.CALC" character*8 ename(maxene) common /names/ ename integer n,nf double precision f,loglik,chisq double precision x(n) integer uiparm double precision ufparm external ufparm double precision ww(maxene),sumlik(maxT),rmsave(maxT) integer it,i,j,k double precision beta,over,boltz,sumQ,ener(maxconf),emin,ee,enel, & sumover,eboltz call x2w(n,x) loglik=0.0d0 chisq=0.0d0 do iT=1,nT do i=1,nene ww(i)=weight(i)*ft(iweight(i),iT) enddo c write (2,*) "iT",iT," temper",temper(iT)," beta",beta c write (2,'(i5,2x,a4,2f10.5,i5,f10.5)') c & (i,ename(i),weight(i),ww(i),iweight(i),ft(iweight(i),iT), c & i=1,n) beta=1.0d0/(temper(iT)*1.987D-3) c write (2,*) "beta",beta emin=1.0d10 do i=1,nconf enel=0.0d0 do j=1,nnbase c write (2,*) c & i,j,sig0(j),(weightel(3*(j-1)+k),eletb(3*(j-1)+k,i),k=1,3) enel=enel+weightel(3*(j-1)+1)*sig0(j)**6*eletb(3*(j-1)+1,i) & +weightel(3*(j-1)+2)*sig0(j)**3*eletb(3*(j-1)+2,i) & +weightel(3*j)*sig0(j)**6*eletb(3*j,i) enddo c write (2,*) i,enel,enetb(6,i) enetb(6,i)=enel ener(i)=0.0d0 do j=1,nene ener(i)=ener(i)+ww(j)*enetb(j,i) enddo ee = ener(i)-entfac(i)/beta if (ee.lt.emin) emin=ee enddo rmsave(it)=0.0d0 sumlik(it)=0.0d0 fave(it)=0.0d0 sumQ=0.0d0 sumover=0.0d0 do i=1,nconf boltz=-beta*(ener(i)-emin)+entfac(i) eboltz=dexp(boltz) rmsave(iT)=rmsave(iT)+rmstab(i)*dexp(boltz) over=dexp(-0.5d0*rmstab(i)**2/sigma2) if (frac(iT).lt.0.5d0) over=1.0d0-over sumover=sumover+over c write (2,*) i,ener(i),entfac(i),rmstab(i),fpair(i),fdup(i), c & over,boltz,eboltz fave(iT)=fave(iT)+fdup(i)*eboltz sumQ=sumQ+eboltz sumlik(iT)=sumlik(iT)+over*boltz enddo fave(iT)=fave(iT)/sumq sumlik(it)=sumlik(iT)-dlog(sumQ)*sumover rmsave(iT)=rmsave(iT)/sumQ if (frac(iT).gt.0.95d0 .or. frac(iT).lt.0.05d0) then loglik=loglik-sumlik(iT) endif chisq=chisq+(frac(iT)-fave(iT))**2 c write (2,*) iT,temper(iT),rmsave(iT),sumlik(iT),sumQ,sumover, c & fave(iT),frac(iT) c call flush(2) enddo f = loglik/nconf+wsq*chisq c write (2,*) "loglik",loglik/nconf," chisq",chisq," f",f return end c------------------------------------------------------------------------------- subroutine grad(n,x,nf,g,uiparm,urparm,ufparm) implicit none integer n,nf,uiparm(1) double precision x(n),g(n),urparm(1),ufparm external ufparm integer i double precision xi,fplus,fminus,delta/1.0d-9/,delta2/2.0d-9/ do i=1,n xi=x(i) x(i)=xi+delta call funclik(n,x,nf,fplus,uiparm,urparm,ufparm) x(i)=xi-delta call funclik(n,x,nf,fminus,uiparm,urparm,ufparm) g(i)=(fplus-fminus)/delta2 c write(2,*) i,fplus,fminus,g(i) enddo return end c------------------------------------------------------------------------------- double precision function fdum() fdum=0.0d0 return end c------------------------------------------------------------------------------- logical function stopx(idum) integer idum stopx=.false. return end c------------------------------------------------------------------------------- subroutine x2w(n,x) include "DIMENSIONS" include "COMMON.CALC" double precision fabs integer n,i,ii double precision x(n) ii=0 do i=1,nene if (mask(i).gt.0) then ii=ii+1 weight(i)=fabs(x(ii)) endif enddo do i=1,nnbase if (maskel(3*(i-1)+1).gt.0) then ii=ii+1 weightel(3*(i-1)+1)=-fabs(x(ii)) endif if (maskel(3*(i-1)+2).gt.0) then ii=ii+1 weightel(3*(i-1)+2)=x(ii) endif if (maskel(3*i).gt.0) then ii=ii+1 weightel(3*i)=-fabs(x(ii)) endif enddo return end c------------------------------------------------------------------------------- subroutine w2x(n,x) include "DIMENSIONS" include "COMMON.CALC" integer n,i,ii double precision x(maxene+3*nnbase) ii=0 do i=1,nene c write (2,*) "i",i," mask",mask(i)," ii",ii if (mask(i).gt.0) then ii=ii+1 x(ii)=weight(i) endif enddo do i=1,3*nnbase c write (2,*) "i",i," maskel",maskel(i)," ii",ii if (maskel(i).gt.0) then ii=ii+1 x(ii)=weightel(i) endif enddo n=ii c write (2,*) "W2X: n=",n return end c------------------------------------------------------------------------------------ double precision function fabs(x) double precision x double precision a /100.0d0/ if (dabs(x).gt.1.0d-2) then fabs = dabs(x) else fabs = dlog(dexp(a*x)+dexp(-a*x))/a endif return end