def prep_direct_grism_pair(direct_asn='goodss-34-F140W_asn.fits', grism_asn='goodss-34-G141_asn.fits', radec=None, raw_path='../RAW/', mask_grow=18, scattered_light=False, final_scale=None, skip_direct=False, ACS=False, jump=False, order=2, get_shift=True, align_threshold=20, column_average=True, sky_iter=3): """ Process both the direct and grism observations of a given visit """ import threedhst.prep_flt_astrodrizzle as prep import drizzlepac from stwcs import updatewcs import time t0 = time.time() #direct_asn='goodss-34-F140W_asn.fits'; grism_asn='goodss-34-G141_asn.fits'; radec=None; raw_path='../RAW/' #radec = os.getenv('THREEDHST') + '/ASTRODRIZZLE_FLT/Catalog/goodss_radec.dat' ################################ #### Direct image processing ################################ #### xx add astroquery 2MASS/SDSS workaround for radec=None if not skip_direct: #### Get fresh FLTS from ../RAW/ asn = threedhst.utils.ASNFile(direct_asn) if ACS: for exp in asn.exposures: print 'cp %s/%s_flc.fits.gz .' %(raw_path, exp) os.system('cp %s/%s_flc.fits.gz .' %(raw_path, exp)) os.system('gunzip %s_flc.fits.gz' %(exp)) else: threedhst.process_grism.fresh_flt_files(direct_asn, from_path=raw_path) if (not ACS): #### Subtract WFC3/IR direct backgrounds prep.subtract_flt_background(root=direct_asn.split('_asn')[0], scattered_light=scattered_light, order=order) #### Flag IR CRs again within runTweakReg #### Run TweakReg if (radec is None) & (not ACS): drizzlepac.astrodrizzle.AstroDrizzle(direct_asn, clean=True, final_scale=None, final_pixfrac=0.8, context=False, final_bits=576, preserve=False, driz_cr_snr='5.0 4.0', driz_cr_scale = '2.5 0.7') # , else: if get_shift: prep.runTweakReg(asn_file=direct_asn, master_catalog=radec, final_scale=None, ACS=ACS, threshold=align_threshold) #### Subtract background of direct ACS images if ACS: for exp in asn.exposures: flc = pyfits.open('%s_flc.fits' %(exp), mode='update') for ext in [1,4]: threedhst.showMessage('Subtract background from %s_flc.fits[%d] : %.4f' %(exp, ext, flc[ext].header['MDRIZSKY'])) flc[ext].data -= flc[ext].header['MDRIZSKY'] flc[ext].header['MDRIZSK0'] = flc[ext].header['MDRIZSKY'] flc[ext].header['MDRIZSKY'] = 0. # flc.flush() else: pass #### Do this later, gives segfaults here??? #prep.subtract_flt_background(root=direct_asn.split('_asn')[0], scattered_light=scattered_light) #### Flag CRs again on BG-subtracted image #drizzlepac.astrodrizzle.AstroDrizzle(direct_asn, clean=True, final_scale=None, final_pixfrac=0.8, context=False, final_bits=576, preserve=False, driz_cr_snr='5.0 4.0', driz_cr_scale = '2.5 0.7') # , ################################ #### Grism image processing ################################ if grism_asn: asn = threedhst.utils.ASNFile(grism_asn) if ACS: for exp in asn.exposures: print 'cp %s/%s_flc.fits.gz .' %(raw_path, exp) os.system('cp %s/%s_flc.fits.gz .' %(raw_path, exp)) os.system('gunzip %s_flc.fits.gz' %(exp)) updatewcs.updatewcs('%s_flc.fits' %(exp)) prep.copy_adriz_headerlets(direct_asn=direct_asn, grism_asn=grism_asn, ACS=True) prep.subtract_acs_grism_background(asn_file=grism_asn, final_scale=None) else: #### Remove the sky and flag CRs ## with mask from rough zodi-only subtraction prep.subtract_grism_background(asn_file=grism_asn, PATH_TO_RAW='../RAW/', final_scale=None, visit_sky=True, column_average=False, mask_grow=mask_grow, first_run=True) ## Redo making mask from better combined image prep.subtract_grism_background(asn_file=grism_asn, PATH_TO_RAW='../RAW/', final_scale=final_scale, visit_sky=True, column_average=column_average, mask_grow=mask_grow, first_run=False, sky_iter=sky_iter) #### Copy headers from direct images if radec is not None: prep.copy_adriz_headerlets(direct_asn=direct_asn, grism_asn=grism_asn, ACS=False) #### Run CR rejection with final shifts drizzlepac.astrodrizzle.AstroDrizzle(grism_asn, clean=True, skysub=False, final_wcs=True, final_scale=final_scale, final_pixfrac=0.8, context=False, final_bits=576, driz_sep_bits=576, preserve=False, driz_cr_snr='8.0 5.0', driz_cr_scale='2.5 0.7') # driz_cr_snr='5.0 4.0', driz_cr_scale = '2.5 0.7') if not grism_asn: t1 = time.time() threedhst.showMessage('direct: %s\n\nDone (%d s).' %(direct_asn, int(t1-t0))) else: t1 = time.time() threedhst.showMessage('direct: %s\ngrism: %s\n\nDone (%d s).' %(direct_asn, grism_asn, int(t1-t0)))
def prep_direct_grism_pair(direct_asn='goodss-34-F140W_asn.fits', grism_asn='goodss-34-G141_asn.fits', radec=None, raw_path='../RAW/', mask_grow=18, scattered_light=False, final_scale=None, skip_direct=False, ACS=False, jump=False, order=2, get_shift=True, align_threshold=20, column_average=True, sky_iter=3, run_acs_lacosmic=False): """ Process both the direct and grism observations of a given visit """ import threedhst.prep_flt_astrodrizzle as prep import drizzlepac from stwcs import updatewcs import time t0 = time.time() #direct_asn='goodss-34-F140W_asn.fits'; grism_asn='goodss-34-G141_asn.fits'; radec=None; raw_path='../RAW/' #radec = os.getenv('THREEDHST') + '/ASTRODRIZZLE_FLT/Catalog/goodss_radec.dat' ################################ #### Direct image processing ################################ #### xx add astroquery 2MASS/SDSS workaround for radec=None if not skip_direct: #### Get fresh FLTS from ../RAW/ asn = threedhst.utils.ASNFile(direct_asn) if ACS: for exp in asn.exposures: print 'cp %s/%s_flc.fits.gz .' %(raw_path, exp) os.system('cp %s/%s_flc.fits.gz .' %(raw_path, exp)) os.system('gunzip -f %s_flc.fits.gz' %(exp)) if run_acs_lacosmic: try: import lacosmicx status = True except: print 'import lacosmicx failed!' status = False if status: im = pyfits.open('%s_flc.fits' %(exp), mode='update') for ext in [1,2]: indata = im['SCI',ext].data #inmask = im['DQ',ext].data > 0 if im['SCI',ext].header['BUNIT'] == 'ELECTRONS': gain = 1 else: gain = 1./im[0].header['EXPTIME'] if 'MDRIZSK0' in im['SCI',ext].header: pssl = im['SCI',ext].header['MDRIZSK0'] else: pssl = 0. if 'FLASHLVL' in im[0].header: pssl += im[0].header['FLASHLVL'] sig_scale = 1.8 else: sig_scale = 1. out = lacosmicx.lacosmicx(indata, inmask=None, sigclip=3.5*sig_scale, sigfrac=0.2, objlim=7.0, gain=gain, readnoise=im[0].header['READNSEA'], satlevel=np.inf, pssl=pssl, niter=5, sepmed=True, cleantype='meanmask', fsmode='median', psfmodel='gauss', psffwhm=2.5,psfsize=7, psfk=None, psfbeta=4.765, verbose=True) crmask, cleanarr = out im['DQ',ext].data |= 16*crmask ### Low pixels if im[0].header['INSTRUME'] == 'WFC3': bad = im['SCI',ext].data < -4*im['ERR',ext].data im['DQ',ext].data |= 16*bad im.flush() else: threedhst.process_grism.fresh_flt_files(direct_asn, from_path=raw_path) if (not ACS): #### Subtract WFC3/IR direct backgrounds prep.subtract_flt_background(root=direct_asn.split('_asn')[0], scattered_light=scattered_light, order=order) #### Flag IR CRs again within runTweakReg #### Run TweakReg if (radec is None) & (not ACS): print len(asn.exposures) if len(asn.exposures) > 1: drizzlepac.astrodrizzle.AstroDrizzle(direct_asn, clean=True, final_scale=None, final_pixfrac=0.8, context=False, final_bits=576, preserve=False, driz_cr_snr='5.0 4.0', driz_cr_scale = '2.5 0.7') else: drizzlepac.astrodrizzle.AstroDrizzle(direct_asn, clean=True, final_scale=None, final_pixfrac=1, context=False, final_bits=576, preserve=False, driz_separate=False, driz_sep_wcs=False, median=False, blot=False, driz_cr=False, driz_cr_corr=False, driz_combine=True) else: if get_shift: prep.runTweakReg(asn_file=direct_asn, master_catalog=radec, final_scale=None, ACS=ACS, threshold=align_threshold) #### Subtract background of direct ACS images if ACS: for exp in asn.exposures: flc = pyfits.open('%s_flc.fits' %(exp), mode='update') if 'SUB' in flc[0].header['APERTURE']: extensions = [1] else: extensions = [1,4] for ext in extensions: threedhst.showMessage('Subtract background from %s_flc.fits[%d] : %.4f' %(exp, ext, flc[ext].header['MDRIZSKY'])) flc[ext].data -= flc[ext].header['MDRIZSKY'] flc[ext].header['MDRIZSK0'] = flc[ext].header['MDRIZSKY'] flc[ext].header['MDRIZSKY'] = 0. # flc.flush() else: pass #### Do this later, gives segfaults here??? #prep.subtract_flt_background(root=direct_asn.split('_asn')[0], scattered_light=scattered_light) #### Flag CRs again on BG-subtracted image #drizzlepac.astrodrizzle.AstroDrizzle(direct_asn, clean=True, final_scale=None, final_pixfrac=0.8, context=False, final_bits=576, preserve=False, driz_cr_snr='5.0 4.0', driz_cr_scale = '2.5 0.7') # , ################################ #### Grism image processing ################################ if grism_asn: asn = threedhst.utils.ASNFile(grism_asn) if ACS: for exp in asn.exposures: print 'cp %s/%s_flc.fits.gz .' %(raw_path, exp) os.system('cp %s/%s_flc.fits.gz .' %(raw_path, exp)) os.system('gunzip -f %s_flc.fits.gz' %(exp)) updatewcs.updatewcs('%s_flc.fits' %(exp)) prep.copy_adriz_headerlets(direct_asn=direct_asn, grism_asn=grism_asn, ACS=True) prep.subtract_acs_grism_background(asn_file=grism_asn, final_scale=None) else: #### Remove the sky and flag CRs ## with mask from rough zodi-only subtraction prep.subtract_grism_background(asn_file=grism_asn, PATH_TO_RAW='../RAW/', final_scale=None, visit_sky=True, column_average=False, mask_grow=mask_grow, first_run=True) ## Redo making mask from better combined image prep.subtract_grism_background(asn_file=grism_asn, PATH_TO_RAW='../RAW/', final_scale=final_scale, visit_sky=True, column_average=column_average, mask_grow=mask_grow, first_run=False, sky_iter=sky_iter) #### Copy headers from direct images if radec is not None: prep.copy_adriz_headerlets(direct_asn=direct_asn, grism_asn=grism_asn, ACS=False) #### Run CR rejection with final shifts drizzlepac.astrodrizzle.AstroDrizzle(grism_asn, clean=True, skysub=False, final_wcs=True, final_scale=final_scale, final_pixfrac=0.8, context=False, final_bits=576, driz_sep_bits=576, preserve=False, driz_cr_snr='8.0 5.0', driz_cr_scale='2.5 0.7') # driz_cr_snr='5.0 4.0', driz_cr_scale = '2.5 0.7') if not grism_asn: t1 = time.time() threedhst.showMessage('direct: %s\n\nDone (%d s).' %(direct_asn, int(t1-t0))) else: t1 = time.time() threedhst.showMessage('direct: %s\ngrism: %s\n\nDone (%d s).' %(direct_asn, grism_asn, int(t1-t0)))