
C++*********************************************************************
C
C    AP_END
C           PEAKV REMOVED                           MAR 04 ArDean Leith
C           IKEY                                    MAR 04 ArDean Leith
C           ANGDIF IF CHANGE IN MIRROR              AUG 04 ArDean Leith
C           ANGLES IN REG OUTPUT WRONG              AUG 04 ArDean Leith
C           APEND2                                  SEP 04 Chao Yang
C           REWRITE FOR END OF 'AP MD'..            SEP 04 ArDean Leith
C           REWRITE FOR UN-MIRROR                   OCT 04 ArDean Leith
C           RANGOUT <= 360                          DEC 04 ArDean Leith
C           MPI WRITES TO REGISTERS NOW             OCT 08 ArDean Leith
C           REMOVED APSHIFT CALL                    NOV 08 ArDean Leith
c           IF (NPROJ.EQ.0)NPROJ=1                  AUG 09 ArDean Leith
C           IF(ABS(ANGDIF).LT.ALMOSTZERO)           AUG 09 ArDean Leith
C
C **********************************************************************
C=* This file is part of:                                              * 
C=* SPIDER - Modular Image Processing System.   Author: J. FRANK       *
C=* Copyright 1985-2009  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=*                                                                    *
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_END(IMGEXP,IMGREF, 
C          ANGREF,REFDIR, ANGEXP,EXPDIR,ISHRANGE,
C          GOTREFANG, NGOTPAR,CCROTT,PEAKVT,
C          RANGNEW,MIRRORNEW,REFPAT,
C          NPROJT,LUNDOC,DLIST)
C   
C PURPOSE : WRITE ALIGNMENT PARAMETERS TO OUTPUT FILE
C
C PARAMETERS:
C       REFPAT              REF. IMAGE SERIES FILE TEMPLATE   (INPUT)
C       DLIST               PARAMETERS                       (OUTPUT)
C
C  OPERATIONS:  'AP REF', 'AP RD', 'AP RN', 'AP MQ', 'AP NQ', 'AP SH'
C
C--*********************************************************************

         SUBROUTINE AP_END(KEY,IMGEXP,IMGREF, 
     &                  ANGREF,REFDIR, 
     &                  ANGEXP,EXPDIR,ISHRANGE,
     &                  GOTREFANG, NGOTPAR, CCROTT,PEAKVT,
     &                  RANGNEW,XSHNEW,YSHNEW, MIRRORNEW,REFPAT,
     &                  NPROJT, CTYPE, LUNDOC,DLIST)

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

        CHARACTER (LEN=*)                           :: REFPAT 

        LOGICAL                                     :: MIRROROLD
        LOGICAL                                     :: MIRRORNEW
	LOGICAL                                     :: GOTREFANG

	REAL, DIMENSION(7)                          :: ANGEXP
	REAL, DIMENSION(3)                          :: ANGREF
	REAL, DIMENSION(3)                          :: ANGOUT
	REAL, DIMENSION(3)                          :: EXPDIR,REFDIR
        CHARACTER (LEN=*)                           :: CTYPE 

        REAL, DIMENSION(*)                          :: DLIST

        PARAMETER (QUADPI = 3.14159265358979323846)
        PARAMETER (DGR_TO_RAD = (QUADPI/180))
        IF (CTYPE(1:1) .EQ. 'M'  .OR. 
     &      CTYPE(1:1) .EQ. 'N'  .OR.
     &      CTYPE(1:2) .EQ. 'RQ' .OR.
     &      CTYPE(1:2) .EQ. 'RD' .OR.
     &      CTYPE(1:2) .EQ. 'RN') THEN
C           FOR OBSOLETE: 'AP MQ', 'AP MD'....
            CALL AP_END_OBSLT(IMGEXP,IMGREF, 
     &                  CCROTT,RANGNEW,XSHNEW,YSHNEW,MIRRORNEW,
     &                  DLIST)

            IF (LUNDOC .GT. 0) THEN
C              SAVE IN ALIGNMENT DOC FILE
C              REF#,CCROT,PSI,SX,SY,IMG#,-1
               CALL LUNDOCWRTDAT(LUNDOC,KEY,DLIST,7,IRTFLG)
            ENDIF
 
            CALL REG_GET_USED(NSEL_USED)

            IF (NSEL_USED .GT. 0) THEN
C               OUTPUT TO SPIDER'S REGISTERS
                CALL REG_SET_NSEL(1,5, DLIST(1),DLIST(2),DLIST(3),
     &                                 DLIST(4),DLIST(5),IRTFLG)
                CALL REG_SET_NSEL(6,5, DLIST(6),DLIST(7),DLIST(8),
     &                                 DLIST(9),DLIST(10),IRTFLG)
                CALL REG_SET_NSEL(11,5,DLIST(11),DLIST(12),DLIST(13),
     &                                 DLIST(14),DLIST(15),IRTFLG)
            ENDIF
            RETURN     ! ------------------------------------
         ENDIF



         NPROJ   = NPROJT
