C ********************************************************************** C * C GETHEDCCP4 * * C * C ********************************************************************** C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM. AUTHOR: J.FRANK * C=* Copyright (C) 1985-2005 Health Research Inc. * C=* * C=* HEALTH RESEARCH INCORPORATED (HRI), * C=* ONE UNIVERSITY PLACE, RENSSELAER, NY 12144-3455. * C=* * C=* Email: spider@wadsworth.org * 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 ********************************************************************** C * C GETHEDCCP4(HEADBUF,NSAM,NROW,NSLICE,IMODE,DMIN,DMAX, C DMEAN,RMS,NSYMBT,ISSWABT,FLIP,MACHST,IRTFLG) C * C PURPOSE: DECODE CCP4 (MRC IMAGE 2000) HEADER * * C * C PARAMETERS: * C * C MAP/IMAGE HEADER FORMAT C C LENGTH = 1024 BYTES, ORGANIZED AS 56 LONG WORDS FOLLOWED C BY SPACE FOR 10 80 BYTE TEXT LABELS. C C 1 NX # OF COLUMNS (FASTEST CHANGING IN MAP) C 2 NY # OF ROWS C 3 NZ # OF SECTIONS (SLOWEST CHANGING IN MAP) C 4 MODE DATA TYPE C 0 IMAGE : SIGNED 8-BIT BYTES RANGE -128 * C TO 127 * C 1 IMAGE : 16-BIT HALFWORDS * C 2 IMAGE : 32-BIT REALS * C 3 TRANSFORM : COMPLEX 16-BIT INTEGERS * C 4 TRANSFORM : COMPLEX 32-BIT REALS * C 5 NXSTART NUMBER OF FIRST COLUMN IN MAP C 6 NYSTART NUMBER OF FIRST ROW IN MAP C 7 NZSTART NUMBER OF FIRST SECTION IN MAP C 8 MX NUMBER OF INTERVALS ALONG X C 9 MY NUMBER OF INTERVALS ALONG Y C 10 MZ NUMBER OF INTERVALS ALONG Z C 11-13 CELLA CELL DIMENSIONS IN ANGSTROMS C 14-16 CELLB CELL ANGLES IN DEGREES * C 17 MAPC WHICH AXIS CORRESPONDS TO COLUMNS (1,2,3 FOR X,Y,Z) C 18 MAPR WHICH AXIS CORRESPONDS TO ROWS (1,2,3 FOR X,Y,Z) C 19 MAPS WHICH AXIS CORRESPONDS TO SECTIONS (1,2,3 FOR X,Y,Z) C 20 DMIN MINIMUM DENSITY VALUE C 21 DMAX MAXIMUM DENSITY VALUE C 22 DMEAN MEAN DENSITY VALUE (AVERAGE) C 23 ISPG SPACE GROUP NUMBER 0 OR 1 (DEFAULT=0) C 24 NSYMBT NUMBER OF BYTES USED FOR SYMMETRY DATA (0 OR 80) C 25-49 EXTRA EXTRA, USER DEFINED STORAGE SPACE. 29 WORDS MAX. C 50-52 ORIGIN ORIGIN IN X,Y,Z USED FOR TRANSFORMS * C 53 MAP CHARACTER STRING 'MAP ' TO IDENTIFY FILE TYPE * C 54 MACHST MACHINE STAMP * C 55 RMS RMS DEVIATION OF MAP FROM MEAN DENSITY * C 56 NLABL NUMBER OF LABELS BEING USED * C 57-256 LABEL(20,10) 10 80-CHARACTER TEXT LABELS * C C SYMMETRY RECORDS FOLLOW - IF ANY - STORED AS TEXT AS IN INTERNATIONAL C TABLES, OPERATORS SEPARATED BY * AND GROUPED INTO 'LINES' OF 80 C CHARACTERS (IE. SYMMETRY OPERATORS DO NOT CROSS THE ENDS OF THE C 80-CHARACTER 'LINES' AND THE 'LINES' DO NOT TERMINATE IN A *). C C DATA RECORDS FOLLOW. C C23456789012345678901234567890123456789012345678901234567890123456789012 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC SUBROUTINE GETHEDCCP4(HEADBUF,NSAM,NROW,NSLICE,IMODE,DMIN,DMAX, & DMEAN,RMS,NSYMBT,ISSWABT,FLIP,MACHST,IRTFLG) INCLUDE 'CMBLOCK.INC' CHARACTER(LEN=200) :: CLABLS COMMON /COMMUN/ CLABLS DIMENSION HEADBUF(*) CHARACTER(LEN=4) :: MAP LOGICAL :: BIGENDARCH,BIGENDED,BIGENDFILE LOGICAL :: FLIP,ISSWABT CHARACTER(LEN=1), DIMENSION(3):: LXYZ DATA LXYZ/'X','Y','Z'/ C GET CURRENT ARCHITECTURE ENDED-NESS BIGENDARCH = BIGENDED(0) C GET CURRENT FILE ENDED-NESS FLAG CALL MVNFLIP(HEADBUF(17), MAPC, .FALSE.) CALL MVNFLIP(HEADBUF(18), MAPR, .FALSE.) CALL MVNFLIP(HEADBUF(19), MAPS, .FALSE.) BIGENDFILE = ((MAPC.EQ.1).OR.(MAPR.EQ.1).OR.(MAPS.EQ.1)) C IF FILE ENDEDNESS DIFFERS FROM THIS MACHINES MUST FLIP BYTES FLIP = (( .NOT. BIGENDFILE .AND. BIGENDARCH) .OR. & ( .NOT. BIGENDARCH .AND. BIGENDFILE)) C IF -byteswapio FLIP BYTES IS OPPOSITE IF (ISSWABT) FLIP = .NOT. FLIP C WRITE OUT CONVERSION INFORMATION IF (VERBOSE) THEN IF (BIGENDARCH) THEN WRITE(NOUT,*)' Big ended architecture' ELSE WRITE(NOUT,*)' Little ended architecture' ENDIF IF (BIGENDFILE) THEN WRITE(NOUT,*)' Big ended file' ELSE WRITE(NOUT,*)' Little ended file' ENDIF IF (.NOT. ISSWABT) THEN WRITE(NOUT,*)' SPIDER I/O Native byte order' ELSE WRITE(NOUT,*)' SPIDER I/O Non-native byte order' ENDIF IF (FLIP) THEN WRITE(NOUT,*)' Flipping byte order!' ENDIF ENDIF C GET MAP TYPE FROM INPUT FILE CALL MVNREV(HEADBUF(53),MAP,ISSWABT) IF (MAP .NE. 'MAP ') THEN C OLD STYLE, MRC MAP OR UNKNOWN FILE TYPE WRITE(NOUT,*) '*** BAD MAP STRING IN CCP4 FILE: ',MAP ENDIF CALL MVNFLIP(HEADBUF( 1), NSAM, FLIP) CALL MVNFLIP(HEADBUF( 2), NROW, FLIP) CALL MVNFLIP(HEADBUF( 3), NSLICE, FLIP) CALL MVNFLIP(HEADBUF( 4), IMODE, FLIP) CALL MVNFLIP(HEADBUF( 5), NXSTART,FLIP) CALL MVNFLIP(HEADBUF( 6), NYSTART,FLIP) CALL MVNFLIP(HEADBUF( 7), NZSTART,FLIP) CALL MVNFLIP(HEADBUF( 8), MX, FLIP) CALL MVNFLIP(HEADBUF( 9), MY, FLIP) CALL MVNFLIP(HEADBUF(10), MZ, FLIP) IF (FLIP) CALL FLIPBYTESI(HEADBUF(11),6,IRTFLG) CELLAX = HEADBUF(11) CELLAY = HEADBUF(12) CELLAZ = HEADBUF(13) CELLBX = HEADBUF(14) CELLBY = HEADBUF(15) CELLBZ = HEADBUF(16) CALL MVNFLIP(HEADBUF(17), MAPC, FLIP) CALL MVNFLIP(HEADBUF(18), MAPR, FLIP) CALL MVNFLIP(HEADBUF(19), MAPS, FLIP) IF (FLIP) CALL FLIPBYTESI(HEADBUF(20),3,IRTFLG) DMIN = HEADBUF(20) DMAX = HEADBUF(21) DMEAN = HEADBUF(22) CALL MVNFLIP(HEADBUF(23), ISPG, FLIP) CALL MVNFLIP(HEADBUF(24), NSYMBT,FLIP) IF (FLIP) CALL FLIPBYTESI(HEADBUF(50),3,IRTFLG) ORX = HEADBUF(50) ORY = HEADBUF(51) ORZ = HEADBUF(52) CALL MVNFLIP(HEADBUF(54), MACHST, FLIP) IF (FLIP) CALL FLIPBYTESI(HEADBUF(55),1,IRTFLG) RMS = HEADBUF(55) CALL MVNFLIP(HEADBUF(56), NLABL, FLIP) IF (NLABL .GT. 0) THEN C GET LABELS INOW = 1 DO I = 57,56 + NLABL * 20 CALL MVNREV(HEADBUF(I),CLABLS(INOW:INOW+3),ISSWABT) INOW = INOW + 4 ENDDO ENDIF IF (VERBOSE) THEN C WRITE OUT HEADER INFORMATION WRITE(NOUT,1000) NSAM,NROW,NSLICE,IMODE, & NXSTART,NYSTART,NZSTART,MX,MY,MZ, & CELLAX,CELLAY,CELLAZ,CELLBX,CELLBY,CELLBZ, & LXYZ(MAPC),LXYZ(MAPR),LXYZ(MAPS), & DMIN,DMAX,DMEAN,RMS,ORX,ORY,ORZ,ISPG,NSYMBT, & MACHST,NLABL,MAP 1000 FORMAT(/ & 7X,'Number of columns, rows, sections ........ ',3I6/ & 7X,'Map mode ................................. ',I6/ & 7X,'Start points on columns, rows, sections .. ',3I6/ & 7X,'Grid sampling on x, y, z ................. ',3I6/ & 7X,'Cell axes ................................ ',3F10.2/ & 7X,'Cell angles .............................. ',3F10.2/ & 7X,'Fast, medium, slow axes .................. ',3(5X,A)/ & 7X,'Minimum density .......................... ',F25.12/ & 7X,'Maximum density .......................... ',F25.12/ & 7X,'Mean density ............................. ',F25.12/ & 7X,'RMS deviation ............................ ',F25.12/ & 7X,'Origin ................................... ',3F10.2/ & 7X,'Space group, # bytes symmetry ............ ',2I6/ & 7X,'Machine stamp ............................ ',I12/ & 7X,'Number of titles ......................... ',I6/ & 7X,'Map ...................................... ',A,//) IF (NLABL .GT. 0) THEN WRITE(NOUT,1001) 1001 FORMAT(7x,'Titles :') WRITE(NOUT,1002) CLABLS(1:NLABL * 80) 1002 FORMAT(1X,A80) ENDIF ENDIF RETURN END C --------------------------- MVNREV ------------------------------- C PURPOSE: COPY AN ARRAY OF INTEGER * 1 INTO A CHAR. STRING C C PARAMETERS: C IA ARRAY HOLDING 4 INTEGER * 1 or 1 FLOAT SENT C COUT CHAR STRING RET. C REVERSE LOGICAL FLAG TO FLIP ORDER OF ELEMENTS SENT SUBROUTINE MVNREV(I1IN,COUT,REVERSE) CHARACTER(LEN=4) :: COUT INTEGER * 1 I1IN(4) LOGICAL :: REVERSE IF (REVERSE) THEN DO I = 1,4 COUT(I:I) = CHAR(I1IN(5-I)) ENDDO ELSE DO I = 1,4 COUT(I:I) = CHAR(I1IN(I)) ENDDO ENDIF END C ------------------------ MVNFLIPO ------------------------------- SUBROUTINE MVNFLIPO(I1IN,I1OUT,FLIP) C ASSIGNS 11IN TO i1OUT AND FLIPS BYTES WITHIN WORDS IF REQUESTED LOGICAL :: FLIP INTEGER * 1 I1IN(4),I1OUT(4) IF (FLIP) THEN I1OUT(3) = I1IN(1) I1OUT(4) = I1IN(2) I1OUT(1) = I1IN(3) I1OUT(2) = I1IN(4) ELSE I1OUT(1) = I1IN(1) I1OUT(2) = I1IN(2) I1OUT(3) = I1IN(3) I1OUT(4) = I1IN(4) ENDIF RETURN END C ------------------------ MVNFLIP ------------------------------- SUBROUTINE MVNFLIP(I1IN,I1OUT,FLIP) C ASSIGNS 11IN TO i1OUT C FLIPS WORDS & BYTES WITHIN WORDS IF REQUESTED LOGICAL :: FLIP INTEGER * 1 I1IN(4),I1OUT(4) IF (FLIP) THEN I1OUT(1) = I1IN(4) I1OUT(2) = I1IN(3) I1OUT(3) = I1IN(2) I1OUT(4) = I1IN(1) ELSE I1OUT(1) = I1IN(1) I1OUT(2) = I1IN(2) I1OUT(3) = I1IN(3) I1OUT(4) = I1IN(4) ENDIF RETURN END