Viewing contents of file '../idllib/ghrs/pro/calhrs_vig.pro'
pro calhrs_vig,file,first_bin,dop_offsets,ih,data,eps,err,log
;
;+
;*NAME:
; calhrs_vig
;
;*PURPOSE:
; Subroutine of CALHRS to perform the vignetting correction
;
; CALLING SEQUENCE:
; calhrs_vig,file,first_bin,dop_offsets,ih,data,eps,err,log
;
; INPUTS:
;
; file - vignetting reference file name
; first_bin - vector of length n_readouts giving the
; position in ih,data,eps, and err of the first
; bin of data for the readout
; dop_offsets - vector of size 100 x n_readouts.
; dop_offset(i,j) gives the percent of time
; that offset i-50 (in deflection steps) was
; used for readout j. (compute by calhrs_dop)
;
; INPUT/OUTPUTS:
; ih - header array (128 x N)
; data - data array (512 x N)
; eps - data quality array
; err - error array
; log - processing log
;
; HISTORY:
; version 1 D. Lindler Mar 1990
; version 1.1 D. Lindler Aug 5 1991 - fixed begun in
; interpolation between line positions in CALHRS_RDVIG.pro
; 1-nov-1991 DJL/ACC - fixed bug with variable name
; (vig vs vig2)
; 2-apr-1992 JKF/ACC - allow 1D data file (DDL's).
;-
;---------------------------------------------------------------------------
VERSION = 1.2
;
; read vignetting vector
;
line = float(ih,74*2)
carpos = ih(43)
if carpos lt 0 then carpos = carpos + 65536L
calhrs_rdvig,file,carpos,line,sample,vignetting
;
; interpolate to 1/8 diode width scale (1 deflection unit)
;
svig = findgen(560*8)/8.0
linterp,sample,vignetting,svig,vig
;
; loop on readouts
;
nreads = n_elements(first_bin)
s = size(data) & ns = s(1) & nbins = n_elements(data)/ns
for iread = 0,nreads-1 do begin
;
; smooth vignetting for the given doppler motion
;
if n_elements(dop_offsets) gt 1 then begin
smooth_vig = fltarr(560*8+100)
weights = dop_offsets(*,iread)
for i=0,99 do if weights(i) gt 0 then $
smooth_vig = smooth_vig + weight*shift(vig,i)
smooth_vig = smooth_vig(50:(50+560*8-1))
end else begin
smooth_vig = vig
end
;
; determine range of bins to process
;
i1 = first_bin(iread)
if iread eq (nreads-1) then i2=nbins-1 $
else i2=first_bin(iread+1)-1
;
; loop on bins
;
for i = i1,i2 do begin
;
; compute sample mapping funtion positions for the bin
;
s0 = float(ih(70:71,i),0)
deltas = float(ih(72:73,i),0)
sample = findgen(500)*deltas + s0
;
; add special diodes
;
sample = [sample(0)-[17,17,17,3,3,3], sample, $
sample(499)+[3,3,3,17,17,17]]
;
; interpolate in the vignetting array
;
linterp,svig,smooth_vig,sample,vig2
;
; correct the data
;
data(0,i) = data(*,i)/vig2
if n_elements(err) gt 1 then err(0,i) = err(*,i)/vig2
end; for i loop on bins
end; for iread loop
;
; update history
;
hist = strarr(2)
hist(0) = 'CALHRS_VIG version '+string(version,'(F6.2)') + $
':Vignetting/Scalloping Correction'
hist(1) = ' Reference file ='+file
sxaddhist,hist,log
if !dump gt 0 then printf,!textunit,hist
ih(66,0) = ih(66,*) or 32 ;flag as done
return
end