
C++*********************************************************************
C
C    AP_GETDATS.F     EXTRACTED                 OCT. 2003 ARDEAN LEITH
C                     LS1... INTERNALIZED       DEC. 2003 ARDEAN LEITH
C                     CALLS NORM3               JUN  2004 ARDEAN LEITH
C                     REMOVED WINDOWING         MAR  2005 ARDEAN LEITH
C                     AVI & SIGI PARAMETERS     NOV  2008 ARDEAN LEITH
C                     ADDED GETDATS_RTSQ        FEB  2011 ARDEAN LEITH
C                     NORMVALS PARAMETERS       SEP  2011 ARDEAN LEITH
C
C **********************************************************************
C=*                                                                    *
C=* This file is part of:   SPIDER - Modular Image Processing System.  *
C=* SPIDER System Authors:  Joachim Frank & ArDean Leith               *
C=* Copyright 1985-2011  Health Research Inc.,                         *
C=* Riverview Center, 150 Broadway, Suite 560, Menands, NY 12204.      *
C=* Email: spider@wadsworth.org                                        *
C=*                                                                    *
C=* SPIDER 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=* SPIDER 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=* You should have received a copy of the GNU General Public License  *
C=* along with this program. If not, see <http://www.gnu.org/licenses> *
C=*                                                                    *
C **********************************************************************
C
C  AP_GETDATS(ILIST,NUMIMG,LSAM,LROW,NUMTH,EXPPAT,LUNIN, IGO,IEND,
C                 XBUF,AVI,SIGI, IRTFLG)
C
C PURPOSE:  READ SERIES OF IMAGE DATA INTO ARRAY XBUF FOR 'AP' OPS.
C           CALLS NORM3 IF NEEDED. CAN LOAD MUTIPLE IMAGES
C           RETURNS ARRAY OF IMAGE STATISTICS
C
C PARAMETERS:
C       ILIST               LIST OF IMAGE FILE NUMBERS        (INPUT)
C       NUMIMG              NO. OF IMAGES                     (INPUT)
C       NSAM,NROW           IMAGE DIMENSIONS                  (INPUT)
C       NUMTH               # THREADS                         (INPUT)
C       EXPPAT              IMAGE SERIES FILE TEMPLATE        (INPUT)
C       LUNIN               IMAGE FILE IO UNIT                (INPUT)
C       IGO,IEND            IMAGE INDEX RANGE                 (INPUT)
C       ANGINHEADER         ANGLES IN IMAGE HEADER            (INPUT)
C       ANGEXP              ANGLES, ETC                       (IN/OUT)
C       BUFTMP              WORKING IMAGE ARRAY               (OUTPUT)
C       BUFOUT              IMAGE ARRAY                       (OUTPUT)
C       AVI,SIGI            STATISTICS ARRAY                  (OUTPUT)
C       IRTFLG              ERROR FLAG                        (OUTPUT)
C
C  VARIABLES:
C
C--*********************************************************************

	SUBROUTINE AP_GETDATS(ILIST,NUMIMG, LSAM,LROW,
     &                       NUMTH,EXPPAT,LUNIN, IGO,IEND,
     &                       XBUF,AVI,SIGI, IRTFLG)

        IMPLICIT NONE

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

        INTEGER, INTENT(IN)          :: ILIST(NUMIMG)
        INTEGER,INTENT(IN)           :: NUMIMG
        INTEGER,INTENT(IN)           :: LSAM,LROW,NUMTH
        CHARACTER (LEN=*),INTENT(IN) :: EXPPAT
        INTEGER,INTENT(IN)           :: LUNIN,IGO,IEND
	REAL                         :: XBUF(LSAM,LROW,NUMTH)
	REAL,  INTENT(OUT)           :: AVI(NUMTH),SIGI(NUMTH)
        INTEGER,INTENT(OUT)          :: IRTFLG

        CHARACTER(LEN=MAXNAM)        :: FILNAM
        LOGICAL                      :: ONEIMAGE
        INTEGER                      :: ITI,NLET,MAXIM,LSAMT,LROWT
        INTEGER                      :: NSLICE,IT
        DOUBLE PRECISION             :: AVD,VRD
        REAL                         :: UNUSED

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

        ONEIMAGE = (IGO .LE. 0 .OR. ILIST(IGO) .LE. 0)

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

C          OPEN EXISTING IMAGE FILE
           MAXIM = 0
           CALL OPFILEC(0,.FALSE.,FILNAM,LUNIN,'O',IFORM,
     &               LSAMT,LROWT,NSLICE,MAXIM,' ',.FALSE.,IRTFLG)
           IF (IRTFLG .NE. 0) RETURN

           CALL SIZCHK(UNUSED,LSAMT,LROWT,0,0,
     &                        LSAM, LROW, 0,0,IRTFLG)
           IF (IRTFLG .NE. 0) RETURN
          
C          XBUF STARTING LOCATION
           IT = ITI-IGO+1

