Simple DAOPHOT-type photometry in Python translated from IDL AstroLib photometry algorithms. Please email me with bugs, suggestions, omissions, etc. The code is citable as part of the Astrophysics Source Code Library (http://ascl.net/1501.010).

djones1040 djones1040 Last update: Feb 19, 2022

PythonPhot PSF Fitting Photometry Tutorial

getpsf.py : Generates a point-spread function (PSF) from observed stars atspecified locations. Uses the family of "peak fit" modules(pkfit, pkfit_noise, pkfit_norecent, etc) to fit a gaussian to eachstar and define an array of non-gaussian psf residuals.Returns a 5-element vector defining the gaussian, a 2-d array ofpsf residuals, and the magnitude of the psf. Also writes out thepsf model to a fits file with the gaussian parameters in the headerand the residuals in the data array.

rdpsf.py : Read the .fits file created by getpsf.py that contains thepsf model gaussian parameters and 2-d array of residuals.

pkfit.py : fit a psf model to an isolated point sourcepkfit_noise : fitting with an input noise imagepkfit_norecent : forced photometry (fitting a peak without recentering)pkfit_norecent_noise : forced photometry with an input noise image


EXAMPLE A : Make a psf model

     import getpsf     import aper     import numpy as np     # load FITS image and specify PSF star coordinates     image = pyfits.getdata(fits_filename)     xpos,ypos = np.array([1450,1400]),np.array([1550,1600])     # run aper to get mags and sky values for specified coords     mag,magerr,flux,fluxerr,sky,skyerr,badflag,outstr = \            aper.aper(image,xpos,ypos,phpadu=1,apr=5,zeropoint=25,            skyrad=[40,50],badpix=[-12000,60000],exact=True)     # use the stars at those coords to generate a PSF model     gauss,psf,psfmag = \            getpsf.getpsf(image,xpos,ypos,                          mag,sky,1,1,np.arange(len(xpos)),                          5,'output_psf.fits')

EXAMPLE B : fit a psf to isolated stars

 import pyfits from PythonPhot import pkfit # read in the fits images containing the target sources image = pyfits.getdata(fits_filename) noiseim = pyfits.getdata(fits_noise_filename) maskim = pyfits.getdata(fits_mask_filename) # read in the fits image containing the PSF (gaussian model # parameters and 2-d residuals array. psf = pyfits.getdata(psf_filename) hpsf = pyfits.getheader(psf_filename) gauss = [hpsf['GAUSS1'],hpsf['GAUSS2'],hpsf['GAUSS3'],hpsf['GAUSS4'],hpsf['GAUSS5']] # x and y points for PSF fitting xpos,ypos = np.array([1450,1400]),np.array([1550,1600]) # run 'aper' on x,y coords to get sky values mag,magerr,flux,fluxerr,sky,skyerr,badflag,outstr = \          aper.aper(image,xpos,ypos,phpadu=1,apr=5,zeropoint=25,          skyrad=[40,50],badpix=[-12000,60000],exact=True) # load the pkfit class pk = pkfit.pkfit_class(image,gauss,psf,1,1,noiseim,maskim) # do the PSF fitting for x,y,s in zip(xpos,ypos,sky):      errmag,chi,sharp,niter,scale = \          pk.pkfit_norecent_noise(1,x,y,s,5)      flux = scale*10**(0.4*(25.-hpsf['PSFMAG']))      dflux = errmag*10**(0.4*(25.-hpsf['PSFMAG']))      print('PSF fit to coords %.2f,%.2f gives flux %s +/- %s'%(x,y,flux,dflux))
Tags:

Subscribe to our newsletter