def bkg_subtraction(time, flux, scope="tpf", sigma=3): """Subtracts background flux from target pixel file. Parameters ---------- scope : string, "tpf" or "postcard" If `tpf`, will use data from the target pixel file only to estimate and remove the background. If `postcard`, will use data from the entire postcard region to estimate and remove the background. sigma : float The standard deviation cut used to determine which pixels are representative of the background in each cadence. """ tpf_flux_bkg = [] sigma_clip = SigmaClip(sigma=sigma) # bkg = MMMBackground(sigma_clip=sigma_clip) bkg = SExtractorBackground(sigma_clip=sigma_clip) bkg_MMM = MMMBackground(sigma_clip=sigma_clip) bkg_ModeEstimator = ModeEstimatorBackground(median_factor=3., mean_factor=2., sigma_clip=sigma_clip) bkg_Mean = MeanBackground(sigma_clip) bkg_Median = MedianBackground(sigma_clip) bkg_SExtractor = SExtractorBackground(sigma_clip) bkg_MMM_value = bkg_MMM.calc_background(flux[0]) bkg_ModeEstimator_value = bkg_ModeEstimator.calc_background(flux[0]) bkg_Mean_value = bkg_Mean.calc_background(flux[0]) bkg_Median_value = bkg_Median.calc_background(flux[0]) bkg_SExtractor_value = bkg_SExtractor.calc_background(flux[0]) print("MMM Background = {}".format(bkg_MMM_value)) print("ModeEstimator Background = {}".format(bkg_ModeEstimator_value)) print("Mean Background = {}".format(bkg_Mean_value)) print("Median Background = {}".format(bkg_Median_value)) print("SExtractor Background = {}".format(bkg_SExtractor_value)) for i in range(len(time)): bkg_value = bkg.calc_background(flux[i]) tpf_flux_bkg.append(bkg_value) tpf_flux_bkg = np.array(tpf_flux_bkg) return tpf_flux_bkg
def test_recovered_flux_aperture(science_image): with fits.open(science_image) as hdul: header = hdul[0].header wcs = WCS(header) footprint = wcs.calc_footprint() # realize fakes randomly throughout the footprint rx = rng.uniform(size=N_FAKE) ry = rng.uniform(size=N_FAKE) # keep things bright mag = rng.uniform(low=15, high=18, size=N_FAKE) minra, mindec = footprint.min(axis=0) maxra, maxdec = footprint.max(axis=0) coord = SkyCoord(minra + (maxra - minra) * rx, mindec + (maxdec - mindec) * ry, unit='deg') fakes.inject_psf(science_image, mag, coord) with fits.open(science_image) as hdul: data = hdul[-2].data header = hdul[0].header table = hdul[-1].data # subtract off the background sigma_clip = SigmaClip(sigma=3.0) bkg = MedianBackground(sigma_clip) bkg_val = bkg.calc_background(data) bkgsub = data - bkg_val APERTURE_RADIUS = 3 * u.pixel for row in table: ra, dec, mag = row['fake_ra'], row['fake_dec'], row['fake_mag'] coord = SkyCoord(ra, dec, unit='deg') apertures = photutils.SkyCircularAperture(coord, r=APERTURE_RADIUS) phot_table = photutils.aperture_photometry(bkgsub, apertures, wcs=wcs) flux = phot_table['aperture_sum'][0] assert abs(-2.5 * np.log10(flux) + header['MAGZP'] + header['APCOR4'] - mag) < 0.05