Function sum_FField,data,Slit,RefPix,FFfile,Reverse=Reverse,Flat=FFdat,$
    NorthUp=NorthUp,Quiet=Quiet

if ((slit eq 3) or  (slit eq 5) or  (slit eq 6) or  (slit eq 8)) and $
    not keyword_set(NorthUp) and not keyword_set(Quiet) then $
    message,/info,'The program assumes by default that the data is '+$
    'oriented with South up. If your data has North up (as is the case for '+$
    'data from the .fts files) please use the NorthUp keyword.'
    
;determine size of data;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
dsize=size(data)
if dsize(0) eq 2 then nexp = 1 else nexp = dsize(3)
dY =  dsize(2)
dW = dsize(1)
data=float(data)
data_out=fltarr(dW,dY,nexp)

;determine subframe of image;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

up = 299
center = 179
down = 59
if keyword_set(NorthUp) then begin 
   case slit of
     1: SlitLoc = center
     2: SlitLoc = center
     3: SlitLoc = down
     4: SlitLoc = center
     5: SlitLoc = up
     6: SlitLoc = down
     7: SlitLoc = center
     8: SlitLoc = up
     9: SlitLoc = center  
     else: message,'Problem with slit'
   endcase  
endif else begin
   case slit of
     1: SlitLoc = center
     2: SlitLoc = center
     3: SlitLoc = up
     4: SlitLoc = center
     5: SlitLoc = down
     6: SlitLoc = up
     7: SlitLoc = center
     8: SlitLoc = down
     9: SlitLoc = center
     else: message,'Problem with slit'
   endcase
endelse
if dY GE 360 THEN SlitLoc = center      ; accept large format with short slit

                    ;spatial image range
YRange=[SlitLoc,SlitLoc]+[-dY/2+1,dY/2]

                    ;wavelength direction range
if dw eq 1024 then wrange=[0,1023] else begin
   if dW mod 2 eq 0 then WRange = [refpix-1,refpix-1]+[-dW/2+1,dW/2] $
                 else WRange = [refpix-1,refpix-1]+[-dW/2,dW/2]

endelse

if WRange(0) lt 0 then data1=data(dW-1-WRange(1):dW-1,YRange(0):YRange(1))else $
if WRange(1) gt 1023 then data1=data(0:1023-WRange(0),YRange(0):YRange(1)) else data1=data

WRangeff=WRange>0
WRangeff=WRangeff<1023
data_out1=data1
         
; get flat field correction matrix

if n_elements(FFdat) ne 360*1024. then begin
   if n_elements(FFfile) eq 0 then begin
                        ; restore ff-matrix
      if file_exist('ff.rst') then begin
          message,/info,'Using flatfield in ff.rst'
          restore,'ff.rst'
      endif else message,'Flat field must be in FITS file FFile (a function input)'+$
                ' or in file ff.rst'

   endif else begin
                        ; read in FITS flat field
   ft_sumread_fits,FFFile,hff,bff,nff,FFdat,col=[1]

   endelse
endif
                        ;select subframe of flat field
FF=float(FFdat(WRangeff(0):WRangeff(1),YRange(0):YRange(1)))


;perform flat field correction or undo;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

for  i=0,nexp-1 do begin
      if keyword_set(Reverse) then data_out1(*,*,i) = float(data1(*,*,i)) * FF $
      else data_out1(*,*,i) = float(data1(*,*,i)) / FF

if WRange(1) gt 1023 then data_out(0:1023-WRange(0),YRange(0):YRange(1))=data_out1 else $
if Wrange(0) lt 0 then $
data_out(dW-1-WRange(1):dW-1,YRange(0):YRange(1))=data_out1 else data_out=data_out1
endfor

return,data_out

end