;+ ; NAME: ; PH_MKFLAT ; ; PURPOSE: ; Make flat and bad pixel maps from PHARO data ; ; CALLING SEQUENCE: ; PH_MKFLAT, flat, FRNO=, DATADIR=, PROCDIR=, DATE= ; ; INPUTS: ; frno= Vector of frame numbers for one set of flats. If not given, ; will prompt for first and last frame numbers. ; ; datadir= Full path to data directory. If not specified, determined ; from date. ; ; procdir= Full path to processing directory. If not specified, ; determined from date. ; ; date = UT date in 'YYMMDD' format. User will be prompted for input ; if datadir and procdir are not defined. ; ; OUTPUTS: ; flat flat map (1024x1024 FLOAT array) ; ; bpix bad pixel map (1024x1024 BYTE array) ; ; EXAMPLE: ; IDL> PH_MKFLAT, flat, bpix, fr=436+INDGEN(12), date='060908' ; ; MODIFICATION HISTORY: ; Original writen 9/10/06, A. Bouchez, Caltech Optical Observatories ; Cleaned up and updated 5/07 A. Bouchez, COO ;- PRO PH_MKFLAT, flat, bpix, frno=frno, $ datadir=datadir, procdir=procdir, date=date ;;; Define constants pfmt = '("ph",I4.4,".fits.gz")' ; PHARO filename format dfmt = '("dark_",I5.5,"ms.fits")' ; Filename format for saved darks min_gain = 0.7 ; Min. allowed gain value (less = bad pixel) max_gain = 1.5 ; Max. allowed gain value (more = bad pixel) ;;; Query for input parameters if not (KEYWORD_SET(datadir) and KEYWORD_SET(procdir)) then begin if not KEYWORD_SET(date) then begin date = '' READ, 'Please enter date ("YYMMDD"): ', date endif date = STRING(date,f='(I6.6)') datadir = '/data/pharo_' + date + '/' procdir = '/Users/abouchez/pharo/' + date + '/' endif if not KEYWORD_SET(frno) then begin fstr= '' READ, 'Please enter first frame number: ', fstr lstr = '' READ, 'Please enter last frame number: ', lstr flno = FIX([fstr, lstr]) frno = flno[0] + LINDGEN(flno[1]-flno[0]+1) endif ;;; Read image stack MESSAGE, /info, 'Processing skyflat frames: ' + $ STRING(MINMAX(frno),f='(I0.0,"-",I0.0)') im0 = RFITS(datadir+STRING(frno,f=pfmt), hd, /pharo, /silent) hd0 = hd[*,0] ;;; Read dark with same integration time darkname = STRING(SXPAR(hd0,'T_INT'), f=dfmt) tmp = FILE_SEARCH(procdir + darkname) while (darkname ne '') and (STRLEN(tmp[0]) eq 0) do begin MESSAGE, /info, 'Dark file ' + darkname + ' not found.' READ, "Please enter a new file name (''=none): ", darkname tmp = FILE_SEARCH(procdir + darkname) endwhile if STRLEN(darkname) gt 0 then $ dark = READFITS(procdir+darkname, /silent) else $ dark = LONARR(1024, 1024) ;;; Compute flat map filt = STRTRIM(SXPAR(hd0,'FILTER'),2) case filt of 'K_short': filt='Ks' 'Br-gamma': filt='Ks' else: foo=0 endcase pscl = STRMID(SXPAR(hd0,'CAROUSEL'),0,2) + 'mas' im1 = REBIN(im0, 1024, 1024) - dark flat = (im1 / MEDIAN(im1)) > min_gain < max_gain sname = 'flat_' + filt + '_' + pscl + '.fits' SXADDPAR, hd0, 'BITPIX', -32 MESSAGE, /info, ' Writing ' + sname WRITEFITS, procdir+sname, flat, hd0 ;;; Compute bad pixel map bpix = BYTARR(1024, 1024) wbad = WHERE((flat eq min_gain) or (flat eq max_gain)) if wbad[0] ne -1 then bpix[wbad] = 1 sname = 'bpix_' + filt + '_' + pscl + '.fits' SXADDPAR, hd0, 'BITPIX', 8 MESSAGE, /info, ' Writing ' + sname WRITEFITS, procdir+sname, bpix, hd0 END