C **********************************************************************
C
C HALI.F
C              RESTRICTION OF THE INTERPOLATION FIELD 10/13/89
C              QUADRATIC INTERPOLATION                07/09/93
C              OPFILEC                                02/24/03 al
C              CHKMIRROR                              06/18/08 al
C **********************************************************************
C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM.   AUTHOR: J.FRANK  *
C=* Copyright (C) 1985-2008  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 HALI
C
C23456789012345678901234567890123456789012345678901234567890123456789012
C--*********************************************************************

        SUBROUTINE HALI(MIRROR)

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

        CHARACTER(LEN=MAXNAM)                :: FINPIC, FINPAT 

        INTEGER, ALLOCATABLE, DIMENSION(:)   :: ILIST
        INTEGER, ALLOCATABLE, DIMENSION(:,:) :: NUMR
        CHARACTER(LEN=1)                     :: MODE,MIRROR,ASK,NULL
        CHARACTER(LEN=1)                     :: CHKMIRROR
        LOGICAL*1                            :: NORM

        DATA  INPIC/77/

        NILMAX = NIMAX
        NULL   = CHAR(0)

        ALLOCATE (ILIST(NILMAX), STAT=IRTFLG)
        IF (IRTFLG .NE. 0) THEN 
           CALL ERRT(46,'AP C, ILIST',NILMAX)
           RETURN
        ENDIF

C       ASK FOR DATA FILE NAME TEMPLATE
        CALL FILELIST(.TRUE.,INPIC,FINPAT,NLET,ILIST,NILMAX,NIMA,
     &      'ENTER TEMPLATE FOR 2-D IMAGE NAME',IRTFLG)
        IF (IRTFLG .NE. 0) GOTO 9999

C       NIMA - TOTAL NUMBER OF IMAGES
        IF (NIMA .GT. 0)  THEN
           WRITE(NOUT,2001) NIMA
2001       FORMAT('  Number of images: ',I5)
        ELSE
           CALL ERRT(101,'NO IMAGES',NDUM)
           GOTO 9999
        ENDIF
	
        CALL FILGET(FINPAT,FINPIC,NLET,ILIST(1),INTFLG)
        MAXIM = 0
        CALL OPFILEC(0,.FALSE.,FINPIC,INPIC,'O',IFORM,NSAM,NROW,NSLICE,
     &              MAXIM,' ',.FALSE.,IRTFLG)
        IF (IRTFLG .NE. 0)  GOTO 9999
        CLOSE(INPIC)

        CALL  RDPRMI(MR,NR,NOT_USED,'FIRST AND LAST RING')

        IF(MR.LE.0.OR.NR.GE.MIN(((NSAM-1)/2)*2+1,((NROW-1)/2)*2+1))THEN
           CALL ERRT(31,'OR 2',NE)
           GOTO 9999
        ENDIF

        CALL  RDPRMI(ISKIP,NDUMP,NOT_USED,'SKIP')
        ISKIP = MAX(1,ISKIP)

        CALL  RDPRMC(ASK,NA,.TRUE.,'(F)ULL OR (H)ALF CIRCLE',NULL,IRT)
        IF (ASK .EQ. 'F')  THEN
           MODE = 'F'
        ELSEIF (ASK .EQ. 'H')  THEN
           MODE = 'H'
        ELSE
           GOTO 9999
        ENDIF

        CALL  RDPRMC(ASK,NA,.TRUE.,'NORMALIZE UNDER MASK? (Y/N)',
     &               NULL,IRT)
        NORM = (ASK.EQ.'Y')   

C       CALL  RDPRMI(JACUP,NDUMP,NOT_USED,
C     &              'PRECISION OF PEAK LOCATION (0..100)')
C       JACUP = MAX(0,MIN(100,JACUP))

        JACUP = 0
        CALL RDPRMI(NKMAX,MAXIT,NOT_USED,
     &              'NUMBER OF GROUPS, MAX. NUMBER OF ITERATIONS')

C       CALL  RDPRMI(KXORD,KYORD,NOT_USED,'X,Y ORDER OF SPLINES')
C       KXORD = MAX(2,KXORD)
C       KYORD = MAX(2,KYORD)
C       IF (KXORD.EQ.0) WRITE(NOUT,*)'QUADRATIC INTERPOLATION USED !'

C       FIND TOTAL NUMBER OF RINGS
        NRING = 0
        DO I=MR,NR,ISKIP
           NRING = NRING + 1
        ENDDO

        ALLOCATE(NUMR(3,NRING), STAT=IRTFLG)
        IF (IRTFLG .NE. 0) THEN 
           CALL ERRT(46,'AP C, NUMR',3*NRING)
           GOTO 9999
        ENDIF

        NRING=0
        DO I=MR,NR,ISKIP
           NRING         = NRING+1
           NUMR(1,NRING) = I
        ENDDO

        CHKMIRROR = MIRROR
        IF (MIRROR .EQ. 'C') THEN
C          MUST ASK IF WANT TO CHECK MIRROR
           CALL RDPRI1S(IMIRROR,NOT_USED,
     &         'CHECK MIRRORED POSITIONS (0=NOCHECK / 1=CHECK)?',IRTFLG)           IF (IRTFLG .NE. 0) GOTO 9999
           CHKMIRROR = 'A'
           IF (IMIRROR .NE. 0) CHKMIRROR = 'M'
        ENDIF
  
C       CALCULATION OF ACTUAL DIMENSION OF AN IMAGE TO BE INTERPOLATED
C       2*(No. OF RINGS)+(0'TH ELEMENT)+2*(MARGIN OF 1)

        NRA  = MIN(((NSAM-1)/2)*2+1,((NROW-1)/2)*2+1,2*NR+3)
        LSAM = NSAM
        LROW = NROW
        NSAM = NRA
        NROW = NRA
        CALL ALPRBS(NUMR,NRING,LCIRC,MODE)

        MAXRIN = NUMR(3,NRING)

        CALL HALI_P(ILIST,NSAM,NROW,LSAM,LROW,NIMA,NRING,LCIRC,
     &        MAXRIN,JACUP,NUMR,NKMAX,MAXIT,MODE,CHKMIRROR,NORM,NOUT,
     &        FINPAT,NLET)
     
9999    IF (ALLOCATED(ILIST))  DEALLOCATE(ILIST)
        IF (ALLOCATED(NUMR))   DEALLOCATE(NUMR)

        END

