C **********************************************************************
C
C ENVELOPE.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
C  ENVELOPE(IRTFLG) : CALCULATE THE ENVELOPS OF CFT 
C  USING LEAST SQUARE METHOD(DEEPEST FRADIENT) TO FIT EXPERIMENT PROFILES
C  (DELETED NOISE BACKGROUND)
C  FITTING THE FOURIER COEFFICIENTS WITH EQUATION 
C  f(A1-A4)=A1*SIN(X(K,DZ,CS,A2)*E1*E2*E3
C  X(K,DZ,CS,Q)=PI*(0.5*CS*LAMBDA**3*K**4-DZ*LAMBDA*KF**2)-Q
C  E1=EXP(-2.*PI**2*A2**2*(KF**3*CS*LAMBDA**3-DZ*KF*LAMBDA)**2)
C  A2: SOURCESIZE
C  E2=EXP(-PI**2*A3**2*K**4*LAMBDA**2/(16*LN2))
C  A3: DEFOCUS SPREAD
C  E3=1/[1+(KF/KFILM)**2]
C  KFILM: CHARACTER OF FILM
C  A4: GAUSSIAN ENVOLOPE HALFWIDTH
C  E4=EXP(-(KF/A4)**2)
C
C  NUM: NUMBER OF IMAGE
C  NSAM: IMAGE DIMESION
C  SPMAX: MAX. OF SPATIAL FREQUENCE
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

	SUBROUTINE ENVELOPE(IRTFLG)

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

        COMMON       NF(10,2),Y1(10,512),Y2(512),Y3(512),
     &               Y4(512,10),Y5(512),
     &               A1(10),DA1(10,10),DZ(10),DXA1(10)

	CHARACTER*1  CHOICE,C2,NULL
	REAL         KM,KS,KF,LAMBDA,KFILM
	LOGICAL      FLAG
        CHARACTER(LEN=MAXNAM)              ::   FILNAME,OUTNAME

	DATA PI/3.1415926535/

	LUN1   = 8
	LUN2   = 10
	IRTFLG = 0
	NULL   = CHAR(0)
5	WRITE(NOUT,*)
     &      ' FITTING THE PROFILE INTO f(A1,A2,A3,A4)=A1*SIN(X(KF))*E1',
     &      '(A2)*E2(A3)*E3(KFILM)*E4(A4)'
 	WRITE(NOUT,*)
     &    ' SIN(X(K))=SIN(PI*(0.5*CS*LAMBDA**3*KF**4-DZ*LAMBDA*KF**2-Q)'
	WRITE(NOUT,*)
     &    ' E1=EXP(-2*PI**2*A2**2*(K**3*CS*LAMBDA**3-DZ*K*LAMBDA)**2 )'
	WRITE(NOUT,*)' E2=EXP(-PI**2*A3**2*K**4*LAMBDA**2/16LN2)'
	WRITE(NOUT,*)' E3=1/[1+(KF/KFILM)**2]'
	WRITE(NOUT,*)' E4=EXP(-(KF/A4)**2]'
	CALL RDPRMI(NUM,NDUM,NOT_USED,
     &              'HOW MANY IMAGES IN THE SERIES?')
	WRITE(NOUT,*)' INPUT EM PARAMETERS'
	CALL RDPRM(LAMBDA,NOT_USED,'WAVELENGTH[A]=')
	CALL RDPRM(CS,NOT_USED,'CS[mm]=')
	CS=CS*1.E7
	CALL RDPRM(SPMAX,NOT_USED,'MAX. SP. FREQ.[A-1]=')
	CALL RDPRM(AC,NOT_USED,'AMPLITUDE CONTRAST [RAD]=')
	CALL RDPRM(A2,NOT_USED,'SOURCE SIZE [A-1]=')
	CALL RDPRM(A3,NOT_USED,'DEFOCUS SPREAD [A]=')
	CALL RDPRM(KFILM,NOT_USED,'CHARACTER OF THE FILM Kf [A-1]=')
	CALL RDPRM(A4,NOT_USED,'GAUSSIAN ENVELOPE CHARACTER [A-1]=')
	DO 20 I=1,NUM
	   WRITE(NOUT,*)'# ',I,'   IMAGE'
           MAXIM = 0
	   CALL OPFILEC(0,.TRUE.,FILNAME,LUN1,'O',IFORM,
     &          NSAM,NROW,NSLICE,MAXIM,'IMAGE', .FALSE.,IRTFLG)
	   IF (IRTFLG .NE. 0) RETURN

	   WRITE(NOUT,24) NSAM,NROW
24	   FORMAT(' FILE"S DIMENSION:',I4,' X',I4)
	   CALL RDPRM(DZ(I),NOT_USED,'DEFOCUS [A]=')
C	   CALL RDPRM(A1(I),NOT_USED,'AMPLITUDE OF PHASE CONTRAST=')
C	   CALL RDPRM(A4(I),NOT_USED,'GAUSSIAN ENVELOPE CHARACTER =')
	   CALL REDLIN(LUN1,Y3,NSAM,1)
	   DO K=1,NSAM
	      Y1(I,K)=Y3(K)
	   ENDDO
	   CALL RDPRMI(NF(I,1),NF(I,2),NOT_USED,
     &                 'FITTING REGION (N1-N2):$')
	   CLOSE(LUN1)
C          GET AMPLITUDE OF PHASE CONTRAST
	   DO  J=10,NSAM
	      FLAG=.TRUE.
	      IF(Y3(J) .GT. Y3(J+1) .AND. Y3(J) .GT. Y3(J-1)) THEN
	         DO K=J-1,J-10,-1
	            IF(Y3(J) .LT. Y3(K)) FLAG=.FALSE.
	         ENDDO
	         DO K=J+1,J+10
	            IF(Y3(J) .LT. Y3(K)) FLAG=.FALSE.
	         ENDDO
	         IF (FLAG) THEN
	            A1(I)=Y3(J)*(1+5000/DZ(I))
	            GOTO 20
	         ENDIF
	      ENDIF
	   ENDDO

20	   CONTINUE
	   KS=SPMAX/FLOAT(NSAM)
	   DO  I=1,NUM
	      DO  J=1,NUM
	         DA1(I,J)=0
	      ENDDO
	   ENDDO
C.......   GET Y4 VALUE
	   DO I=1,NUM
	      DO J=1,NSAM
	         Y4(J,I)=1
	      ENDDO
	   ENDDO

	   FLAG=.TRUE.
	   NEIB=3
	   DO  I=1,NUM
	      DO  J=1+NEIB,NSAM-NEIB
	         BX=Y1(I,J)
	         IF (BX .GT. Y1(I,J+1)) THEN
	            DO K=J,J-NEIB,-1
	              IF(BX .LT. Y1(I,K)) THEN
	                 FLAG=.FALSE.
	              ENDIF
                 ENDDO
	         DO K=J,J+NEIB
                   IF(BX .LT. Y1(I,K)) THEN
	              FLAG=.FALSE.
	           ENDIF
	         ENDDO
	        IF(FLAG) THEN
	           Y4(J-3,I)=10
	           Y4(J-2,I)=10
	           Y4(J-1,I)=10
	           Y4(J,I)=10
	           Y4(J+1,I)=10
	           Y4(J+2,I)=10
	           Y4(J+3,I)=10
	        ELSE
	           FLAG=.TRUE.
	        ENDIF	
	      ENDIF
	   ENDDO
	ENDDO

C......GET VALUE OF Y2
	X=0.0
	DO I=1,NUM
	CALL Y2VALUE(Y2,NSAM,KS,CS,LAMBDA,DZ(I),AC,KFILM,A1(I),A2,A3,
     &  A4)
C......GET VALUE OF X0=SUM((Y1-Y2)**2)
	DO K=1,NSAM
	Y3(K)=Y1(I,K)
	y5(k)=y4(k,i)
	ENDDO
	CALL XSUM(X0,Y3,Y2,y5,NF(I,1),NF(I,2))
	X=X+X0
	ENDDO
	X0=X
C......SET INITIATION STEP
	NSTEP=0
999	DO I=1,NUM
	DA1(I,I)=0.001*A1(I)
	ENDDO
	DA2=0.001*A2
	DA3=0.001*A3
	DKFILM=0.001*KFILM	
	DA4=0.001*A4
	DAC=0.001*AC
C......GET VALUE OF dX**2/dA1(I)
	 DO  I=1,NUM
	 X=0
	 DO  J=1,NUM
	  CALL Y2VALUE(Y2,NSAM,KS,CS,LAMBDA,DZ(J),AC,KFILM,
     &    A1(J)+0.1*DA1(I,J),A2,A3,A4)
	   DO K=1,NSAM
	    Y3(K)=Y1(J,K)
	    y5(k)=y4(k,j)
	   ENDDO
	  CALL XSUM(X1,Y3,Y2,y5,NF(J,1),NF(J,2))
          X=X+X1
	 ENDDO
	 X1=X
	DXA1(I)=-(X1-X0)/(0.1*DA1(I,I))
	ENDDO
C......GET VALUE OF dX**2/dA2
	X=0
	DO  I=1,NUM
	CALL Y2VALUE(Y2,NSAM,KS,CS,LAMBDA,DZ(I),AC,KFILM,A1(I),
     &               A2+0.1*DA2, A3,A4)
	 DO K=1,NSAM
	  Y3(K)=Y1(I,K)
	  y5(k)=y4(k,i)
	 ENDDO
	CALL XSUM(X1,Y3,Y2,y5,NF(I,1),NF(I,2))
	X=X+X1
	ENDDO
	X1=X
	DXA2=-(X1-X0)/(0.1*DA2)
C......GET VALUE OF dX**2/dA3
	X=0
	DO  I=1,NUM
	CALL Y2VALUE(Y2,NSAM,KS,CS,LAMBDA,DZ(I),AC,KFILM,A1(I),A2,
     &  A3+0.1*DA3,A4)
	  DO K=1,NSAM
	  Y3(K)=Y1(I,K)
	  y5(k)=y4(k,i)
	  ENDDO
	CALL XSUM(X1,Y3,Y2,y5,NF(I,1),NF(I,2))
	X=X+X1
	ENDDO
	X1=X
C	DXA3=-(X1-X0)/(0.1*DA3)
	DXA3=0

C......GET VALUE dX**2/dKFILM
	X=0
	DO  I=1,NUM
	CALL Y2VALUE(Y2,NSAM,KS,CS,LAMBDA,DZ(I),AC,
     &               KFILM+0.1*DKFILM,A1(I),A2, A3,A4)
	  DO K=1,NSAM
	  Y3(K)=Y1(I,K)
	  y5(k)=y4(k,i)
	  ENDDO
	CALL XSUM(X1,Y3,Y2,y5,NF(I,1),NF(I,2))
	X=X+X1
	ENDDO
	X1=X
	DXKFILM=-(X1-X0)/(0.1*DKFILM)
	

C......GET VALUE dX**2/dA4

	X=0
	DO  J=1,NUM
	CALL Y2VALUE(Y2,NSAM,KS,CS,LAMBDA,DZ(J),AC,KFILM,A1(J),A2,A3,
     &  A4+0.1*DA4)
	  DO K=1,NSAM
	   Y3(K)=Y1(J,K)
	   y5(k)=y4(k,j)
	  ENDDO
	CALL XSUM(X1,Y3,Y2,y5,NF(J,1),NF(J,2))
	X=X+X1
	ENDDO
	X1=X
140	DXA4=-(X1-X0)/(0.1*DA4)

C......GET VALUE dX**2/dAC

	X=0
	DO  J=1,NUM
	CALL Y2VALUE(Y2,NSAM,KS,CS,LAMBDA,DZ(J),AC+0.1*DAC,KFILM,A1(J),
     &  A2,A3,A4)
	  DO K=1,NSAM
	   Y3(K)=Y1(J,K)
 	   y5(k)=y4(k,j)
	  ENDDO
	CALL XSUM(X1,Y3,Y2,y5,NF(J,1),NF(J,2))
	X=X+X1
	ENDDO
	X1=X
	DXAC=-(X1-X0)/(0.1*DAC)

C......GET NEW VALUE OF A1,A2,A3,KFILM,A4,AC
	SUM=0
	DO I=1,NUM
	SUM=SUM+(DXA1(I)*DA1(I,I))**2
	ENDDO
	
	SUM=SUM+(DXA4*DA4)**2
	SUM=SUM+(DXA2*DA2)**2+(DXA3*DA3)**2+(DXKFILM*DKFILM)**2
	SUM=SUM+(DXAC*DAC)**2
	SUM=SQRT(SUM)
	DO I=1,NUM
	A1(I)=A1(I)+DXA1(I)*DA1(I,I)**2/SUM
	ENDDO
	A2=A2+DXA2*DA2**2/SUM
	A3=A3+DXA3*DA3**2/SUM
	KFILM=KFILM+DXKFILM*DKFILM**2/SUM
	A4=A4+DXA4*DA4**2/SUM
	AC=AC+DXAC*DAC**2/SUM
	
C......GET NEW VALUE OF Y2
	X=0
	DO I=1,NUM
	CALL Y2VALUE(Y2,NSAM,KS,CS,LAMBDA,DZ(I),AC,KFILM,
     &  A1(I),A2,A3,A4)
C......GET VALUE OF X1=SUM((Y1-Y2)**2)
	  DO K=1,NSAM
	  Y3(K)=Y1(I,K)
	  y5(k)=y4(k,i)
	  ENDDO
	CALL XSUM(X1,Y3,Y2,y5,NF(I,1),NF(I,2))
	X=X+X1
	ENDDO
	X1=X               
C......CRITERIA FOR ITERATION
	D=X0-X1
	IF(D .LT. 0.) THEN
	DO I=1,NUM
	A1(I)=A1(I)-0.5*DXA1(I)*DA1(I,I)**2/SUM
	ENDDO
	A2=A2-0.5*DXA2*DA2**2/SUM
	A3=A3-0.5*DXA3*DA3**2/SUM
	KFILM=KFILM-0.5*DXKFILM*DKFILM**2/SUM
	A4=A4-0.5*DXA4*DA4**2/SUM
	AC=AC-0.5*DXAC*DAC**2/SUM	
C	WRITE(NOUT,*)'STEP=',NSTEP
	WRITE(NOUT,210)
210	FORMAT(' A1=')
	DO I=1,NUM
	   WRITE(NOUT,200)A1(I)
	ENDDO
200	FORMAT(4F16.10)
	WRITE(NOUT,*)'SOURCE SIZE=',A2,'  KFILM=',KFILM

	WRITE(NOUT,220)
220	FORMAT(' GAUSSIAN ENVELOPE HALFWIDTH=')
	WRITE(NOUT,200)A4

	WRITE(NOUT,*)'AMPLITUDE CONTRAST=',AC	
	WRITE(NOUT,*)'X**2=',X1

C......CREATE A DIFFRACTION  PATTERN
1200	WRITE(NOUT,250)
250	FORMAT(' CREATE A POWER SPECTRUM')
	DO I=1,NUM
	  WRITE(NOUT,*)'FILE #', I

          MAXIM = 0
          CALL OPFILEC(0,.TRUE.,OUTNAME,LUN2,'U',IFORM,NSAM,NROW,1,
     &             MAXIM,'OUTPUT',.FALSE.,IRTFLG)
          IF (IRTFLG .NE. 0) RETURN

	  DO  K=1,NSAM
	    KF=FLOAT(K)*KS
	    O1=PI*(0.5*CS*LAMBDA**3*KF**4-DZ(I)*LAMBDA*KF**2)-AC
	    O2=-2.0*PI**2*A2**2*(KF**3*CS*LAMBDA**3-DZ(I)*KF*LAMBDA)**2
	    O3=-1.*PI**2*A3**2*KF**4*LAMBDA**2/(16.*ALOG(2.))
	    O4=1./(1.+(KF/KFILM)**2)
	    O5=EXP(-(KF/A4)**2)
	    Y3(K)=ABS(A1(I)*SIN(O1)*EXP(O2+O3)*O4*O5)
	  ENDDO
          CALL WRTLIN(LUN2,Y3,NSAM,1)
	  CLOSE(LUN2)
	ENDDO
	ELSE
	NSTEP=NSTEP+1
	X0=X1
C	WRITE(NOUT,*)'SPET',NSTEP
C	WRITE(NOUT,210)
C	DO I=1,NUM
C	WRITE(NOUT,200)A1(I)
C	ENDDO
C	WRITE(NOUT,*)'A2=',A2,'  A3=',A3
C	WRITE(NOUT,220)
C	DO I=1,NUM
C	WRITE(NOUT,200)A4(I)
C	ENDDO
	GOTO 999
	ENDIF
	RETURN
	END

        SUBROUTINE Y2VALUE(Y2,NSAM,KS,CS,LAMBDA,DZ,Q,KFILM,
     &	A1,A2,A3,A4)
	DIMENSION Y2(*)
	REAL KF,KS,LAMBDA,KFILM
	DATA PI/3.1415926535/
	DO  I=1,NSAM
        KF=FLOAT(I)*KS
	O1=PI*(0.5*CS*LAMBDA**3*KF**4-DZ*LAMBDA*KF**2)-Q
	O2=-2.0*PI**2*A2**2*(KF**3*CS*LAMBDA**3-DZ*KF*LAMBDA)**2
	O3=-1.*PI**2*A3**2*KF**4*LAMBDA**2/(16.*ALOG(2.))
	O4=1./(1.+(KF/KFILM)**2)
	O5=EXP(-(KF/A4)**2)
	Y2(I)=ABS(A1*SIN(O1)*EXP(O2+O3)*O4*O5)
	ENDDO
        RETURN
	END


	SUBROUTINE XSUM(X,Y1,Y2,y3,NM,NSAM)
	DIMENSION Y1(*),Y2(*),y3(512)
	X=0
	DO  I=NM,NSAM
	X=X+(y3(I)*(Y1(I)-Y2(I)))**2
	ENDDO
	RETURN
	END
