Viewing contents of file '../idllib/contrib/icur/fftsm.pro'
;*******************************************************************
PRO FFTSM,FLUX,MODE,IFSM,helpme=helpme
; MODE=0 IS INTERACTIVE, MODE=1 IS AUTOMATIC, WITH GAUSSIAN FILTER AND
; DEFAULT HALF-POWER POINT AT THE NYQUIST FREQUENCY
COMMON COMXY,XCUR,YCUR,ZERR,zzz,lu3
common icurunits,xunits,yunits,title,c1,c2,c3,ch,c4,c5,c6,c7,c8,c9
IF N_PARAMS(0) EQ 0 THEN helpme=1
if keyword_set(helpme) then BEGIN
   print,' '
   print,'* FFTSM --  Fourier smoothing'
   print,'* Minimum call is FFTSM,F,M,FSM'
   print,'*    F: vector to be smoothed'
   print,'*    M: 0 for interactive (default), 1 for automatic'
   print,'*    FSM: if mode=1, optional input half power width in units of the'
   print,'*               Nyquist frequency (default=1.0).'
   print,'*         if mode=0, FSM is the HPP output in units of the Nyquist Frequency.'
   print,' '
   return
   endif
;
if n_elements(xunits) eq 0 then xunits=''
if n_params(0) eq 1 then mode=0   ;default=interactive
if n_elements(c2) eq 0 then c2=!p.color
if n_elements(c3) eq 0 then c3=!p.color
if strupcase(!d.name) eq 'X' or strupcase(!d.name) eq 'WIN' then $
     iscr=1 else iscr=0
if n_elements(xcur) eq 0 then xcur=0
if n_elements(ycur) eq 0 then ycur=0
X0=XCUR & Y0=YCUR
IGS=0
FORIG=FLUX
PI=180./!RADEG
NMAX0=N_ELEMENTS(FLUX)
; EXPAND VECTOR LENGTH TO FACTOR OF 2
L=ALOG10(NMAX0)/ALOG10(2.)
IEXPAND=0
IF (L - FIX(L)) NE 0. THEN BEGIN
   IEXPAND=1
   MEAN=TOTAL(FLUX)/FLOAT(NMAX0)
   L=long(L)+1l
   F=FLTARR(2L^L)+MEAN  ;PAD WITH MEAN LEVEL
   F(0)=FLUX
   FLUX=F
   ENDIF
NMAX=N_ELEMENTS(FLUX)
NM2=NMAX/2L
IX=FINDGEN(NM2) & IX2=FINDGEN(NMAX)
FFL=FLUX
FLUX=FFT(FLUX,-1)
Z1=' '
NIT=0
YM=MAX(FLUX(1:NM2-1))
I1=NM2/2.-0.5  ;POSITION AT NYQUIST FREQUENCY
I0=0L
KGO=0
if n_elements(ifsm) gt 0 then begin
   if (mode eq 1) and (ifsm gt 0.) then i1=(i1/ifsm>0)<nm2
   endif
IF MODE EQ 1 THEN GOTO,AUTO
; set up plot parameters
XTIT=!X.TITLE & YTIT=!Y.TITLE & mt=!p.title
X1=!X.range(0)
X2=!X.range(1)
Y1=!Y.range(0)
Y2=!Y.range(1)
;
PLT:
!x.ticks=0
!X.TITLE=''
!Y.TITLE='Amplitude'
SETXY,0.,0.,-YM,YM
!C=-10
PLOT,IX,FLUX,xr=[0,n_elements(ix)-1],/xsty               ;FFT
oplot,[NM2/2.-0.5,NM2/2.-0.5],!y.crange,linestyle=1,psym=0,color=c2  ;Nyquist freq.
IF n_elements(gsn) gt 1 THEN OPLOT,IX,GSN*YM,color=c3
IF NIT EQ 0 THEN BEGIN
   XCUR=NM2/2.-0.5   ;MOVE X TO NYQUIST FREQUENCY
   YCUR=!Y.CRANGE(0)+0.75*(!Y.CRANGE(1)-!Y.CRANGE(0))
   ENDIF
!p.NOERASe=0
if iscr then wshow
Z='MARK HALF WIDTH (C->cosine;also c,g), > to zero, Q TO ABORT'+Z1
print,z
MVCUR:
opstat,'  Waiting'
xu0=xunits & xunits='f/Nyquist f'
BLOWUP,-1,readout=101
xunits=xu0
opstat,'  Working'
if zerr eq 13 then zerr=32  ;CR valid response
if (zerr lt 26) or (zerr gt 122) then zrecover
IF (ZERR EQ 90) or (zerr eq 122) THEN BEGIN   ;<Z,z>
   STOP,' FFTSM STOP'
   GOTO,PLT
   ENDIF
IF (ZERR EQ 81) or (zerr eq 113) THEN BEGIN   ;<Q,q>
   FLUX=FORIG
   I1=0L
   GOTO,QUIT
   ENDIF
