pro make_xrt_ccd, XRT_ccd, ccd, qabort, define=define, caldir=caldir, $
                  debug=debug
  
; =========================================================================
;+
; PROJECT:
;       Solar-B / XRT
;
; NAME:
;       MAKE_XRT_CCD
;
; CATEGORY:
;       Calibration 
;
; PURPOSE:
;       Generate the XRT CCD structure. Calculate CCD QE.
;
; CALLING SEQUENCE:
;       MAKE_XRT_CCD, XRT_ccd, ccd, [,qabort] [,/define] [,caldir=caldir]
;
; INPUTS:
;       XRT_CCD: [Mandatory] Variable to return XRT_CCD structure
;           CCD: [Optional] ccd input structure from config file
;       Also reads "atten_len_Si.txt", "atten_len_SiO2.txt" files from
;       calibration directory.
;
; KEYWORDS:
;       CALDIR: [Optional input] location of $SSW/hinode/xrt/calibration
;      /DEFINE: [Optional] when set returns only XRT_ccd structure definition.
;
; OUTPUTS:
;       XRT_CCD: (structure) Returns fully populated ccd structure
;       QABORT: [Optional] program return status
;
; EXAMPLES:
;      make_xrt_ccd, XRT_ccd, /define
;      make_xrt_ccd, XRT_ccd, ccd, qabort
;
; ; COMMON BLOCKS:
;       None.
;
; NOTES:
;      Code and logic reuse from mk_xrt_ccd_genx.pro. Notes from that program.
;
;      The QE formula and parameter values are taken from the "Gray Book -
;      Solar-B XRT Flight CCD Camera System Data Package" (2003.Aug.26).
;      The CCD Gain is also taken from the "Gray Book".
;      Uses utility routines, timestamp.pro and resolve_caldir.pro.
;
; MODIFICATION HISTORY:
;  progver = 'v2008.Sep.15' ; --- (Alisdair Davey/Mark Weber)
;                                 First debugged version. Derived from
;                                 <mk_xrt_ccd_genx.pro>, v2007-May-13.
   progver = 'v2008.Oct.01' ; --- (M.Weber) Reviewed version.
;
;-
; =========================================================================

   qabort = 0

   XRT_ccd = {      XRT_ccd_v0001,                           $
                          type: '',                          $
               ccd_str_version: '',                          $
                 ccd_str_descr: '',                          $
                          name: '',                          $
                     long_name: '',                          $
                     ev_per_el: float(0),                    $
               ev_per_el_units: 'eV',                        $
                     full_well: float(0),                    $
               full_well_units: 'electrons',                 $
                        gain_l: float(0),                    $
                        gain_r: float(0),                    $
                    gain_units: '',                          $
                    pixel_size: float(0),                    $
              pixel_size_units: 'microns',                   $
                          wave: fltarr(5000),                $
                    wave_units: 'Angstroms',                 $
                            qe: fltarr(5000),                $
                        length: 0L,                          $
                    data_files: strarr(5),                   $
                       history: strarr(3),                   $
                      comments: strarr(5)                    $
	     }

   if keyword_set(define) then return

; Populate structure

   struct_assign, ccd, XRT_ccd, /nozero
   
   XRT_ccd.history[0] = 'MAKE_XRT_CCD '+progver+timestamp()
   XRT_ccd.ccd_str_version = tag_names(XRT_ccd,/structure)

;  Various constants and variables needed for calculations
   
   d_Si = 1.50e5
   d_SiO2 = 61.0
   eta = 0.40
   gamma = 1.0/2.1e3

   h_planck = 4.136e-15 ;; eV s
   c_light = 2.998e18   ;; Angstroms / s

;  Where are the calibration files?

   resolve_caldir, caldir=caldir, qabort
   if qabort then return
	 
   infile_atten_Si = caldir+'/atten/atten_len_Si.txt'
   infile_atten_SiO2 = caldir+'/atten/atten_len_SiO2.txt'	        
   
; Calculate components - The Quantum Efficiency (QE)
   
   vtemp = rd_tfile(infile_atten_Si, 2, /hskip)
   wave_Si = reform(vtemp[0,*]) * 10. ;; Angstroms
   len_Si  = reform(vtemp[1,*]) * 1e4
   
   vtemp = rd_tfile(infile_atten_SiO2, 2, /hskip)
   wave_SiO2 = reform(vtemp[0,*]) * 10. ;; Angstroms
   len_SiO2  = reform(vtemp[1,*]) * 1e4
   
   ph_energy = h_planck * c_light / wave_Si ;; eV
   
   aa = exp(-d_SiO2/len_SiO2)
   bb = (1-eta)/len_Si/(gamma+(1./len_Si))
   cc = exp(-d_Si/len_Si)
   dd = bb * exp(-gamma*d_Si)
   qe = aa * (1 - bb - cc*(1-dd))
   
; Finish populating structure
   
   XRT_ccd.qe = qe
   XRT_ccd.wave = wave_SiO2
   XRT_ccd.length = n_elements(wave_SiO2)
   
end
 
