C++*********************************************************************
C
C CENT.F
C                 ADDED CENT_SYM           JAN 2012 GREGORY KISHCHENKO *
C **********************************************************************
C=*                                                                    *
C=* This file is part of:   SPIDER - Modular Image Processing System.  *
C=* SPIDER System Authors:  Joachim Frank & ArDean Leith               *
C=* Copyright 1985-2012  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  CENT()
C
C  PURPOSE: DETERMINATION OF CENTER OF OBJECT USING PHASE OR SYMMETRY
C           INFO                         
C
C--*********************************************************************

         SUBROUTINE CENT()

         IMPLICIT NONE

         INCLUDE 'CMBLOCK.INC'
         INCLUDE 'CMLIMIT.INC' 
 
         CHARACTER(LEN=MAXNAM)  :: FILNAM
         REAL, ALLOCATABLE      :: AIMG(:,:),F1(:,:)

         INTEGER, PARAMETER     :: LUN1 = 21

         INTEGER                :: ICOMM,MYPID,MPIERR
         INTEGER                :: MAXIM,ITYPE,NX,NY,NZ
         INTEGER                :: IRTFLG,M,NS,NR,NC,NXLD
         REAL                   :: SNS,SNR,SNC

         CALL SET_MPI(ICOMM,MYPID,MPIERR)  ! SETS ICOMM AND MYPID

         MAXIM = 0
         CALL OPFILEC(0,.TRUE.,FILNAM,LUN1,'O',ITYPE,NX,NY,NZ,
     &                MAXIM,'INPUT',.FALSE.,IRTFLG)
         IF (IRTFLG .NE. 0) RETURN
         
         IF (ITYPE == 1) THEN
C           IMAGE
            IF (FCHAR(4:4) == 'S') THEN
C              QUASISYMMETRY

               NXLD = NX + 2 - MOD(NX,2)

               ALLOCATE (AIMG(NXLD,NY), 
     &                   F1  (NXLD,NY), STAT=IRTFLG)
               IF (IRTFLG .NE. 0) THEN 
                  CALL ERRT(46,'CENT, AIMG..',2*NXLD*NY)
                  GOTO 505
               ENDIF
               CALL READV(LUN1,AIMG,NXLD,NY, NX,NY,1)           
               CALL CENT_SYM(AIMG,F1,NXLD, NX,NY,SNS,SNR,IRTFLG)
               IF (IRTFLG .NE. 0) GOTO 505

            ELSE

               ALLOCATE (AIMG(NX,NY), STAT=IRTFLG)
               IF (IRTFLG .NE. 0) THEN 
                  CALL ERRT(46,'CENT, AIMG',NX*NY)
                  GOTO 505
               ENDIF

               CALL READV(LUN1,AIMG,NX,NY, NX,NY,1)           
               CALL CENT_D(AIMG, NX,NY,SNS,SNR)

               M   = NX/2+1
               SNS = SNS-M
               M   = NY/2+1
               SNR = SNR-M
            ENDIF

            NS  = INT(SNS)
            NR  = INT(SNR)

            IF (MYPID <= 0) WRITE(NOUT,2222) NS,NR, SNS,SNR
2222        FORMAT(/,'  Approximate center',/,
     &      '              X                Y',/,
     &      '          ', I5,'            ',I5,/,
     &      '          ',F8.3,'         ',F8.3,/)

            CALL REG_SET_NSEL(1,4,FLOAT(NS),FLOAT(NR),SNS,SNR,0.0,
     &                        IRTFLG)

         ELSEIF(ITYPE /= 3 )  THEN
C           FOURIER FILE?
            CALL ERRT(102,
     &          'OPERATION NOT IMPLEMENTED FOR THIS DATA FORMAT',ITYPE)

         ELSEIF(ITYPE == 3 .AND. FCHAR(4:4) == 'S' )  THEN
C           VOLUME
            CALL ERRT(101,
     &          'OPERATION NOT IMPLEMENTED FOR VOLUMES',IRTFLG)

         ELSEIF(ITYPE == 3)  THEN
C           VOLUME

            CALL CENT_3(LUN1,NX,NY,NZ, SNS,SNR,SNC)

            M   = NX/2+1
            SNS = SNS-M
            M   = NY/2+1
            SNR = SNR-M
            M   = NZ/2+1
            SNC = SNC-M
            NS  = INT(SNS)
            NR  = INT(SNR)
            NC  = INT(SNC)

            IF (MYPID .LE. 0) WRITE(NOUT,3333) NS,NR,NC, SNS,SNR,SNC
3333        FORMAT(/,'  Approximate center',/,
     &      '              X                Y                Z',/,
     &      '          ', I5,'            ',I5,'            ',I5,/,
     &      '          ',F8.3,'         ',F8.3,'         ',F8.3,/)

            CALL REG_SET_NSEL(1,5,FLOAT(NS), FLOAT(NR), FLOAT(NC),
     &                            SNS, SNR, IRTFLG)
            CALL REG_SET_NSEL(6,1,SNC, 0.0, 0.0, 0.0, 0.0,IRTFLG)

         ENDIF

505      CLOSE(LUN1)
         IF (ALLOCATED(AIMG)) DEALLOCATE(AIMG)
         IF (ALLOCATED(F1))   DEALLOCATE(F1)

         END

