; Time-stamp: <2000-08-31 19:42:29 dph> 
; MIT Directory: /nfs/wiwaxia/h1/dph/h2/CXC/ARD/pro-fits
; CfA Directory: /dev/null
; File: acis_qbar_ard.pro
; Author: D. Huenemoerder
; Original version: 
;                           Updated: 990317                          
;                           Updated: 990615 - ICDV1.4
;                           Updated: 000831 - new cip files.
;====================================================================

; write ACIS <QE> FITS file.
;  File structure is:
;   HDU        Content
;    0         Null 
;    1         Table E, QE for for all of I0
;    2                                    I1
;    3                                    I2
;    4                                    I3
;    5                                    S0
;    6                                    S1
;    7                                    S2
;    8                                    S3
;    9                                    S4
;    10                                   S5        

;;;;;;;;;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;;;;;; utility function
;
PRO jgrids, qegrid, qeraw, tegrid, trans, egrid, qe
; take QE and Transmissivity and their grids, join the grids, 
; and interpolate each quantitiy to the same grid, then multiply for
; net QE.
; Grids will be different resolutions, and have edges in different
; places. 

   np = n_params()
   IF np NE 6 THEN BEGIN
      message, /inf, 'Usage: jgrids, qegrid, qeraw, tegrid, trans, egrid, qe'
      message, 'Join grids, put qe and trans on common grid, multiply, prune.'
   ENDIF
   
   j = [qegrid, tegrid]         ; joint grid
   sj = sort(j)
   j = j[sj]                    ; sorted joint grid
   uj = uniq(j)
   j = j[uj]                    ; unique sorted joint grid

   qe = interpol_sort(qeraw, qegrid, j) * $
    interpol_sort(trans, tegrid, j)
   
   acc = 0.001                  ; fractional accuracy desired
   l_j = interp_pruned_x(j, qe, acc)
   egrid = j[l_j]
   qe = qe[l_j]
   
END


FUNCTION acis_syserr, egrid, ccdid
;    given the energy grid and type of chip, return systematic
;    uncertainty array as fractional uncertainty.
;
;  egrid:   array of energies
;  ccdid:   integer in range 0-9
;
;  The uncertainties are partially given in the release notes.
;  QUOTE:
; !2. Please read the ACIS Calibration report, release of January 1999,
; !for a complete discussion of the limitations of these predictions.
; !Systematic relative errors in the spectrally-averaged absolute efficiency 
; !of the  FI detector models  may be of order 5% over the 0.4-6 keV. Errors 
; !may be larger outside this band.
; !Errors in the efficiency of one FI device relative to another should be
; !considerably smaller than 5%, except possibly at energies above 6 keV. 
; !Systematic Errors in the predicted absolute efficiency of the 
; !BI devices may be as large as 25% below 1.5 keV.
; ENDQUOTE.
; 
; use numbers as given for given ranges.
; outside, guess.
;
;FI   0.05  0.4-6.0  keV
;     0.10  0.0-0.4 (guess)
;      0.10  6.0-12.0  (guess)
;
;BI   0.25 0.0-1.5 keV
;     0.05 1.5-6.0  (guess)
;     0.1 6.0-12.0  (guess)

   np = n_params()
   IF np NE 2 THEN BEGIN
      message, /inf, 'USAGE: result=acis_syserr(egrid,ccdid)'
      return, -1
   ENDIF
   
   syserr = egrid*0.0
   
   IF ccdid LE 3 THEN BEGIN     ; FI
      
      r1 = [0.0, 0.4]
      v1 = 0.1
      r2 = [0.4, 6.0]
      v2 = 0.05
      r3 = [6.0, 12.0]
      v3 = 0.10
      
      syserr[where(between(egrid, r1))] = v1
      syserr[where(between(egrid, r2))] = v2
      syserr[where(between(egrid, r3))] = v3
   
   ENDIF ELSE BEGIN             ; BI
      
      r1 = [0.0, 1.5]
      v1 = 0.25
      r2 = [1.5, 6.0]
      v2 = 0.05
      r3 = [6.0, 12.0]
      v3 = 0.10
      
      syserr[where(between(egrid, r1))] = v1
      syserr[where(between(egrid, r2))] = v2
      syserr[where(between(egrid, r3))] = v3
      
   ENDELSE
   
   return, syserr
   
END
;;;;;;;;;;;;;;;;;------------------------------------------------------
   
   
   
;;;;;;;;;;;;;;;;;;++++++++++++++++++++++++++++++++++++++++++++++++++++
; the main routine.
;    -----this has grown, and has lots of redundant code, repeated for
;    each ccdid, which would be better if turned into functions.
;
PRO acis_qbar_ard
   
