Example #1
0
    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)
Example #2
0
 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)
Example #3
0
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