
C ++********************************************************************
C                                                                      *
C ROT3.F                                                                   *
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                                                                      *
C     ROT3(LUNI,LUNO,NSAM,NROW,NSLICE,AV1,IFANGL,ALPH,BETA,GAMA, 
C          IFSHIF,SHX,SHY,SHZ)
C
C     3-D ROTATION ACCORDING TO EULER ANGLES
C           
C     ANGLES ARE ACCORDING TO THE CONVENTION THAT THEY AGREE WITH WHAT 
C     YOU SEE IN THE SLICES
C     
C     IF IFANGL AND IFSHIF ARE EQUAL TO 1 THIS SOUBROUTINE DOES NOT ASK
C     FOR ANYTHING AND PROCREEDS WITH THE GIVEN DATA
C
C     (ALPH AND BETA ARE THE SAME THAN IN MICHAEL'S PROJECTION PROGRAM)
C     
C     10/27/86 J.M.CARAZO
C
C--*******************************************************************

      SUBROUTINE ROT3(LUNI,LUNO,NSAM,NROW,NSLICE,AV1,
     &            IFANGL,ALPH,BETA,GAMA, IFSHIF,SHX,SHY,SHZ)

      INCLUDE 'CMLIMIT.INC'
      COMMON /IOBUF/ RBUF(NBUFSIZ)
 
      INCLUDE 'CMBLOCK.INC' 

      CHARACTER NULL,ANS

      DATA PI/3.14159269/

      NULL = CHAR(0)

C     LUNI AND LUNO ARE MAIN INPUT/OUTPUT VOLUMES

C     ASK FOR TILTING ANGLES (IF IFANGL.NE.0)

      IF (IFANGL .NE. 1) THEN
         CALL RDPRM2(ALPH,BETA,NOT_USED,'ALPHA, BETA')
         CALL RDPRM (GAMA,NOT_USED,'GAMMA')
      ENDIF

      ALPH = ALPH*PI/180
      BETA = BETA*PI/180
      GAMA = GAMA*PI/180

      IF (IFSHIF .NE. 1) THEN
C        ASK FOR ROTATIONAL CENTER AND AVERAGE
         SHX = 0
         SHY = 0
         SHZ = 0
         CALL RDPRM2(SHX,SHY,NOT_USED,'SHIFT IN X-Y')

         CALL RDPRM (SHZ,NOT_USED,'SHIFT IN Z')
 
         CALL RDPRMC(ANS,NC,.TRUE.,
     &       'CHANGE DEFAULT MEAN VALUE? (N/Y)',NULL,IRT)

         IF (ANS .EQ. 'Y') THEN
            CALL RDPRM(AV1,NOT_USED,'VALUE OUTSIDE')
         ENDIF
      ENDIF

C     IT COPIES LUNI INTO LUNO (inefficient! al)

      IF (LUNI .NE. LUNO) THEN
        DO  I=1, NROW*NSLICE
           CALL REDLIN(LUNI,RBUF,NSAM,I)
           CALL WRTLIN(LUNO,RBUF,NSAM,I)  
	ENDDO
      ENDIF

C     MAKES THE FIRST ROTATION AROUND Z
      IF (ABS(ALPH) .GE. 0.0001) THEN
        DO  ISLICE=1, NSLICE  
            NROWS  = (ISLICE-1) * NROW + 1
            NROWE  = NROWS + NROW - 1
            NROWSK = -1
            CALL ROT32(LUNO,LUNO,NSAM,NROWS,NROWE,NROWSK,
     &                 ALPH,AV1,SHX,SHY)
         ENDDO
      ENDIF

C     could be speeded up by not writing to file each rotation!! al

C     MAKES THE ROTATION AROUND Y 
      IF (ABS(BETA) .GE. 0.0001) THEN  
         BETA=-BETA
         DO  IROW=1,NROW
            NROWS  = IROW         
            NROWE  = (NSLICE-1) * NROW + IROW
            NROWSK = -NROW
            CALL ROT32(LUNO,LUNO,NSAM,NROWS,NROWE,NROWSK,
     &                 BETA,AV1,SHX,SHZ)
         ENDDO
      ENDIF


C     THIS MAKES THE LAST ROTATION AROUND Z 
      IF (ABS(GAMA) .GE. 0.0001) THEN
         DO  ISLICE=1,NSLICE
            NROWS  = (ISLICE-1) * NROW + 1
            NROWE  = NROWS + NROW - 1
            NROWSK = -1
            CALL ROT32(LUNO,LUNO,NSAM,NROWS,NROWE,NROWSK,
     &                 GAMA,AV1,SHX,SHY)
         ENDDO
      ENDIF

      RETURN   
      END