;   revision = 1.3
;   revision = 1.4
   revision = 1.5
   creator = 'acis_qbar_ard.pro - '+string(revision, format = '(f4.2)')
   hduspec = 'ARD for Exposure Maps and Grating Levels 1.5-2 Pipelines ICD (V1.4)'

; -make header templates----------------------------------------------   
   hdr_dir = './ARD_FITS/'
   hdrs = hdr_templates(hdr_dir) 
   hdr_null = hdr_nullprim(hdrs)
   hdr_princ = hdr_princtbl(hdrs)
   hdr_aux = hdr_auxtbl(hdrs)
; --------------------------------------------------------------------   
   
; Input files -------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; QE file names: 
;                files are ASCII w/ structure:
;       Energy(keV)    QE             Filt_trans     QE*Filt_trans
;
; Here: use first and last columns:
;
; 2000.08.31::::: FILE FORMAT CHANGE by CAL
;    Now need 2 sets of files: the QE (now two columns, keV and QE)
;                           and filter trans (two col, keV, trans)
;    10 acis files, 2 filter files
;    Grids not necessarily the same --- need to join.
;   QE grid spacing is 0.2 eV; overkill for most regions, can prune.

   cip_dir = './cip/Acis_qe/'

; prev version:
; fnames = ['i0_w203c4r_eff_898_release.qdp.dat', $
;           'i1_w193c2_eff_898_release.qdp.dat', $
;           'i2_w158c4r_eff_898_release.qdp.dat', $
;           'i3_w215c2r_eff_898_release.qdp.dat', $
;           's0_w168c4r_eff_898_release.qdp.dat', $
;           's1_w140c4r_eff_898_release.qdp.dat', $
;           's2_w182c4r_eff_898_release.qdp.dat', $
;           's3_w134c4r_eff_898_release.qdp.dat', $
;           's4_w457c4_eff_898_release.qdp.dat', $
;           's5_w201c3r_eff_898_release.qdp.dat']

; current version:
    fnames = ['i0_w203c4r_eff_0700_release.qdp', $
             'i1_w193c2_eff_0700_release.qdp', $
             'i2_w158c4r_eff_0700_release.qdp', $
             'i3_w215c2r_eff_0700_release.qdp', $
             's0_w168c4r_eff_0700_release.qdp', $
             's1_w140c4r_eff_0700_release.qdp', $
             's2_w182c4r_eff_0700_release.qdp', $
             's3_w134c4r_eff_0700_release.qdp', $
             's4_w457c4_eff_0700_release.qdp', $
             's5_w201c3r_eff_0700_release.qdp']

   fnames = cip_dir + fnames

; filter files, one for -I and one for -S
   fnames_t = ['acis_i_xray_trans_1198.qdp', $
               'acis_s_xray_trans_1198.qdp']
  fnames = ['i0_w203c4r_eff_0700_release.qdp', $
             'i1_w193c2_eff_0700_release.qdp', $
             'i2_w158c4r_eff_0700_release.qdp', $
             'i3_w215c2r_eff_0700_release.qdp', $
             's0_w168c4r_eff_0700_release.qdp', $
             's1_w140c4r_eff_0700_release.qdp', $
             's2_w182c4r_eff_0700_release.qdp', $
             's3_w134c4r_eff_0700_release.qdp', $
             's4_w457c4_eff_0700_release.qdp', $
             's5_w201c3r_eff_0700_release.qdp']

   fnames = cip_dir + fnames

; filter files, one for -I and one for -S
   fnames_t = ['acis_i_xray_trans_1198.qdp', $
               'acis_s_xray_trans_1198.qdp']
   fnames_t = cip_dir + fnames_t
; -------------------------------------------------------------------

detnames = 'ACIS-'+string(indgen(10), format = '(i1)')

                                ; hdu's to write - toy detector QE:

message, /inf, 'writing primary...'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  1111111111111111111111111111111
                                ; 1 - null primary image
                                ;   --Img_mand
                                ;   --cc_null
                                ;   --timing_short
                                ;   --observation_short
   
                                ; now update it...
                                ; - Will naxis be updated automatically?
                                ; ---yes.
                                ; - Does the 'END' have to go?
                                ; ---yes. BUT, needed on last header.


   sxaddpar, hdr_null, 'OBSERVER', 'Hey Dale, do you check headers in detail before releasing?'
   sxaddpar, hdr_null, 'TITLE', 'ACIS mean QE ARD'
   sxaddpar, hdr_null, 'CREATOR', creator

   sxaddpar, hdr_null, 'NAXIS', 0
   sxdelpar, hdr_null, 'NAXIS1'
   sxdelpar, hdr_null, 'NAXIS2'

   sxdelpar, hdr_null, 'HDUCLAS3'
   sxdelpar, hdr_null, 'DATE-OBS'
   sxdelpar, hdr_null, 'DATE-END'
   sxdelpar, hdr_null, 'TIMESYS'
   sxdelpar, hdr_null, 'MJDREF'
   sxdelpar, hdr_null, 'TIMEZERO'
   sxdelpar, hdr_null, 'TIMEUNIT'

   sxaddpar, hdr_null, 'INSTRUME', 'ACIS'

   sxaddhist, 'Input CIP files:', hdr_null
   sxaddhist, fnames, hdr_null
   sxaddhist, fnames_t, hdr_null
   
   sxaddhist, 'Pruned to 0.1% accuracy under linear interpolation', hdr_null


