def cog(self, window_size, method, tolerance = 0.01): """ Curve of growth to determine nominal aperture for photometry using astropy photutils. Parameters ---------- tolerance : float Magnitude difference tolerance between different apertures Returns ------- aperture : float Nominal aperture radius for photmetry """ # Aperture values in pixels apertures = np.array([2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]) naper = apertures.shape[0] # Randomly perform curve of growth on 5 frames framenum = np.random.randint(1, self.nframes, 5) apertures = np.linspace(2,20,19) # Read input image and star position image = chimera.fitsread(self.sci_file) pos = np.loadtxt(self.coords, ndmin = 2) # Iterate through the frames and determine nominal aperture nom_aper = np.zeros(5, dtype = np.float32) cnt = 0 for val in framenum: mags_arr = np.zeros(len(apertures)) objpos = chimera.recenter(image[val,:,:], pos, window_size, method) for i in range(naper): flux = self.phot(image[val,:,:], objpos, aper = apertures[i]) try: mags_arr[i] = -2.5 * np.log10(flux['flux']) except: mags_arr[i] = -2.5 * np.log10(flux['flux'][1]) mags_diff = np.diff(mags_arr) idx = np.where((np.abs(mags_diff) < 0.01) & (np.abs(mags_diff) != 0.0)) if len(idx[0]) != 0: nom_aper[cnt] = apertures[idx[0][0]] else: nom_aper[cnt] = 10.0 cnt += 1 return np.median(nom_aper)
def cog(self, window_size, method, tolerance = 0.01): """ Curve of growth to determine nominal aperture for photometry using astropy photutils. Parameters ---------- tolerance : float Magnitude difference tolerance between different apertures Returns ------- aperture : float Nominal aperture radius for photmetry """ # Aperture values in pixels apertures = np.array([2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]) naper = apertures.shape[0] # Randomly peform curve of growth on 5 frames framenum = np.random.randint(1, self.nframes, 5) apertures = np.linspace(2,20,19) # Read input image and star position image = chimera.fitsread(self.sci_file) pos = np.loadtxt(self.coords, ndmin = 2) # Iterate through the frames and determine nominal aperture nom_aper = np.zeros(5, dtype = np.float32) cnt = 0 for val in framenum: mags_arr = np.zeros(len(apertures)) objpos = chimera.recenter(image[val,:,:], pos, window_size, method) for i in range(naper): flux = self.phot(image[val,:,:], objpos, aper = apertures[i]) mags_arr[i] = -2.5 * np.log10(flux['flux']) mags_diff = np.diff(mags_arr) idx = np.where(np.abs(mags_diff) < 0.01) if len(idx[0]) != 0: nom_aper[cnt] = apertures[idx[0][0]] else: nom_aper[cnt] = 12.0 cnt += 1 return np.median(nom_aper)
def process(infile, coords, method, inner_radius, outer_radius, cen_method, window_size, output, zmag, avg): """ Entry point function to process science image. Parameters ---------- infile : string Science image or list of science images coords : string Input text file with coordinates of stars method : string FWHM of the stelar psf in pixels inner_radius : float Sky background sigma outer_radius : int Inner sky annulus radius in pixels cen_method : string Centroid method window_size : int Centroid finding window size in pixels output : string Output file name zmag : float Photometric zero point Returns ------- None """ print("FASTPHOT: CHIMERA Fast Aperture Photometry Routine") inner_radius = float(inner_radius) outer_radius = float(outer_radius) # Check if input is a string of FITS images or a text file with file names if infile[0] == "@": infile = infile[1:] if not os.path.exists(infile): print("REGISTER: Not able to locate file %s" % infile) image_cubes = [] with open(infile, "r") as fd: for line in fd.readlines(): if len(line) > 1: image_cubes.append(line.replace("\n", "")) else: image_cubes = infile.split(",") # Number of images ncubes = len(image_cubes) pos = np.loadtxt(coords, ndmin=2) nstars = len(pos) total_phot_data = [] for i in range(ncubes): sci_file = image_cubes[i] print(" Processing science image %s" % sci_file) # Read FITS image and star coordinate image = chimera.fitsread(sci_file) if avg != "": image = time_average(image, avg) avg = int(avg) else: avg = 1 # Instantiate an Aperphot object ap = chimera.Aperphot(sci_file, coords) # Set fwhmpsf, sigma, annulus, dannulus and zmag ap.method = method ap.inner_radius = inner_radius ap.outer_radius = outer_radius if zmag != "": ap.zmag = float(zmag) # Determine nominal aperture radius for photometry if i == 0: nom_aper = ap.cog(window_size, cen_method) #nom_aper = 3 print(" Nominal aperture radius : %4.1f pixels" % nom_aper) # Perform aperture photometry on all the frames dtype = [("DATETIME", "S25"), ("XCEN", "f4"), ("YCEN", "f4"), ("MSKY", "f8"), ("NSKY", "f8"), ("AREA", "f8"), ("FLUX_ADU", "f8"), ("FLUX_ELEC", "f8"), ("FERR", "f8"), ("MAG", "f8")] phot_data = np.zeros([nstars, ap.nframes / avg], dtype=dtype) for j in range(ap.nframes / avg): print(" Processing frame number : %d" % (j + 1)) objpos = chimera.recenter(image[j, :, :], pos, window_size, cen_method) aperphot_data = ap.phot(image[j, :, :], objpos, nom_aper) pos = np.copy(objpos) phot_data[:, j]['DATETIME'] = ap.addtime(j * avg * ap.kintime).isoformat() phot_data[:, j]['XCEN'] = aperphot_data["xcenter_raw"] phot_data[:, j]['YCEN'] = aperphot_data["ycenter_raw"] phot_data[:, j]['MSKY'] = aperphot_data["msky"] phot_data[:, j]['NSKY'] = aperphot_data["nsky"] phot_data[:, j]['AREA'] = aperphot_data["area"] phot_data[:, j]['FLUX_ADU'] = aperphot_data["flux"] phot_data[:, j]['FLUX_ELEC'] = phot_data[:, j]['FLUX_ADU'] * ap.epadu phot_data[:, j]['MAG'] = ap.zmag - 2.5 * np.log10( phot_data[:, j]['FLUX_ELEC'] / (ap.exptime)) # Calculate error in flux - using the formula # err = sqrt(flux * gain + npix * (1 + (npix/nsky)) * (flux_sky * gain + R**2)) phot_data[:, j]['FERR'] = np.sqrt( phot_data[:, j]['FLUX_ELEC'] + phot_data[:, j]['AREA'] * (1 + phot_data[:, j]['AREA'] / phot_data[:, j]['NSKY']) * (phot_data[:, j]['MSKY'] * ap.epadu + ap.readnoise**2)) total_phot_data.append(phot_data) # Save photometry data in numpy binary format print(" Saving photometry data as numpy binary") if output != "": npy_outfile = output + ".npy" else: npy_outfile = sci_file.replace(".fits", ".phot.npy") if os.path.exists(npy_outfile): os.remove(npy_outfile) #np.save(npy_outfile, phot_data) ''' # Plot first pass light curve if plot_flag: print " Plotting normalized light curve" if output != "": plt_outfile = output + ".png" else: plt_outfile = sci_file.replace(".fits", ".lc.png") plotter(phot_data, ap.nframes, ap.kintime, plt_outfile) ''' # Convert the total_phot_data to array and reshape it print(' Saving consolidated photometry data...') total_phot_data_arr = np.concatenate(total_phot_data, axis=1) # Save the array as npy file if output != "": np.save(output + "phot_total.npy", total_phot_data_arr) else: np.save("phot_total.npy", total_phot_data_arr) return