
C ++********************************************************************
C                                                                      *
C  RPRQ.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  PURPOSE:                                                            *
C                                                                      *
C  PARAMETERS:                                                         *
C
C IMAGE_PROCESSING_ROUTINE                                             *
C
C        0         2         3         4         5         6         7 *
C23456789012345678901234567890123456789012345678901234567890123456789012
C***********************************************************************

        SUBROUTINE RPRQ(N,B,CUBE,IPCUBE,NN,PHI,THETA,PSI,DM,RI)

        INCLUDE 'CMBLOCK.INC'

        DIMENSION  B(N,N),CUBE(*)
        INTEGER           IPCUBE(5,NN)
        DOUBLE PRECISION  CPHI,SPHI,CTHE,STHE,CPSI,SPSI
        DOUBLE PRECISION  QUADPI,DGR_TO_RAD
        DIMENSION         DM(9)
        LOGICAL           ALLOK

        PARAMETER (QUADPI = 3.141592653589793238462643383279502884197)
        PARAMETER (DGR_TO_RAD = (QUADPI/180))

        COMMON /PAR/  LDP,NM,LDPNM

C IPCUBE: 1 - beginning
C         2 - end
C         3 - ix
C         4 - iy
C         5 - iz

        R=RI*RI

        CPHI=DCOS(DBLE(PHI)*DGR_TO_RAD)
        SPHI=DSIN(DBLE(PHI)*DGR_TO_RAD)
        CTHE=DCOS(DBLE(THETA)*DGR_TO_RAD)
        STHE=DSIN(DBLE(THETA)*DGR_TO_RAD)
        CPSI=DCOS(DBLE(PSI)*DGR_TO_RAD)
        SPSI=DSIN(DBLE(PSI)*DGR_TO_RAD)

        DM(1)=CPHI*CTHE*CPSI-SPHI*SPSI
        DM(2)=SPHI*CTHE*CPSI+CPHI*SPSI
        DM(3)=-STHE*CPSI
        DM(4)=-CPHI*CTHE*SPSI-SPHI*CPSI
        DM(5)=-SPHI*CTHE*SPSI+CPHI*CPSI
        DM(6)=STHE*SPSI
        DM(7)=STHE*CPHI
        DM(8)=STHE*SPHI
        DM(9)=CTHE     

        ALLOK = .TRUE.
        DM1   = DM(1)
        DM4   = DM(4)

c$omp parallel do private(i,j,xb,yb,xbb,ybb,iqx,iqy,dipy),shared(allok)

        DO I=1,NN
           XB = (IPCUBE(3,I)-LDP)*DM(1)+(IPCUBE(4,I)-LDP)*DM(2)+
     &          (IPCUBE(5,I)-LDP)*DM(3)
           YB = (IPCUBE(3,I)-LDP)*DM(4)+(IPCUBE(4,I)-LDP)*DM(5)+
     &          (IPCUBE(5,I)-LDP)*DM(6)

           DO J=IPCUBE(1,I),IPCUBE(2,I)

              XBB = (J - IPCUBE(1,I)) * DM1 + XB
              IQX = IFIX(XBB + FLOAT(LDPNM))

              YBB = (J - IPCUBE(1,I)) * DM4 + YB
              IQY = IFIX(YBB + FLOAT(LDPNM))
              IF (IQX.LT.1 .OR. IQX.GE.N .OR.
     &            IQY.LT.1 .OR. IQY.GE.N) THEN
                 ALLOK = .FALSE.
              ELSE

                 DIPY = YBB + LDPNM - IQY

C                EVEN FASTER VERSION
                 CUBE(J) = CUBE(J) + B(IQX,IQY) + 
     &              DIPY * (B(IQX,IQY+1)   - B(IQX,IQY)) +
     &              (XBB + LDPNM - IQX) * (B(IQX+1,IQY) - B(IQX,IQY) + 
     &              DIPY * (B(IQX+1,IQY+1) - B(IQX+1,IQY) -
     &                      B(IQX,IQY+1)   + B(IQX,IQY)))

C               FASTER VERSION
C               CUBE(J)=CUBE(J)
C    &          +B(IQX,IQY)+DIPY*(B(IQX,IQY+1)-B(IQX,IQY))
C    &          +DIPX*(B(IQX+1,IQY)-B(IQX,IQY)
C    &          +DIPY*(B(IQX+1,IQY+1)-B(IQX+1,IQY)
C    &          -B(IQX,IQY+1)+B(IQX,IQY)))
C
C               ORIGINAL VERSION
C                CUBE(J)=CUBE(J)
C     &                 +(1.0-DIPX)*(1.0-DIPY)*B(MAP(IQX,IQY))
C     &                 +     DIPX *(1.0-DIPY)*B(MAP(IQX+1,IQY))
C     &                 +(1.0-DIPX)*     DIPY *B(MAP(IQX,IQY+1))
C     &                 +     DIPX *     DIPY *B(MAP(IQX+1,IQY+1))

             ENDIF
           ENDDO
        ENDDO

        IF (.NOT. ALLOK) THEN
           WRITE(NOUT,*) '*** IQX or IQY out of range - ',
     &                   ' reduce the radius!'
           CALL ERRT(100,'BP RP',NE)
         ENDIF

         END

