Introduction to CameraGeom

Overview

The cameraGeom package describes the geometry of an imaging camera, including the location of each detector (e.g. CCD) on the focal plane, information about the amplifier subregions of each detector, and the location of known bad pixels in each detector. The cameraGeom package supports operations such as:

  • Assemble images from raw data (combining amplifier subregions and trimming overscan). CameraGeom does not assemble an entire image (see lsst.ip.isr.AssembleCcdTask for that) but includes functions in assembleImage that do much of the work.
  • Transform 2-d points between various camera coordinate systems, using Camera.transform(). This can be used as part of generating a lsst.afw.geom.SkyWcs or to examine the effects of optical distortion.
  • Create a graphic showing the layout of detectors on the focal plane, using utils.plotFocalPlane().

Data for constructing a Camera comes from the appropriate observatory-specific obs_ package. For example obs_sdss contains data for the SDSS imager, and obs_subaru contains data for both Suprime-Cam and Hyper Suprime-Cam (HSC).

Camera Geometry Utilities

There are a few utilities available for visualizing and debugging Camera objects. Examples of available utility methods are: display a particular amp, display an assembled sensor, display the full camera mosaic, plot the sensor boundaries with a grid of test points in FOCAL_PLANE coordinates. An example of how to use the utilities to visualize a camera is available in the obs_lsstSim package as $OBS_LSSTSIM_DIR/bin/displayCamera.py.

Camera Coordinate Systems

The cameraGeom package supports the following camera-based 2-dimensional coordinate systems, and it is possible to add others:

FOCAL_PLANE
Position on a 2-d planar approximation to the focal plane (x,y mm). The origin and orientation may be defined by the camera team, but we strongly recommend that the origin be on the optical axis and (if using CCD detectors) that the X axis be aligned along CCD rows. Note: location and orientation of detectors are defined in a 3-d version of FOCAL_PLANE coordinates (the z axis is also relevant).
FIELD_ANGLE
Angle of a principal ray relative to the optical axis (x,y radians). The orientation of the x,y axes is the same as FOCAL_PLANE.
PIXELS
Nominal position on the entry surface of a given detector (x, y unbinned pixels). For CCD detectors the x axis must be along rows (the direction of the serial register). This is required for our interpolation algorithm to interpolate across bad columns.
ACTUAL_PIXELS
Like PIXELS, but takes into account pixel-level distortions (deviations from the nominal model of uniformly spaced rectangular pixels).
TAN_PIXELS
Is a variant of PIXELS with estimated optical distortion removed. TAN_PIXELS is an affine transformation from FIELD_ANGLE coordinates, where PIXELS and TAN_PIXELS match at the center of the pupil frame.

Basic Usage

The file examples/cameraGeomExample.py shows some basic usage of the cameraGeom package.

Objects

The cameraGeom package contains the following important objects; unless otherwise noted, all are available in both C++ and Python:

Camera

A Camera is a collection of Detectors.

Camera also supports coordinate transformation between all camera coordinate systems.

Detector

Detector contains information about a given imaging detector (typically a CCD), including its position and orientation in the focal plane and information about amplifiers (such as the image region, overscan and readout corner). Amplifier data is stored as records in an lsst.afw.table.AmpInfoTable, and Detector acts as a collection of lsst.afw.table.AmpInfoRecord.

Detector also supports transformation between FOCAL_PLANE, PIXELS, and (if a suitable transform has been provided) ACTUAL_PIXELS coordinates. However Detector does not support FIELD_ANGLE coordinates; use a Camera for that.

CameraSys and CameraSysPrefix

CameraSys represents a camera coordinate system. It contains a coordinate system name and a detector name. The detector name is blank for non-detector-based camera coordinate systems such as FOCAL_PLANE and FIELD_ANGLE, but must always name a specific detector for detector-based coordinate systems.

CameraSysPrefix is a specialized variant of CameraSys that represents a detector-based coordinate system when the detector is not specified. CameraSysPrefix contains a coordinate system name but no detector name.

A constant is provided each camera coordinate system:

  • __FOCAL_PLANE__ (a CoordSys) for the FOCAL_PLANE system
  • __FIELD_ANGLE__ (a CoordSys) for the FIELD_ANGLE system
  • __PIXELS__ (a CoordSysPrefix) for the PIXELS system
  • __ACTUAL_PIXELS__ (a CoordSysPrefix) for the ACTUAL_PIXELS system

All Detector methods that take a CameraSys also accept a CameraSysPrefix instead. For example to transform a list of points from PIXELS to FOCAL_PLANE system using a Detector:

focalPlanePoints = Detector.transform(pixelPoints, PIXELS, FOCAL_PLANE)

Camera methods always require a CameraSys; a CameraSysPrefix is not acceptable because the camera does not know which detector to use. For example to transform a list of points from PIXELS on a specific detector to FIELD_ANGLE:

fieldAnglePoints = camera.transform(pixelPoints, detector.makeCameraSys(PIXELS), FIELD_ANGLE)

TransformMap

TransformMap is a collection of lsst.afw.geom.TransformPoint2ToPoint2 “Transforms” from one camera coordinate system to another.

Camera and Detector both contain TransformMaps. The transform map in Camera does not support detector-based coordinate systems (e.g. PIXELS), but Camera.getTransform and Camera.transform do support detector-based coordinate systems (since the camera contains information about the detectors).