C++*********************************************************************
C
C BPWR_Q.F
C                  OPFILEC                         FEB 03 ARDEAN LEITH
C
C **********************************************************************
C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM.   AUTHOR: J.FRANK  *
C=* Copyright (C) 1985-2005  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   BPWR_Q(BUF,B,W,FM,ILIST,NANG,N2S,N2R,NSAM,NROW)
C
C23456789012345678901234567890123456789012345678901234567890123456789012
C--*********************************************************************

         SUBROUTINE  BPWR_Q(BUF,B,W,FM,ILIST,NANG,N2S,N2R,NSAM,NROW)

         INCLUDE 'CMBLOCK.INC'

         DIMENSION         B(N2S+2,N2R),W(N2S+2,N2R)
         DOUBLE PRECISION  AVE
         DIMENSION         ILIST(NANG),BUF(1024)
         COMMON  /F_SPEC/  FINPAT,FINPIC,FOUT,NLET,NLOT
         CHARACTER*80      FINPAT,FINPIC,FOUT

         DATA  LUNI/99/

         NS2=N2S/2
         NR2=N2R/2
         X1=FLOAT(NS2)**2
         Y1=FLOAT(NR2)**2

C        PREPARE WEIGHTING FUNCTION R**2
         DO    J=1,N2R
            IY=J-1
            IF(IY.GT.NR2)  IY=IY-N2R
            DO    I=1,N2S+2,2
               IX=(I-1)/2
               IF(FM.GE.0.0)  THEN
                  FQ=0.25*(FLOAT(IX*IX)/X1+FLOAT(IY*IY)/Y1)
               ELSE
                  FQ=0.5*SQRT(FLOAT(IX*IX)/X1+FLOAT(IY*IY)/Y1)
               ENDIF
               W(I,J)=FQ
               W(I+1,J)=FQ
            ENDDO
	 ENDDO
         W(1,1)=1.0
         W(2,1)=1.0

C       PARZEN FILTER

	FM=ABS(FM)
	IF(.NOT.(FM.EQ.0.0.OR.FM.EQ.1.0))  THEN
           DO    J=1,N2R
              IY=J-1
              IF(IY.GT.NR2)  IY=IY-N2R
              DO    I=1,N2S+2,2
                 IX=(I-1)/2
                 FQ=0.5*SQRT(FLOAT(IX*IX)/X1+FLOAT(IY*IY)/Y1)
                 PARZ=0.0
                 IF(FQ.LE.FM)  THEN
                    IF(FQ.LE.FM/2.0)  THEN
                       PARZ=1.0-6.0*(FQ/FM)**2*(1.0-FQ/FM)
                    ELSE
                       PARZ=2.0*(1.0-FQ/FM)**3
                    ENDIF
                 ENDIF
                 W(I,J)=W(I,J)*PARZ
                 W(I+1,J)=W(I+1,J)*PARZ
              ENDDO
           ENDDO
	ENDIF

         DO  K=1,NANG
C           READ ONE PROJECTION
            CALL  FILGET(FINPAT,FINPIC,NLET,ILIST(K),INTFLAG)
            MAXIM = 0
            CALL OPFILEC(0,.FALSE.,FINPIC,LUNI,'O',IFORM,LSAM,LROW,NSL,
     &               MAXIM,' ',.FALSE.,IRTFLG)
            IF (IRTFLG .NE. 0) THEN
               WRITE(NOUT,2032)  FINPIC
2032           FORMAT(' FILE SKIPPED: ',A)
	    ELSE

C              READ  IMAGE
               DO    I=1,NROW
                  CALL  REDLIN(LUNI,B(1,I),NSAM,I)
               ENDDO
               CLOSE(LUNI)

C              PADDING WITH BORDER AVERAGE
               IF (N2S.NE.NSAM.AND.N2R.NE.NROW)  THEN
                  AVE=0.0
                  DO    J=1,NROW
                     AVE=AVE+B(NSAM,J)
                     AVE=AVE+B(1,J)
                  ENDDO
                  DO    I=1,NSAM
                     AVE=AVE+B(I,1)
                     AVE=AVE+B(I,NROW)
                  ENDDO
                  AVE=AVE/(2*FLOAT(NSAM)+2*FLOAT(NROW))
                  DO    J=1,N2R
                     DO    I=NSAM+1,N2S
                        B(I,J)=AVE
                     ENDDO
                  ENDDO
                  DO    J=NROW+1,N2R
                     DO    I=1,NSAM
                        B(I,J)=AVE
                     ENDDO
                  ENDDO
               ENDIF
               INV=+1
               CALL  FMRS_2(B,N2S,N2R,INV)

C              Apply filter

c$omp          parallel do private(i,j)
               DO    J=1,N2R
                  DO    I=1,N2S+2
                     B(I,J)=B(I,J)*W(I,J)
                  ENDDO
               ENDDO

               INV=-1
               CALL  FMRS_2(B,N2S,N2R,INV)

C              WRITE  IMAGE
               CALL  FILGET(FOUT,FINPIC,NLOT,ILIST(K),INTFLAG)

               MAXIM = 0
               CALL OPFILEC(0,.FALSE.,FINPIC,LUNI,'U',IFORM,
     &               LSAM,LROW,NSL,
     &               MAXIM,' ',.FALSE.,IRTFLG)

               DO I=1,NROW
                  CALL  WRTLIN(LUNI,B(1,I),NSAM,I)
               ENDDO
               CLOSE(LUNI)
            ENDIF
C        ENDIF COMES FROM SKIPPING A FILE
	 ENDDO
         END
