Wavelength-dependent Profiles

Real astronomical objects emit photons at a range of wavelengths according to a potentially complicated spectral energy distribution (SED). These photons then may be affected differently by the atmosphere and optics as part of the point-spread function (PSF). Then they typically pass through a bandpass filter with a variable transmission as a function of wavelength. Finally, there may be other wavelength-dependent effects when converting from photons to electrons in the sensor.

GalSim supplies a number of tools to simulate these chromatic effects. An SED is used to define the SED of the objects. There are a variety of options as to the units of the input SED function; e.g. photons/cm^2/nm/sec, ergs/cm^2/Hz/s, etc. There are also ways to adjust the normalization of the SED to give a particular observed magnitude when observed through a particular Bandpass. And there is a dimensionless option, which may be appropriate for defining chromatic PSFs.

The Bandpass class represents a spectral throughput function, which could be an entire imaging system throughput response function (reflection off of mirrors, transmission through filters, lenses and the atmosphere, and quantum efficiency of detectors), or individual pieces thereof. Both a Bandpass and the SED are necessary to compute the relative contribution of each wavelength of a ChromaticObject to a drawn image.

Then there are a number of kinds of ChromaticObject to define the wavelength dependence of an object’s surface brightness profile. The simplest one is when the spatial and spectral dependencies are separable; i.e. every part of the profile has the same SED. In this case, one forms the ChromaticObject simply by multiplying a GSObject by an SED:

>>> obj = galsim.Sersic(n=2.3, half_light_radius=3.5)
>>> sed = galsim.SED('CWW_Sbc_ext.sed', wave_type'Ang', flux_type='flambda')
>>> chromatic_object = obj * sed

Other more complicated kinds of chromatic profiles are subclasses of ChromaticObject and have their own initialization arguments. See the listings below.

To draw any kind of ChromaticObject, you call its drawImage() method, which works largely the same as GSObject:drawImage(), but requires a Bandpass argument to define what bandpass is being used for the observation:

>>> gband = galsim.Bandpass(lambda w:1.0, wave_type='nm', blue_limit=410, red_limit=550)
>>> image = chromatic_obj.drawImage(gband)

The transformation methods of ChromaticObject, like dilate() and shift(), can also accept as an argument a function of wavelength (in nanometers) that returns a wavelength-dependent dilation, shift, etc. These can be used to implement chromatic PSFs. For example, a diffraction limited PSF might look like:

>>> psf500 = galsim.Airy(lam_over_diam=2.0)
>>> chromatic_psf = ChromaticObject(psf500).dilate(lambda w:(w/500)**1.0)