Viewing contents of file '../idllib/ghrs/pro/calfos_repair.pro'
pro calfos_repair,mask,data
;+
;			calfos_repair
;
; Repair bad pixels in a data vector by linear interpolation over
; good pixels.
;
; CALLING SEQUENCE:
;	calfos_repair,mask,data
;
; INPUTS:
;	mask - mask of same length as data.  mask=0 (good pixel)
;					     mask=1 (bad pixel)
; INPUT/OUTPUT:
;	data - data vector
;
; OPERATIONAL NOTES:
;	if all pixels are bad, no repair is done and !err is set to -1.
;	Otherwise !err is set to 1.
;
; HISTORY:
;	version 1.0  D. Lindler   Jan 1990
;-
;---------------------------------------------------------------------------
	ns = n_elements(data)			;number of data points
	bad = where(mask) & nbad=!err		;bad data points
	if nbad eq ns then begin		;all bad?
		!err = -1
		return
	end

	if nbad gt 0 then begin			;any bad points?
;
; locate bad regions
;
		first = intarr(nbad)		;first point in regions
		last = intarr(nbad)		;last point in regions
		nregions = 0			;number of regions
		first(0) = bad(0)		;first point in first region

		for i=1,nbad-1 do begin		;loop on bad points
		    if bad(i)-bad(i-1) gt 1 then begin ; not consecutive?
			last(nregions) = bad(i-1) ;last point in region
			nregions = nregions + 1
			first(nregions) = bad(i)  ;first point in next region
		    endif
		endfor

		last(nregions) = bad(nbad-1)	;last point in last region
;
; correct each bad region
;
		for k=0,nregions do begin
		    i1 = first(k)		;first bad point
		    i2 = last(k)		;last bad point
		    j1 = i1 - 1			;previous good point
		    j2 = i2 + 1			;next good point
		    if j1 lt 0 then j1=j2	;propagate data from j2
		    if j2 ge ns then j2=j1	;propagate data from j1
		    d1 = data(j1)
		    d2 = data(j2)
		    if j1 ne j2 then frac = (d2-d1)/(j2-j1)
;
; interpolate between two good points
;
		    index = indgen(i2-i1+1) + i1
		    if j1 ne j2 then begin
			    data(index) = d1 + frac*(index-j1)	;interpolate
			  end else begin
			    data(index) = data(j1)		;propagate
		    endelse

		endfor ; loop on regions
	end; if there are any bad data points

	!err = 1
return
end