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