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