C++*********************************************************************
C
C PJ3.
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-2010  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 IMAGE_PROCESSING_ROUTINE
C23456789012345678901234567890123456789012345678901234567890123456789012
C--*********************************************************************

        SUBROUTINE PJ3
 
        INCLUDE 'CMBLOCK.INC'
        INCLUDE 'CMLIMIT.INC' 
 
        CHARACTER(LEN=MAXNAM)   ::  FINPIC
        REAL, ALLOCATABLE, DIMENSION(:,:) :: B
        DOUBLE PRECISION  CPHI,SPHI,CTHE,STHE,CPSI,SPSI
        DIMENSION  DM(6)
        DOUBLE PRECISION  QUADPI,DGR_TO_RAD,RAD_TO_DGR
        
        PARAMETER (QUADPI = 3.141592653589793238462643383279502884197)
        PARAMETER (DGR_TO_RAD = (QUADPI/180))
        DATA  INPIC/98/,IOPIC/97/

        MAXIM=0
        CALL OPFILEC(0,.TRUE.,FINPIC,INPIC,'O',ITYPE,NSAM,NROW,NSLICE,
     &             MAXIM,'INPUT',.FALSE.,IRTFLG)

        IF (IRTFLG .NE. 0)    RETURN
        IF(ITYPE.NE.3)  THEN
           CLOSE(INPIC)
           CALL  ERRT(2,'PJ 3',NE)
           RETURN
        ENDIF

        CALL RDPRMI(NSAMP,NROWP,NOT_USED,'PROJECTION DIMENSIONS X,Y')
        IF(NROWP.EQ.0)  NROWP=NINT(NSAMP*(FLOAT(NROW)/FLOAT(NSAM)))
        IF(NROWP.EQ.0)  THEN
           CLOSE(INPIC)
           CALL  ERRT(31,'PJ 3',NE)
           RETURN
        ENDIF

        MAXIM=0
        NSLICEP=0
        ITYPE = 1
        CALL OPFILEC(0,.TRUE.,FINPIC,IOPIC,'U',ITYPE,
     &             NSAMP,NROWP,NSLICEP,
     &             MAXIM,'OUTPUT',.FALSE.,IRTFLG)

        CALL  RDPRM2(PHI,THETA,NOT_USED,'PHI, THETA')
        CALL  RDPRM(PSI,NOT_USED,'PSI')
        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

        ALLOCATE (B(NSAMP,NROWP), STAT=IRTFLG)
        IF (IRTFLG.NE.0) THEN 
           CALL ERRT(46,'PJ 3, B',IER)
           CLOSE(INPIC)
           RETURN
        ENDIF

        CALL  PJ33(INPIC,B,NSAM,NROW,NSLICE,NSAMP,NROWP,DM)
        CLOSE(INPIC)
 
        NSLICEP = 1
        CALL WRITEV(IOPIC,B,NSAMP,NROWP,NSAMP,NROWP,NSLICEP)

        CLOSE(IOPIC)
        DEALLOCATE (B)
        END



        SUBROUTINE  PJ33(INPIC,B,NSAM,NROW,NSLICE,NSAMP,NROWP,DM)

        DIMENSION   CUBE(NSAM),B(NSAMP,NROWP),DM(6)

        B=0.0
        LDPX=NSAM/2+1
        LDPY=NROW/2+1
        LDPZ=NSLICE/2+1
        MPPX=NSAMP/2+1
        MPPY=NROWP/2+1
        DO  K=1,NSLICE
     	   XBB=(1-LDPY)*DM(2)+(K-LDPZ)*DM(3)
           YBB=(1-LDPY)*DM(5)+(K-LDPZ)*DM(6)
           DO  J=1,NROW
             XB=(1-LDPX)*DM(1)+XBB
             YB=(1-LDPX)*DM(4)+YBB
             CALL  REDLIN(INPIC,CUBE,NSAM,J+(K-1)*NROW)
             DO  I=1,NSAM
               IQX=IFIX(XB+FLOAT(MPPX))
                 IF(.NOT.(IQX.LT.1 .OR. IQX.GE.NSAMP))  THEN
                   IQY=IFIX(YB+FLOAT(MPPY))
                   IF(.NOT.(IQY.LT.1 .OR. IQY.GE.NROWP))  THEN
                     DIPX=XB+MPPX-IQX
                     DIPY=YB+MPPY-IQY
                     CT=CUBE(I)
                     B(IQX,IQY) =B(IQX,IQY)  +(1.0-DIPX)*(1.0-DIPY)*CT
                     B(IQX+1,IQY)=B(IQX+1,IQY)+    DIPX *(1.0-DIPY)*CT
                     B(IQX,IQY+1)=B(IQX,IQY+1)+(1.0-DIPX)*    DIPY *CT
                     B(IQX+1,IQY+1)=B(IQX+1,IQY+1)+   DIPX *  DIPY *CT
                   ENDIF
                ENDIF
                XB=XB+DM(1)
                YB=YB+DM(4)
             ENDDO
             XBB=XBB+DM(2)
             YBB=YBB+DM(5)
           ENDDO
        ENDDO
	END