; mwrfits creates a null primary if the input "foofoo" is undefined.
   
;  outfile = 'acisD1997-04-17qeN0002.fits'
   outfile = 'acisD1997-04-17qeN0003.fits'

   mwrfits, foofoo, outfile, hdr_null, /create, /no_comment

   
; read the 2 filter files, to avoid reading for every ccd:
   readcol, fnames_t[0], ti_kev, ti_trans, /sil
   readcol, fnames_t[1], ts_kev, ts_trans, /sil
   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
                                ; 1 - Table E, QE, QEn
                                ;   --Bintable_mand
                                ;   --Tbl_coord [non-std]
                                ;   --cc_Full
                                ;   --timing_Full
                                ;   --observation_Full
   
   ccdid = 0
   message, /inf, 'writing ccdid '+string(ccdid)
    
   qe_file = fnames[ccdid] 

   readcol, qe_file, qegrid, qeraw, /silent
   
; select filter array:
   IF ccdid LE 3 THEN BEGIN     ; ACIS-I
      tegrid = ti_kev
      trans = ti_trans
   ENDIF ELSE BEGIN             ; ACIS-S
      tegrid = ts_kev
      trans = ts_trans
   ENDELSE
   
; join grids, multiply, and prune:   
   jgrids, qegrid, qeraw, tegrid, trans, egrid, qe

   npts = n_elements(egrid)
   sys_min = acis_syserr(egrid, ccdid)

; Data structure of one row (column TYPE and FORM) -------------------
;   dat = {energy:egrid, QE:qe, SYS_MIN:sys_min }
   tdat = {energy:0.0, QE:0.0, SYS_MIN:0.0}
   dat = replicate(tdat, npts)
   dat.energy = egrid
   dat.qe = qe
   dat.sys_min = sys_min
; -------------------------------------------------------------------

   sxaddpar, hdr_princ, 'CREATOR', creator
   sxaddpar, hdr_princ, 'HDUSPEC', hduspec
   sxaddpar, hdr_princ, 'DATACLAS', 'OBSERVED'
   sxaddpar, hdr_princ, 'REVISION', revision

   sxaddpar, hdr_princ, 'EXTNAME', 'AXAF_QE', 'ACIS QE(E) for I0'
   extver = 1
   extver_str = string(extver, format = '(i0.0)')
   sxaddpar, hdr_princ, 'EXTVER', extver
   sxaddpar, hdr_princ, 'HDUNAME', 'AXAF_QE'+extver_str
   sxaddpar, hdr_princ, 'CONTENT', 'CDB_ACIS_QE'
   sxaddpar, hdr_princ, 'HDUCLASS', 'ASC'
   sxaddpar, hdr_princ, 'HDUCLAS1', 'DETCHAR'
   sxaddpar, hdr_princ, 'HDUCLAS2', 'QE'
   sxaddpar, hdr_princ, 'HDUCLAS3', 'MEAN'
   
   sxaddpar, hdr_princ, 'INSTRUME', 'ACIS'
   sxaddpar, hdr_princ, 'DETNAM',  detnames[ccdid]
   sxaddpar, hdr_princ, 'CCD_ID', ccdid
   sxaddpar, hdr_princ, 'GRATING', 'NONE'
   sxaddpar, hdr_princ, 'FILTER', 'UVIS_ACISI'
   sxaddpar, hdr_princ, 'DATAMODE',  'TEF',  'ACIS Read Mode'
   sxaddpar, hdr_princ, 'GRADESET',  'g02346',  'ACIS grading scheme used (TBR keyword)'

   sxaddpar, hdr_princ, 'TUNIT1', 'keV'
   sxaddpar, hdr_princ, 'TLMIN2', 0.0
   sxaddpar, hdr_princ, 'TLMAX2', 1.0

   sxdelpar, hdr_princ, 'DATE-OBS'
   sxdelpar, hdr_princ, 'DATE-END'
   sxdelpar, hdr_princ, 'TIMESYS'
   sxdelpar, hdr_princ, 'MJDREF'
   sxdelpar, hdr_princ, 'TIMEZERO'
   sxdelpar, hdr_princ, 'TIMEUNIT'

