Viewing contents of file '../idllib/iuedac/iuelib/pro/blemish.pro'
;************************************************************************
;+
;*NAME:
;
;  BLEMISH     (General IDL Library 01) August 13, 1986
;
;*CLASS: 
;
;    Data Editing
;
;*CATEGORY:
;
;*PURPOSE:  
;
;    To interactively remove blemishes in a flux vector by linear
;    interpolation between the flux values on each side of the 
;    blemish. (Based on BLEMISH by D. Lindler.)
;
;*CALLING SEQUENCE: 
;
;    BLEMISH,WAVE,FLUX,bsize,FCOR
;
;*PARAMETERS:
;
;    WAVE   (REQ) (I) (1) (F D)
;           Required input vector containing the wavelength data associated
;           with the FLUX data which are to be edited.
;
;    FLUX   (REQ) (I) (1) (F D)
;           Required input vector containing the flux data which are to be
;           edited.
;
;    BSIZE  (OPT) (I) (0) (F D)
;           Optional input scalar parameter specifying the interval, in the same
;           units as WAVE, over which the FLUX data are to be averaged 
;           on either side of the blemish, before interpolating across the
;           blemish. 
;
;    FCOR   (REQ) (O) (1) (F D)
;           Required output vector giving the edited FLUX array.
;
;*EXAMPLES
;
;    To linearly interpolate across a blemish, using the adjacent good 
;    data points:
;    BLEMISH,WAVE,FLUX,FCOR
;
;    To linearly interpolate across a blemish using an average of the 
;    data points within BSIZE wavelength units of the edges of the blemish,
;    BLEMISH,WAVE,FLUX,BSIZE,FCOR
;
;*SYSTEM VARIABLES USED:
;
;    !d.name
;    !ERR
;    !NOPRINT
;
;*INTERACTIVE INPUT:
;
;    Flux versus wavelength is plotted and the user is requested
;    to indicate with the verticle cross-hairs the extent of the
;    blemish.  The procedure then fills those points within the
;    blemish with values interpolated between the endpoints of the
;    blemish. 
;    This process is repeated until the user types 0 (zero) or presses
;    the right mouse button when asked to position the crosshairs.
;
;*SUBROUTINES CALLED:
;
;    BINS
;    TABINV
;    PARCHECK
;    PCHECK
;
;*FILES USED:
;
;*SIDE EFFECTS:
;
;    Aborting the procedure may result in !ERR and !NOPRINT being 
;    altered. 
;    
;*RESTRICTIONS:
;
;    Device Dependent - This procedure requires a terminal equipped 
;                       with a graphics cursor.
;    (modified to run under unix sun idl version 1.2)
;
;*NOTES:
;
;        Order of specifying endpoints is not important.
;
;	tested with IDL Version 2.1.0 (sunos sparc)  	19 Jun 91
;	tested with IDL Version 2.1.0 (ultrix mispel)	N/A
;	tested with IDL Version 2.1.0 (vms vax)      	19 Jun 91
; 
;                
;*PROCEDURE: 
;
;    For each pair of positions marked by the user the wavelengths
;    at those points are computed by CURSOR. The subscripts
;    associated with those wavelengths are computed with TABINV.
;    BINS is called to calculate binned flux if BSIZE is specified.
;    Let IMIN and IMAX be the pair of subscripts.  For each value
;    of I, IMIN < I < IMAX, a new flux is computed for FCOR(I):
;         
;    FCOR(I) = FCOR(IMIN) + S*(WAVE(I)-WAVE(IMIN))
;    where:
;    S = (FCOR(IMAX)-FCOR(IMIN)) / (WAVE(IMAX)-WAVE(IMIN))
;    or, if BSIZE is specified,
;    S = (MEAN(1) - MEAN(0))  / (WC(1) - WC(0))
;    where MEAN is the average flux values and WC is the bin center
;    positions.
;
;        
;*MODIFICATION HISTORY:
;
;                 D. Lindler  GSFC  initial version
;    Oct 31 1985  JKF         GSFC  DIDL compatible (indirect compilation)
;    Jul 25 1986  CLI         GSFC  add BSIZE parameter to take average flux
;                                   on either side of the specified points.
;    Aug 13 1986  RWT         GSFC  use N_ELEMENTS and CURSOR commands
;    Feb 19 1987  RWT         GSFC  VAX Mods: make BSIZE optional, account
;                                   references, @ for #, remove one GOTO
;                                   statement and DO loop, improve calculation
;                                   of subscripts, allow points to be 
;                                   specified in any order.
;
;    Mar 14 1987  RWT         GSFC  add PARCHECK
;    May  6 1987  RWT         GSFC  fix error with N_PARAMS(0)=3 mode
;    Mar  8 1988  CAG         GSFC  VAX RDAF-style prolog, add disabling
;                                   of tabular printout from BINS.
;    jan  1 1990  jtb         gsfc  modified for sun/unix idl.
;    Jun 19 1991  PJL         GSFC  cleaned up; tested on SUN and VAX;
;				    updated prolog
;
;-
;********************************************************************
 pro blemish,wave,flux,bsize,fcor
