pro restore_overflow, data, det_sorted, maxindex=maxindex on_error,2 ;spex_over_test - if this is set, then an alternative technique is used to ; discover overflow conditions and correct them. Not the ; standard technique in the BATSE directory common restore_overflow, spex_over_test ;SETUP NEW ARRAY ; ;LOOP THROUGH FIRST 4 CHANNELS IN EACH DETECTOR, INCLUDING TOTAL NaI rate ; ;START AT THE LEAST SUNWARD DETECTOR, HIGHEST ENERGY CHANNEL ;CORRECT IT FOR OVERFLOW AND SO IN SUCCESSION TILL DONE ; ndet = n_elements(data(0,*,0)) checkvar, det_sorted, indgen(ndet) det_id = det_sorted(0) nchan = n_elements( data(*,0,0) ) komni = 0 checkvar, maxindex, n_elements(data(0,0,*))-1 ; ; Look for HXT cal data first ; case ndet of 64: begin ; HXT CAL ichan = 10 i_init= 9 data = data * 256L end else: begin case nchan of 6: begin ; DISCLA data ; If any part of interval is in omni mode, can't use channel 3. ; CHANGE: channel 3 has been redefined from channel 4 qomni = where ((data(0,0,*) ne 0) and (data(3,0,*) eq 0), komni) if komni then i_init = 2 else i_init = 3 ichan = 5 end 16: begin ; CONT data ichan = 15 i_init = 14 end 4: begin ; DISCSP data ichan = 3 i_init = 2 end endcase end endcase FOR I = I_init,0,-1 DO BEGIN ;START AT THE HIGHEST ENERGY ; if i eq 0 and nchan eq 4 then $ ;correct channel 0 of discsp by subtracting higher cleaned rates data(0,*,*) = data(0,*,*) - data(1,*,*) ;LOOP THROUGH EACH DETECTOR ; FOR J=ndet-1,0,-1 DO BEGIN ;START AT THE LEAST SUNWARD ; ;Identify the current detector and channel and the last one corrected ; last_id = det_id ;last detector corrected last_chan = ichan ;last channel corrected det_id = det_sorted(j) ;current detector ichan = i ;current channel ; wnz = where( total( abs(data(*,det_id,0:maxindex)),1) ne 0.0 $ and total( abs(data(*,last_id,0:maxindex)),1) ne 0.0, nzero) if nzero gt 0 then begin jumper, reform(data(ichan,det_id,wnz)), clean, summed=summed ; ;TEST TO SEE WHETHER FIRST OVERFLOW CORRECTION WAS SUFFICIENT ; wless = where( clean lt 0, nless) if total(summed) ne 0 or nless ge 1 then begin ; ; Change below: channel 2 is now the next to the last ; channel. ; ; if we're in omni mode, and on channel 2, and least sunward ; detector and first overflow correction was not sufficient, ; can't do any more. Write message and get out. if komni and (i eq I_init) and (J eq 7) then begin printx, ' ' printx,'Error - unable to correct overflow.' printx,' Omni antenna was used during part of the ' + $ 'overflow interval, resulting' printx,' in incomplete data in high energy channels.' printx, ' ' goto, getout endif ;COMPARE NEW RATE WITH LAST CLEANED RATE AND LOOK FOR JUMPS ; jumper, reform(clean-data(last_chan,last_id,wnz)), clean, summed=summed clean = reform(data(last_chan,last_id,wnz)) + clean wless = where( clean lt 0, nless) if total(summed) ne 0 or nless ge 1 and nchan ne 6 and j ne (ndet-1) and $ fcheck(spex_over_test) then begin ;retry using closest rate of cleaned rates instead of last cleaned! ;try this comparison only for non-discla data! big_test = 3e4 start: ;find the most comparable rate when flux is getting ng intense wbig = where( clean gt big_test, nbig) if nbig ge 1 then wbig=wbig(0) else begin big_test =big_test - 1000. if big_test lt 1000. then goto, giveup goto, start endelse candidate_ids = det_sorted(j+1:ndet-1) test = min( abs( clean(wbig)-data(last_chan,candidate_ids,wbig)), min_script) ;Min_script is the index of the corrected rate closest to the current is_clean = reform(data(last_chan, candidate_ids(min_script), wnz)) ;scale the IS_CLEAN rate as closely as possible to the rate to clean is_clean = clean(wbig)/is_clean(wbig) * is_clean jumper, clean-is_clean, clean, summed=summed clean = clean +is_clean endif giveup: if total(summed) ne 0 then begin if nchan eq 4 then begin printx, 'WARNING - Possible problem with overflow ' +$ 'correction.' endif else begin jumper2, reform(clean-data(last_chan,last_id,wnz)), $ clean, summed=summed clean = reform(data(last_chan,last_id,wnz)) + clean endelse endif ;stop endif data(ichan,det_id,wnz) = clean(*) endif; ENDFOR ENDFOR if nchan eq 4 then $ ;add the higher channel data to channel 0, expected by calling routine data(0,*,*) = data(0,*,*) + data(1,*,*) getout: if ndet eq 64 then data=data/256L END