; caldb keywords--------------------------------------------
   str_E = 'ENERGY(' + $
    string(min(egrid), format = '(f4.2)') + $
    '-' + $
    string(max(egrid), format = '(f5.2)') + $
    ')keV'

   sxaddpar, hdr_princ, 'CCLS0001', 'BCF'
   sxaddpar, hdr_princ, 'CDTP0001', 'DATA'
   sxaddpar, hdr_princ, 'CCNM0001', 'QE' ; xxx
   sxaddpar, hdr_princ, 'CBD10001', str_E
   sxaddpar, hdr_princ, 'CDES0001', 'Mean quantum efficiency' ; xxx
   sxaddpar, hdr_princ, 'CVSD0001', '1996-11-01T00:00:00' ; xxx
; ----------------------------------------------------------


   mwrfits, dat, outfile, hdr_princ, /no_comment

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
                                ; 2 - bintable aux
                                ;   --bintable_mand
                                ;   --table_coords
                                ;   --cc_short
                                ;   --timing_short
                                ;   --observation_short

   ccdid = 1
   message, /inf, 'writing ccdid '+string(ccdid)
    
   qe_file = fnames[ccdid] 
   readcol, qe_file, qegrid, qeraw, /silent

; select filter array:
   IF ccdid LE 3 THEN BEGIN     ; ACIS-I
      tegrid = ti_kev
      trans = ti_trans
   ENDIF ELSE BEGIN             ; ACIS-S
      tegrid = ts_kev
      trans = ts_trans
   ENDELSE
   
; join grids, multiply, and prune:   
   jgrids, qegrid, qeraw, tegrid, trans, egrid, qe

   npts = n_elements(egrid)
   sys_min = acis_syserr(egrid,ccdid)

; Data structure of one row (column TYPE and FORM) -------------------
;   dat = {energy:egrid, QE:qe, SYS_MIN:sys_min }
   tdat = {energy:0.0, QE:0.0, SYS_MIN:0.0}
   dat = replicate(tdat, npts)
   dat.energy = egrid
   dat.qe = qe
   dat.sys_min = sys_min
; -------------------------------------------------------------------

   sxaddpar, hdr_aux, 'CREATOR', creator
   sxaddpar, hdr_aux, 'EXTNAME', 'AXAF_QE', 'ACIS QE(E) for I1'
   extver = 2
   extver_str = string(extver, format = '(i0.0)')
   sxaddpar, hdr_aux, 'EXTVER', extver
   sxaddpar, hdr_aux, 'HDUNAME', 'AXAF_QE'+extver_str
   sxaddpar, hdr_aux, 'CONTENT', 'CDB_ACIS_QE'
   sxaddpar, hdr_aux, 'HDUCLASS', 'ASC'
   sxaddpar, hdr_aux, 'HDUCLAS1', 'DETCHAR'
   sxaddpar, hdr_aux, 'HDUCLAS2', 'QE'
   sxaddpar, hdr_aux, 'HDUCLAS3', 'MEAN'
   
   sxaddpar, hdr_aux, 'INSTRUME', 'ACIS'
   sxaddpar, hdr_aux, 'DETNAM',  detnames[ccdid]
   sxaddpar, hdr_aux, 'CCD_ID', ccdid
   sxaddpar, hdr_aux, 'FILTER', 'UVIS_ACISI'
   sxaddpar, hdr_aux, 'DATAMODE',  'TEF',  'ACIS Read Mode'
   sxaddpar, hdr_aux, 'GRADESET',  'g02346',  'ACIS grading scheme used (TBR keyword)'

   sxaddpar, hdr_aux, 'TUNIT1', 'keV'
   sxaddpar, hdr_aux, 'TLMIN2', 0.0
   sxaddpar, hdr_aux, 'TLMAX2', 1.0

                                ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   sxdelpar, hdr_aux, 'DATE-OBS'
   sxdelpar, hdr_aux, 'DATE-END'
   sxdelpar, hdr_aux, 'TIMESYS'
   sxdelpar, hdr_aux, 'MJDREF'
   sxdelpar, hdr_aux, 'TIMEZERO'
   sxdelpar, hdr_aux, 'TIMEUNIT'

