LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
CModel Magnitudes

The CModel approach to model-fit galaxy photometry - also known as the "Sloan Swindle" - is an approximation to bulge+disk or Sersic model fitting that follows the following sequence:

  • Fit a PSF-convolved elliptical exponential (Sersic n=1) model to the data.
  • Fit a PSF-convolved elliptical de Vaucouleurs (Sersic n=4) model to the data.
  • Holding the positions and ellipses of both models fixed (only allowing the amplitudes to vary), fit a linear combination of the two models. In the limit of pure bulge or pure disk galaxies, this approach yields the same results as a more principled bugle+disk or Sersic fit. For galaxies that are a combination of the two components (or have more complicated morphologies, as of course all real galaxies do), it provides a smooth transition between the two models, and the fraction of flux in each of the two parameters is correlated with Sersic index and the true bulge-disk ratio. Most importantly, this approach yieled good galaxy colors in the SDSS data processing.

In this implementation of the CModel algorithm, we actually have 4 stages:

  • In the "initial" stage, we fit a very approximate PSF-convolved elliptical model, just to provide a good starting point for the subsequence exponential and de Vaucouleur fits. Because we use shapelet/Gaussian approximations to convolved models with the PSF, model evaluation is much faster when only a few Gaussians are used in the approximation, as is done here. In the future, we may also use a simpler PSF approximation in the initial fit, but this is not yet implemented. We also have not yet researched how best to make use of the initial fit (i.e. how does the initial best-fit radius typically relate to the best-fit exponential radius?), or what convergence criteria should be used in the initial fit. Following the initial fit, we also revisit the question of which pixels should be included in the fit (see CModelRegionControl).
  • In the "exp" stage, we start with the "initial" fit results, and fit an elliptical exponential profile.
  • In the "dev" stage, we start with the "initial" fit results, and fit an elliptical de Vaucouleur profile.
  • Holding the "exp" and "dev" ellipses fixed, we fit a linear combination of those two profiles. In all of these steps, the centroid is held fixed at a given input value (take from the slot centroid when run by the measurement framework).


Unlike most measurement algorithms, CModel requires the Exposure it is given to have both a Wcs and a PhotoCalib. This is because it makes use of Bayesian priors, and hence it has to know the relationship between the raw units of the image (pixel and count) and the global units in which the priors are defined.

In fact, all of the nonlinear fits in CModel are done in a special, local coordinate system, defined by a Wcs in which the "pixels" have units of arcseconds (because we never create an image in this system, we don't have to worry about the size of the pixels) and the fluxes should be of order unity. In addition to allowing us to use priors, it also ensures that the parameters all have the same order of magnitude, which improves the behavior of the optimizer.

See Units and Coordinate Systems for more information.

Forced Photometry

In forced photometry, we replace the three nonlinear fits with amplitude-only fits, and then repeat the final linear fit, using the ellipses from the reference catalog in all casees. We do allow the relative amplitudes of the two components to vary in forced mode, though in the future we will add an option to hold this fixed as well as the ellipses.

Shapelet Approximations to the PSF

The CModel algorithm relies on a multi-shapelet approximation to the PSF to convolve galaxy models. It does not compute this approximation directly; for CModelAlgorithm methods that take inputs directly as arguments, the PSF must be supplied as a shapelet::MultiShapeletFunction instance. When using SourceRecords for input/output, CModel assumes that the ShapeletPsfApprox plugin has already been run (see, and uses the fields created by that plugin to retrieve the PSF approximation.

Code Organization

The CModel implementation consists of many classes, defined in this file and These mostly fall into four categories:

  • Control structs: C++ analogs of Python Config classes, these structs contain the configuration parameters that control the behavior of the algorithm. These are nested; the CModelControl struct contains a PixelFitRegionControl instance and three CModelStageControl (one for each of "initial", "exp", and "dev"). The configuration for the final amplitude-only fit goes in CModelControl itself; because it is a simpler linear fit, it doesn't have much in common with the first three stages.
  • Result structs: while the algorithm has methods to use SourceRecord objects for input/output, it can also take inputs directly as arguments and return the outputs using these structs. Like the Control structs, the master CModelResult struct holds three CModelStageResult classes, for each of the three nonlinear fits.
  • Keys structs: these private classes (defined in an anonymous namespace in hold the afw::table::Key and FunctorKey objects that provide a mapping from the Result structs to Schema fields. They also provide methods to transfer values from Results to Records, or the reverse. These are also split into a master CModelKeys struct, which holds three CModelStageKeys structs.
  • Impl classes: these private classes contain the actual algorithmic code. Once again, we have the master implementation class (CModelAlgorithm::Impl) and a class for the nonlinear fitting stages (CModelStageImpl). In addition to these categories, we also have the CModelAlgorithm class, which is the C++ public interface to all of this, and the CModelStageData class, a private class that aggregates per-source state and makes it easier to pass it around.