
C++*********************************************************************
C
C    AP_GETDAT.F
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  AP_GETDAT(ILIP,NIMA,LSAM,LROW,NSAM,NROW,NUMTH,EXPPAT,INPIC, IGO,IEND,
C                 LR1,LR2,LS1,LS2, X, IRTFLG)
C
C PURPOSE:       READ READ WINDOWED IMAGE DATE INTO ARRAY X FOR 'AP' OPS.
C
C PARAMETERS:
C       ILIP                LIST OF IMAGE FILE NUMBERS        (INPUT)
C       NIMA                NO. OF IMAGES                     (INPUT)
C       LSAM,LROW           IMAGE DIMENSIONS                  (INPUT)
C       NSAM,NROW           OUTPUT IMAGE DIMENSIONS           (INPUT)
C       EXPPAT              IMAGE SERIES FILE TEMPLATE        (INPUT)
C       INPIC               IMAGE FILE IO UNIT                (INPUT)
C       IGO,IEND            IMAGE INDEX RANGE                 (INPUT)
C       LR1,LR2,LS1,LS2     OUTPUT IMAGE WINDOW               (INPUT)
C       X                   OUTPUT ARRAY                      (OUTPUT)
C       IRTFLG              ERROR FLAG                        (OUTPUT)
C
C--*********************************************************************

	SUBROUTINE AP_GETDAT(ILIP,NIMA,LSAM,LROW,NSAM,NROW,
     &                       NUMTH,EXPPAT,INPIC, IGO,IEND,
     &                       LR1,LR2,LS1,LS2, X,
     &                       IRTFLG)

        INCLUDE 'CMLIMIT.INC'
        INCLUDE 'CMBLOCK.INC'

	REAL, DIMENSION(NSAM,NROW,NUMTH)             :: X
        INTEGER, DIMENSION(NIMA)                     :: ILIP
        CHARACTER (LEN=*)                            :: EXPPAT

        CHARACTER(LEN=MAXNAM)                        :: FILNAM
        LOGICAL                                      :: WINDOW
        LOGICAL                                      :: ONEIMAGE

C       AUTOMATIC ARRAY
        REAL, DIMENSION(LSAM)                        :: BUFIN

        IRTFLG = 1

        WINDOW = (LR1 .NE. 1    .OR. LS1 .NE. 1 .OR.
     &            LR2 .NE. LROW .OR. LS2 .NE. LSAM) 

C       write(6,*) 'Reading images: ',igo,'...',iend

        ONEIMAGE = (ILIP(IGO) .LE. 0)

        DO ITI=IGO,IEND
           IF (ONEIMAGE) THEN
              FILNAM = EXPPAT
           ELSE
              NLET = 0
              CALL FILGET(EXPPAT,FILNAM,NLET,ILIP(ITI),IRTFLG)
              IF (IRTFLG .NE. 0)  RETURN
           ENDIF

           MAXIM = 0
           CALL OPFILEC(0,.FALSE.,FILNAM,INPIC,'O',IFORM,
     &               LSAMT,LROWT,NSLICE,MAXIM,' ',.FALSE.,IRTFLG)
           IF (IRTFLG .NE. 0)  RETURN

           IF (LSAMT.NE.LSAM .OR. LROWT.NE.LROW)  THEN
              CALL ERRT(102,'INCONSISTENT IMAGE SIZE',LSAMT)
              IRTFLG = 1
              RETURN
           ENDIF

           IT = ITI-IGO+1
           IF (WINDOW) THEN
C             READ IN CENTRAL WINDOW FROM THE WHOLE IMAGE
              DO K2=LR1,LR2
                 CALL REDLIN(INPIC,BUFIN,LSAM,K2)
                 KT = K2-LR1+1
                 DO K3=LS1,LS2
                    X(K3-LS1+1,KT,IT) = BUFIN(K3)
                 ENDDO
              ENDDO
           ELSE
C             READ IN THE WHOLE IMAGE
              CALL REDVOL(INPIC,LSAM,LROW,1,1, X(1,1,IT),IRTFLG) 
              IF (IRTFLG .NE. 0) RETURN
           ENDIF
           CLOSE(INPIC)
        ENDDO

        IRTFLG = 0
        END
C
#ifdef USE_MPI
C       THE SAME AS AP_GETDAT EXCEPT THAT NO BROADCAST
C       IS USED IN THE READ.
C
	SUBROUTINE AP_GETDAT1P(ILIP,NIMA,LSAM,LROW,NSAM,NROW,
     &                         NUMTH,EXPPAT,INPIC, IGO,IEND,
     &                         LR1,LR2,LS1,LS2, X,
     &                         IRTFLG)

        INCLUDE 'CMLIMIT.INC'
        INCLUDE 'CMBLOCK.INC'

	REAL, DIMENSION(NSAM,NROW,NUMTH)             :: X
        INTEGER, DIMENSION(NIMA)                     :: ILIP
        CHARACTER (LEN=*)                            :: EXPPAT

        CHARACTER(LEN=MAXNAM)                        :: FILNAM
        LOGICAL                                      :: WINDOW
        LOGICAL                                      :: ONEIMAGE

C       AUTOMATIC ARRAY
        REAL, DIMENSION(LSAM)                        :: BUFIN

        IRTFLG = 1

        WINDOW = (LR1 .NE. 1    .OR. LS1 .NE. 1 .OR.
     &            LR2 .NE. LROW .OR. LS2 .NE. LSAM) 

C       write(6,*) 'Reading images: ',igo,'...',iend

        ONEIMAGE = (ILIP(IGO) .LE. 0)

        DO ITI=IGO,IEND
           IF (ONEIMAGE) THEN
              FILNAM = EXPPAT
           ELSE
              NLET = 0
              CALL FILGET(EXPPAT,FILNAM,NLET,ILIP(ITI),IRTFLG)
              IF (IRTFLG .NE. 0)  RETURN
           ENDIF

           MAXIM = 0
           CALL OPFILEC(0,.FALSE.,FILNAM,INPIC,'O',IFORM,
     &               LSAMT,LROWT,NSLICE,MAXIM,' ',.FALSE.,IRTFLG)
           IF (IRTFLG .NE. 0)  RETURN

           IF (LSAMT.NE.LSAM .OR. LROWT.NE.LROW)  THEN
              CALL ERRT(102,'INCONSISTENT IMAGE SIZE',LSAMT)
              IRTFLG = 1
              RETURN
           ENDIF

           IT = ITI-IGO+1
           IF (WINDOW) THEN
C             READ IN CENTRAL WINDOW FROM THE WHOLE IMAGE
              DO K2=LR1,LR2
                 CALL REDLIN1P(INPIC,BUFIN,LSAM,K2)
                 KT = K2-LR1+1
                 DO K3=LS1,LS2
                    X(K3-LS1+1,KT,IT) = BUFIN(K3)
                 ENDDO
              ENDDO
           ELSE
C             READ IN THE WHOLE IMAGE
              CALL REDVOL1P(INPIC,LSAM,LROW,1,1, X(1,1,IT),IRTFLG) 
              IF (IRTFLG .NE. 0) RETURN
           ENDIF
           CLOSE(INPIC)
        ENDDO

        IRTFLG = 0
        END
#endif