; caldb keywords--------------------------------------------
   str_E = 'ENERGY(' + $
    string(min(egrid), format = '(f4.2)') + $
    '-' + $
    string(max(egrid), format = '(f5.2)') + $
    ')keV'

   sxaddpar, hdr_aux, 'CCLS0001', 'BCF'
   sxaddpar, hdr_aux, 'CDTP0001', 'DATA'
   sxaddpar, hdr_aux, 'CCNM0001', 'QE' ; xxx
   sxaddpar, hdr_aux, 'CBD10001', str_E
   sxaddpar, hdr_aux, 'CDES0001', 'Mean quantum efficiency' ; xxx
   sxaddpar, hdr_aux, 'CVSD0001', '1996-11-01T00:00:00' ; xxx
; ----------------------------------------------------------

   mwrfits, dat, outfile, hdr_aux, /no_comment


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
                                ; 3 - bintable aux
                                ;   --bintable_mand
                                ;   --table_coords
                                ;   --cc_short
                                ;   --timing_short
                                ;   --observation_short

   ccdid = 2
   message, /inf, 'writing ccdid '+string(ccdid)
    
   qe_file = fnames[ccdid] 
   readcol, qe_file, qegrid, qeraw, /silent

; select filter array:
   IF ccdid LE 3 THEN BEGIN     ; ACIS-I
      tegrid = ti_kev
      trans = ti_trans
   ENDIF ELSE BEGIN             ; ACIS-S
      tegrid = ts_kev
      trans = ts_trans
   ENDELSE
   
; join grids, multiply, and prune:   
   jgrids, qegrid, qeraw, tegrid, trans, egrid, qe

   npts = n_elements(egrid)
   sys_min = acis_syserr(egrid,ccdid)

; Data structure of one row (column TYPE and FORM) -------------------
;   dat = {energy:egrid, QE:qe, SYS_MIN:sys_min          }
   tdat = {energy:0.0, QE:0.0, SYS_MIN:0.0}
   dat = replicate(tdat, npts)
   dat.energy = egrid
   dat.qe = qe
   dat.sys_min = sys_min
; -------------------------------------------------------------------


   sxaddpar, hdr_aux, 'EXTNAME', 'AXAF_QE', 'ACIS QE(E) for I2'
   extver = 3
   extver_str = string(extver, format = '(i0.0)')
   sxaddpar, hdr_aux, 'EXTVER', extver
   sxaddpar, hdr_aux, 'HDUNAME', 'AXAF_QE'+extver_str
   sxaddpar, hdr_aux, 'DETNAM',  detnames[ccdid]
   sxaddpar, hdr_aux, 'CCD_ID', ccdid

   str_E = 'ENERGY(' + $
    string(min(egrid), format = '(f4.2)') + $
    '-' + $
    string(max(egrid), format = '(f5.2)') + $
    ')keV'
   sxaddpar, hdr_aux, 'CBD10001', str_E


   mwrfits, dat, outfile, hdr_aux, /no_comment


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
                                ; 4 - bintable aux
                                ;   --bintable_mand
                                ;   --table_coords
                                ;   --cc_short
                                ;   --timing_short
                                ;   --observation_short

   ccdid = 3                     ;;;;;;;;;;;;;;;;;;;;;;;;; EDIT
   message, /inf, 'writing ccdid '+string(ccdid)
    
   qe_file = fnames[ccdid] 
   readcol, qe_file, qegrid, qeraw, /silent

; select filter array:
   IF ccdid LE 3 THEN BEGIN     ; ACIS-I
      tegrid = ti_kev
      trans = ti_trans
   ENDIF ELSE BEGIN             ; ACIS-S
      tegrid = ts_kev
      trans = ts_trans
   ENDELSE
   
; join grids, multiply, and prune:   
   jgrids, qegrid, qeraw, tegrid, trans, egrid, qe

   npts = n_elements(egrid)
   sys_min = acis_syserr(egrid,ccdid)

; Data structure of one row (column TYPE and FORM) -------------------
;   dat = {energy:egrid, QE:qe, SYS_MIN:sys_min           }
   tdat = {energy:0.0, QE:0.0, SYS_MIN:0.0}
   dat = replicate(tdat, npts)
   dat.energy = egrid
   dat.qe = qe
   dat.sys_min = sys_min
; -------------------------------------------------------------------


   sxaddpar, hdr_aux, 'EXTNAME', 'AXAF_QE', 'ACIS QE(E) for I3' ;;;; EDIT
   extver = 4                      ;;;;;;;;;;;;;;;;;;;;;;;;; EDIT
   extver_str = string(extver, format = '(i0.0)')
   sxaddpar, hdr_aux, 'EXTVER', extver
   sxaddpar, hdr_aux, 'HDUNAME', 'AXAF_QE'+extver_str
   sxaddpar, hdr_aux, 'DETNAM',  detnames[ccdid]
   sxaddpar, hdr_aux, 'CCD_ID', ccdid
   str_E = 'ENERGY(' + $
    string(min(egrid), format = '(f4.2)') + $
    '-' + $
    string(max(egrid), format = '(f5.2)') + $
    ')keV'
   sxaddpar, hdr_aux, 'CBD10001', str_E

   mwrfits, dat, outfile, hdr_aux, /no_comment


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
                                ; 5 - bintable aux
                                ;   --bintable_mand
                                ;   --table_coords
                                ;   --cc_short
                                ;   --timing_short
                                ;   --observation_short

   ccdid = 4                     ;;;;;;;;;;;;;;;;;;;;;;;;; EDIT
   message, /inf, 'writing ccdid '+string(ccdid)
    
   qe_file = fnames[ccdid] 
   readcol, qe_file, qegrid, qeraw, /silent