c         IF (NPROJ .EQ. 0) NPROJ = 1 removed aug 09 al

         PEAKV = PEAKVT

         IF (IMGREF .GT. 0) THEN
C           IMGREF IS NUMBER OF MOST SIMILAR REF. IMAGE 
            CCROT   = CCROTT
         ELSE
C           NO REFERENCE IMAGE SELECTED
            CCROT = -1.0
            PEAKV = 0.0
         ENDIF

C        SET NEW PROJECTION ANGLES
         ANGOUT = 0.0            ! DEFAULT VALUE
         IF (IMGREF .GT. 0 .AND. GOTREFANG) THEN
C           USE REF. ANGLES AS NEW PROJECTION ANGLES
            ANGOUT = ANGREF(1:3)

            IF (MIRRORNEW) THEN
C              REF. PROJECTION MUST BE MIRRORED
               ANGOUT(1) = -ANGOUT(1)
               ANGOUT(2) = 180+ANGOUT(2)
            ENDIF
         ELSEIF (NGOTPAR .GE. 3) THEN
C           KEEP OLD EXP. PROJ. ANGLES 
            ANGOUT = ANGEXP(1:3)
         ENDIF

         RANGOLD   = 0.0
         XSHOLD    = 0.0
         YSHOLD    = 0.0

         IF (NGOTPAR .GE. 7 .AND. ISHRANGE .GT. 0) THEN
C           USE OLD INPLANE ROT. & SHIFT  
            RANGOLD   = ANGEXP(4)
            XSHOLD    = ANGEXP(5)
            YSHOLD    = ANGEXP(6)

            MIRROROLD = (ANGEXP(7) .GT. 0)
            IF (MIRROROLD) THEN
               WRITE(NOUT,90)
90             FORMAT(
     &           ' *** MIRRORED PROJECTION INPUT NO LONGER ALLOWED.',/,
     &           ' *** CONVERT YOUR ALIGNMENT PARAMETER FILES TO ',
     &           ' NON-MIRRORED FORM OR USE OLDER SPIDER RELEASE.')
               CALL ERRT(101,
     &          'MIRRORED PROJECTION INPUT NO LONGER ALLOWED',NE)
            ENDIF

         ENDIF
    
C        COMBINE ROT. & SHIFT WITH PREVIOUS TRANSFORMATION
         C       =  COS(RANGNEW * DGR_TO_RAD)
         S       = -SIN(RANGNEW * DGR_TO_RAD)

         XSHOUT  = XSHNEW  + XSHOLD*C - YSHOLD*S
         YSHOUT  = YSHNEW  + XSHOLD*S + YSHOLD*C
         RANGOUT = RANGOLD + RANGNEW

C        LIST ANGLES IN RANGE 0...360
         DO WHILE(RANGOUT .LT. 0.0)
            RANGOUT = RANGOUT + 360.0
         ENDDO
         DO WHILE(RANGOUT .GE. 360.0)
            RANGOUT = RANGOUT - 360.0
         ENDDO

C        CONVERT ~360 TO: 0
         IF ( ABS(RANGOUT - 360.0) .LE. 0.05) RANGOUT = 0.0


C        SET FLAG FOR NO ANGDIF DETERMINED
         ANGDIF = -1.0 

         IF (IMGREF .LE. 0)  THEN
C            NO RELEVANT REF. IMAGE FOUND
             ANGDIF = 0.0

         ELSEIF (GOTREFANG .AND. NGOTPAR .GE. 3) THEN
C            CAN FIND ANGDIF
             ANGDIF = ABS(EXPDIR(1) * REFDIR(1) + 
     &                    EXPDIR(2) * REFDIR(2) + 
     &                    EXPDIR(3) * REFDIR(3))
             ANGDIF = MIN(1.0,ANGDIF)
             ANGDIF = ACOS(ANGDIF) / DGR_TO_RAD
         ENDIF

         IKEY     = KEY
         IF (CTYPE(1:2) .EQ. 'SH' .OR. 
     &       CTYPE(1:3) .EQ. 'REF') THEN
             IKEY     = IMGEXP
         ENDIF

C        SAVE 15 ALIGNMENT PARAMETERS
         CALL AP_OUT(IKEY,IMGEXP,
     &               ANGOUT, IMGREF,CCROT,
     &               RANGNEW,XSHNEW,YSHNEW,MIRRORNEW,
     &               RANGOUT,XSHOUT,YSHOUT,
     &               NPROJ,ANGDIF,PEAKV,
     &               LUNDOC,DLIST,15,IRTFLG)

          END



C++****************************** AP_OUT *****************************

        SUBROUTINE AP_OUT(KEY,IMGEXP,
     &                    ANGOUT, IMGREF,CCROT,
     &                    RANGNEW,XSHNEW,YSHNEW,MIRRORNEW,
     &                    RANGOUT,XSHOUT,YSHOUT,
     &                    NPROJ,ANGDIF,PEAKV,
     &                    LUNDOC,DLIST,NLIST,IRTFLG)

        REAL, DIMENSION(3)             :: ANGOUT
        LOGICAL                        :: MIRRORNEW
        REAL, DIMENSION(NLIST)         :: DLIST
        REAL, PARAMETER                :: ALMOSTZERO=0.05

