C****************************************************************************** C MOVIE CREATION PROGRAM USING ANM EIGENVALUE/EIGENVECTOR OUTPUT C******************************************************************************* C VERSION 4 11/16/04 C WRITTEN AND ARRANGED BY TANER Z SEN C THE MATERIAL AND ASSISTANCE PROVIDED BY C ROBERT L. JERNIGAN, ANDRZEJ KLOCZKOWSKI C IVET BAHAR, YONGMEI WANG (YW wrote the original program) C******************************************************************************* C VARIABLES C******************************************************************************* PARAMETER(SITE=104) INTEGER I,LN,NEIG,IC,NSITE REAL X(SITE),Y(SITE),Z(SITE),W(SITE*3),V(SITE*3,SITE*3),WI,VIJ,SUM REAL FAC,BETA(SITE),SCA,DX(SITE),DY(SITE),DZ(SITE) CHARACTER*3 NNAM,CNAM(SITE),DUMMY3 CHARACTER*6 DUMMY6 CHARACTER*4 ATNAME,ANAME(SITE) CHARACTER*1 A1,CHA(SITE) CHARACTER*12 AA CHARACTER*30 FILEOUT REAL OCCUP(SITE*3),VMAX,VMAXIN,OCCUPMAX,OCCUPMAXIN,TOP,R1 INTEGER NMODE,D1INT,D2INT,ANUM(SITE),RNUM(SITE) OPEN(50,FILE='1hrc.pdb') OPEN(71,FILE='eigenvectors.txt') C******************************************************************************* C READ ALPHA CARBONS COORDINATES, AND B-FACTORS C******************************************************************************* 310 READ(50,'(A6)') DUMMY6 IF(DUMMY6.NE.'ATOM ') GOTO 310 BACKSPACE(50) ICA=1 320 READ(50,'(A6)') DUMMY6 IF(DUMMY6.NE.'ATOM ') THEN IF(DUMMY6.EQ.'END ') THEN GOTO 330 ELSE GOTO 320 ENDIF ENDIF BACKSPACE(50) READ(50,55) DUMMY6,D1INT,ATNAME,DUMMY3,A1,D2INT,XXX,YYY,ZZZ,R1,BBB IF(ATNAME.EQ.' CA ') THEN ANUM(ICA)=D1INT ANAME(ICA)=ATNAME CNAM(ICA)=DUMMY3 CHA(ICA)=A1 RNUM(ICA)=D2INT X(ICA)=XXX Y(ICA)=YYY Z(ICA)=ZZZ BETA(ICA)=BBB ICA=ICA+1 ENDIF GOTO 320 55 FORMAT(A6,I5,1X,A4,1X,A3,1X,A1,I4,4X,3F8.3,2F6.2) 330 IF(SITE.NE.(ICA-1)) THEN WRITE(*,*) 'THERE IS A PROBLEM WITH THE NUMBER OF RESIDUES!' WRITE(*,*) 'GIVEN RESNUM=',SITE,'CALCULATED RESNUM=',ICA-1 GOTO 666 ENDIF C******************************************************************************* C READING THE EIGENVALUES & EIGENVECTORS as created by ANM program C******************************************************************************* READ(71,*) LN, NEIG DO I=1,NEIG READ (71,*) W(I) ENDDO NSITE=LN/3 IF(NSITE.NE.SITE) THEN WRITE(*,*) 'NSITE is not equal to SITE' GOTO 666 ENDIF C THE FIRST SET OF DATA IS: J=1 AND THEN I=1,LN (V(1,1) V(2,1) etc. READ(71,*) ((V(I,j), I=1,LN),J=1,NEIG) C******************************************************************************* C CREATING THE MOVIE TO BE SHOWN IN VMD (freeware software) C http://www.ks.uiuc.edu/Research/vmd/ C******************************************************************************* C USER INPUT 10 WRITE(*,*) 'Which mode do you want to visualize?' WRITE(*,*) '(the first 6 modes correspond to zero eigenvalues, so' WRITE(*,*) ' 7 -> 1st slowest mode,' WRITE(*,*) ' 8 -> 2nd slowest mode, etc)' READ(*,*) NMODE WRITE(*,*) 'How many frames do you want? (e.g. 20)' WRITE(*,*) '(output is in -1 to +1 displacement using cosine)' READ(*,*) IFRAME WRITE(*,*) 'Enter amplification factor: (e.g. 5)' READ(*,*) AMP_FACTOR WRITE(*,*) 'Enter a filename for the output pdbfile: (e.g. "1agb.")' READ(*,'(a)') FILEOUT I=INDEX(FILEOUT,'.')-1 OPEN(12,FILE=FILEOUT(1:I)//".pdb") OPEN(13,FILE=FILEOUT(1:I)//"_FLUCTUATIONS.pdb") OPEN(14,FILE=FILEOUT(1:I)//"_COLOR.pdb") OPEN(15,FILE=FILEOUT(1:I)//"_FLUC.TXT") C ADJUSTING THE FLUCTUATION AMPLITUDES OCCUPMAX=0.0 VMAX=0.0 DO J=1,NSITE OCCUP(J)=v(3*J-2,NMODE)*v(3*J-2,NMODE)+v(3*J-1,NMODE)*v(3*J-1,NMODE) $ +v(3*J,NMODE)*v(3*J,NMODE) OCCUP(J)=OCCUP(J)/W(NMODE) IF(OCCUPMAX.LE.OCCUP(J)) OCCUPMAX=OCCUP(J) IF(VMAX.LE.ABS(v(3*J-2,NMODE))) VMAX=ABS(v(3*J-2,NMODE)) IF(VMAX.LE.ABS(v(3*J-1,NMODE))) VMAX=ABS(v(3*J-1,NMODE)) IF(VMAX.LE.ABS(v(3*J,NMODE))) VMAX=ABS(v(3*J,NMODE)) ENDDO WRITE(*,*) 'The largest fluctuation OCCUPMAX is',OCCUPMAX WRITE(*,*) 'If you want to change OCCUPMAX, put in a smaller value' READ(*,*) OCCUPMAXIN IF(OCCUPMAX.GT.OCCUPMAXIN) OCCUPMAX=OCCUPMAXIN WRITE(*,*) 'Largest VMAX absolute is',VMAX WRITE(*,*) 'If you want to adjust it, enter a smaller value' READ(*,*) VMAXIN IF(VMAX.GT.VMAXIN) VMAX=VMAXIN DO J=1,NSITE IF(OCCUP(J).GT.OCCUPMAX) THEN OCCUP(J)=1.0 ELSE OCCUP(J)=OCCUP(J)/OCCUPMAX ENDIF IF(ABS(V(3*J-2,NMODE)).GT.VMAX) THEN TOP=SIGN(VMAX,v(3*J-2,NMODE)) V(3*J-2,NMODE)=TOP ENDIF IF(ABS(V(3*J-1,NMODE)).GT.VMAX) THEN TOP=SIGN(VMAX,V(3*J-1,NMODE)) V(3*J-1,NMODE)=TOP ENDIF IF(ABS(V(3*j,NMODE)).GT.VMAX) THEN TOP=SIGN(VMAX,v(3*J,NMODE)) V(3*J,NMODE)=TOP ENDIF ENDDO C FOR EACH FRAME DO IFR=1,IFRAME+1 C CALCULATION OF COORDINATE CHANGES DURING MOTION XTEMP=(IFR-1)*3.14156/(IFRAME) IF(W(NMODE).GT.1.0E-05) THEN XTEMP=AMP_FACTOR*COS(XTEMP)/SQRT(W(NMODE)) ELSE WRITE(*,*) 'Please enter a non-zero eigenvalue!' GOTO 666 ENDIF DO J=1,NSITE DX(J)=V(3*J-2,NMODE)*XTEMP DY(J)=V(3*J-1,NMODE)*XTEMP DZ(J)=V(3*J,NMODE)*XTEMP ENDDO C WRITING COORDINATES TO A FILE IN PDB FORMAT DO I=1,NSITE WRITE(12,55) 'ATOM ',ANUM(I),ANAME(I),CNAM(I),CHA(I),RNUM(I), * X(I)+DX(I),Y(I)+DY(I),Z(I)+DZ(I),R1,BETA(I) ENDDO WRITE(12,'(a)')'END' C WRITING COORDINATES TO A FILE IN COLORFUL PDB FORMAT DO I=1,NSITE WRITE(14,55) 'ATOM ',ANUM(I),ANAME(I),CNAM(I),CHA(I),RNUM(I), * X(I)+DX(I),Y(I)+DY(I),Z(I)+DZ(I),R1, * (DX(I)**2+DY(I)**2+DZ(I)**2) ENDDO WRITE(14,'(a)')'END' ENDDO CLOSE(12) C THE FLUCTUATIONS ARE GIVEN IN THE B-FACTOR COLUMN DO I=1,NSITE IFR=1 XTEMP=(IFR-1)*3.14156/(IFRAME) XTEMP=AMP_FACTOR*COS(XTEMP)/SQRT(W(NMODE)) DX(I)=V(3*I-2,NMODE)*XTEMP DY(I)=V(3*I-1,NMODE)*XTEMP DZ(I)=V(3*I,NMODE)*XTEMP WRITE(13,55) 'ATOM ',ANUM(I),ANAME(I),CNAM(I),CHA(I),RNUM(I), * X(I)+DX(I),Y(I)+DY(I),Z(I)+DZ(I),R1, * (DX(I)**2+DY(I)**2+DZ(I)**2) WRITE(15,*) RNUM(I),(DX(I)**2+DY(I)**2+DZ(I)**2) ENDDO WRITE(13,'(a)')'END' C VISUALIZATION OF OTHERS MODES WRITE(*,*) 'Do you want to visualize another mode?' WRITE(*,*) 'Enter 1 for yes, any other DIGIT for no' READ(*,*) IANSWER IF(IANSWER.eq.1) GOTO 10 WRITE(*,*) 'Program finished successfully!' 666 STOP END