; select filter array:
   IF ccdid LE 3 THEN BEGIN     ; ACIS-I
      tegrid = ti_kev
      trans = ti_trans
   ENDIF ELSE BEGIN             ; ACIS-S
      tegrid = ts_kev
      trans = ts_trans
   ENDELSE
   
; join grids, multiply, and prune:   
   jgrids, qegrid, qeraw, tegrid, trans, egrid, qe

   npts = n_elements(egrid)
   sys_min = acis_syserr(egrid,ccdid)

; Data structure of one row (column TYPE and FORM) -------------------
;   dat = {energy:egrid, QE:qe, SYS_MIN:sys_min           }
   tdat = {energy:0.0, QE:0.0, SYS_MIN:0.0}
   dat = replicate(tdat, npts)
   dat.energy = egrid
   dat.qe = qe
   dat.sys_min = sys_min
; -------------------------------------------------------------------

   sxaddpar, hdr_aux, 'EXTNAME', 'AXAF_QE', 'ACIS QE(E) for S0' ;;;; EDIT
   extver = 5                      ;;;;;;;;;;;;;;;;;;;;;;;;; EDIT
   extver_str = string(extver, format = '(i0.0)')
   sxaddpar, hdr_aux, 'EXTVER', extver
   sxaddpar, hdr_aux, 'HDUNAME', 'AXAF_QE'+extver_str
   sxaddpar, hdr_aux, 'DETNAM',  detnames[ccdid]
   sxaddpar, hdr_aux, 'CCD_ID', ccdid
   sxaddpar, hdr_aux, 'FILTER', 'UVIS_ACISS'
   str_E = 'ENERGY(' + $
    string(min(egrid), format = '(f4.2)') + $
    '-' + $
    string(max(egrid), format = '(f5.2)') + $
    ')keV'
   sxaddpar, hdr_aux, 'CBD10001', str_E


   mwrfits, dat, outfile, hdr_aux, /no_comment


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
                                ; 6 - bintable aux
                                ;   --bintable_mand
                                ;   --table_coords
                                ;   --cc_short
                                ;   --timing_short
                                ;   --observation_short

   ccdid = 5                     ;;;;;;;;;;;;;;;;;;;;;;;;; EDIT
   message, /inf, 'writing ccdid '+string(ccdid)
    
   qe_file = fnames[ccdid] 
   readcol, qe_file, qegrid, qeraw, /silent

; select filter array:
   IF ccdid LE 3 THEN BEGIN     ; ACIS-I
      tegrid = ti_kev
      trans = ti_trans
   ENDIF ELSE BEGIN             ; ACIS-S
      tegrid = ts_kev
      trans = ts_trans
   ENDELSE
   
; join grids, multiply, and prune:   
   jgrids, qegrid, qeraw, tegrid, trans, egrid, qe

   npts = n_elements(egrid)
   sys_min = acis_syserr(egrid,ccdid)

; Data structure of one row (column TYPE and FORM) -------------------
;   dat = {energy:egrid, QE:qe, SYS_MIN:sys_min           }
   tdat = {energy:0.0, QE:0.0, SYS_MIN:0.0}
   dat = replicate(tdat, npts)
   dat.energy = egrid
   dat.qe = qe
   dat.sys_min = sys_min
; -------------------------------------------------------------------

   sxaddpar, hdr_aux, 'EXTNAME', 'AXAF_QE', 'ACIS QE(E) for S1' ;;;; EDIT
   extver = 6                      ;;;;;;;;;;;;;;;;;;;;;;;;; EDIT
   extver_str = string(extver, format = '(i0.0)')
   sxaddpar, hdr_aux, 'EXTVER', extver
   sxaddpar, hdr_aux, 'HDUNAME', 'AXAF_QE'+extver_str
   sxaddpar, hdr_aux, 'DETNAM',  detnames[ccdid]
   sxaddpar, hdr_aux, 'CCD_ID', ccdid
   str_E = 'ENERGY(' + $
    string(min(egrid), format = '(f4.2)') + $
    '-' + $
    string(max(egrid), format = '(f5.2)') + $
    ')keV'
   sxaddpar, hdr_aux, 'CBD10001', str_E

   mwrfits, dat, outfile, hdr_aux, /no_comment


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
                                ; 7 - bintable aux
                                ;   --bintable_mand
                                ;   --table_coords
                                ;   --cc_short
                                ;   --timing_short
                                ;   --observation_short

   ccdid = 6                     ;;;;;;;;;;;;;;;;;;;;;;;;; EDIT
   message, /inf, 'writing ccdid '+string(ccdid)
    
   qe_file = fnames[ccdid] 
   readcol, qe_file, qegrid, qeraw, /silent

