;function Median_Sky
;
;PURPOSE:
;	To produce a median value for a pixel that consists of sky background
;	in a given filter
;

function Flat_Median, Rootdir = Rootdir, Date=Date, ReducedDir = ReducedDir, $
		skipsky=skipsky,skipflat=skipflat, $
		BlockLength = BlockLength, DarkSub = DarkSub, $
		ObjectName = ObjectName, SkyName = SkyName, $
		NReads = NReads, ThisFilter = ThisFilter, $
		OverRide = OverRide, FlatDir = FlatDir

 ;Path Delimiter
 PathDelim = Path_Sep()

 If Not keyword_set(date) then date='07Apr30'
 If Not keyword_set(RootDir) then Rootdir='/nfs/slac/g/ki/ki09/lances/'
 If Not keyword_set(ReducedDir) then ReducedDir = $
	RootDir+'Reduced'+PathDelim+Date+PathDelim
 If Not keyword_set(FlatDir) then FlatDir = ReducedDir+'Flats'+PathDelim
 
 cd,rootdir+date
	
 ;Block Length for Offset
 If Not keyword_set(BlockLength)) then BlockLength = 0
 If Not keyword_set(skipsky)) then skipsky=0
 If Not keyword_set(skipflat)) then skipflat=0
 If Not keyword_set(ThisFilter)) then ThisFilter = 'I'
 If Not keyword_set(ObjectName)) then ObjectName = 'Dark'
 If Not keyword_set(NReads)) then NReads = 20
 If Not keyword_set(DarkSub)) then DarkSub = 1
 If Not keyword_set(SkyName)) then SkyName = 'Cuyo'

 ;Check to see if the Median Dark for 2 Reads (Flat Cadence) exists 
 DarkforFlatExists = dark_median(RootDir = RootDir, Date = '07Apr30', $
          NReads = 2, ThisFilter = ThisFilter, ObjectName = 'Dark', $
	  OverRide = 0); OverRide)
 
 ;Check to see if the Median Flat already exists; overwrite if not
 DarkSubStr = ''
 If DarkSub eq 1 then DarkSubStr = 'DarkSub' 
 FlatMedianFile = file_search(ReducedDir+'MedianFlat*'+DarkSubStr+'*'+$
		  ThisFilter+'*.fits')

 If FlatMedianFile eq '' or OverRide then begin
 
   print, 'Forming Median Flat Image for ' + strtrim(NReads,2) + ' Read Ramp for Filter ' + ThisFilter

   ;Get the Median Dark for the Flat -- Standard is 2 Reads
   If DarkSub then begin
     DarkMedianFile = file_search(ReducedDir+'MedianDark*2Reads.fits')
     Fits_Read, DarkMedianFile(0), MedianDark , DarkHeader
   Endif

   ;Set up Indices for the images in the filter we want
   Files=file_search('FlatH4RG*2_Reads*.fits')
   dummy=0
   valid_indices = 0
		
   ;Find Images with the right filters
   for i = 0, n_elements(files) - 1 do begin
      print, i
      Fits_Read,  Files(i), NoData, FitsHeader, /header_only
      Filter = sxpar(FitsHeader ,'FILTER')
      If stregex(Filter, ThisFilter , /boolean) then $
	     valid_indices = [valid_indices, i]
   endfor

   ;Get a Few Keywords
   Fits_Read,  Files(valid_indices(0)), NoData, FitsHeader, /header_only
   Naxis1     = long(sxpar(FitsHeader, 'NAXIS1'))
   Naxis2     = long(sxpar(FitsHeader, 'NAXIS2'))
   TotalReads = sxpar(FitsHeader ,'NAXIS3')
   ArrSize = long(Naxis1*Naxis2)
	
   ;Form a datacube big enough to hold the array, and use longs to deal with #
   Im=lonarr(Naxis1,Naxis2,n_elements(valid_indices-1))

   for i=1, n_elements(valid_indices) - 1 do begin
       index=valid_indices(i)
       Fits_Read, Files(index), nodata, FitsHeader, /header_only
       print, i, Files(valid_indices(i)), sxpar(Fitsheader, 'FILTER')

       ;Get Difference with the function
       im(*,*,i-1)= return_cube_diff(Files(index), ArrSize, Naxis1, Naxis2, 1, TotalReads) 
       if DarkSub then im(*,*,i-1) = im(*,*,i-1) - float(MedianDark)
       delvarx,0
    endfor

    medim=median(im,dimension=3)
    If DarkSub then begin
       writefits, Reduceddir+'MedianFlat_DarkSub_'+ThisFilter+'_'+$
		  date+'_'+Strtrim(NReads,2)+'Reads'+'.fits',medim
       print, 'Wrote Median Flat: ' +  Reduceddir+'MedianFlat_DarkSub_'+ThisFilter+'_'+date+'.fits'

    Endif Else begin
       writefits, Reduceddir+'MedianFlat_'+ThisFilter+'_'+$
		 date+Strtrim(NReads,2)+'Reads'+'.fits',medim
       print, 'Wrote Median Flat: ' + Reduceddir+'MedianFlat_'+ThisFilter+'_'+date+'.fits', Medim

    EndElse
    return, 1

 EndIf else begin
    print, 'Flat for Filter ' + ThisFilter + ' already exists... continuing'
    return, 2

 Endelse
 
stop

end
