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