PRO replace_badrows,din,dout ; ; Interpolate across bad rows of MAMA in a splat obs. ; badrow = indgen(6) + 599 goodrow_start1 = 595 goodrow_end1 = goodrow_start1 + 2 goodrow_start2 = 606 goodrow_end2 = goodrow_start2 + 2 ; dout = din ; ; make replacement row, and replace bad rows with it ; avggood = (total(din(0:1023,goodrow_start1:goodrow_end1),2) $ + total(din(0:1023,goodrow_start2:goodrow_end2),2)) $ / float(goodrow_end1 - goodrow_start1 + goodrow_end2 - goodrow_start2 + 2) for j = 0, n_elements(badrow)-1 DO dout(0,badrow[j]) = avggood ; END PRO uvthru_calc ; ; Calculate UV throughput I_SBC/I_PMT after dark ; subtraction for a list of paired "splat" and ; dark images. Write the results and ; appropriate header values to disk. ; ; First read list of splat and dark observations ; readcol,'splat_obs.lis',splatid,darkid,filt,monitor,$ format='I,I,I,I',skipline=1 ; ; fill arrays from the database. ; nobs = n_elements(splatid) ; tstart_spl = dblarr(nobs) ; texp_spl = fltarr(nobs) ; lampid = strarr(nobs) dbopen,'acs_log' dbext,splatid,'EXPSTART,EXPTIME,SBCTEMP,MEBID,LAMP,STFATTEN,FILTER3,STFTARG',$ tstart_spl,texp_spl,sbctemp_spl,mebid,lampid,atten,filter,junk_targ dbext,splatid,'LAMP_I1,LAMP_I2,RADSGNL1,RADSGNL2,RADTIME1,RADTIME2',$ lampi1,lampi2,radsig1,radsig2,radtime1,radtime2 radiom_spl = 0.5*(radsig1/radtime1 + radsig2/radtime2) eradiom_spl = 0.5*sqrt(radsig1/radtime1^2 + radsig2/radtime2^2) dbext,darkid,'EXPSTART,EXPTIME,SBCTEMP,RADSGNL1,RADSGNL2,RADTIME1,RADTIME2',$ tstart_drk,texp_drk,sbctemp_drk,radsig1,radsig2,radtime1,radtime2 radiom_drk = 0.5*(radsig1/radtime1 + radsig2/radtime2) eradiom_drk = 0.5*sqrt(radsig1/radtime1^2 + radsig2/radtime2^2) dbclose lampi = 0.5*(lampi1 + lampi2) counts_spl = fltarr(nobs) counts_drk = fltarr(nobs) target = fltarr(nobs) ; ; flag radiom darks where count rate > 10 c/s or <= 0, and set to ; radiom_drk = 1.7 +- 1.7 for these ; raddrk_flag = strarr(nobs) bad = where((radiom_drk GT 10.0) OR (radiom_drk LE 0.0)) raddrk_flag[bad] = ' *' radiom_drk[bad] = 1.7 eradiom_drk[bad] = 1.7 ; ; loop through list, extract header info ; and calculate global rates ; FOR i = 0, (nobs-1) DO BEGIN ; ; first read splat observations. ; replace bad rows (dead annode) ; calculate total splat count rate. ; acs_read,splatid[i],h,d replace_badrows,d,dout counts_spl[i] = total(temporary(dout)) ; ; Now get results from dark frames. ; Only read new dark if different from previous entry ; IF (i EQ 0) THEN BEGIN acs_read,darkid[i],h,d replace_badrows,d,dout counts_drk[i] = total(temporary(dout)) ENDIF ELSE BEGIN j = i - 1 IF (darkid[i] NE darkid[j]) THEN BEGIN acs_read,darkid[i],h,d replace_badrows,d,dout counts_drk[i] = total(temporary(dout)) ENDIF ELSE BEGIN counts_drk[i] = counts_drk[j] ENDELSE ENDELSE ; ; Now decode junk_target & junk_atten to get pinhole size & attenuator ; There is probably a quicker way of doing this ; junk = strmid(junk_targ[i],0,1) IF (junk EQ '1') THEN target[i] = 1.0 $ ELSE IF (junk EQ '2') THEN target[i] = 2.5 $ ELSE IF (junk EQ '4') THEN target[i] = 4.0 $ ELSE target[i] = 0.0 atten[i] = strmid(atten[i],6,1) ENDFOR ; ; process numbers to get dark subtracted count rates ; rate_sbc = counts_spl/texp_spl - counts_drk/texp_drk erate_sbc = sqrt(counts_spl/texp_spl^2 + counts_drk/texp_drk^2) rate_pmt = radiom_spl - radiom_drk erate_pmt = sqrt(eradiom_spl^2 + eradiom_drk^2) sbc_pmt = rate_sbc / rate_pmt esbc_pmt = sqrt((erate_sbc/rate_sbc)^2 + (erate_pmt/rate_pmt^2)) ; ; print results ; openw,unit,'uvthru.out',/get_lun FOR i = 0, (nobs - 1) DO BEGIN printf,unit,splatid[i], darkid[i], mebid[i], filter[i], lampid[i], lampi[i], $ atten[i], target[i], radiom_spl[i], tstart_spl[i], texp_spl[i], $ sbctemp_spl[i], counts_spl[i], $ radiom_drk[i], 1440*(tstart_drk[i]-tstart_spl[i]), texp_drk[i], $ sbctemp_drk[i], counts_drk[i], rate_sbc[i], erate_sbc[i], rate_pmt[i], $ erate_pmt[i], sbc_pmt[i], esbc_pmt[i], raddrk_flag[i], $ format='(i4,i5,i3,2x,a6,2x,a3,f5.2,a2,f4.1,f8.1,f12.5,i5,f5.1,i8,f4.1,f6.2,i5,f5.1,i7,i6,i3,i6,i3,f7.3,f6.3,a2)' ENDFOR free_lun,unit END