C       ZERO DLIST ARRAY
        DLIST     = 0.0


        DLIST(1)  = ANGOUT(1)
        DLIST(2)  = ANGOUT(2)
        DLIST(3)  = ANGOUT(3)
        DLIST(4)  = IMGREF
        DLIST(5)  = IMGEXP

        DLIST(6)  = RANGOUT
        IF (ABS(RANGOUT) .LT. ALMOSTZERO) DLIST(6) = 0.0
        DLIST(7)  = XSHOUT
        IF (ABS(XSHOUT)  .LT. ALMOSTZERO) DLIST(7) = 0.0
        DLIST(8)  = YSHOUT
        IF (ABS(YSHOUT)  .LT. ALMOSTZERO) DLIST(8) = 0.0

        DLIST(9)  = NPROJ

        DLIST(10) = ANGDIF
        IF (ABS(ANGDIF) .LT. ALMOSTZERO) DLIST(10) = 0.0

        DLIST(11) = CCROT

        DLIST(12) = RANGNEW
        IF (ABS(RANGNEW) .LT. ALMOSTZERO) DLIST(12) = 0.0
        DLIST(13) = XSHNEW
        IF (ABS(XSHNEW)  .LT. ALMOSTZERO) DLIST(13) = 0.0
        DLIST(14) = YSHNEW
        IF (ABS(YSHNEW)  .LT. ALMOSTZERO) DLIST(14) = 0.0
        DLIST(15) = PEAKV 
        IF (MIRRORNEW) DLIST(15) = -PEAKV 

#ifndef USE_MPI
         IF (LUNDOC .GT. 0) THEN
C           SAVE IN ALIGNMENT DOC FILE IF NOT USING MPI
C           <,<,<, REF#,IMG#,INPLANE<, SX,SY,NPROJ, <DIF,CCROT,INPLANE<,SX,SY,PEAK
            CALL LUNDOCWRTDAT(LUNDOC,KEY,DLIST,NLIST,IRTFLG)
         ENDIF
#endif
 
         CALL REG_GET_USED(NSEL_USED)

         IF (NSEL_USED .GT. 0) THEN
C            OUTPUT TO SPIDER'S REGISTERS
             CALL REG_SET_NSEL(1,5, DLIST(1),DLIST(2),DLIST(3),
     &                              DLIST(4),DLIST(5),IRTFLG)
             CALL REG_SET_NSEL(6,5, DLIST(6),DLIST(7),DLIST(8),
     &                              DLIST(9),DLIST(10),IRTFLG)
             CALL REG_SET_NSEL(11,5,DLIST(11),DLIST(12),DLIST(13),
     &                              DLIST(14),DLIST(15),IRTFLG)
          ENDIF

          END

C++**************************** AP_END_OBSLT **************************

         SUBROUTINE AP_END_OBSLT(IMGEXP,IMGREF, 
     &                  CCROTT,RANGNEW,XSHNEW,YSHNEW,MIRRORNEW,
     &                  DLIST)

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

        LOGICAL                                     :: MIRRORNEW
        REAL, DIMENSION(*)                          :: DLIST

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

         IF (IMGREF .GT. 0) THEN
C           IMGREF IS NUMBER OF MOST SIMILAR REF. IMAGE 
            CCROT   = CCROTT
         ELSE
            CCROT   = -1.0
         ENDIF

C        OUTPUT .
C        1 - NUMBER OF THE MOST SIMILAR REFERENCE PROJECTION.
C        2 - NOT-NORMALIZED CORRELATION COEFFICIENT (ROTATION).
C        3 - PSI ANGLE. (IN=PLANE ROTATION)
C        4 - SX SHIFT (SET TO ZERO IF NOT 'AP MQ,..')  
C        5 - SY SHIFT (SET TO ZERO IF NOT 'AP MQ,..')  
C        6 - INPUT IMAGE NUMBER.
C        7 - ANGULAR DIFFERENCE. (-1.0 IF NOT DETERMINED)

         DLIST(1) = IMGREF        ! NUMBER OF MOST SIMILAR REF. IMAGE 
         IF (MIRRORNEW) DLIST(1) = -IMGREF  ! REF. IMAGE NUMBER <0 
                
         DLIST(2)  = CCROT        ! NOT-NORMALIZED CC  (ROTATION)
         DLIST(3)  = RANGNEW      ! IN=PLANE ROTATION
	 DLIST(4)  = XSHNEW       ! X SHIFT
	 DLIST(5)  = YSHNEW       ! Y SHIFT
         DLIST(6)  = IMGEXP       ! INPUT IMAGE NUMBER
         DLIST(7)  = -1.0         ! ANGDIF IS NOT AVAILABLE
 
         END
