C ********************************************************************** C * PDB C=********************************************************************** C=* From: SPIDER - MODULAR IMAGE PROCESSING SYSTEM * C=* Copyright (C)2004, P. A. Penczek * C=* * C=* University of Texas - Houston Medical School * C=* Email: pawel.a.penczek@uth.tmc.edu * C=* * C=* This program is free software; you can redistribute it and/or * C=* modify it under the terms of the GNU General Public License as * C=* published by the Free Software Foundation; either version 2 of the * C=* License, or (at your option) any later version. * C=* * C=* This program is distributed in the hope that it will be useful, * C=* but WITHOUT ANY WARRANTY; without even the implied warranty of * C=* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * C=* General Public License for more details. * C=* * C=* You should have received a copy of the GNU General Public License * C=* along with this program; if not, write to the * C=* Free Software Foundation, Inc., * C=* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * C=* * C=********************************************************************** SUBROUTINE PDB INCLUDE 'CMBLOCK.INC' IF (FCHAR(4:6) .EQ. 'CG3') THEN C ------------------------- 'PDB GRAVITY' CALL PDBCG3 ELSEIF (FCHAR(4:5) .EQ. 'IF') THEN C ------------------------- 'GET PDB FILE PARAMETERS' CALL PDBIF ELSEIF (FCHAR(4:5) .EQ. 'SH') THEN C ------------------------- 'PDB SHIFT CALL PDBSH ELSEIF (FCHAR(4:7) .EQ. 'RT3A') THEN C ------------------------- 'PDB ROTATE AROUND AN ARBITRARY POINT CALL PDBRT3A ELSEIF (FCHAR(4:7) .EQ. 'RT3L') THEN C ------------------------- 'PDB ROTATE AROUND A LINE DEFINED by Two points CALL PDBRT3L ELSEIF (FCHAR(4:6) .EQ. 'RT3') THEN C ------------------------- 'PDB ROTATE AROUND AN ARBITRARY POINT CALL PDBRT3 ELSEIF (FCHAR(4:6) .EQ. 'STP') THEN C ------------------------- 'COPY SPIDER COORDINATES TO PDB FORMAT' CALL SPTOPDB ELSEIF (FCHAR(4:6) .EQ. 'PTS') THEN C ------------------------- 'COPY PDB FILE TO SPIDER FORMAT' CALL PDBTOSP ENDIF END C ********************************************************************** SUBROUTINE PDBSH INCLUDE 'CMLIMIT.INC' INCLUDE 'CMBLOCK.INC' CHARACTER (LEN=MAXNAM) :: PDBFILE,TRFILE CHARACTER *80 RECLIN,HEAD*10, NULL*1,ATOM*4,RESIDUE*3 LOGICAL EX,FLAGCELLDIM,FLAGATOM,ZNUM,COMBIND DATA LUN2,LUN3/25,26/ NATOM = 1 LENREC = 0 CALL OPAUXFILE(.TRUE.,PDBFILE,NULL,LUN2,LENREC,'O', & 'PDB INPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN CALL OPAUXFILE(.TRUE.,PDBFILE,NULL,LUN3,LENREC,'N', & 'PDB OUTPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN CALL RDPRM3S(SXT,SYT,SZT,NOT_USED, & 'SHIFT IN ANGSTROMS SXT, SYT, SZT: ',IRTFLG) C CHANGE COORDINATE SYSTEM SX = SYT SY = SXT SZ = -SZT 70 READ(LUN2,30) RECLIN 30 FORMAT(A80) IF (RECLIN(1:4) .NE. 'ATOM' .AND. & RECLIN(1:4) .NE. 'END' .AND. & RECLIN(1:4) .NE. 'TER' ) THEN WRITE(LUN3,30) RECLIN GOTO 70 ELSEIF (RECLIN(1:4) .EQ. 'ATOM') THEN READ(RECLIN,75) HEAD,N,ATOM,NULL,RESIDUE,NULL,NR2, & NULL,XO,YO,ZO, & OCCUPANCY,TEMPERATURE,N 75 FORMAT(A6,I5,1X,A4,A1,A3,1X,A1,I4,A1,3X,3F8.3,2F6.2,1X,I3) X = XO + SX Y = YO + SY Z = ZO + SZ C REMOVED ALTERATION DEC 07 al C ALTERED NOV 07 al AFTER RECEIVING BUG REPORT C TEMP = X C X = Y C Y = TEMP C Z = -Z WRITE(RECLIN(7:11),80) NATOM 80 FORMAT(I5) NATOM = NATOM + 1 WRITE(RECLIN(31:54),85) X,Y,Z 85 FORMAT(3F8.3) WRITE(LUN3,30) RECLIN GOTO 70 ELSEIF (RECLIN(1:3) .EQ. 'TER') THEN WRITE(RECLIN(7:11),80)NATOM WRITE(LUN3,30)RECLIN NATOM = NATOM+1 GOTO 70 ELSEIF (RECLIN(1:3) .EQ. 'END') THEN WRITE(LUN3,30)RECLIN GOTO 999 ELSE GOTO 70 ENDIF 999 CLOSE(LUN2) CLOSE(LUN3) END C ********************************************************************** C* C*Rotate PDB file around an arbitrary center C* C******************************************** SUBROUTINE PDBRT3A INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' CHARACTER (LEN=MAXNAM) :: PDBFILE,TRFILE CHARACTER *80 RECLIN,HEAD*10, NULL*1,ATOM*4,RESIDUE*3 LOGICAL EX,FLAGCELLDIM,FLAGATOM,ZNUM,COMBIND DOUBLE PRECISION RM(3,3) DATA LUN2,LUN3/25,26/ NATOM=1 LENREC=0 CALL OPAUXFILE(.TRUE.,PDBFILE,NULL,LUN2,LENREC,'O', & 'PDB INPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN CALL OPAUXFILE(.TRUE.,PDBFILE,NULL,LUN3,LENREC,'N', & 'PDB OUTPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN CALL RDPRM3S(PHI,THETA,PSI,NOT_USED, & 'ROTATION ANGLE IN DEGREES PHI, THETA, PSI: ',IRTFLG) CALL BLDR(RM,PSI,THETA,PHI) CALL RDPRM3S(XC,YC,ZC,NOT_USED, & 'CENTER OF ROTATION IN ANGSTROMS X,Y,Z: ',IRTFLG) 70 READ(LUN2,30) RECLIN 30 FORMAT(A80) IF (RECLIN(1:4) .NE. 'ATOM' .AND. & RECLIN(1:4).NE.'END'.AND. & RECLIN(1:4).NE.'TER' ) THEN WRITE(LUN3,30) RECLIN GOTO 70 ELSEIF (RECLIN(1:4) .EQ. 'ATOM') THEN READ(RECLIN,75) HEAD,N,ATOM,NULL,RESIDUE,NULL,NR2, & NULL,XO,YO,ZO, & OCCUPANCY,TEMPERATURE,N 75 FORMAT(A6,I5,1X,A4,A1,A3,1X,A1,I4,A1,3X,3F8.3,2F6.2,1X,I3) C WRITE(*,*) XO,YO,ZO C CHANGE COORDINATE SYSTEM W = XO XO = YO YO = W ZO = -ZO XO = XO-XC YO = YO-YC ZO = ZO-ZC C AFTER ROTATION CHANGE IT BACK, THAT'S WHY THE ORDER OF C X,Y IS CHANGED AND Z HAS INVERTED SIGN Y = RM(1,1)*XO+RM(1,2)*YO+RM(1,3)*ZO+XC X = RM(2,1)*XO+RM(2,2)*YO+RM(2,3)*ZO+YC Z = -(RM(3,1)*XO+RM(3,2)*YO+RM(3,3)*ZO+ZC) WRITE(RECLIN(7:11),80) NATOM 80 FORMAT(I5) NATOM = NATOM+1 WRITE(RECLIN(31:54),85) X,Y,Z 85 FORMAT(3F8.3) WRITE(LUN3,30)RECLIN GOTO 70 ELSEIF (RECLIN(1:3) .EQ. 'TER') THEN WRITE(RECLIN(7:11),80)NATOM WRITE(LUN3,30)RECLIN NATOM = NATOM + 1 GOTO 70 ELSEIF (RECLIN(1:3) .EQ. 'END') THEN WRITE(LUN3,30)RECLIN GOTO 999 ELSE GOTO 70 ENDIF 999 CLOSE(LUN2) CLOSE(LUN3) END C ********************************************************************** C* C*Rotate PDB file around a line defined by two points in 3D space C* C******************************************** SUBROUTINE PDBRT3L INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' CHARACTER (LEN=MAXNAM) :: PDBFILE,TRFILE CHARACTER *80 RECLIN,HEAD*10, NULL*1,ATOM*4,RESIDUE*3 LOGICAL EX,FLAGCELLDIM,FLAGATOM,ZNUM,COMBIND DOUBLE PRECISION RM(3,3),R1(3,3),R2(3,3),R3(3,3) DATA LUN2,LUN3/25,26/ NATOM = 1 LENREC = 0 CALL OPAUXFILE(.TRUE.,PDBFILE,NULL,LUN2,LENREC,'O', & 'PDB INPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN 30 FORMAT(A80) CALL OPAUXFILE(.TRUE.,PDBFILE,NULL,LUN3,LENREC,'N', & 'PDB OUTPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN CALL RDPRM1S(ALPHA,NOT_USED,'ROTATION ANGLE ALPHA',IRTFLG) CALL RDPRM3S(X1,Y1,Z1,NOT_USED, & 'FIRST POINT DEFINING ROTATION AXIS IN ANGSTROMS X,Y,Z', & IRTFLG) CALL RDPRM3S(X2,Y2,Z2,NOT_USED, & 'SECOND POINT DEFINING ROTATION AXIS IN ANGSTROMS X,Y,Z', & IRTFLG) XX = X2-X1 YY = Y2-Y1 ZZ = Z2-Z1 PSI = -ATAN2D(YY,XX) THETA = ATAN2D(ZZ,SQRT(XX*XX+YY*YY)) CALL BLDR(R1,PSI,THETA,90.0) CALL BLDR(R2,0.0,ALPHA,0.0) C -1 C R U(ALPHA) R DO 11 I=1,3 DO 11 J=1,3 R3(J,I)=0.0 DO 11 K=1,3 11 R3(J,I)=R3(J,I)+R2(K,I)*R1(J,K) DO 12 I=1,3 DO 12 J=1,3 RM(J,I)=0.0 DO 12 K=1,3 12 RM(J,I)=RM(J,I)+R1(I,K)*R3(J,K) 70 READ(LUN2,30) RECLIN IF (RECLIN(1:4) .NE. 'ATOM' .AND. & RECLIN(1:4) .NE. 'END' .AND. & RECLIN(1:4) .NE. 'TER' ) THEN WRITE(LUN3,30) RECLIN GOTO 70 ELSEIF (RECLIN(1:4) .EQ. 'ATOM') THEN READ(RECLIN,75) HEAD,N,ATOM,NULL,RESIDUE,NULL,NR2, & NULL,XO,YO,ZO, & OCCUPANCY,TEMPERATURE,N 75 FORMAT(A6,I5,1X,A4,A1,A3,1X,A1,I4,A1,3X,3F8.3,2F6.2,1X,I3) C WRITE(*,*) XO,YO,ZO C CHANGE COORDINATE SYSTEM W = XO XO = YO YO = W ZO = -ZO XO = XO-X1 YO = YO-Y1 ZO = ZO-Z1 C AFTER ROTATION CHANGE IT BACK, THAT'S WHY THE ORDER OF X,Y IS CHANGED C AND Z HAS INVERTED SIGN Y=RM(1,1)*XO+RM(1,2)*YO+RM(1,3)*ZO+X1 X=RM(2,1)*XO+RM(2,2)*YO+RM(2,3)*ZO+Y1 Z=-(RM(3,1)*XO+RM(3,2)*YO+RM(3,3)*ZO+Z1) WRITE(RECLIN(7:11),80) NATOM 80 FORMAT(I5) NATOM = NATOM+1 WRITE(RECLIN(31:54),85) X,Y,Z 85 FORMAT(3F8.3) WRITE(LUN3,30)RECLIN GOTO 70 ELSEIF (RECLIN(1:3) .EQ. 'TER') THEN WRITE(RECLIN(7:11),80)NATOM WRITE(LUN3,30)RECLIN NATOM = NATOM + 1 GOTO 70 ELSEIF (RECLIN(1:3) .EQ. 'END') THEN WRITE(LUN3,30)RECLIN GOTO 999 ELSE GOTO 70 ENDIF 999 CLOSE(LUN2) CLOSE(LUN3) END C ********************************************************************** C* C* Copy SPIDER document file to a PDB file C* C******************************************** SUBROUTINE SPTOPDB INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' CHARACTER (LEN=MAXNAM) :: PDBFILE,TRFILE CHARACTER *95 RECLIN,HEAD*10, NULL*1,ATOM*4 CHARACTER *95 ANAM*4,RESIDUE*3,PHEAD*5,SENQ*1 LOGICAL EX,FLAGCELLDIM,FLAGATOM,ZNUM,COMBIND DATA LUN2,LUN3/25,26/ OPEN(99,FILE='ttt') PHEAD='ATOM ' LENREC = 0 30 FORMAT(A80) CALL OPAUXFILE(.TRUE.,PDBFILE,NULL,LUN2,LENREC,'O', & 'SPIDER INPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN CALL OPAUXFILE(.TRUE.,PDBFILE,NULL,LUN3,LENREC,'N', & 'PDB OUTPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN NCOUNT=0 DO 55 READ(LUN2,30,END=701) TRFILE IF (TRFILE(1:2) .EQ.' ;') GOTO 55 READ(TRFILE,33)NATOM,MMM,XO,YO,ZO,CATOM,TEMPERATURE,XSEN,XNUL cc==decoding INUL=INT(XNUL) IRES=INT(CATOM/10000.) NR2=INT(XSEN/1000.) ISEN=INT(REAL(MOD(INT(XSEN),1000))/10.) OCCUPANCY=REAL(MOD(INT(XSEN),2)) IF (IRES.EQ.1) THEN RESIDUE='LEU' ElSEIF (IRES.EQ.2) THEN RESIDUE='THR' ELSEIF (IRES.EQ.3) THEN RESIDUE='GLY' ELSEIF (IRES.EQ.4) THEN RESIDUE='SER' ELSEIF (IRES.EQ.5) THEN RESIDUE='VAL' ELSEIF (IRES.EQ.6) THEN RESIDUE='PHE' ELSEIF (IRES.EQ.7) THEN RESIDUE='ALA' ELSEIF (IRES.EQ.8) THEN RESIDUE='LYS' ELSEIF (IRES.EQ.9) THEN RESIDUE='ARG' ELSEIF (IRES.EQ.10) THEN RESIDUE='PRO' ELSEIF (IRES.EQ.11) THEN RESIDUE='TAU' ELSEIF (IRES.EQ.12) THEN RESIDUE='HIS' ELSEIF (IRES.EQ.13) THEN RESIDUE='GLU' ELSEIF (IRES.EQ.14) THEN RESIDUE='GLY' ELSEIF (IRES.EQ.15) THEN RESIDUE='TYR' ELSEIF (IRES.EQ.16) THEN RESIDUE='CYS' ELSEIF (IRES.EQ.17) THEN RESIDUE='TRY' ELSEIF (IRES.EQ.18) THEN RESIDUE='ISO' ELSEIF (IRES.EQ.19) THEN RESIDUE='MET' ELSEIF (IRES.EQ.20) THEN RESIDUE='ILE' ENDIF cc IF (isen.EQ.1) THEN SENQ='A' ELSEIF (isen.EQ.2) THEN SENQ='B' ELSEIF (isen.EQ.3) THEN SENQ='C' ELSEIF (isen.EQ.4) THEN SENQ='D' ELSEIF (isen.EQ.5) THEN SENQ='E' ELSEIF (isen.EQ.6) THEN SENQ='F' ELSEIF (isen.EQ.7) THEN SENQ='G' ELSEIF (isen.EQ.8) THEN SENQ='H' ELSEIF (isen.EQ.9) THEN SENQ='I' ELSEIF (isen.EQ.10) THEN SENQ='J' ELSEIF (isen.EQ.11) THEN SENQ='K' ELSEIF (isen.EQ.12) THEN SENQ='L' ELSEIF (isen.EQ.13) THEN SENQ='M' ELSEIF (isen.EQ.14) THEN SENQ='N' ELSEIF (isen.EQ.15) THEN SENQ='O' ELSEIF (isen.EQ.16) THEN SENQ='P' ELSEIF (isen.EQ.17) THEN SENQ='Q' ENDIF C IF (INUL.EQ.0) THEN NULL=' ' ELSEIF (INUL.EQ.1) THEN NULL='A' ELSEIF (INUL.EQ.2) THEN NULL='B' ELSEIF (INUL.EQ.3) THEN NULL='C' ELSEIF (INUL.EQ.4) THEN NULL='D' ELSEIF (INUL.EQ.5) THEN NULL='E' ELSEIF (INUL.EQ.6) THEN NULL='F' ELSEIF (INUL.EQ.7) THEN NULL='G' ELSEIF (INUL.EQ.8) THEN NULL='H' ELSEIF (INUL.EQ.9) THEN NULL='I' ELSEIF (INUL.EQ.10) THEN NULL='J' ELSEIF (INUL.EQ.11) THEN NULL='K' ELSEIF (INUL.EQ.12) THEN NULL='L' ELSEIF (INUL.EQ.13) THEN NULL='M' ELSEIF (INUL.EQ.14) THEN NULL='N' ELSEIF (INUL.EQ.15) THEN NULL='O' ELSEIF (INUL.EQ.16) THEN NULL='P' ELSEIF (INUL.EQ.17) THEN NULL='Q' ELSEIF (INUL.EQ.18) THEN NULL='R' ELSEIF (INUL.EQ.19) THEN NULL='S' ELSEIF (INUL.EQ.20) THEN NULL='T' ELSEIF (INUL.EQ.21) THEN NULL='U' ELSEIF (INUL.EQ.22) THEN NULL='V' ELSE NULL=' ' ENDIF NCATOM = INT(REAL(MOD(INT(CATOM),10000))/100.) NPOS = MOD(INT(CATOM),100) IF (NCATOM.EQ.1) THEN ANAM=' H ' ELSEIF (NCATOM.EQ.6) THEN IF (NPOS.EQ.0) THEN ANAM=' C ' ELSEIF (NPOS.EQ.1) THEN ANAM=' CA ' ELSEIF (NPOS.EQ.2) THEN ANAM=' CB ' ELSEIF (NPOS.EQ.3) THEN ANAM=' CE1' ELSEIF (NPOS.EQ.4) THEN ANAM=' CE2' ELSEIF (NPOS.EQ.5) THEN ANAM=' CD ' ELSEIF (NPOS.EQ.6) THEN ANAM=' CD1' ELSEIF (NPOS.EQ.7) THEN ANAM=' CD2' ELSEIF (NPOS.EQ.8) THEN ANAM=' CG ' ELSEIF (NPOS.EQ.9) THEN ANAM=' CG1' ELSEIF (NPOS.EQ.10) THEN ANAM=' CG2' ENDIF ELSEIF (NCATOM.EQ.7) THEN IF (NPOS.EQ.0) THEN ANAM=' N ' ELSEIF (NPOS.EQ.1) THEN ANAM=' N1' ELSEIF (NPOS.EQ.2) THEN ANAM=' NH2' ELSEIF (NPOS.EQ.3) THEN ANAM=' NE2' ELSEIF (NPOS.EQ.4) THEN ANAM=' NZ ' ENDIF ELSEIF (NCATOM.EQ.8) THEN IF (NPOS.EQ.0) THEN ANAM=' O ' ELSEIF (NPOS.EQ.1) THEN ANAM=' OH' ELSEIF (NPOS.EQ.2) THEN ANAM=' OE1' ELSEIF (NPOS.EQ.3) THEN ANAM=' OE2' ELSEIF (NPOS.EQ.4) THEN ANAM=' OG1' ELSEIF (NPOS.EQ.5) THEN ANAM=' OD1' ELSEIF (NPOS.EQ.6) THEN ANAM=' OXT' ENDIF ELSEIF (NCATOM.EQ.16) THEN IF (NPOS.EQ.0) THEN ANAM=' S ' ELSEIF (NPOS.EQ.1) THEN ANAM=' SG ' ELSEIF (NPOS.EQ.2) THEN ANAM=' SD ' ENDIF ENDIF NCOUNT=NCOUNT+1 WRITE(98,*)XNUL,INUL WRITE(LUN3,76)PHEAD,NCOUNT,ANAM,RESIDUE,SENQ,NR2, & NULL,XO,YO,ZO, & OCCUPANCY, TEMPERATURE,ANAM(2:2) 76 FORMAT(A5,1X,I5,1X,A4,1X,A3,1X,A1,I4,1A,3X,3F8.3,2F6.2, & ' ',1A) IF (NCATOM.EQ.8.AND.NPOS.EQ.6) THEN NCOUNT=NCOUNT+1 WRITE(LUN3,77)NCOUNT,RESIDUE,SENQ,NR2 ENDIF 77 FORMAT('TER ',I5,6X,A3,1X,A1,I4) ENDDO 33 FORMAT(I5,1X,I1,7G12.6) 701 WRITE(LUN3,62) 62 FORMAT('END') CLOSE(LUN2) CLOSE(LUN3) CLOSE(99) END C ********************************************************************** C* C* Copy PDB file to a SPIDER document file C* C******************************************** SUBROUTINE PDBTOSP INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' PARAMETER (NLIST=8) REAL DLIST(NLIST) CHARACTER (LEN=MAXNAM) :: PDBFILE,TRFILE CHARACTER *95 RECLIN,HEAD*10, NULL*1,ATOM*4,RESIDUE*3 CHARACTER *95 NULL1*1,NULL2*1 LOGICAL EX,FLAGCELLDIM,FLAGATOM,ZNUM,COMBIND DATA LUN2,LUN3/25,26/ 30 FORMAT(A95) LENREC = 0 CALL OPAUXFILE(.TRUE.,PDBFILE,NULL,LUN2,LENREC,'O', & 'PDB INPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN 31 FORMAT(' ; ',A60) NATOM=0 70 READ(LUN2,30) RECLIN IF (RECLIN(1:4) .EQ. 'ATOM') THEN READ(RECLIN,75)HEAD,N,ATOM,NULL,RESIDUE,NULL1,NR2, & NULL2,XO,YO,ZO, & OCCUPANCY,TEMPERATURE,N 75 FORMAT(A6,I5,1X,A4,A1,A3,1X,A1,I4,A1,3X,3F8.3,2F6.2,1X,I3) C I AM NOT SURE ABOUT THE NEXT LINE.... C IF (OCCUPANCY.GE.1) THEN IF (ATOM(2:2) .EQ. 'H') THEN VATOM=100. CCarbon ELSEIF (ATOM(2:2) .EQ. 'C') THEN VATOM=600. IF (ATOM(3:3).EQ.'A') THEN VATOM=601 ELSEIF (ATOM(3:3).EQ.'B') THEN VATOM=602 ELSEIF (ATOM(3:4).EQ.'E1')THEN VATOM=603 ELSEIF (ATOM(3:4).EQ.'E2') THEN VATOM=604 ELSEIF (ATOM(3:3).EQ.'D') THEN VATOM=605 ELSEIF (ATOM(3:4).EQ.'D1') THEN VATOM=606 ELSEIF (ATOM(3:4).EQ.'D2') THEN VATOM=607 ELSEIF (ATOM(3:3).EQ.'G') THEN VATOM=608 ELSEIF (ATOM(3:4).EQ.'G1') THEN VATOM=609 ELSEIF (ATOM(3:4).EQ.'G2') THEN VATOM=610 ELSEIF (ATOM(3:3).EQ.'Z') THEN VATOM=611 ENDIF CNitrogen ELSEIF (ATOM(2:2) .EQ. 'N') THEN VATOM=700. IF (ATOM(3:4).EQ.'H1') THEN VATOM=701 ELSEIF (ATOM(3:4).EQ.'H2') THEN VATOM=702. ELSEIF (ATOM(3:3).EQ.'E')THEN VATOM=703. ELSEIF (ATOM(3:4).EQ.'E2') THEN VATOM=704. ELSEIF (ATOM(3:3).EQ.'Z') THEN VATOM=705. ENDIF CS ELSEIF (ATOM(2:2) .EQ. 'S') THEN VATOM=1600. IF (ATOM(3:3).EQ.'G') THEN VATOM=1601. ELSEIF (ATOM(3:3).EQ.'D') THEN VATOM=1602. ENDIF CP ELSEIF (ATOM(2:2) .EQ. 'P') THEN VATOM=1500. COxygen ELSEIF (ATOM(2:2) .EQ. 'O') THEN VATOM=800. IF (ATOM(3:3) .EQ. 'H') THEN VATOM=801. ELSEIF (ATOM(3:4) .EQ. 'E1') THEN VATOM=802. ELSEIF (ATOM(3:4) .EQ. 'E2') THEN VATOM=803. ELSEIF (ATOM(3:4) .EQ. 'G1') THEN VATOM=804. ELSEIF (ATOM(3:4) .EQ. 'D1') THEN VATOM=805. ELSEIF (ATOM(3:4) .EQ. 'XT') THEN VATOM=806. ENDIF ENDIF CResidue IF (RESIDUE(1:3).EQ.'LEU') THEN IRES=1 ElSEIF (RESIDUE(1:3).EQ.'THR') THEN IRES=2 ELSEIF (RESIDUE(1:3).EQ.'GLY') THEN IRES=3 ELSEIF (RESIDUE(1:3).EQ.'SER') THEN IRES=4 ELSEIF (RESIDUE(1:3).EQ.'VAL') THEN IRES=5 ELSEIF (RESIDUE(1:3).EQ.'PHE') THEN IRES=6 ELSEIF (RESIDUE(1:3).EQ.'ALA') THEN IRES=7 ELSEIF (RESIDUE(1:3).EQ.'LYS') THEN IRES=8 ELSEIF (RESIDUE(1:3).EQ.'ARG') THEN IRES=9 ELSEIF (RESIDUE(1:3).EQ.'PRO') THEN IRES=10 ELSEIF (RESIDUE(1:3).EQ.'TAU') THEN IRES=11 ELSEIF (RESIDUE(1:3).EQ.'HIS') THEN IRES=12 ELSEIF (RESIDUE(1:3).EQ.'GLU') THEN IRES=13 ELSEIF (RESIDUE(1:3).EQ.'GLY') THEN IRES=14 ELSEIF (RESIDUE(1:3).EQ.'TYR') THEN IRES=15 ELSEIF (RESIDUE(1:3).EQ.'CYS') THEN IRES=16 ELSEIF (RESIDUE(1:3).EQ.'TRY') THEN IRES=17 ELSEIF (RESIDUE(1:3).EQ.'ISO') THEN IRES=18 ELSEIF (RESIDUE(1:3).EQ.'MET') THEN IRES=19 ELSEIF (RESIDUE(1:3).EQ.'ILE') THEN IRES=20 ENDIF CCSequence IF (NULL1(1:1).EQ.'A') THEN ISEN=1 ELSEIF (NULL1(1:1).EQ.'B') THEN ISEN=2 ELSEIF (NULL1(1:1).EQ.'C') THEN ISEN=3 ELSEIF (NULL1(1:1).EQ.'D') THEN ISEN=4 ELSEIF (NULL1(1:1).EQ.'E') THEN ISEN=5 ELSEIF (NULL1(1:1).EQ.'F') THEN ISEN=6 ELSEIF (NULL1(1:1).EQ.'G') THEN ISEN=7 ELSEIF (NULL1(1:1).EQ.'H') THEN ISEN=8 ELSEIF (NULL1(1:1).EQ.'I') THEN ISEN=9 ELSEIF (NULL1(1:1).EQ.'J') THEN ISEN=10 ELSEIF (NULL1(1:1).EQ.'K') THEN ISEN=11 ELSEIF (NULL1(1:1).EQ.'L') THEN ISEN=12 ELSEIF (NULL1(1:1).EQ.'M') THEN ISEN=13 ELSEIF (NULL1(1:1).EQ.'N') THEN ISEN=14 ELSEIF (NULL1(1:1).EQ.'O') THEN ISEN=15 ELSEIF (NULL1(1:1).EQ.'P') THEN ISEN=16 ELSEIF (NULL1(1:1).EQ.'Q') THEN ISEN=17 ENDIF IF (NULL2.EQ.' ') THEN INUL=0 ELSEIF (NULL2.EQ.'A') THEN INUL=1 ELSEIF (NULL2.EQ.'B') THEN INUL=2 ELSEIF (NULL2.EQ.'C') THEN INUL=3 ELSEIF (NULL2.EQ.'D') THEN INUL=4 ELSEIF (NULL2.EQ.'E') THEN INUL=5 ELSEIF (NULL2.EQ.'F') THEN INUL=6 ELSEIF (NULL2.EQ.'G') THEN INUL=7 ELSEIF (NULL2.EQ.'H') THEN INUL=8 ELSEIF (NULL2.EQ.'I') THEN INUL=9 ELSEIF (NULL2.EQ.'J') THEN INUL=10 ELSEIF (NULL2.EQ.'K') THEN INUL=11 ELSEIF (NULL2.EQ.'L') THEN INUL=12 ELSEIF (NULL2.EQ.'M') THEN INUL=13 ELSEIF (NULL2.EQ.'N') THEN INUL=14 ELSEIF (NULL2.EQ.'O') THEN INUL=15 ELSEIF (NULL2.EQ.'P') THEN INUL=16 ELSEIF (NULL2.EQ.'Q') THEN INUL=17 ELSEIF (NULL2.EQ.'R') THEN INUL=18 ELSEIF (NULL2.EQ.'S') THEN INUL=19 ELSEIF (NULL2.EQ.'T') THEN INUL=20 ELSEIF (NULL2.EQ.'U') THEN INUL=21 ELSEIF (NULL2.EQ.'V') THEN INUL=22 ENDIF NATOM=NATOM+1 DLIST(1)=NATOM DLIST(2)=XO DLIST(3)=YO DLIST(4)=ZO DLIST(5)=IRES*10000.+VATOM DLIST(6)=TEMPERATURE DLIST(7)=NR2*1000.+ISEN*10.+occupancy DLIST(8)=INUL CALL SAVD(LUN3,DLIST,NLIST,IRTFLG) GOTO 70 ELSEIF (RECLIN(1:3) .EQ. 'END') THEN CLOSE(LUN2) CALL SAVDC CLOSE(LUN3) RETURN ELSE GOTO 70 ENDIF END C ********************************************************************** C* C* Calculate center of gravity of a PDB file C* C******************************************** SUBROUTINE PDBCG3 INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' REAL, ALLOCATABLE, DIMENSION (:) :: R_TMP CHARACTER (LEN=MAXNAM) :: PDBFILE,TRFILE CHARACTER *80 RECLIN,HEAD*10, NULL*1,ATOM*4,RESIDUE*3 LOGICAL EX,FLAGCELLDIM,FLAGATOM,ZNUM,COMBIND DATA LUN2,LUN3/25,26/ LENREC = 0 CALL OPAUXFILE(.TRUE.,PDBFILE,NULL,LUN2,LENREC,'O', & 'PDB INPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN NATOM=0 UX=0.0 UY=0.0 UZ=0.0 TMASS=0.0 70 READ(LUN2,30) RECLIN 30 FORMAT(A80) IF (RECLIN(1:6) .EQ. 'HEADER') THEN GOTO 70 ELSEIF (RECLIN(1:4) .EQ. 'ATOM') THEN READ(RECLIN,75) HEAD,N,ATOM,NULL,RESIDUE,NULL,NR2, & NULL,XO,YO,ZO, & OCCUPANCY,TEMPERATURE,N 75 FORMAT(A6,I5,1X,A4,A1,A3,1X,A1,I4,A1,3X,3F8.3,2F6.2,1X,I3) C WRITE(*,*) XO,YO,ZO C I AM NOT SURE ABOUT THE NEXT LINE.... IF (OCCUPANCY .GE. 1) THEN IF (ATOM(2:2) .EQ. 'H') THEN VATOM=1.0 ELSEIF (ATOM(2:2) .EQ. 'C') THEN VATOM=6.0 ELSEIF (ATOM(2:2) .EQ. 'N') THEN VATOM=7.0 ELSEIF (ATOM(2:2) .EQ. 'O') THEN VATOM=8.0 ELSEIF (ATOM(2:2) .EQ. 'S') THEN VATOM=16.0 ELSEIF (ATOM(2:2) .EQ. 'P') THEN VATOM=15.0 ELSEIF (ATOM(2:2) .EQ. 'X' .AND. ATOM(1:3) .EQ. 'OXT') & THEN C TRNA THREE PRIME TERMINAL VATOM=8.0 ELSE WRITE(*, *) 'SPECIAL ATOM ENCOUNTERED IN:' WRITE(*,*) RECLIN STOP ENDIF C VATOM = VATOM*OCCUPANCY ELSE VATOM=OCCUPANCY ENDIF TMASS=TMASS+VATOM UX=UX+XO*VATOM UY=UY+YO*VATOM UZ=UZ+ZO*VATOM NATOM=NATOM+1 GOTO 70 ELSEIF (RECLIN(1:3) .EQ. 'END') THEN UX=UX/TMASS UY=UY/TMASS UZ=UZ/TMASS WRITE(*,780) NATOM 780 FORMAT(' Number of atoms encountered:',I6) WRITE(*,781) UX,UY,UZ 781 FORMAT(' Center of gravity of PDB file',/,3(2x,g12.4)) C CHANGE COORDINATE SYSTEM SX = UY SY = UX SZ = -UZ WRITE(*,782) SX,SY,SZ 782 FORMAT(' Center of gravity of PDB file in SPIDER coords' & ,/,3(2x,g12.4)) ALLOCATE (R_TMP(6)) NREG = 7 R_TMP(1) = UX R_TMP(2) = UY R_TMP(3) = UZ R_TMP(4) = SX R_TMP(5) = SY R_TMP(6) = SZ R_TMP(7) = NATOM CALL REG_SET_NSELA(NREG,R_TMP,.FALSE.,IRTFLG) DEALLOCATE(R_TMP) CLOSE(LUN2) RETURN ELSE GOTO 70 ENDIF CLOSE(LUN2) END C ********************************************************************** C* C* Copy PDB file to a SPIDER document file C* C******************************************** SUBROUTINE PDBIF INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' PARAMETER (NLIST=4,NRG=6) REAL DLIST(NLIST) REAL DLIST1(NLIST) REAL R_TMP(NRG) CHARACTER (LEN=MAXNAM) :: PDBFILE,TRFILE CHARACTER *80 RECLIN,HEAD*10 CHARACTER *80 NULL*6,ATOM*4,RESIDUE*3 LOGICAL EX,FLAGCELLDIM,FLAGATOM,ZNUM,COMBIND DATA LUN2,LUN3/25,26/ LENREC=0 CALL OPAUXFILE(.TRUE.,PDBFILE,NULL,LUN2,LENREC,'O', & 'PDB INPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN 30 FORMAT(A80) 31 FORMAT(' ; ',A60) 33 FORMAT(A30) 35 FORMAT(A6,3(2X,F7.4),3F7.4) 36 FORMAT(A6,4X,3F10.4,5X,F10.4) 37 FORMAT(' ;',A21) NCOUNT=0 NATOM=0 NTERM=0 NHET=0 NPR=0 70 READ(LUN2,30) RECLIN IF ( RECLIN(1:4) .EQ. 'JRNL') THEN WRITE(*,30)RECLIN GOTO 70 ELSEIF (RECLIN(13:23) .EQ. 'FIT TO DATA') THEN WRITE(*,*) RECLIN(12:60) DO NPR=1,6 READ(LUN2,30) RECLIN WRITE(*,*)RECLIN(12:60) ENDDO GOTO 70 ELSEIF (RECLIN(13:21) .EQ. 'DATA USED') THEN WRITE(*,*) RECLIN(12:60) DO NPR=1,6 READ(LUN2,30) RECLIN WRITE(*,*)RECLIN(12:60) ENDDO GOTO 70 ELSEIF (RECLIN(14:20) .EQ. 'PROGRAM') THEN WRITE(*,*) 'USED PROGRAM',RECLIN(21:60) GOTO 70 ELSEIF (RECLIN(1:6) .EQ. 'CRYST1') THEN WRITE(*,*) RECLIN READ(RECLIN(1:54),35)NULL,DLIST(2:4),DLIST1(2:4) NCOUNT=NCOUNT+1 DLIST(1)=NCOUNT R_TMP(1:3)=DLIST(2:4) CALL SAVD(LUN3,DLIST,NLIST,IRTFLG) NCOUNT=NCOUNT+1 DLIST1(1)=NCOUNT DLIST(:)=DLIST1(:) CALL SAVD(LUN3,DLIST,NLIST,IRTFLG) GOTO 70 ELSEIF (RECLIN(1:3) .EQ. 'ORI') THEN NCOUNT=NCOUNT+1 DLIST(1)=NCOUNT READ(RECLIN,36)NULL,DLIST(2:4),XX CALL SAVD(LUN3,DLIST,NLIST,IRTFLG) GOTO 70 ELSEIF (RECLIN(1:3) .EQ. 'SCA') THEN NCOUNT=NCOUNT+1 DLIST(1)=NCOUNT READ(RECLIN,36)NULL,DLIST(2:4),XX CALL SAVD(LUN3,DLIST,NLIST,IRTFLG) GOTO 70 ELSEIF (RECLIN(1:4) .EQ. 'ATOM') THEN NATOM=NATOM+1 GOTO 70 ELSEIF (RECLIN(1:3) .EQ. 'TER') THEN NTERM=NTERM+1 GOTO 70 ELSEIF (RECLIN(1:3) .EQ. 'HET') THEN NHET=NHET+1 GOTO 70 ELSEIF (RECLIN(1:3) .EQ. 'END') THEN CLOSE(LUN2) NCOUNT=NCOUNT+1 DLIST(1)=NCOUNT DLIST(2)=NATOM DLIST(3)=NTERM DLIST(4)=NHET CALL SAVD(LUN3,DLIST,NLIST,IRTFLG) CALL SAVDC CLOSE(LUN3) XNATOM=REAL(NATOM) XNTERM=REAL(NTERM) XNHET=REAL(NHET) R_TMP(4)=XNATOM R_TMP(5)=xNTERM R_TMP(6)=XNHET CALL REG_SET_NSELA(NRG,R_TMP,.FALSE.,IRTFLG) RETURN ELSE GOTO 70 ENDIF END C ********************************************************************** SUBROUTINE PDBRT3 INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' CHARACTER (LEN=MAXNAM) :: PDBFILE,TRFILE CHARACTER *80 RECLIN,HEAD*10, NULL*1,ATOM*4,RESIDUE*3 LOGICAL EX,FLAGCELLDIM,FLAGATOM,ZNUM,COMBIND DOUBLE PRECISION RM(3,3) DATA LUN2,LUN3/25,26/ NATOM = 1 LENREC = 0 CALL OPAUXFILE(.TRUE.,PDBFILE,NULL,LUN2,LENREC,'O', & 'PDB INPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN CALL OPAUXFILE(.TRUE.,PDBFILE,NULL,LUN3,LENREC,'N', & 'PDB OUTPUT',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) RETURN CALL RDPRM3S(PHI, THETA, PSI,NOT_USED, & 'ROTATION ANGLES PHI, THETA, PSI: ',IRTFLG) CALL BLDR(RM,PSI,THETA,PHI) 70 READ(LUN2,30) RECLIN 30 FORMAT(A80) IF (RECLIN(1:4) .NE. 'ATOM' .AND. & RECLIN(1:4) .NE. 'END' .AND. & RECLIN(1:4) .NE. 'TER' ) THEN WRITE(LUN3,30) RECLIN GOTO 70 ELSEIF (RECLIN(1:4) .EQ. 'ATOM') THEN READ(RECLIN,75) HEAD,N,ATOM,NULL,RESIDUE,NULL,NR2, & NULL,XO,YO,ZO, & OCCUPANCY,TEMPERATURE,N 75 FORMAT(A6,I5,1X,A4,A1,A3,1X,A1,I4,A1,3X,3F8.3,2F6.2,1X,I3) C WRITE(*,*) XO,YO,ZO c CHANGE COORDINATE SYSTEM W = XO XO = YO YO = W ZO = -ZO C AFTER ROTATION CHANGE IT BACK, THAT'S WHY THE ORDER OF X,Y C IS CHANGED AND Z HAS INVERTED SIGN Y=RM(1,1)*XO+RM(1,2)*YO+RM(1,3)*ZO X=RM(2,1)*XO+RM(2,2)*YO+RM(2,3)*ZO Z=-(RM(3,1)*XO+RM(3,2)*YO+RM(3,3)*ZO) WRITE(RECLIN(7:11),80) NATOM 80 FORMAT(I5) NATOM=NATOM+1 WRITE(RECLIN(31:54),85) X,Y,Z 85 FORMAT(3F8.3) WRITE(LUN3,30)RECLIN GOTO 70 ELSEIF (RECLIN(1:3) .EQ. 'TER') THEN WRITE(RECLIN(7:11),80)NATOM WRITE(LUN3,30)RECLIN NATOM=NATOM+1 GOTO 70 ELSEIF (RECLIN(1:3) .EQ. 'END') THEN WRITE(LUN3,30)RECLIN GOTO 999 ELSE GOTO 70 ENDIF 999 CLOSE(LUN2) CLOSE(LUN3) END