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