; select filter array:
   IF ccdid LE 3 THEN BEGIN     ; ACIS-I
      tegrid = ti_kev
      trans = ti_trans
   ENDIF ELSE BEGIN             ; ACIS-S
      tegrid = ts_kev
      trans = ts_trans
   ENDELSE
   
; join grids, multiply, and prune:   
   jgrids, qegrid, qeraw, tegrid, trans, egrid, qe

   npts = n_elements(egrid)
   sys_min = acis_syserr(egrid,ccdid)

; Data structure of one row (column TYPE and FORM) -------------------
;   dat = {energy:egrid, QE:qe, SYS_MIN:sys_min           }
   tdat = {energy:0.0, QE:0.0, SYS_MIN:0.0}
   dat = replicate(tdat, npts)
   dat.energy = egrid
   dat.qe = qe
   dat.sys_min = sys_min
; -------------------------------------------------------------------


   sxaddpar, hdr_aux, 'EXTNAME', 'AXAF_QE', 'ACIS QE(E) for S2' ;;;; EDIT
   extver = 7                      ;;;;;;;;;;;;;;;;;;;;;;;;; EDIT
   extver_str = string(extver, format = '(i0.0)')
   sxaddpar, hdr_aux, 'EXTVER', extver
   sxaddpar, hdr_aux, 'HDUNAME', 'AXAF_QE'+extver_str
   sxaddpar, hdr_aux, 'DETNAM',  detnames[ccdid]
   sxaddpar, hdr_aux, 'CCD_ID', ccdid
   str_E = 'ENERGY(' + $
    string(min(egrid), format = '(f4.2)') + $
    '-' + $
    string(max(egrid), format = '(f5.2)') + $
    ')keV'
   sxaddpar, hdr_aux, 'CBD10001', str_E


   mwrfits, dat, outfile, hdr_aux, /no_comment


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
                                ; 8 - bintable aux
                                ;   --bintable_mand
                                ;   --table_coords
                                ;   --cc_short
                                ;   --timing_short
                                ;   --observation_short

   ccdid = 7                     ;;;;;;;;;;;;;;;;;;;;;;;;; EDIT
   message, /inf, 'writing ccdid '+string(ccdid)
    
   qe_file = fnames[ccdid] 
   readcol, qe_file, qegrid, qeraw, /silent

; select filter array:
   IF ccdid LE 3 THEN BEGIN     ; ACIS-I
      tegrid = ti_kev
      trans = ti_trans
   ENDIF ELSE BEGIN             ; ACIS-S
      tegrid = ts_kev
      trans = ts_trans
   ENDELSE
   
; join grids, multiply, and prune:   
   jgrids, qegrid, qeraw, tegrid, trans, egrid, qe

   npts = n_elements(egrid)
   sys_min = acis_syserr(egrid,ccdid)

; Data structure of one row (column TYPE and FORM) -------------------
;   dat = {energy:egrid, QE:qe, SYS_MIN:sys_min           }
   tdat = {energy:0.0, QE:0.0, SYS_MIN:0.0}
   dat = replicate(tdat, npts)
   dat.energy = egrid
   dat.qe = qe
   dat.sys_min = sys_min
; -------------------------------------------------------------------

   sxaddpar, hdr_aux, 'EXTNAME', 'AXAF_QE', 'ACIS QE(E) for S3' ;;;; EDIT
   extver = 8                      ;;;;;;;;;;;;;;;;;;;;;;;;; EDIT
   extver_str = string(extver, format = '(i0.0)')
   sxaddpar, hdr_aux, 'EXTVER', extver
   sxaddpar, hdr_aux, 'HDUNAME', 'AXAF_QE'+extver_str
   sxaddpar, hdr_aux, 'DETNAM',  detnames[ccdid]
   sxaddpar, hdr_aux, 'CCD_ID', ccdid
   str_E = 'ENERGY(' + $
    string(min(egrid), format = '(f4.2)') + $
    '-' + $
    string(max(egrid), format = '(f5.2)') + $
    ')keV'
   sxaddpar, hdr_aux, 'CBD10001', str_E


   mwrfits, dat, outfile, hdr_aux, /no_comment


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
                                ; 9 - bintable aux
                                ;   --bintable_mand
                                ;   --table_coords
                                ;   --cc_short
                                ;   --timing_short
                                ;   --observation_short

   ccdid = 8                     ;;;;;;;;;;;;;;;;;;;;;;;;; EDIT
   message, /inf, 'writing ccdid '+string(ccdid)
    
   qe_file = fnames[ccdid] 
   readcol, qe_file, qegrid, qeraw, /silent

