
pro fg_get_dark, index, dark_index, dark_image, darkdir =darkdir,  $
                 darkfile=darkfile, uniform_bias=uniform_bias, $
                 deltaday=deltaday, $
                 version=progver, name=prognam, retrn=retrn, $
                 verbose=verbose, loud=loud, $
                 _extra=_extra
;+
; NAME:
;	FG_GET_DARK
;
; PURPOSE:
;       Return an FG dark image appropriate for the index structure. 
;       This routine is called from FG_DARK_SUB by default when a 
;       user-provided dark image is not available.
;       If dark image appropriate to the passed index structure is not
;       found, an array of appropriate size filled with a constant
;       'uniform bias' value is created and returned.  The uniform bias
;       value is currently set to 190.
;       
; CATEGORY:
;	FITS processing
;
; SAMPLE CALLING SEQUENCE:
;	fg_get_dark, index, dark_index, dark_image   $
;                [, darkdir=darkdir, deltaday=deltaday, darkfile=darkfile $
;                 , /verbose, /loud, version=version, name=name ]
;
; INPUTS:
;	INDEX	   - the SSW index structure
;
; OUTPUTS:
;       DARK_INDEX - the SSW header index structure for the dark image
;       DARK_IMAGE - 2D full FOV dark mage without ROI extraction
;	
; OPTIONAL INPUT KEYWORD PARAMETERS: 
;	DARKDIR    - Alternate directory for processed dark current 
;                    fits images,
;		     default =  concat_dir('SOT_SSWDB_FG_CAL'','darks')
;	VERBOSE    - Set for a few more messages; overrides /loud
;       LOUD       - Not set to minimize the messages
;
; OUTPUT KEYWORD PARAMETERS: 
;       DELTADAY   - Time difference (day) between the image and the dark
;       DARKFILE   - Filename of the dark FITS file
;       VERSION    - The current version number of the program
;       NAME       - The name of this routine
;	RETRN      - Flag for branching on unusual return
;
; PROCEDURE:
;
; MODIFICATION HISTORY:
;V1.0   Created from fg_get_flat.YK 21-Nov-2007.
;V1.1   2022-03-17 - GLS:
;       - Adapted code to handle cases in which the input
;         structure is a vector.
;       - Explicitly defined the 'uniform bias' as a parameter, for clarity.
;-
;-----------------------------------------------------------------------------
;
prognam = 'FG_GET_DARK.PRO'
progver = 'V1.0'

retrn   = 0
loud    = KEYWORD_SET(loud)
verbose = KEYWORD_SET(verbose)
if verbose then loud = 1b

; default directory
if N_ELEMENTS(darkdir) eq 0 then darkdir = concat_dir(getenv('SOT_SSWDB_FG_CAL'),'darks')

; get size, wavelength & summing
img_nx0 = gt_tagval(index,/naxis1)
img_ny0 = gt_tagval(index,/naxis2)
img_waveid = gt_tagval(index, /waveid)
img_exptime= gt_tagval(index,/exptime)
img_psum   = gt_tagval(index, /campsum)
img_ssum   = gt_tagval(index, /camssum)
img_binx   = gt_tagval(index, /fgbinx)
img_biny   = gt_tagval(index, /fgbiny)
img_tccd  = gt_tagval(index, /t_fgccd)
img_tceb  = gt_tagval(index, /t_fgceb)

; summing 
sum = '1x1'
if (img_ssum[0] gt 1) or (img_psum[0] gt 1) then $
  sum = STRING(img_psum[0],img_ssum[0], form='(I1,"x",I1)')

; return file list
file = 'dark_fg_'+sum+'_'+'*.fits'
filelist = FILE_SEARCH(darkdir, file, count=nfile)
;HELP, FILELIST & STOP, 'Stopping in fg_get_dark.'
if nfile le 0 then begin 
    ; If not found, return array of 1s.
    MESSAGE, /CONT, 'No dark found. Returning array filled ' + $
                    'with constant uniform bias value...'
    if ~exist(uniform_bias) then uniform_bias = 190
    dark_index = index
    dark_image = REPLICATE(uniform_bias, img_nx0[0], img_ny0[0])
    darkfile = 'No dark found in database. Using uniform bias.'
    deltaday=-1
    retrn = 1
    RETURN
endif

; Check time difference
; read header to get DATE_OBS
mreadfits, filelist, dark_index, /nodata
utc_obs  = str2utc(index.date_obs)
utc_dark = str2utc(dark_index.date_obs)
deltaday = (utc_dark.mjd-utc_obs.mjd) + (utc_dark.time - utc_obs.time)/8.64e7

; use minimum DT
deltaday = MIN(ABS(deltaday),imin)
darkfile = filelist[imin]

if (verbose) then begin
    MESSAGE,/info,'Model dark data information.'
    MESSAGE,/info,'      File name: '+file
endif

; read header again
mreadfits, darkfile, dark_index, /nodata

; CCD and CEB temperatures
t_ceb0 = gt_tagval(dark_index, 'T_FGCEB')
t_ccd0 = gt_tagval(dark_index, 'T_FGCCD')

; read parameters from image extension
a0 = mrdfits(darkfile, 1, /fscale, /silent)
b0 = mrdfits(darkfile, 2, /fscale, /silent)
b1 = mrdfits(darkfile, 3, /fscale, /silent)
c0 = mrdfits(darkfile, 4, /fscale, /silent)
c1 = mrdfits(darkfile, 5, /fscale, /silent)

; bias correction
t0 = FLOAT(img_tceb[0]-t_ceb0)
t1 = FLOAT(img_tccd[0]-t_ccd0)
dark_image = a0 + b0*t0 + b1*t1

; dark current correction
dark_image += img_exptime[0]*EXP(c0 + c1*t1)
dark_image = FLOAT(dark_image)
   
; update dark_index
sz = SIZE(dark_image,/dim)
dark_index.naxis = 2
dark_index = add_tag(dark_index,sz[0],'NAXIS1',index='NAXIS')
dark_index = add_tag(dark_index,sz[1],'NAXIS2',index='NAXIS1')

RETURN
END
