Viewing contents of file '../idllib/ghrs/pro/calfos_exp.pro'
pro calfos_exp,fname,pattern,ddt,h,gpar,data,eps,err,expmax
;+
;			CALFOS_EXP
;
; Convert to count rates
;
; CALLING SEQUENCE:
;	calfos_exp,fname,pattern,ddt,h,gpar,data,eps,err,expmax
;
; INPUTS:
;	fname - rootname of observation
;	pattern - pattern vector for CALFOS_RD
;	ddt - disabled diode table (for the diode range observed)
;		Value = 0  (good diode)  Value=1 (bad)
;
; INPUT/OUTPUT:
;	h - FITS header
;	gpar - group parameters from calfos_rd
;	data - data array
;	eps - data quality array
;	err - error array
;
; OUTPUT
;	expmax - maximum exposure time for a readout
;	
; HISTORY:
;	version 1  Don Lindler Jan 1990
;	version 2  D. Neill Mar 1992 Modified to read reject array directly
;	version 3  D. Lindler  Apr, 1993  added EXPMAX output parameter
;-
;--------------------------------------------------------------------------
	expmax = 0.0
;
; get useful information from pattern and from header
;
	nxsteps = pattern(3)
	overscan = pattern(2)
	nchnls = pattern(1)
	ysteps = pattern(6)
	slices = pattern(9)
	nreads = pattern(10)
	ns = pattern(8)
	ns_per_xstep = pattern(7)
	name = 'the .d0h file'
	ints = sxpar(h,'ints',name)
	npat = sxpar(h,'npat',name)
	reads_per_clear = sxpar(h,'nread',name)
	livetime = sxpar(h,'livetime',name) * 7.8125E-6
	v = sxgpar(h,gpar(*,0,0),'EXPTIME',dtype1,sbyte1)	
	if !err lt 0 then Begin
		print,'EXPOSURE assumed to be the group parameter name'
		v = sxgpar(h,gpar(*,0,0),'EXPOSURE',dtype1,sbyte1)
	endif
;
; create reject array if needed
;
	if sxpar(h,'trailer',name) then begin
		reject=intarr(nxsteps,overscan,ysteps,slices,nreads)
		sxopen,1,strtrim(fname)+'.d1h'
		for i=0,nreads-1 do begin
			d = fix(sxread(1,i))
			reject(0,0,0,0,i) = $
				fix(d,0,nxsteps,overscan,ysteps,slices)
		endfor
		rejects_present = 1
	endif else rejects_present = 0
;
; create a dead diode array padded for overscan
;
	if overscan eq 1 then dead = ddt $
			 else dead = [ddt,replicate(1,overscan-1)]
	index = indgen(ns_per_xstep)*nxsteps	;indices for one xstep

;
; loop on readouts
;
	for frame = 0,nreads-1 do begin

    	    clears = frame/reads_per_clear	;number of clears so far
	    iread = frame - clears*reads_per_clear+1 ;effective readout number
	    nr = ints*npat*iread		;effective number of rejects
						;     do to disabled diode
	    ncoadds = nr*overscan		;total number of coadds per
						;	data point
	    dead_rejects = dead*nr		;rejects from disabled diodes
	    expotime = ncoadds*livetime
	    expmax = expmax>expotime
	    expotime = byte(expotime,0,4) ;exposure for group pars
;
; loop on every thing else
;
	    for slice = 0,slices-1 do begin
		islice = slices*frame + slice	;slice position in data arrays

		for ystep = 0,ysteps-1 do begin
		    missed = lonarr(ns)
		    for oscan = 0,overscan-1 do begin
;
; shift disabled diode rejects to proper oscan position
;
		        sdead = shift(dead_rejects,oscan) 

			for xstep = 0,nxsteps-1 do begin
			    misses = sdead
			    if rejects_present then misses=misses > $
					reject(xstep,oscan,ystep,slice,frame)
			    ind = index+xstep
			    missed(ind)=missed(ind)+misses ;sum over overscan
			endfor ;loop on xsteps
		    endfor; loop on overscan
;
; find number of hits
;
		    hits = ncoadds - missed
		    bad = where(hits le 0) & nbad = !err
		    hits = hits>1		;let's not divide by
						;    zero and say we did
		    sort_of_bad = where(ncoadds/hits ge 2) & nsort_of = !err
;
; divide by exposure time
;
		    expo = livetime*hits
		    d = data(*,ystep,islice)/expo
		    if nbad gt 0 then d(bad) = 0.0
		    data(0,ystep,islice) = d
		    gpar(sbyte1,ystep,islice) = expotime
;
; propagate errors (in data, not in the code)
;
		    if n_elements(err) gt 1 then begin
			e = err(*,ystep,islice)/expo
			if nbad gt 0 then e(bad) = 0.0
			err(0,ystep,islice) = e
		    endif
;
; flag bad and sort of bad data
;
		    if (nbad gt 0) or (nsort_of gt 0) then begin
			e = eps(*,ystep,islice)
			if nbad gt 0 then e(bad) = e(bad)>400
			if nsort_of gt 0 then e(sort_of_bad) = $
						e(sort_of_bad)>50
			eps(0,ystep,islice) = e
		    endif

		endfor; loop on ysteps
	    endfor; loop on slices
	endfor; loop on frames
;
; Did you ever think that dividing by exposure time could be so hard.
;
	hist='Data converted to count rates'
	sxaddhist,hist,h
	if !dump gt 0 then print,hist
return
end