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.AssembleCcdTaskfor that) but includes functions inassembleImagethat 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 alsst.afw.geom.SkyWcsor 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_PLANEcoordinates (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
PIXELSwith estimated optical distortion removed.TAN_PIXELSis an affine transformation fromFIELD_ANGLEcoordinates, wherePIXELSandTAN_PIXELSmatch 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).