27 from lsst.afw.cameraGeom
import FOCAL_PLANE, FIELD_ANGLE
29 __all__ = [
"CameraTests"]
33 """Tests that the butler returns a useable Camera.
35 In the subclasses's setUp():
36 * Call setUp_camera() to fill in required parameters.
42 first_detector_name=None,
45 """Set up the necessary variables for camera tests.
53 number of detectors in this camera
54 first_detector_name : `str`
55 name of the first detector in this camera
56 plate_scale : `lsst.geom.Angle`
57 plate scale at center of focal plane, as angle-on-sky/mm
59 fields = [
'camera_name',
61 'first_detector_name',
64 CameraData = collections.namedtuple(
"CameraData", fields)
65 self.
camera_data = CameraData(camera_name=camera_name,
66 n_detectors=n_detectors,
67 first_detector_name=first_detector_name,
68 plate_scale=plate_scale,
72 """Simplest camera test: can we get a Camera instance, and does iterating return Detectors?"""
73 camera = self.butler.get(
'camera', immediate=
True)
74 self.assertIsInstance(camera, lsst.afw.cameraGeom.Camera)
75 for detector
in camera:
76 msg =
"Failed for detector={}".format(detector)
77 self.assertIsInstance(detector, lsst.afw.cameraGeom.Detector, msg=msg)
80 """Check that the butler returns the right type of camera."""
81 camera = self.butler.get(
'camera', immediate=
True)
82 self.assertEqual(camera.getName(), self.
camera_data.camera_name)
83 self.assertEqual(len(camera), self.
camera_data.n_detectors)
84 self.assertEqual(next(iter(camera)).getName(), self.
camera_data.first_detector_name)
87 """Check the plate scale at center of focal plane
89 Check plate_scale using the FOCAL_PLANE to FIELD_ANGLE transform
93 self.assertIsNotNone(plate_scale)
94 camera = self.butler.get(
'camera', immediate=
True)
95 focalPlaneToFieldAngle = camera.getTransformMap().getTransform(FOCAL_PLANE, FIELD_ANGLE)
96 focalPlaneRadiusMm = 0.001
97 for offsetAngleRad
in (0.0, 0.65, 1.3):
98 cosAng = math.cos(offsetAngleRad)
99 sinAng = math.sin(offsetAngleRad)
100 fieldAngleRadians = focalPlaneToFieldAngle.applyForward(
101 lsst.geom.Point2D(cosAng * focalPlaneRadiusMm, sinAng * focalPlaneRadiusMm))
102 fieldAngleRadius = math.hypot(*fieldAngleRadians) * lsst.geom.radians
103 measuredScale1 = fieldAngleRadius / focalPlaneRadiusMm
104 self.assertAnglesAlmostEqual(measuredScale1, plate_scale)
106 focalPlanePos = focalPlaneToFieldAngle.applyInverse(
107 lsst.geom.Point2D(fieldAngleRadius.asRadians() * cosAng,
108 fieldAngleRadius.asRadians() * sinAng))
109 focalPlaneRadiusMm2 = math.hypot(*focalPlanePos)
110 measureScale2 = fieldAngleRadius / focalPlaneRadiusMm2
111 self.assertAnglesAlmostEqual(measureScale2, plate_scale)