
C++*******************************************************************
C
C    NORM3.F
C               SIG FOR BLANK IMAGE FLOAT SLOP     JAN 06 A. LEITH
C               FLOAT                              APR 07 A. LEITH
C               ERROR MESSAGES                     NOV 10 A. LEITH
C               NORMVALSP ADDED                    AUG 11 A. LEITH
C **********************************************************************
C=*                                                                    *
C=* This file is part of:   SPIDER - Modular Image Processing System.  *
C=* SPIDER System Authors:  Joachim Frank & ArDean Leith               *
C=* Copyright 1985-2011  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    NORM3(LUN,NSAM,NROW,NSLICE,FMAX,FMIN,AV)
C
C    PURPOSE:  DETERMINES MAX, MIN, AV, AND SIG FOR A SPIDER IMAGE
C
C    PARAMETERS:
C        LUN          LOGICAL UNIT NUMBER OF IMAGE             (SENT)
C        NSAM,NROW,NSLICE    DIMENSIONS OF VOLUME              (SENT)
C        FMAX         MAXIMUM OF VOLUME                        (RET.)
C        FMIN         MINIMUM OF VOLUME                        (RET.)
C        AV           AVERAGE OF VOLUME                        (RET.)
C
C    NOTE:    THIS USES UNLABELED COMMON!!
C             SIG RETURNED IN COMMON  (LEGACY ISSUE)
C
C--*******************************************************************

      SUBROUTINE NORM3(LUN,NSAM,NROW,NSLICE,FMAX,FMIN,AV)

      COMMON BUF(1)
      COMMON /MASTER/NSAMC,NROWC,IREC,NLABEL,IFORM,IMAMI,FMAXC,FMINC,
     &               AVC,SIG,IHIST
      COMMON /UNITS/LUNT,NIN,NOUT

      DOUBLE PRECISION DAV,DAV2,DTOP,FNALL,DTEMP

      FNALL = FLOAT(NSAM) * FLOAT(NROW) * FLOAT(NSLICE)
      IF (FNALL .LE. 0) THEN
         WRITE(NOUT,*) '*** NSAM, NROW, NSLICE:',NSAM,NROW,NSLICE
         CALL ERRT(101,'NORM3, BAD DIMENSIONS',NE)
         RETURN
      ENDIF

      DAV  = 0.
      DAV2 = 0.

      FMIN = HUGE(FMIN)
      FMAX = -FMIN

      DO IRECT = 1,NROW*NSLICE
         CALL REDLIN(LUN,BUF,NSAM,IRECT)
         DO K = 1,NSAM
            B    = BUF(K)
            FMAX = MAX(B,FMAX)
            FMIN = MIN(B,FMIN)
            DAV  = DAV  + B
            DAV2 = DAV2 + B * DBLE(B)
          ENDDO
      ENDDO

      AV    = DAV / FNALL
      AVC   = AV
      FMAXC = FMAX
      FMINC = FMIN

      DTOP  = DAV2 - DAV * DAV / FNALL

      DIFF  = FMAX - FMIN
      IF (DIFF .LE. TINY(DIFF)) THEN
C        BLANK IMAGE SOMETIMES LEADS TO SQRT NEG. NUMBER

      ELSEIF (DTOP .LT. 0.0D0) THEN
C        SQRT OF NEGATIVE NUMBER
         WRITE(NOUT,*) '*** SQRT(',DTOP,') IMPOSSIBLE. ',
     &                 'ASSUMING THIS IS A BLANK IMAGE' 
         SIG = 0.0
 
      ELSEIF (FNALL .EQ. 1.0) THEN
C        DIVISION BY ZERO
         CALL ERRT(101,'SINGLE PIXEL --> NO STANDARD DEVIATION',NE) 
         RETURN
      ELSE
C        CAN CALCULATE SIG
         SIG = DSQRT( DTOP / DBLE(FNALL - 1.0))
      ENDIF

      CALL SETPRM(LUN,NSAM,NROW,FMAX,FMIN,AV,'U')

      END



C++*********************************************************************
C
C NORMVALS.F         NEW                         FEB 2011 ARDEAN LEITH
C **********************************************************************
C=* FROM: SPIDER - MODULAR IMAGE PROCESSING SYSTEM.   AUTHOR: J.FRANK  *
C=* Copyright (C) 1985-2011  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 NORMVALS(X,NS,NR,DAV,DSIG,USE_OMP)
C
C PURPOSE: DETERMINE NORMALIZATION PARAMETERS: AVG & VARIANCE
C
C23456789012345678901234567890123456789012345678901234567890123456789012
C--*********************************************************************

