Viewing contents of file '../idllib/ghrs/pro/calhrs_rdvig.pro'
pro calhrs_rdvig,file,carpos,line,sample,vignetting
;
;+
;*NAME:
;			calhrs_rdvig
;
;*PURPOSE:
; Obtain vignetting curve for given carrousel position and
; photocathode line position by bilinear interpolation in a vignetting
; reference file
;
; CALLING SEQUENCE:
;	calhrs_rdvig,file,carpos,line,sample,vignetting
;
; INPUTS:
;	file - vignetting file name
;	carpos - carrousel position
;	line - photocathode line position
;
; OUTPUTS:
;	sample - vector of sample locations
;	vignetting - vector of vignetting values
;
; HISTORY:
;	version 1  D. Lindler Mar 1990
;	Aug 5, 1991  Fixed bug in LINE interpolation (D. Lindler)
;	Oct. 6, 1992  DJL Changed so that it does not extrapolate in line
;			positions  
;	Oct 5 1992	JKF/ACC	- (DJL) - read new vign. files.
;-
;---------------------------------------------------------------------------
;
; Open file and extract group parameters
;
	sxopen,9,strtrim(file,2),h
	gcount = sxpar(h,'gcount')
	psize = sxpar(h,'psize')/8	;size of parameter block in bytes
	pblk = bytarr(psize,gcount)
	ns = sxpar(h,'naxis1')
	s0 = sxpar(h,'sampbeg')
	deltas = sxpar(h,'sampoff')
	sample = findgen(ns)*deltas + s0 ;tabulated sample positions
 
	for i=0,gcount-1 do begin
		x = sxread(9,i,par)
		pblk(0,i) = par
	end
 
	lines = sxgpar(h,pblk,'line_pos')
	cpos  = sxgpar(h,pblk,'car_pos')
;
; Determine vignetting at the closet tabulated carrousel positions
; above and below CARPOS
;
	sub = sort(cpos)		;sort by carrousel position
	cpos = cpos(sub)
	lines = lines(sub)
 
	below = where(cpos le carpos) & nbelow = !err
	nabove = gcount - nbelow
;
; determine the two carrousel positions to interpolate between
;
	c = lonarr(2)
	if nbelow gt 0 then c(0) = cpos(nbelow-1) else c(0) = cpos(0)
	if nabove gt 0 then c(1) = cpos(nbelow) else c(1) = c(0)
;
; compute vignetting at each of the two carrousel positions
;
	vig = fltarr(ns,2)
	for ic = 0,1 do begin
		good = where(cpos eq c(ic)) & ngood = !err
		goodsub = sub(good)
		L = lines(good)
;
; Interpolate between closest line positions
;
		ind = sort(L)
		L = L(ind)
		goodsub = goodsub(ind)
		below = where(L le line) & nbelow = !err
		above = ngood - below
		i1 = (nbelow-1)>0
		i2 = (nbelow)<(ngood-1)>0
 
		if i1 eq i2 then begin
			vig(0,ic) = sxread(9,goodsub(i1)) ;do not extrapolate
		   end else begin
			vig1 = sxread(9,goodsub(i1))
			vig2 = sxread(9,goodsub(i2))
			L1 = L(i1)
			L2 = L(i2)
			frac = (line - L1)/(L2 - L1)
			vig(0,ic) = vig1*(1.0-frac) + vig2*frac
		end
;
; We are done if we do not need to interpolate in carrousel positions
;
		if (c(1) eq c(0)) or (c(0) eq carpos) then begin
			vignetting = vig(*,0)
			close,9
			return
		endif
	end
;
; interpolate in carrousel positions
;
	frac = (carpos - c(0))/(c(1)-c(0))
	vignetting = vig(*,0)*(1.0-frac) + vig(*,1)*frac
	close,9
	return
end