IF (ZERR EQ 78) or (zerr eq 110) or (ZERR EQ 82) or (zerr eq 114) $
      THEN BEGIN   ;<N,R> MOVE CURSOR TO NYQUIST FREQUENCY
   XCUR=NM2/2.-0.5
   YCUR=!Y.CRANGE(0)+0.75*(!Y.CRANGE(1)-!Y.CRANGE(0))
   GOTO,MVCUR
   ENDIF
IF (ZERR EQ 50) or (zerr eq 72) or (ZERR EQ 104) $
      THEN BEGIN   ;<2,h> MOVE CURSOR TO half NYQUIST FREQUENCY
   XCUR=NM2/4.-0.5
   YCUR=!Y.CRANGE(0)+0.75*(!Y.CRANGE(1)-!Y.CRANGE(0))
   GOTO,MVCUR
   ENDIF
IF (NIT GT 0) AND (ZERR EQ 48) THEN GOTO,GOON
I1=XCUR
NIT=1
;
IF ZERR EQ 62 THEN BEGIN   ;> ; ZERO POWER IN HIGH FREQUENCIES
   IGS=-1
   K=FLTARR(NMAX-(I1<NM2)*2)
   FFL=FLUX & FFL(I1)=K
   GOTO,CFT
   ENDIF
;
IF ZERR EQ 60 THEN BEGIN   ;> ; ZERO POWER IN Low FREQUENCIES
   IGS=-1
   K=FLTARR(I1<(nmax-1))
   FFL=FLUX & FFL(0)=K
   GOTO,CFT
   ENDIF
;
KGO=ZERR
IF (ZERR EQ 99) OR (ZERR EQ 103) THEN BEGIN   ; SECOND CURSOR CALL
   print,' hit cursor again'
   opstat,'  Waiting'
   BLOWUP,-1,readout=101
   opstat,'  Working'
   if (zerr lt 26) or (zerr gt 122) then zrecover
   I=XCUR
   IF I LT 0. THEN I=0L
   I0=LONG(I<I1) & I1=LONG(I>I1)
   ENDIF ELSE I0=0L
AUTO:
   GSN=FLTARR(NMAX)+1.
   G0=GSN*0.
IF (KGO EQ 67) OR (KGO EQ 99) THEN BEGIN   ;<C,c> USE COSINE FILTER
   IGS=1
   V=PI/2.*FINDGEN(((I1-I0)*2)<NMAX)/FLOAT(I1-I0)
   C=(COS(V)+1.)/2.
   G0(0)=C
   GSN(I0)=G0(0:nmax-i0-1)
   GOTO,PFILT
   ENDIF                       ; CREATE GAUSSIAN FILTER
  IGS=2
  EXPT=(IX2/(I1-I0))<9.
  EXPT=-ALOG(2.)*EXPT*EXPT
  G0=(EXP(EXPT)>1.E-18)
  GSN(I0)=G0(0:nmax-i0-1)
PFILT:                         ; REFLECT FILTER FUNCTION
FOR I=0L,NM2-1L DO GSN(NMAX-1-I)=GSN(I)
!C=-10
IF MODE EQ 0 THEN begin
   OPLOT,IX,GSN*YM,color=c3
   oplot,[NM2/2.-0.5,NM2/2.-0.5],!y.crange,linestyle=1,psym=0,color=c2
   endif
FFL=FLUX*GSN
CFT:
FFL=FFT(FFL,1)
IF MODE EQ 1 THEN GOTO, GOON   ;AUTOMATIC FIT
;
!p.position=[.2,.5,.9,.9]
!X.RANGE(*)=0.
!Y.RANGE(*)=0.
!C=-10
!y.title=ytit
!p.title=mt
!x.tickname=' '
PLOT,FFL(0:nmax0-1)
!x.tickname=''
!p.position=[.2,.1,.9,.5]
!p.NOERASE=1
!p.title=''
Z1='; TYPE 0 IF OK
GOTO,PLT
;
GOON: FLUX=FLOAT(FFL)
IF IEXPAND EQ 1 THEN FLUX=FLUX(0:NMAX0-1)
QUIT:
Z='                                                                         '
IF MODE EQ 0 THEN begin
   print,z
   SETXY,X1,X2,Y1,Y2
;   !x.range=[X1,X2]
;   !y.range=[Y1,Y2]
   !p.position=[.2,.2,.9,.9]
   !y.title=ytit
   !x.title=xtit
   !p.title=mt
   !x.ticks=0
   endif
IFSM=FIX(FLOAT(I1)/FLOAT(NM2)*1000.)
IF IGS EQ -1 THEN IFSM=-IFSM ELSE IFSM=IFSM+10000*IGS+5000*(I0/(I0>1))
zerr=68
XCUR=X0 & YCUR=Y0
RETURN
END