C++*********************************************************************
C
C    RFACTSDO.F              ADDED FOURIER INPUT JULY 2000 ARDEAN LEITH
C                            OPFILEC             FEB  03   ARDEAN LEITH
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    RFACTSDO: DIFFERENTIAL R-FACTOR AND PHASE RESIDUAL COMPARISON OF 
C              TWO FOURIER TRANSFORMS ON A SERIES OF RINGS.  FOLLOWS
C              PHILOSOPHY OF FRANK ET AL. SCIENCE 214 (1981) 1353-1355. 
C              IN THE CURRENT ROUTINE, ALL RINGS ARE COMPUTED AT ONCE,
C              BUT SCALE SEARCH IS DONE ON EACH RING SEPARATELY.  THUS THE
C              RESULT IS EQUIVALENT TO THE RESULT OF APPLYING A SERIES
C              OF CALLS TO "RF S" WITH SUCCESSIVE RINGS.
C NOTE THAT THIS APPROACH WILL LEAD TO UNREASONABLE PHASE RESIDUAL RESULTS 
C IF THE TWO FOURIER TRANSFORMS HAVE STRONGLY DIFFERENT RADIAL BEHAVIORS.
C
C IMAGE_PROCESSING_ROUTINE
C
C23456789012345678901234567890123456789012345678901234567890123456789012
C-************************************************************************

        SUBROUTINE RFACTSDO(LUN1,LUN2,NSAM,NROW,NSLICE,
     &                               NSAM2,NROW2,NSLICE2,
     &                               ITYPE1,ITYPE2)

        INCLUDE 'CMBLOCK.INC'      
 
        REAL, ALLOCATABLE, DIMENSION(:) ::    AIMG,BIMG,CSUM1,CSUM
        REAL, ALLOCATABLE, DIMENSION(:,:) ::  PR,AMP,AVSUM
        REAL, ALLOCATABLE, DIMENSION(:) ::    CSUM2
        INTEGER, ALLOCATABLE, DIMENSION(:) :: LR

        CHARACTER*1       SER

        PARAMETER(NSCALE=20)

        CALL RDPRM(WI,NOT_USED,'RING WIDTH')

        CALL RDPRM2(SCALE1,SCALE2,NOT_USED,
     &             'SCALE FACTOR(LOWER,UPPER)')

        IF (ITYPE1 .LT. 0) THEN
C          FOURIER INPUT FILES
           LSD  = NSAM
           NSAM = NSAM - MOD(-ITYPE2,10)
        ELSE
           LSD = NSAM+2-MOD(NSAM,2)
        ENDIF

        SER    = 'C'
        SSANG  = 90.0

C       FACTOR FOR NOISE COMPARISON
        FACT   = 3.0
        DSCALE = (SCALE2-SCALE1)/FLOAT(NSCALE-1)
        Y1     = FLOAT(MAX0(NSAM,NROW))
        INC    = INT(Y1/WI)/2+1

        ALLOCATE (AIMG(LSD*NROW),BIMG(LSD*NROW), STAT=IRTFLG)
        IF (IRTFLG.NE.0) THEN 
           CALL ERRT(46,'RF, AIMG & BIMG',IER)
           GOTO 9999
        ENDIF

        IF (ITYPE1 .EQ. 1) THEN
C          INPUT FILES ARE REAL SPACE, NOT FOURIER
           DO  I = 1,NROW
              CALL REDLIN(LUN1,AIMG(1+(I-1)*LSD),NSAM,I)
           ENDDO

           DO  I = 1,NROW
              CALL REDLIN(LUN2,BIMG(1+(I-1)*LSD),NSAM,I)
           ENDDO

C          CONVERT TO FOURIER SPACE
           INV = +1
           CALL FMRS_2(AIMG,NSAM,NROW,INV)
           IF (INV.EQ.0) THEN
              CALL ERRT(38,'RF ',NE)           
              GOTO 9999
           ENDIF

           INV = +1
           CALL FMRS_2(BIMG,NSAM,NROW,INV)
           IF (INV.EQ.0)THEN
              CALL ERRT(38,'RF ',NE)
              GOTO 9999
           ENDIF
        ELSE
C          INPUT IS FOURIER ALREADY
           CALL READV(LUN1,AIMG,LSD,NROW,NSAM,NROW,NSLICE)
           CALL READV(LUN2,BIMG,LSD,NROW,NSAM,NROW,NSLICE)

        ENDIF

        ALLOCATE(PR(NSCALE,INC), AMP(NSCALE,INC),CSUM1(INC),
     &           LR(INC),CSUM(INC),CSUM2(INC), AVSUM(NSCALE,INC),
     &           STAT=IRTFLG)
        IF (IRTFLG.NE.0) THEN 
           CALL ERRT(46,'RF,  ARRAYS',IER)
           GOTO 9999
        ENDIF

        CALL PR3DB(AIMG,BIMG,PR,AMP,CSUM1,LR,CSUM,CSUM2,
     &      AVSUM,LSD,NSAM,NROW,NSLICE,DSCALE,NSCALE,SCALE1,
     &      SSANG,INC,Y1,WI,SER)

C     WRITE RESULT INTO DOC FILE AND RESULT FILE
      WRITE(NOUT,*) '2D PHASE RESIDUE AND FOURIER SHELL CORRELATION'

      WRITE(NOUT,5600) WI
5600  FORMAT(1X,'RING WIDTH = ',G12.5)

      WRITE(NOUT,5700)
5700  FORMAT(10X,'|NUMBER|','|RING RADIUS',
     &           '|DPH|','|FRC|','|FRCCRIT|','|PIXELS|')          

      WRITE(NOUT,5800)
5800  FORMAT(10X,'        ',' NORMALIZED|')             

        CALL  RFACTSD2(PR,AMP,CSUM1,LR,CSUM,CSUM2,AVSUM,
     &                 NSCALE,INC,WI,FACT,NOUT)

9999    CLOSE(LUN1)
        CLOSE(LUN2)
        IF (ALLOCATED(AIMG))  DEALLOCATE (AIMG)
        IF (ALLOCATED(BIMG))  DEALLOCATE (BIMG)
        IF (ALLOCATED(PR))    DEALLOCATE (PR)
        IF (ALLOCATED(AMP))   DEALLOCATE (AMP)
        IF (ALLOCATED(CSUM1)) DEALLOCATE (CSUM1)
        IF (ALLOCATED(LR))    DEALLOCATE (LR)
        IF (ALLOCATED(CSUM))  DEALLOCATE (CSUM)
        IF (ALLOCATED(CSUM2)) DEALLOCATE (CSUM2)
        IF (ALLOCATED(AVSUM)) DEALLOCATE (AVSUM)

        RETURN
        END