C          LOAD THE WHOLE IMAGE
           CALL REDVOL(LUNIN,LSAM,LROW,1,1, XBUF(1,1,IT),IRTFLG) 
           CLOSE(LUNIN)
           IF (IRTFLG .NE. 0) RETURN

           IF (IMAMI .NE. 1) THEN
C             FIND IMAGE STATISTICS, USE OPEN MP
              CALL NORMVALS(XBUF(1,1,IT),LSAM,LROW,1,AVD,VRD,.TRUE.)
              AVI(IT)  = AVD
              SIGI(IT) = VRD
           ELSE
C             RECORD THE AVERAGE AND SD (IN COMMON)
              AVI(IT)  = AV
              SIGI(IT) = SIG
           ENDIF
        ENDDO

        IRTFLG = 0
        END

C       ************************** AP_GETDATS_RTSQ *******************

	SUBROUTINE AP_GETDATS_RTSQ(ILIST,NUMIMG,NSAM,NROW,
     &                          NUMTH,EXPPAT,LUNIN, IGO,IEND,
     &                          ANGINHEADER,ANGEXP, 
     &                          BUFTMP,BUFOUT,AVI,SIGI,IRTFLG)

        IMPLICIT NONE
        INCLUDE 'CMLIMIT.INC'
        INCLUDE 'CMBLOCK.INC'

        INTEGER, INTENT(IN)   :: ILIST(NUMIMG)
        INTEGER, INTENT(IN)   :: NUMIMG
        INTEGER, INTENT(IN)   :: NSAM,NROW,NUMTH
        CHARACTER (LEN=*)     :: EXPPAT
        INTEGER, INTENT(IN)   :: LUNIN, IGO,IEND
        LOGICAL, INTENT(IN)   :: ANGINHEADER
        REAL, INTENT(IN)      :: ANGEXP(8,NUMIMG) 
        REAL                  :: BUFTMP(NSAM,NROW)
	REAL, INTENT(OUT)     :: BUFOUT(NSAM,NROW,NUMTH)
	REAL, INTENT(OUT)     :: AVI(NUMTH),SIGI(NUMTH)
        INTEGER, INTENT(OUT)  :: IRTFLG

        INTEGER               :: ITI,NLET,MAXIM,IFORMT,LSAMT,LROWT
        INTEGER               :: NSLICE,IT,IDUM
        REAL                  :: SCALE,UNUSED,SHXI,SHYI,THETA
        CHARACTER(LEN=MAXNAM) :: FILNAM
        LOGICAL               :: ONEIMAGE
        DOUBLE PRECISION      :: AVT,SIGT

        SCALE    = 1.0
        ONEIMAGE = (ILIST(IGO) .LE. 0)
         
C       write(6,*) 'Reading images: ',igo,'...',iend

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

C          OPEN EXISTING IMAGE FILE
           MAXIM = 0
           CALL OPFILEC(0,.FALSE.,FILNAM,LUNIN,'O',IFORMT,
     &                  LSAMT,LROWT,NSLICE,MAXIM,' ',.FALSE.,IRTFLG)
           IF (IRTFLG .NE. 0)  RETURN

           CALL SIZCHK(UNUSED,LSAMT,LROWT,0,0,
     &                        NSAM, NROW, 0,0,IRTFLG)
           IF (IRTFLG .NE. 0) RETURN

           IF (ANGINHEADER) THEN
C             GET ANGLES FROM IMAGE HEADER
              CALL LUNGETVALS(LUNIN,IAPLOC + 1,8,ANGEXP(1,ITI),IRTFLG)
              IF (IRTFLG .NE. 0) RETURN
           ENDIF

C          READ IN THE WHOLE IMAGE
           CALL REDVOL(LUNIN,NSAM,NROW,1,1, BUFTMP,IRTFLG) 
           CLOSE(LUNIN)
           IF (IRTFLG .NE. 0) RETURN

C          SHIFT & ROTATE THE INPUT IMAGE --> BUFOUT  
           THETA = ANGEXP(4,ITI)
           SHXI  = ANGEXP(5,ITI)
           SHYI  = ANGEXP(6,ITI)
           !print *,'rot2qs; thta,xy',THETA,SHXI,SHYI

C          XBUF STARTING LOCATION
           IT = ITI-IGO+1

C          ROTATE AND SHIFT
           CALL ROT2QS(BUFTMP,BUFOUT(1,1,IT),NSAM,NROW,
     &                 THETA,SCALE,SHXI,SHYI,IDUM,0)

C          FIND IMAGE STATISTICS, (HAS MOVED SO NOT SAME)
           CALL NORMVALS(BUFTMP,NSAM,NROW,1, AVT,SIGT,.TRUE.)

C          RECORD THE AVERAGE AND SD 
           AVI(IT)  = AVT
           SIGI(IT) = SIGT

        ENDDO

        IRTFLG = 0
        END




