Pro dqe_reduce, testdir=testdir,temperature=temperature,region=region

    if not(keyword_set(testdir)) then testdir='E:\H4RG-10-007\cold3\ASIC\dqe.20Aug07\'
    ;testdir='C:\figerdev\idtl\sipinrockwell\H1RG-021-SIPIN\cold1\dqe.9Aug04\'
    ;calfile='C:\figerdev\idtl\sipinrockwell\H1RG-021-SIPIN\cold1\dqe.9Aug04\si_sciencetech.txt'
    calfile='\\hawk.cis.rit.edu\RIDL\internal\software\calibration data\si_all_caldata.txt'
    if not(keyword_set(temperature)) then temperature='170K'

    ; set plotting appearnace parameters
    ; set line and text characteristics for publication quality
    !P.CHARSIZE=8
    !P.CHARTHICK=10.
    !X.THICK=20.
    !Y.THICK=20.
    !P.THICK=20.
    symsize=10.
    filenamecharsize=8.
    !P.TICKLEN=0.03
    ; define forground and background colors
    white=255
    black=0

    ; specify region for analysis
    if not(keyword_set(region)) then begin
;       x1=500
;       x2=520
;       y1=500
;       y2=520
       x1=4
       x2=4091
       y1=4
       y2=4091
    endif else begin
       x1=region(0)
       x2=region(1)
       y1=region(2)
       y2=region(3)
    endelse
    ; set skip factor to allow for cases where pixel types are different in alternate rows
    skip=1

    ; add a path delimiter at the end of the path in case the user
    ; forgot to add one.
    if (strmid(testdir, strlen(testdir) - 1, 1) ne path_sep()) then testdir=testdir+path_sep()

    ; change directory to testdir
    cd,testdir

    ; readcol, testdir+infile , numbimgs, format='(A)'
    numbimgs=file_search('*on_'+temperature+'.fits')

    ; get exposure time
    ; (if there are no "on" images, the procedure will error exit here)
    dummy=readfits(numbimgs(0),h)
    itime=sxpar(h,'EXP_TIME')

    sig=fltarr(n_elements(numbimgs))
    sigoff=fltarr(n_elements(numbimgs))
    sigdiff=fltarr(n_elements(numbimgs))
    signorm=fltarr(n_elements(numbimgs))
    wav=fltarr(n_elements(numbimgs))
    sird=fltarr(n_elements(numbimgs))
    sibk=fltarr(n_elements(numbimgs))
    gerd=fltarr(n_elements(numbimgs))
    gebk=fltarr(n_elements(numbimgs))

    ; this loop cycles over the number of types of pixels on a device, i.e. 1 type for H1RG-18-SIPIN and two
    ; types for H1RG-021-SIPIN
    for j=0,skip-1 do begin

       for imgcount=0, n_elements(numbimgs)-1 do begin
         print,numbimgs[imgcount]

         ; construct the name of the "off" image for the current "on" image
         imageparts = strsplit(numbimgs[imgcount], '_on_', /extract, /regex)
         offimg = strjoin(imageparts, '_off_')

         ; check for existence of "off" image, and skip this wavelength if it is not found
         if (not file_test(offimg)) then begin
             continue
         endif

         fits_read, numbimgs[imgcount], img, imghdr
         fits_read, offimg, img_off,imghdr_off
         img=float(img)
         img_off=float(img_off)

         sig[imgcount]=median(img(x1:x2,j:y2:skip,1)-img(x1:x2,j:y2:skip,0))
         sigoff[imgcount]=median(img_off(x1:x2,j:y2:skip,1)-img_off(x1:x2,j:y2:skip,0))
         sigdiff[imgcount]=sig[imgcount]-sigoff[imgcount]
         signorm[imgcount]=sigdiff[imgcount]/(median(img(x1:x2,j:y2:skip,1)-img(x1:x2,j:y2:skip,0))-(median(img_off(x1:x2,j:y2:skip,1)-img_off(x1:x2,j:y2:skip,0))))  ; difference in region versus whole array
         print,'norm='+strtrim(string(signorm[imgcount]),2),'  difference='+strtrim(string(sigdiff[imgcount]),2)
         wav[imgcount]=sxpar(imghdr,'lambda')
         sird[imgcount]=sxpar(imghdr,'si_rd')
         gerd[imgcount]=sxpar(imghdr,'ge_rd')
         sibk[imgcount]=sxpar(imghdr,'si_bk')
         gebk[imgcount]=sxpar(imghdr,'ge_bk')

       endfor

       wav=wav[where(wav ne 0.0)]
       sigdiff=sigdiff[where(wav ne 0.0)]
       ; output device to frame buffer
       set_plot, 'z'
       device, set_resolution=[4800,3200]
       device, set_font='Courier'
       wavs=wav(sort(wav))
       sigdiffs=sigdiff(sort(wav))
       plot,wavs,sigdiffs,position=[0.15,0.15,0.8,0.95],xtitle='Wavelength (nm)',ystyle=8,$
         ytitle='Signal (ADU)',title=testdir,yrange=[0,max(sigdiff)],background=white,color=black
       ; set ytitle and axis depending on whether Germanium and Silicon readings are displayed
       ytitle='SI (Dash) Voltage'
       if (max(wav) gt 1300.) then ytitle='SI (Dash) and GE (Dot) Voltage'
       if (max(wav) gt 1300.) then axis,yaxis=1,yrange=[0,max([gerd-gebk,sird-sibk])],/save,ytitle=ytitle,color=black
       if (max(wav) lt 1300.) then axis,yaxis=1,yrange=[0,max(sird-sibk)],/save,ytitle=ytitle,color=black
       oplot,wavs,sird(sort(wav))-sibk(sort(wav)),color=black,linestyle=2
       ; suppress Germanium diode curve if wavelengths do not exceed 1300 nm
       if (max(wav) gt 1300.) then oplot,wavs,gerd(sort(wav))-gebk(sort(wav)),color=black,linestyle=1

       ; set text in JPG file name to indicate which pixels were processed
       if (skip eq 1) then ext=''
       if (skip eq 2 and j eq 0) then ext='_evens'
       if (skip eq 2 and j eq 1) then ext='_odds'

       jpgimg=tvrd()
       write_jpeg,'Results\dqedataplot'+'_'+temperature+'.jpg', congrid(jpgimg, 1280, 1024, /interp, /center), quality=100

       openw,1,'Results\dqedata'+'_'+temperature+'.txt'
       sigdiffsort=sigdiff(sort(wav))
       sisort=sird(sort(wav))-sibk(sort(wav))
       gesort=gerd(sort(wav))-gebk(sort(wav))
       for out=0,n_elements(wavs)-1 do begin
         printf,1,wavs(out),sigdiffsort(out),sisort(out),format='(F6.1,E16.3,F16.4)'
      ;   printf,1,string(13B)
       endfor
       close,1

       ; read in calfile
       readcol,calfile,calwav,si1low_vpw,si1high_vpw,si2low_vpw,si2high_vpw       ; units in Volts/Watt

       h=6.6260755e-34                                 ; J*seconds
       c=3e8                                      ; m/s

       si1low_vpp=si1low_vpw*(h*c/(calwav*1e-9))                    ; Volts/(photon/s)
       si1high_vpp=si1high_vpw*(h*c/(calwav*1e-9))                    ; Volts/(photon/s)
       si2low_vpp=si2low_vpw*(h*c/(calwav*1e-9))                    ; Volts/(photon/s)
       si2high_vpp=si2high_vpw*(h*c/(calwav*1e-9))                    ; Volts/(photon/s)

       gain=2.0                                        ; e-/ADU
       pixelarea=0.010^2                  ; mm^2
       diodearea=!pi*(2.5/2)^2               ; mm^2
       qe=sigdiff/itime/pixelarea*gain/((sird-sibk)/interpol(si1high_vpp,calwav,wav)/diodearea)  ; (electrons/pixel area)/(photon/diode area)
       qenorm=qe/max(qe(where(finite(qe))))
       set_plot, 'z'
       device, set_resolution=[4800,3200]
       device, set_font='Courier'
       plot,wavs,qenorm(sort(wav)),position=[0.15,0.15,0.8,0.95],xtitle='Wavelength (nm)',ystyle=1,$
         ytitle='QE',title=testdir,yrange=[0,1.],background=white,color=black
       jpgimg=tvrd()
       write_jpeg,'Results\dqe'+'_'+temperature+'.jpg', congrid(jpgimg, 1280, 1024, /interp, /center), quality=100

       openw,1,'Results\dqe'+'_'+temperature+'.txt'
       qenormsort=qenorm(sort(wav))
       qesort=qe(sort(wav))
       for out=0,n_elements(wavs)-1 do begin
         printf,1,wavs(out),qesort(out),qenormsort(out),format='(F6.1,E16.3,F16.4)'
      ;   printf,1,string(13B)
       endfor
       close,1

    endfor

end
