C++************************************************************************* C C RAWTOSPIDER.F -- CREATED JUL 95 ARDEAN LEITH C ADDED -32 APRIL 00 ARDEAN LEITH C REWRITTEN JUNE 01 ARDEAN LEITH C ALTERED MAR 02 ARDEAN LEITH C RETURNED IOSTAT JAN 03 ARDEAN LEITH C QUESTION ORDER FEB 03 ARDEAN LEITH C RDPR PARAMETERS 04/14/05 ARDEAN LEITH C -33 CORRECTED 07/30/07 ARDEAN LEITH C 64 ADDED 07/30/07 ARDEAN LEITH C ********************************************************************** C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM. AUTHOR: J.FRANK * C=* Copyright (C) 1985-2007 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 RAWTOSPIDER(LUNOLD,LUNNEW,IRTFLG) C C PURPOSE: CONVERTS "RAW" INTEGER TO SPIDER FORMAT C C23456789 123456789 123456789 123456789 123456789 123456789 123456789 12 C--********************************************************************* SUBROUTINE RAWTOSPIDER(LUNOLD,LUNNEW,IRTFLG) INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' COMMON BUFRAW(NBUFSIZ) CHARACTER(LEN=MAXNAM) :: FILOLD,FILNEW,PROMPT CHARACTER(LEN=1) :: CDUM,ANS,NULL LOGICAL :: FOLD,FLIP LOGICAL :: BIGENDARCH,BIGENDED NULL = CHAR(0) C GET FILENAME FOR EXISTING RAW IMAGE FILE CALL FILERD(FILOLD,NLET,DATEXC,'EXISTING RAW~9',IRTFLG) IF (IRTFLG .NE. 0) RETURN C GET INPUT MODE NOW MODE = 8 CALL RDPRI1S(MODE,NOT_USED, & 'ENTER BITS / PIXEL IN INPUT IMAGE (8, 16 OR 32)',IRTFLG) IF (IRTFLG .NE. 0) RETURN MODEA = ABS(MODE) IF (MODEA .EQ. 33) MODEA = 32 IF (MODEA .EQ. 65) MODEA = 64 IF (MODEA .NE. 8 .AND. & MODEA .NE. 16 .AND. & MODEA .NE. 32 .AND. & MODEA .NE. 64) THEN CALL ERRT(100,'MUST BE (8,16,32,-32,33,64,-64, OR 65)!',NE) RETURN ENDIF NSLICE = 1 NSAM = -1 CALL RDPRI3S(NSAM,NROW,NSLICE,NOT_USED, & 'ENTER COLUMNS, ROWS, & SLICES',IRTFLG) IF (IRTFLG .NE. 0) RETURN 22 IOFFSET = 0 CALL RDPRI1S(IOFFSET,NOT_USED, & 'ENTER HEADER BYTES TO BE SKIPPED',IRTFLG) IF (IRTFLG .NE. 0) GOTO 9999 IF ( MODEA .EQ. 16 .OR. MODEA .EQ. 64) THEN 23 ISIGB = 1 CALL RDPRI1S(ISIGB,NOT_USED, & 'ENTER MOST SIGNIFICANT BYTE (1 OR 2)',IRTFLG) IF (IRTFLG .NE. 0) GOTO 9999 IF (ISIGB .NE. 1 .AND. ISIGB .NE. 2) THEN CALL ERRT(16,'RAWTOSPIDER',NE) GOTO 23 ENDIF C GET CURRENT ARCHITECTURE ENDED-NESS BIGENDARCH = BIGENDED(0) FLIP = .TRUE. IF ((ISIGB .EQ. 1 .AND. BIGENDARCH) .OR. & (ISIGB .EQ. 2 .AND. .NOT. BIGENDARCH)) FLIP = .FALSE. CALL RDPRMC(ANS,NCHAR,.TRUE.,'FOLD NEGATIVES? (N/Y)', & CDUM,IRTFLG) IF (IRTFLG .EQ. -1) GOTO 23 FOLD = (ANS .EQ. 'Y') ENDIF C CODE IS INVOLVED IF HEADER IS NOT SAME WORD LENGTH AS DATA C OPEN NEW OUTPUT SPIDER IMAGE FILE WITH SPECIFIED SIZE IFORM = 1 IF (NSLICE .GT. 1) IFORM = 3 MAXIM = 0 CALL OPFILEC(0,.TRUE.,FILNEW,LUNNEW,'U',IFORM,NSAM,NROW,NSLICE, & MAXIM,'NEW SPIDER IMAGE',.FALSE.,IRTFLG) IF (IRTFLG .EQ. -1) GOTO 22 IF (IRTFLG .NE. 0) GOTO 9999 NPIX = NSAM * NROW * NSLICE IOFFMOD2 = MOD(IOFFSET,2) IOFFMOD4 = MOD(IOFFSET,4) C OPEN RAW FILE AS DIRECT ACCESS, UNFORMATTED REC. LENOPEN = NSAM * (MODEA / 8) IF (MODEA .EQ. 33) LENOPEN = NSAM * (32 / 8) CALL OPAUXFILE(.FALSE.,FILOLD,CHAR(0),LUNOLD,LENOPEN,'O', & ' ',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) GOTO 9999 IF (MODE .EQ. 8) THEN C FOR 8 BIT RAW INTEGER INPUT CALL RAW8TOSPI(LUNOLD,LUNNEW,NSAM,NPIX,IOFFSET,.TRUE., & LENOPEN,BUFRAW,IRTFLG) ELSEIF (MODE .EQ. 16 .AND. IOFFMOD2 .EQ. 0) THEN C 16 BIT RAW INTEGER WITH HEADER LENGTH DIVISABLE BY TWO FOLD = .NOT. FOLD CALL RAW16TOSPI(LUNOLD,LUNNEW,NSAM,NPIX,IOFFSET,FLIP, & FOLD,LENOPEN,BUFRAW,IRTFLG) ELSEIF (MODEA .EQ. 32) THEN C COPY/AND ALTER BYTE ORDER OF 32 BIT RAW FLOATING POINT IMAGES NFLIP = 0 IF (MODE .EQ. -32) NFLIP = -1 ! INVERTS BYTES IF (MODE .EQ. -33) NFLIP = 1 ! FLIPS BYTES WITHIN WORDS IF (MODE .EQ. 33) NFLIP = 2 ! FLIPS BYTES & WORDS CALL RAW32TOSPI(LUNOLD,LUNNEW,NSAM,NPIX,IOFFSET, & NFLIP,LENOPEN,BUFRAW,IRTFLG) ELSEIF (MODEA .EQ. 64 .OR. MODEA .EQ. 65) THEN C COPY/AND ALTER BYTE ORDER OF 32 BIT RAW INTEGER IMAGES NFLIP = 0 IF (MODE .EQ. -64) NFLIP = -1 ! INVERTS BYTES IF (MODE .EQ. -65) NFLIP = 1 ! FLIPS BYTES WITHIN WORDS IF (MODE .EQ. 65) NFLIP = 2 ! FLIPS BYTES & WORDS FOLD = .NOT. FOLD CALL RAW32INTTOSPI(LUNOLD,LUNNEW,NSAM,NPIX,IOFFSET, & NFLIP,FOLD,LENOPEN,IRTFLG) ELSE C OTHER RAW IMAGE FORMATS OR CONVERSIONS (SLOW) C OPEN RAW FILE AS DIRECT ACCESS, UNFORMATTED REC. = 1 BYTE CLOSE(LUNOLD) LENOPEN = 1 CALL OPAUXFILE(.FALSE.,FILOLD,CHAR(0),LUNOLD,LENOPEN,'O', & ' ',.TRUE.,IRTFLG) IF (IRTFLG .NE. 0) GOTO 9999 CALL RAWTOSPI(LUNOLD,LUNNEW,NSAM,NPIX,IOFFSET, & MODE,FOLD,FLIP,ISIGB,IRTFLG) ENDIF 9999 CLOSE(LUNOLD) CLOSE(LUNNEW) RETURN END C ------------------------- RAW8TOSPI ------------------------------- SUBROUTINE RAW8TOSPI(LUNRAW,LUNSPI,NSAM,NPIX,IOFFSET,FOLD, & LENOPEN,BUFRAW,IRTFLG) C FOR 8 BIT INPUT DATA INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' COMMON /IOBUF/ BUFSPI(NBUFSIZ) INTEGER *1 BUFRAW(LENOPEN) LOGICAL FOLD IRECRAW = 0 IRECSPI = 0 LOCSPI = 0 IGOT = 0 LOCRAW = LENOPEN C NEED IS NUMBER OF BYTE VALUES TO BE READ INCLUDING HEADER NEED = NPIX + IOFFSET DO WHILE (IGOT .LT. NEED) C PROCESS EACH BYTE VALUE IN HEADER AND IMAGE LOCRAW = LOCRAW + 1 IF (LOCRAW .GT. LENOPEN) THEN C NEED TO READ NEW RECORD FROM RAW INPUT FILE NVAL = MIN(LENOPEN,NEED-IGOT) IRECRAW = IRECRAW + 1 CALL REDLIN8(LUNRAW,BUFRAW,NVAL,IRECRAW,IRTFLG) IF (IRTFLG .NE. 0 .AND. IRTFLG .NE. 253) THEN WRITE(NOUT,90) IRTFLG,IRECRAW,NVAL 90 FORMAT('*** IO ERROR: ',I5,' RECORD: ',I6,' NVAL: ',I6) CALL ERRT(101,'READING FILE',IDUM) RETURN ENDIF LOCRAW = 1 ENDIF IGOT = IGOT + 1 IF (IGOT .GT. IOFFSET) THEN C WANT THIS RAW VALUE FOR AN OUTPUT PIXEL LOCSPI = LOCSPI + 1 IVAL = BUFRAW(LOCRAW) IF (IVAL .LT. 0 .AND. FOLD) THEN BUFSPI(LOCSPI) = 256 + IVAL ELSE BUFSPI(LOCSPI) = IVAL ENDIF IF (LOCSPI .GE. NSAM) THEN C PUT OUT COMPLETED SPIDER RECORD IRECSPI = IRECSPI + 1 CALL WRTLIN(LUNSPI,BUFSPI,NSAM,IRECSPI) LOCSPI = 0 ENDIF ENDIF ENDDO IF (LOCSPI .GT. 0) THEN C PUT OUT UNFINISHED SPIDER RECORD IRECSPI = IRECSPI + 1 NVAL = MIN(NSAM,LOCSPI) CALL WRTLIN(LUNSPI,BUF,NVAL,IRECSPI) ENDIF RETURN END C ------------------------- RAW16TOSPI ---------------------------------- SUBROUTINE RAW16TOSPI(LUNOLD,LUNNEW,NSAM,NPIX,IOFFSET,FLIP, & FOLD,LENOPEN,INBUFB,IRTFLG) C FOR 16 BIT INPUT DATA INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' COMMON /IOBUF/ BUF(NBUFSIZ) INTEGER *1 INBUFB(LENOPEN) LOGICAL FOLD,FLIP INTEGER *2 I2VAL INTEGER *1 I1VAL(2) EQUIVALENCE (I2VAL,I1VAL) IF (MOD(LENOPEN,2) .NE. 0) THEN CALL ERRT(102,'PGM ERROR, LENOPEN MUST BE EVEN',LENOPEN) RETURN ELSEIF (MOD(IOFFSET,2) .NE. 0) THEN CALL ERRT(102,'PGM ERROR, OFFSET MUST BE EVEN',IOFFSET) RETURN ENDIF IRECRAW = 0 IRECSPI = 0 ILOCSPI = 0 IRECSPI = 0 IGOT = 0 ILOCRAW = LENOPEN C NEED IS NUMBER OF BYTE VALUES TO BE READ INCLUDING HEADER NEED = NPIX * 2 + IOFFSET DO WHILE (IGOT .LT. NEED) ILOCRAW = ILOCRAW + 2 IF (ILOCRAW .GT. LENOPEN) THEN C NEED TO READ NEW RECORD FROM INPUT NVAL = MIN(LENOPEN,NEED-IGOT) IRECRAW = IRECRAW + 1 CALL REDLIN8(LUNOLD,INBUFB,NVAL,IRECRAW,IRTFLG) IF (IRTFLG .NE. 0 .AND. IRTFLG .NE. 253) THEN WRITE(NOUT,90) IRTFLG,IRECRAW,NVAL 90 FORMAT('*** IO ERROR: ',I5,' RECORD: ',I6,' NVAL: ',I6) CALL ERRT(101,'READING FILE',IDUM) RETURN ENDIF ILOCRAW = 1 ENDIF IF (IGOT .GT. IOFFSET) THEN C WANT THIS VALUE FOR AN OUTPUT PIXEL IF (FLIP) THEN I1VAL(2) = INBUFB(ILOCRAW) I1VAL(1) = INBUFB(ILOCRAW+1) ELSE I1VAL(1) = INBUFB(ILOCRAW) I1VAL(2) = INBUFB(ILOCRAW+1) ENDIF ILOCSPI = ILOCSPI + 1 IF (FOLD .AND. (I2VAL .LT. 0)) THEN BUF(ILOCSPI) = 65536 + I2VAL ELSE BUF(ILOCSPI) = I2VAL ENDIF IF (ILOCSPI .GE. NSAM) THEN C PUT OUT COMPLETED RECORD IRECSPI = IRECSPI + 1 CALL WRTLIN(LUNNEW,BUF,NSAM,IRECSPI) ILOCSPI = 0 ENDIF ENDIF IGOT = IGOT + 2 ENDDO IF (ILOCSPI .GT. 0) THEN C PUT OUT COMPLETED RECORD IRECSPI = IRECSPI + 1 NVAL = MIN(NSAM,ILOCSPI) CALL WRTLIN(LUNNEW,BUF,NSAM,IRECSPI) ENDIF RETURN END C------------------------- RAW32TOSPI ---------------------------------- SUBROUTINE RAW32TOSPI(LUNOLD,LUNNEW,NSAM,NPIX,IOFFSET, & NFLIP,LENOPEN,INBUFB,IRTFLG) C FOR 32 BIT INPUT DATA INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' COMMON /IOBUF/ BUF(NBUFSIZ) LOGICAL :: FLIP INTEGER *1 INBUFB(LENOPEN) REAL *4 R4VAL INTEGER *4 I4VAL INTEGER *2 I2VAL(4) INTEGER *1 I1VAL(4) EQUIVALENCE (R4VAL,I1VAL) EQUIVALENCE (I4VAL,I1VAL) EQUIVALENCE (I2VAL,I1VAL) C PREVENT NaN ERROR IN DEBUG MODE I4VAL = 0 IF (MOD(LENOPEN,4) .NE. 0) THEN CALL ERRT(102,'PGM ERROR, LENOPENNOT DIVISABLE BY 4!',LENOPEN) RETURN ENDIF IRECRAW = 0 IRECSPI = 0 ILOCSPI = 0 IRECSPI = 0 IGOT = 0 ILOCRAW = LENOPEN + 1 LOCB = 0 IBYTE = 0 C NEED IS TOTAL NUMBER OF BYTES TO BE READ INCLUDING HEADER NEED = NPIX * 4 + IOFFSET DO WHILE (IGOT .LT. NEED) ILOCRAW = ILOCRAW + 1 IF (ILOCRAW .GT. LENOPEN) THEN C NEED TO READ NEW RECORD FROM INPUT NVAL = MIN(LENOPEN,NEED-IGOT) IRECRAW = IRECRAW + 1 CALL REDLIN8(LUNOLD,INBUFB,NVAL,IRECRAW,IRTFLG) IF (IRTFLG .NE. 0 .AND. IRTFLG .NE. 253) THEN WRITE(NOUT,90) IRTFLG,IRECRAW,NVAL 90 FORMAT('*** IO ERROR: ',I5,' RECORD: ',I6,' NVAL: ',I6) CALL ERRT(101,'READING FILE',IDUM) RETURN ENDIF ILOCRAW = 1 ENDIF C IGOT POINTS TO CURRENT BYTE IN INPUT FILE IGOT = IGOT + 1 IF (IGOT .GT. IOFFSET) THEN C WANT THIS VALUE FOR AN OUTPUT PIXEL IBYTE = IBYTE + 1 IF (NFLIP .EQ. 0) THEN C NO FLIP I1VAL(IBYTE) = INBUFB(ILOCRAW) ELSEIF (NFLIP .EQ. -1) THEN C INVERT BYTE ORDER I1VAL(5-IBYTE) = INBUFB(ILOCRAW) ELSEIF (NFLIP .EQ. 1) THEN C FLIP BYTES WITHIN WORDS IF (IBYTE .EQ. 1) THEN I1VAL(2) = INBUFB(ILOCRAW) ELSEIF (IBYTE .EQ. 2) THEN I1VAL(1) = INBUFB(ILOCRAW) ELSEIF (IBYTE .EQ. 3) THEN I1VAL(4) = INBUFB(ILOCRAW) ELSEIF (IBYTE .EQ. 4) THEN I1VAL(3) = INBUFB(ILOCRAW) ENDIF ELSEIF (NFLIP .EQ. 2) THEN C FLIP BYTES AND WORDS IF (IBYTE .EQ. 1) THEN I1VAL(3) = INBUFB(ILOCRAW) ELSEIF (IBYTE .EQ. 2) THEN I1VAL(4) = INBUFB(ILOCRAW) ELSEIF (IBYTE .EQ. 3) THEN I1VAL(1) = INBUFB(ILOCRAW) ELSEIF (IBYTE .EQ. 4) THEN I1VAL(2) = INBUFB(ILOCRAW) ENDIF ENDIF IF (IBYTE .EQ. 4) THEN C TIME TO OUTPUT THE BYTES ILOCSPI = ILOCSPI + 1 BUF(ILOCSPI) = R4VAL IBYTE = 0 #ifdef NEVER IF ((ILOCSPI .LE. 4) .AND. IRECSPI .EQ. 1) THEN WRITE(6,*) 'ILOCSPI : ',ILOCSPI,' I1VALS: ', & I1VAL(1),I1VAL(2),I1VAL(3),I1VAL(4) WRITE(6,*) 'I2VAL: ',I2VAL(1),I2VAL(2) WRITE(6,*) 'R4VAL: ',R4VAL WRITE(6,*) 'I4VAL: ',I4VAL WRITE(6,*) ' ' ENDIF #endif ENDIF IF (ILOCSPI .GE. NSAM) THEN C PUT OUT COMPLETED RECORD IRECSPI = IRECSPI + 1 CALL WRTLIN(LUNNEW,BUF,NSAM,IRECSPI) ILOCSPI = 0 ENDIF ENDIF ENDDO IF (ILOCSPI .GT. 0) THEN C PUT OUT REMAINING RECORD IRECSPI = IRECSPI + 1 CALL WRTLIN(LUNNEW,BUF,NSAM,IRECSPI) ENDIF RETURN END C dd if=avg000.dat of=tes032.dat count=16384 bs=1 C tail +1025c avg000.dat > tes032.dat #ifdef NEVER if (icount .le. 1) THEN write(6,*) 'inbufb(',ILOCRAW,'): ',inbufb(ILOCRAW) it = ilocin + 1 write(6,*) 'inbufb(',it,'): ',inbufb(it) write(6,*) 'i1val(1): ', i1val(1),' i1val(2): ',i1val(2) write(6,*) 'i1val(3): ', i1val(3),' i1val(4): ',i1val(4) write(6,*) 'i4val: ',i4val c write(6,*) ' buf(',ilocout,'): ',buf(ilocout) c write(6,*) 'i2val(1): ', i2val(1),' i2val(2): ',i2val(2) c write(6,*) 'ilocin: ', ilocin,' ilocout: ',ilocout c write(6,*) 'recin: ', irecin,' irow: ',irow write(6,*) ' -------------',icount icount = icount + 1 endif #endif C------------------------- RAW32INTTOSPI ---------------------------------- SUBROUTINE RAW32INTTOSPI(LUNOLD,LUNNEW,NSAM,NPIX,IOFFSET, & NFLIP,FOLD,LENOPEN,IRTFLG) C FOR 32 BIT INTEGER INPUT DATA (SOME OF THIS IS PROBABLY C REDUNDANT AND NOT NECESSARY!! al INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' REAL :: RBUF(NBUFSIZ) LOGICAL :: FOLD INTEGER *1 :: INBUFB(LENOPEN) INTEGER *4 :: I4VAL INTEGER *1 :: I1VAL(4) EQUIVALENCE (I4VAL,I1VAL) C PREVENT NaN ERROR IN DEBUG MODE I4VAL = 0 IF (MOD(LENOPEN,4) .NE. 0) THEN CALL ERRT(102,'PGM ERROR, LENOPENNOT DIVISABLE BY 4!',LENOPEN) RETURN ENDIF IRECRAW = 0 IRECSPI = 0 ILOCSPI = 0 IRECSPI = 0 IGOT = 0 ILOCRAW = LENOPEN + 1 LOCB = 0 IBYTE = 0 C NEED IS TOTAL NUMBER OF BYTES TO BE READ INCLUDING HEADER NEED = NPIX * 4 + IOFFSET DO WHILE (IGOT .LT. NEED) ILOCRAW = ILOCRAW + 1 IF (ILOCRAW .GT. LENOPEN) THEN C NEED TO READ NEW RECORD FROM INPUT NVAL = MIN(LENOPEN,NEED-IGOT) IRECRAW = IRECRAW + 1 CALL REDLIN8(LUNOLD,INBUFB,NVAL,IRECRAW,IRTFLG) IF (IRTFLG .NE. 0 .AND. IRTFLG .NE. 253) THEN WRITE(NOUT,90) IRTFLG,IRECRAW,NVAL 90 FORMAT('*** IO ERROR: ',I5,' RECORD: ',I6,' NVAL: ',I6) CALL ERRT(101,'READING FILE',IDUM) RETURN ENDIF ILOCRAW = 1 ENDIF C IGOT POINTS TO CURRENT BYTE IN INPUT FILE IGOT = IGOT + 1 IF (IGOT .GT. IOFFSET) THEN C WANT THIS VALUE FOR AN OUTPUT PIXEL IBYTE = IBYTE + 1 IF (NFLIP .EQ. 0) THEN C NO FLIP (64) I1VAL(IBYTE) = INBUFB(ILOCRAW) ELSEIF (NFLIP .EQ. -1) THEN C INVERT BYTE ORDER (-64) I1VAL(5-IBYTE) = INBUFB(ILOCRAW) ELSEIF (NFLIP .EQ. 1) THEN C FLIP BYTES WITHIN WORDS (65) IF (IBYTE .EQ. 1) THEN I1VAL(2) = INBUFB(ILOCRAW) ELSEIF (IBYTE .EQ. 2) THEN I1VAL(1) = INBUFB(ILOCRAW) ELSEIF (IBYTE .EQ. 3) THEN I1VAL(4) = INBUFB(ILOCRAW) ELSEIF (IBYTE .EQ. 4) THEN I1VAL(3) = INBUFB(ILOCRAW) ENDIF ELSEIF (NFLIP .EQ. 2) THEN C FLIP BYTES AND WORDS (-65) IF (IBYTE .EQ. 1) THEN I1VAL(3) = INBUFB(ILOCRAW) ELSEIF (IBYTE .EQ. 2) THEN I1VAL(4) = INBUFB(ILOCRAW) ELSEIF (IBYTE .EQ. 3) THEN I1VAL(1) = INBUFB(ILOCRAW) ELSEIF (IBYTE .EQ. 4) THEN I1VAL(2) = INBUFB(ILOCRAW) ENDIF ENDIF IF (IBYTE .EQ. 4) THEN C TIME TO OUTPUT THE BYTES ILOCSPI = ILOCSPI + 1 IF (FOLD .AND. (I4VAL .LT. 0)) THEN RBUF(ILOCSPI) = 2**32 + I4VAL ELSE RBUF(ILOCSPI) = I4VAL ENDIF IBYTE = 0 ENDIF IF (ILOCSPI .GE. NSAM) THEN C PUT OUT COMPLETED RECORD IRECSPI = IRECSPI + 1 CALL WRTLIN(LUNNEW,RBUF,NSAM,IRECSPI) ILOCSPI = 0 ENDIF ENDIF ENDDO IF (ILOCSPI .GT. 0) THEN C PUT OUT REMAINING RECORD IRECSPI = IRECSPI + 1 CALL WRTLIN(LUNNEW,RBUF,NSAM,IRECSPI) ENDIF RETURN END C ------------------------- RAWTOSPI ---------------------------------- SUBROUTINE RAWTOSPI(LUNOLD,LUNNEW,NSAM,NPIX,IOFFSET, & MODE,FOLD,FLIP,ISIGB,IRTFLG) INCLUDE 'CMBLOCK.INC' INCLUDE 'CMLIMIT.INC' COMMON /IOBUF/ FBUF(NBUFSIZ) CHARACTER(LEN=1) :: CINBUF c EQUIVALENCE (CINBUF,I1BUF) REAL *4 F4BUF INTEGER * 1 I1BUF(4) EQUIVALENCE (F4BUF,I1BUF) LOGICAL :: FOLD,FLIP INTEGER * 1 I1VAL(4) INTEGER * 4 I4VAL EQUIVALENCE (I4VAL,I1VAL(1)) EQUIVALENCE (FVAL,I1VAL(1)) C CLEAN THE BUFFER, THIS ASSUMES THE INTENSITIES IN THE RAW IMAGE C ARE ALL POSITIVE NUMBERS ---- liy DO I = 1, 4 I1VAL(I) = 0 ENDDO C ILOCSPI IS POINTER TO CURRENT NUMBER OF IMAGE VALUES OUTPUT TO C CURRENT OUTPUT RECORD ILOCSPI = 0 C IRECSPI IS NUMBER OF CURRENT OUTPUT RECORD IRECSPI = 0 C BYTE POINTER FOR 16 & 32 BIT INPUT IBITE = 0 NBYTES = NPIX * (ABS(MODE) / 8) #if defined (SP_NT) || defined (__osf__) || defined (__linux__) C MUST ADJUST BYTE ORDER IN I4VAL LOC1 = 1 LOC2 = 2 #else LOC1 = 3 LOC2 = 4 #endif IF (IOFFSET .GT. 0) THEN C SKIP HEADER OFFSET DO ILOC = 1,IOFFSET C THE (1) IS ESSENTIAL ON THESE READS READ(LUNOLD,REC=ILOC,IOSTAT=IRTFLG) I1BUF(1) IF (IRTFLG .NE. 0) THEN WRITE(NOUT,90) IRTFLG,ILOC 90 FORMAT('*** ERROR: (',I5, & ') READING HEADER BYTE: ',I4) CALL ERRT(100,'RAWTOSPI',NE) RETURN ENDIF ENDDO ENDIF DO ILOC = IOFFSET + 1,IOFFSET + NBYTES READ(LUNOLD,REC=ILOC,IOSTAT=IRTFLG) I1BUF(1) IF (IRTFLG .NE. 0) THEN WRITE(NOUT,91) IRTFLG, ILOC - IOFFSET 91 FORMAT('*** ERROR: (',I5,') READING IMAGE BYTE: ',I8) CALL ERRT(100,'RAWTOSPI',NE) RETURN ENDIF IF (MODE .EQ. 8) THEN C INPUT IS 8 BIT ------------------------------- 8 BIT IN C CONVERT TO 32 BIT FLOATING POINT ILOCSPI = ILOCSPI + 1 IVAL = I1BUF(1) IF (IVAL .LT. 0) IVAL = 256 + IVAL FBUF(ILOCSPI) = IVAL ELSE IF (MODE .EQ. 16) THEN C INPUT IS 16 BIT ----------------------------- 16 BIT IN C CONVERT TO 32 BIT FLOATING POINT IBITE = IBITE + 1 IF (ISIGB .EQ. 1 .AND. IBITE .EQ. 1) THEN I1VAL(LOC1) = I1BUF(1) ELSE IF (ISIGB .EQ. 1 .AND. IBITE .EQ. 2) THEN I1VAL(LOC2) = I1BUF(1) ELSE IF (IBITE .EQ. 1) THEN I1VAL(LOC2) = I1BUF(1) ELSE IF (IBITE .EQ. 2) THEN I1VAL(LOC1) = I1BUF(1) ENDIF IF (IBITE .EQ. 2) THEN C PUT OUT COMPLETED VALUE IF (FOLD) THEN IF (I4VAL .LE. 32767) THEN I4VAL = I4VAL + 32768 ELSE I4VAL = I4VAL - 32768 ENDIF ENDIF ILOCSPI = ILOCSPI + 1 FBUF(ILOCSPI) = I4VAL IBITE = 0 ENDIF ELSE IF (MODE .EQ. 32) THEN C INPUT IS 32 BIT ---------------------------- 32 BIT IN C CONVERT TO 32 BIT FLOATING POINT IBITE = IBITE + 1 IF (FLIP) THEN I1VAL(5 - IBITE) = I1BUF(1) ELSE I1VAL(IBITE) = I1BUF(1) ENDIF IF (IBITE .GE. 4) THEN C PUT OUT COMPLETED VALUE ILOCSPI = ILOCSPI + 1 FBUF(ILOCSPI) = FVAL IBITE = 0 ENDIF ENDIF IF (ILOCSPI .EQ. NSAM) THEN C PUT OUT COMPLETED RECORD IRECSPI = IRECSPI + 1 CALL WRTLIN(LUNNEW,FBUF,NSAM,IRECSPI) ILOCSPI = 0 ENDIF ENDDO IF (ILOCSPI .GT. 0) THEN C PUT OUT COMPLETED RECORD IRECSPI = IRECSPI + 1 CALL WRTLIN(LUNNEW,FBUF,NSAM,IRECSPI) ENDIF C SET NO ERROR FLAG IRTFLG = 0 RETURN END