Datasets and Simulation (photutils.datasets
)#
Introduction#
photutils.datasets
provides tools for loading datasets or making
simulated data. These tools mostly involve astronomical images, but they
also include PSF models and source catalogs.
These datasets are useful for the Photutils documentation examples, tests, and benchmarks. However, they can also be used for general data analysis or for users that would like to try out or implement new methods for Photutils.
Functions that start with load_*
load datasets, either from within
the Photutils package or remotely from a GitHub repository. Very
small data files are bundled with Photutils and are guaranteed to be
available. Larger datasets are available from the astropy-data
repository. On first load, these larger datasets will be downloaded and
placed into the Astropy cache on the user’s machine.
Functions that start with make_*
generate simulated data.
Typically one would need to use a combination of these functions
to create a simulated image. For example, one might use
make_model_params()
to create a table of
source parameters, then use make_model_image()
to create an image of the sources, add noise using
make_noise_image()
, and finally create a world
coordinate system (WCS) using make_wcs()
. An
example of this process is shown below.
Loading Datasets#
Let’s load an example image of M67 with
load_star_image()
:
>>> from photutils.datasets import load_star_image
>>> hdu = load_star_image()
>>> print(hdu.data.shape)
(1059, 1059)
hdu
is a FITS ImageHDU
object and hdu.data
is a ndarray
object.
Let’s plot the image:
import matplotlib.pyplot as plt
from photutils.datasets import load_star_image
hdu = load_star_image()
fig, ax = plt.subplots()
ax.imshow(hdu.data, origin='lower', interpolation='nearest')
(Source code
, png
, hires.png
, pdf
, svg
)
Simulating Images#
For this example, let’s simulate an image of 2D Gaussian sources on a constant background with Gaussian noise.
First, we’ll create a table of 2D Gaussian source
parameters with random positions, fluxes, and shapes using
make_model_params()
:
>>> from photutils.datasets import make_model_params
>>> from photutils.psf import GaussianPSF
>>> model = GaussianPSF()
>>> shape = (500, 500)
>>> n_sources = 500
>>> params = make_model_params(shape, n_sources, x_name='x_0',
... y_name='y_0', min_separation=5,
... flux=(100, 500), x_fwhm=(1, 3),
... y_fwhm=(1, 3), theta=(0, 90), seed=123)
Next, we’ll create a simulated image of the sources using the table of
model parameters using make_model_image()
:
>>> from photutils.datasets import make_model_image
>>> model_shape = (25, 25)
>>> data = make_model_image(shape, model, params, model_shape=model_shape,
... x_name='x_0', y_name='y_0')
Next, let’s add a constant background (mean = 5
) and Gaussian noise
(stddev = 2
) to the image:
>>> from photutils.datasets import make_noise_image
>>> noise = make_noise_image(shape, distribution='gaussian', mean=5,
... stddev=2, seed=123)
>>> data += noise
Finally, let’s plot the simulated image:
import matplotlib.pyplot as plt
from astropy.visualization import simple_norm
from photutils.datasets import (make_model_image, make_model_params,
make_noise_image)
from photutils.psf import GaussianPSF
model = GaussianPSF()
shape = (500, 500)
n_sources = 500
params = make_model_params(shape, n_sources, x_name='x_0',
y_name='y_0', min_separation=5,
flux=(100, 500), x_fwhm=(1, 3),
y_fwhm=(1, 3), theta=(0, 90), seed=123)
model_shape = (25, 25)
data = make_model_image(shape, model, params, model_shape=model_shape,
x_name='x_0', y_name='y_0')
noise = make_noise_image(shape, distribution='gaussian', mean=5,
stddev=2, seed=123)
data += noise
fig, ax = plt.subplots()
norm = simple_norm(data, 'sqrt', percent=99)
ax.imshow(data, norm=norm, origin='lower')
ax.set_title('Simulated image')
(Source code
, png
, hires.png
, pdf
, svg
)
We can also create a simulated world coordinate system (WCS) for the
image using make_wcs()
:
>>> from photutils.datasets import make_wcs
>>> wcs = make_wcs(shape)
>>> wcs.pixel_to_world(0, 0)
<SkyCoord (ICRS): (ra, dec) in deg
(197.8899676, -1.3750039)>
or a generalized WCS using make_gwcs()
:
>>> from photutils.datasets import make_gwcs
>>> gwcs = make_gwcs(shape)
>>> gwcs.pixel_to_world(0, 0)
<SkyCoord (ICRS): (ra, dec) in deg
(197.8899676, -1.3750039)>