; select filter array:
   IF ccdid LE 3 THEN BEGIN     ; ACIS-I
      tegrid = ti_kev
      trans = ti_trans
   ENDIF ELSE BEGIN             ; ACIS-S
      tegrid = ts_kev
      trans = ts_trans
   ENDELSE
   
; join grids, multiply, and prune:   
   jgrids, qegrid, qeraw, tegrid, trans, egrid, qe

   npts = n_elements(egrid)
   sys_min = acis_syserr(egrid,ccdid)

; Data structure of one row (column TYPE and FORM) -------------------
;   dat = {energy:egrid, QE:qe, SYS_MIN:sys_min           }
   tdat = {energy:0.0, QE:0.0, SYS_MIN:0.0}
   dat = replicate(tdat, npts)
   dat.energy = egrid
   dat.qe = qe
   dat.sys_min = sys_min
; -------------------------------------------------------------------

   sxaddpar, hdr_aux, 'EXTNAME', 'AXAF_QE', 'ACIS QE(E) for S4' ;;;; EDIT
   extver = 9                      ;;;;;;;;;;;;;;;;;;;;;;;;; EDIT
   extver_str = string(extver, format = '(i0.0)')
   sxaddpar, hdr_aux, 'EXTVER', extver
   sxaddpar, hdr_aux, 'HDUNAME', 'AXAF_QE'+extver_str
   sxaddpar, hdr_aux, 'DETNAM',  detnames[ccdid]
   sxaddpar, hdr_aux, 'CCD_ID', ccdid
   str_E = 'ENERG(' + $
    string(min(egrid), format = '(f4.2)') + $
    '-' + $
    string(max(egrid), format = '(f5.2)') + $
    ')keV'
   sxaddpar, hdr_aux, 'CBD10001', str_E

   mwrfits, dat, outfile, hdr_aux, /no_comment


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
                                ; 10 - bintable aux
                                ;   --bintable_mand
                                ;   --table_coords
                                ;   --cc_short
                                ;   --timing_short
                                ;   --observation_short

   ccdid = 9                     ;;;;;;;;;;;;;;;;;;;;;;;;; EDIT
   message, /inf, 'writing ccdid '+string(ccdid)
    
   qe_file = fnames[ccdid] 
   readcol, qe_file, qegrid, qeraw, /silent

; select filter array:
   IF ccdid LE 3 THEN BEGIN     ; ACIS-I
      tegrid = ti_kev
      trans = ti_trans
   ENDIF ELSE BEGIN             ; ACIS-S
      tegrid = ts_kev
      trans = ts_trans
   ENDELSE
   
; join grids, multiply, and prune:   
   jgrids, qegrid, qeraw, tegrid, trans, egrid, qe

   npts = n_elements(egrid)
   sys_min = acis_syserr(egrid,ccdid)

; Data structure of one row (column TYPE and FORM) -------------------
;   dat = {energy:egrid, QE:qe, SYS_MIN:sys_min           }
   tdat = {energy:0.0, QE:0.0, SYS_MIN:0.0}
   dat = replicate(tdat, npts)
   dat.energy = egrid
   dat.qe = qe
   dat.sys_min = sys_min
; -------------------------------------------------------------------

   sxaddpar, hdr_aux, 'EXTNAME', 'AXAF_QE', 'ACIS QE(E) for S5' ;;;; EDIT
   extver = 10                      ;;;;;;;;;;;;;;;;;;;;;;;;; EDIT
   extver_str = string(extver, format = '(i0.0)')
   sxaddpar, hdr_aux, 'EXTVER', extver
   sxaddpar, hdr_aux, 'HDUNAME', 'AXAF_QE'+extver_str
   sxaddpar, hdr_aux, 'DETNAM',  detnames[ccdid]
   sxaddpar, hdr_aux, 'CCD_ID', ccdid
   str_E = 'ENERG(' + $
    string(min(egrid), format = '(f4.2)') + $
    '-' + $
    string(max(egrid), format = '(f5.2)') + $
    ')keV'
   sxaddpar, hdr_aux, 'CBD10001', str_E


   mwrfits, dat, outfile, hdr_aux, /no_comment


END
