Viewing contents of file '../idllib/ghrs/pro/calfos_flt.pro'
pro calfos_flt,flat,ypos,config,pattern,h,data,err
;+
;			CALFOS_FLT
;
; FOS flat fielding
;
; CALLING SEQUENCE:
;	calfos_flt,flat,ypos,config,pattern,h,data,err
;
; INPUTS:
;	flat - flat field array  NS x 2.
;		flat(*,0) = upper or single aperture or pass_dir = 1
;		flat(*,1) = lower aperture or pass_dir = 2
;	ypos - two element vector containing the ybase for the
;		upper and the lower aperture for a paired aperture.
;	config - instrument configuration (output from CALFOS_RD)
;	pattern - pattern vector (output from CALFOS_RD)
;
; INPUT/OUTPUTS:
;	h - fits header
;	data - data array
;	err - propagated error array
;
; HISTORY:
;	version 1.0  D. Lindler  Jan 1990
;-
;----------------------------------------------------------------------------
;
; get configuration and pattern information
;
	polar_id = strtrim(config(2))
	if strtrim(config(7)) eq 'PAIR' then paired = 1 else paired = 0
	ytypes = config(4:6)
	ysteps = pattern(6)
	yrange = pattern(5)
	ybase = pattern(4)
	slices = pattern(9)
	nreads = pattern(10)
;
; determine which ysteps to calibrate
;
	if ysteps le 3 then begin
		calibrate = intarr(ysteps)
		for i=0,ysteps-1 do if strtrim(ytypes(i)) ne 'BCK' then $
				calibrate(i) = 1
	end else calibrate=replicate(1,ysteps)
;
; determine which of the two flat fields to use
;
	if polar_id eq 'C' then begin

		if paired then begin
			y = ybase + (yrange*32.0)/ysteps*indgen(ysteps)
			pos = abs(ypos(1)-y) lt abs(ypos(0)-y)
		end else pos = intarr(ysteps)

	   end else begin

		if ysteps le 3 then begin
			pos = intarr(ysteps)
			nobj = 0
			for i=0,ysteps do begin
				if strtrim(ytypes(i)) eq 'OBJ' then begin
					pos(i) = nobj
					nobj = nobj + 1
				endif
			endfor
		end else pos = intarr(ysteps)
	endelse
;
; loop on readouts and slices
;
	f0 = flat(*,0)
	f1 = flat(*,1)
	for iread = 0,nreads-1 do begin
	    for slice = 0,slices-1 do begin
	    	ipos = iread*slices + slice	;last subscript in data array

;
; loop on ysteps
;
		for ys = 0,ysteps-1 do begin
		    if calibrate(ys) then begin
		       if pos(ys) eq 0 then data(0,ys,ipos)=data(*,ys,ipos)*f0 $
			               else data(0,ys,ipos)=data(*,ys,ipos)*f1
		       if n_elements(err) gt 1 then begin
			 if pos(ys) eq 0 then err(0,ys,ipos)=err(*,ys,ipos)*f0 $
					 else err(0,ys,ipos)=err(*,ys,ipos)*f1
		       endif
		    endif
		endfor
	    endfor
	endfor

return
end