C****************************** NORMVALS ******************************

        SUBROUTINE NORMVALS(X, NX, NY, NZ,
     &                         DAV,DSIG, USE_OMP)

        IMPLICIT NONE

        REAL, INTENT(IN)              :: X(NX,NY,NZ) 
        INTEGER, INTENT(IN)           :: NX, NY, NZ    ! SIZE 
        DOUBLE PRECISION, INTENT(OUT) :: DAV,DSIG 
        LOGICAL, INTENT(IN)           :: USE_OMP 

        DOUBLE PRECISION              :: DN,DVR,DTEMP,DSUM
        INTEGER                       :: K,J,I       

        DSUM  = 0.0
        DVR   = 0.0
        DN    = FLOAT(NX*NY*NZ)

        IF (USE_OMP) THEN
c$omp      parallel do private(k,j,i),reduction(+:dsum,dvr)
           DO K=1,NZ
              DO J=1,NY
                 DO I=1,NX
                   DSUM = DSUM + X(I,J,K)
                   DVR  = DVR  + X(I,J,K) * DBLE(X(I,J,K))
                 ENDDO
              ENDDO
           ENDDO
c$omp      end parallel do

        ELSE
           DO K=1,NZ
              DO J=1,NY
                 DO I=1,NX
                   DSUM = DSUM + X(I,J,K)
                   DVR  = DVR  + X(I,J,K) * DBLE(X(I,J,K))
                 ENDDO
              ENDDO
           ENDDO
        ENDIF

        DAV   = DSUM / DN

        DTEMP = (DVR - DN * DAV * DAV)

        IF (DTEMP .GT. 0) THEN
           DSIG   = DSQRT(DTEMP / (DN-1))
        ELSE
C          TRAP FOR BLANK IMAGE AREA IMPRECISION
           DSIG = 0
        ENDIF

        END


C****************************** NORMVALSP *****************************

        SUBROUTINE NORMVALSP(X, NX, NY, NZ,
     &                          NXP,NYP,NZP, 
     &                          DAV,DSIG, USE_OMP)

        IMPLICIT NONE

        REAL, INTENT(IN)              :: X(NXP,NYP,NZP) 
        INTEGER, INTENT(IN)           :: NX, NY, NZ     ! ANALYZED SIZE 
        INTEGER, INTENT(IN)           :: NXP,NYP,NZP    ! PADDED  SIZE
        DOUBLE PRECISION, INTENT(OUT) :: DAV,DSIG 
        LOGICAL, INTENT(IN)           :: USE_OMP        ! UNUSED 

        DOUBLE PRECISION              :: DN,DVR,DTEMP,DSUM
        INTEGER                       :: K,J,I       

        DSUM  = 0.0
        DVR   = 0.0
        DN    = FLOAT(NX*NY*NZ)

c$omp      parallel do private(k,j,i),reduction(+:dsum,dvr)
           DO K=1,NZ
              DO J=1,NY
                 DO I=1,NX
                   DSUM = DSUM + X(I,J,K)
                   DVR  = DVR  + X(I,J,K) * DBLE(X(I,J,K))
                 ENDDO
              ENDDO
           ENDDO
c$omp      end parallel do

        DAV   = DSUM / DN 

        DTEMP = (DVR - DN * DAV * DAV)

        IF (DTEMP .GT. 0) THEN
           DSIG   = DSQRT(DTEMP / (DN-1))
        ELSE
C          TRAP FOR BLANK IMAGE AREA IMPRECISION
           DSIG = 0
        ENDIF

        END

C****************************** NORMVALSP_NOOMP ***********************
!! UNUSED!!

        SUBROUTINE NORMVALSP_NOOMP(X, NX, NY, NZ,
     &                          NXP,NYP,NZP, 
     &                          DAV,DSIG, USE_OMP)

C       COMPILER FAILED IF USE_OMP WAS PASSED, GAVE ODD COMPILATION

        IMPLICIT NONE

        REAL, INTENT(IN)              :: X(NXP,NYP,NZP) 
        INTEGER, INTENT(IN)           :: NX, NY, NZ     ! ANALYZED SIZE 
        INTEGER, INTENT(IN)           :: NXP,NYP,NZP    ! PADDED  SIZE
        DOUBLE PRECISION, INTENT(OUT) :: DAV,DSIG 
        LOGICAL, INTENT(IN)           :: USE_OMP        ! UNUSED 

        DOUBLE PRECISION              :: DN,DVR,DTEMP,DSUM
        INTEGER                       :: K,J,I       

        DSUM  = 0.0
        DVR   = 0.0
        DN    = FLOAT(NX*NY*NZ)

           DO K=1,NZ
              DO J=1,NY
                 DO I=1,NX
                   DSUM = DSUM + X(I,J,K)
                   DVR  = DVR  + X(I,J,K) * DBLE(X(I,J,K))
                 ENDDO
              ENDDO
           ENDDO

        DAV   = DSUM / DN 

        DTEMP = (DVR - DN * DAV * DAV)

        IF (DTEMP .GT. 0) THEN
           DSIG   = DSQRT(DTEMP / (DN-1))
        ELSE
C          TRAP FOR BLANK IMAGE AREA IMPRECISION
           DSIG = 0
        ENDIF

        END