;
 npar = n_params(0)
 if npar eq 0 then begin
    print,' BLEMISH,WAVE,FLUX,bsize,FCOR'
    retall
 endif  ; npar
 parcheck,npar,[3,4],'BLEMISH'
 pcheck,wave,1,010,0111
 pcheck,flux,2,010,0111
;
 fcor=flux
 npts = fix(n_elements(flux))
;
; check for optional bsize parameter (set to 0 if not specified)
;
 if n_params(0) lt 4 then bs = 0.0 else bs = float(bsize)
 wc = fltarr(2)
 width = wc + bs
;
 noprint=!noprint    ;save !noprint
 !noprint=1          ;set noprint to suppress "bins" output
;
; loop to plot flux with directions for blemish removal
;
 while 1 do begin            ;loop until interactive exit
;
    plot,wave,fcor
;
    if (strlowcase(!d.name) ne 'tek') then begin
   ;
       print,'Press the MIDDLE or LEFT buttons to select each POINT using'
       print,'the VERTICLE CROSSHAIR.'
       print,'Press the RIGHT mouse button to EXIT.'
   ;
    endif else begin
   ;
       print, 'Press the SPACE BAR to select each POINT using'
       print, 'the VERTICAL CROSSHAIR.'
       print, 'Type 0 (no  return) to EXIT.'
   ;
    endelse  ; !d.name
   ;
    if bs ne 0 then begin
       print,' '
       print,form="(1x,a,f7.2,a)", $
          'The interpolation will be made using mean fluxes in ',bs,' ang bins'
       print,' on either side of the points chosen.'
    endif  ; bs
;
; let user define limits to fix region using cursor
;
    cursor,w1,f1,/down,/data
    flush = get_kbrd(0)
    print,string(7b)
    if !err eq "60 or !err eq 4 then goto,end_loop
;
    cursor,w2,f2,/down,/data
    flush = get_kbrd(0)
    print,string(7b)
    if !err eq "60 or !err eq 4 then goto,end_loop
;
; compute subscripts for area to be corrected
;
    tabinv,wave,w1,p1
    tabinv,wave,w2,p2
    imin = fix((p1<p2)+0.5) < (npts-2)
    imax = fix((p1>p2)+0.5) > (imin+2)
;
; find average flux next to specified endpoints (for bs = 0.0)
; tabular printout is suppressed for this section (!noprint = 1)
;
    if bs ne 0.0 then begin
       wc([0,1]) = [wave(imin)-bs/2.,wave(imax)+bs/2.]
       bins,wave,flux,wc,width,mean,sigma,np
       s = (mean(1)-mean(0))/(wc(1)-wc(0))
       f0 = mean(0) + s*bs/2.
    endif else begin
       s = (fcor(imax)-fcor(imin))/(wave(imax)-wave(imin))
       f0 = fcor(imin)
    endelse  ; bs
;    
; fix up bad region
;
    fcor(imin+1) = f0 + s*(wave(imin+1:imax-1)-wave(imin))
 endwhile  ; 1
;
;
 end_loop:
    if (n_params(0) eq 3) then bsize = fcor
    !noprint = noprint        ;restore !noprint
;
 return
 end  ; blemish