22 __all__ = [
"addDetectorBuilderFromConfig",
23 "makeCameraFromPath",
"makeCameraFromAmpLists"]
27 from ._cameraGeom
import FOCAL_PLANE, FIELD_ANGLE, PIXELS, TAN_PIXELS, ACTUAL_PIXELS, CameraSys
28 from ._cameraGeom
import Amplifier
29 from ._camera
import Camera
30 from ._makePixelToTanPixel
import makePixelToTanPixel
31 from .pupil
import PupilFactory
33 cameraSysList = [FIELD_ANGLE, FOCAL_PLANE, PIXELS, TAN_PIXELS, ACTUAL_PIXELS]
34 cameraSysMap = dict((sys.getSysName(), sys)
for sys
in cameraSysList)
38 """Build a dictionary of Detector constructor keyword arguments.
40 The returned dictionary can be passed as keyword arguments to the Detector
41 constructor, providing all required arguments. However, using these
42 arguments directly constructs a Detector with knowledge of only the
43 coordinate systems that are *directly* mapped to its own PIXELS coordinate
44 system. To construct Detectors with a shared TransformMap for the full
45 Camera, use makeCameraFromCatalogs or makeCameraFromPath instead of
46 calling this function or makeDetector directly.
50 cameraBuilder : `lsst.afw.cameraGeonm.Camera.Builder`
51 Camera builder object to which the new Detector Builder
53 detectorConfig : `lsst.pex.config.Config`
54 Configuration for this detector.
55 amplifiers : `list` [`~lsst.afw.cameraGeom.Amplifier`]
56 amplifier information for this detector
57 focalPlaneToField : `lsst.afw.geom.TransformPoint2ToPoint2`
58 FOCAL_PLANE to FIELD_ANGLE Transform
62 detectorBuilder : `lsst.afw.cameraGeom.Detector.InCameraBuilder`
63 A builder object for a detector corresponding to the given config,
64 associated with the given camera builder object.
66 detectorBuilder = cameraBuilder.add(detectorConfig.name, detectorConfig.id)
67 detectorBuilder.fromConfig(detectorConfig)
69 for ampBuilder
in amplifiers:
70 detectorBuilder.append(ampBuilder)
80 detectorNativeSysPrefix = cameraSysMap.get(detectorConfig.transformDict.nativeSys, PIXELS)
81 assert detectorNativeSysPrefix == PIXELS,
"Detectors with nativeSys != PIXELS are not supported."
83 for toSys, transform
in transforms.items():
84 detectorBuilder.setTransformFromPixelsTo(toSys, transform)
85 tanPixSys = CameraSys(TAN_PIXELS, detectorConfig.name)
87 bbox=detectorBuilder.getBBox(),
88 orientation=detectorBuilder.getOrientation(),
89 focalPlaneToField=focalPlaneToField,
90 pixelSizeMm=detectorBuilder.getPixelSize(),
93 for toSys, transform
in transforms.items():
94 detectorBuilder.setTransformFromPixelsTo(toSys, transform)
96 detectorBuilder.setCrosstalk(detectorConfig.getCrosstalk(len(amplifiers)))
98 return detectorBuilder
102 """Make a dictionary of CameraSys: lsst.afw.geom.Transform from a config dict.
106 transformConfigDict : value obtained from a `lsst.pex.config.ConfigDictField`
107 registry; keys are camera system names.
111 transforms : `dict` [`CameraSys` or `CameraSysPrefix`, `lsst.afw.geom.Transform`]
112 A dict of CameraSys or CameraSysPrefix: lsst.afw.geom.Transform
115 if transformConfigDict
is not None:
116 for key
in transformConfigDict:
117 transform = transformConfigDict[key].transform.apply()
118 resMap[CameraSys(key)] = transform
123 pupilFactoryClass=PupilFactory):
124 """Make a Camera instance from a directory of ampInfo files
126 The directory must contain one ampInfo fits file for each detector in cameraConfig.detectorList.
127 The name of each ampInfo file must be shortNameFunc(fullDetectorName) + ".fits".
131 cameraConfig : `CameraConfig`
132 Config describing camera and its detectors.
134 Path to ampInfo data files.
135 shortNameFunc : callable
136 A function that converts a long detector name to a short one.
137 pupilFactoryClass : `type`, optional
138 Class to attach to camera; default is `lsst.afw.cameraGeom.PupilFactory`.
142 camera : `lsst.afw.cameraGeom.Camera`
146 for detectorConfig
in cameraConfig.detectorList.values():
147 shortName = shortNameFunc(detectorConfig.name)
148 ampCatPath = os.path.join(ampInfoPath, shortName +
".fits")
149 catalog = BaseCatalog.readFits(ampCatPath)
150 ampListDict[detectorConfig.name] = [Amplifier.Builder.fromRecord(record)
151 for record
in catalog]
157 pupilFactoryClass=PupilFactory):
158 """Construct a Camera instance from a dictionary of detector name: list of
163 cameraConfig : `CameraConfig`
164 Config describing camera and its detectors.
165 ampListDict : `dict` [`str`, `list` [`Amplifier.Builder`]]
166 A dictionary of detector name: list of Amplifier.Builder
167 pupilFactoryClass : `type`, optional
168 Class to attach to camera; `lsst.default afw.cameraGeom.PupilFactory`.
172 camera : `lsst.afw.cameraGeom.Camera`
175 nativeSys = cameraSysMap[cameraConfig.transformDict.nativeSys]
181 assert nativeSys == FOCAL_PLANE,
"Cameras with nativeSys != FOCAL_PLANE are not supported."
184 cameraBuilder.setPupilFactoryClass(pupilFactoryClass)
187 focalPlaneToField = transformDict[FIELD_ANGLE]
189 for toSys, transform
in transformDict.items():
190 cameraBuilder.setTransformFromFocalPlaneTo(toSys, transform)
192 for detectorConfig
in cameraConfig.detectorList.values():
195 detectorConfig=detectorConfig,
196 amplifiers=ampListDict[detectorConfig.name],
197 focalPlaneToField=focalPlaneToField,
200 return cameraBuilder.finish()
A helper class for creating and modifying cameras.
def makeCameraFromAmpLists(cameraConfig, ampListDict, pupilFactoryClass=PupilFactory)
def makeTransformDict(transformConfigDict)
def makeCameraFromPath(cameraConfig, ampInfoPath, shortNameFunc, pupilFactoryClass=PupilFactory)
def addDetectorBuilderFromConfig(cameraBuilder, detectorConfig, amplifiers, focalPlaneToField)
def makePixelToTanPixel(bbox, orientation, focalPlaneToField, pixelSizeMm)