25 import lsst.afw.cameraGeom
as cameraGeom
26 import lsst.geom
as geom
27 import lsst.afw.geom
as afwGeom
28 from lsst.afw.cameraGeom
import Amplifier, Camera, ReadoutCorner
31 __all__ = [
"makeCamera"]
35 """An imaging camera (e.g. the LSST 3Gpix camera) 40 Camera description YAML file. 44 camera : `lsst.afw.cameraGeom.Camera` 48 with open(cameraFile)
as fd:
49 cameraParams = yaml.load(fd, Loader=yaml.CLoader)
51 cameraName = cameraParams[
"name"]
56 plateScale = geom.Angle(cameraParams[
"plateScale"], geom.arcseconds)
57 nativeSys = cameraGeom.CameraSys(cameraParams[
"transforms"].pop(
"nativeSys"))
60 ccdParams = cameraParams[
"CCDs"]
64 for ccdName, ccdValues
in ccdParams.items():
71 """Make a list of detector configs 75 detectorConfig : `list` of `lsst.afw.cameraGeom.DetectorConfig` 76 A list of detector configs. 79 for name, ccd
in ccdParams.items():
80 detectorConfig = cameraGeom.DetectorConfig()
81 detectorConfigs.append(detectorConfig)
83 detectorConfig.name = name
84 detectorConfig.id = ccd[
'id']
85 detectorConfig.serial = ccd[
'serial']
86 detectorConfig.detectorType = ccd[
'detectorType']
87 if 'physicalType' in ccd:
88 detectorConfig.physicalType = ccd[
'physicalType']
90 detectorConfig.bbox_x0, detectorConfig.bbox_y0 = ccd[
'bbox'][0]
91 detectorConfig.bbox_x1, detectorConfig.bbox_y1 = ccd[
'bbox'][1]
92 detectorConfig.pixelSize_x, detectorConfig.pixelSize_y = ccd[
'pixelSize']
93 detectorConfig.transformDict.nativeSys = ccd[
'transformDict'][
'nativeSys']
94 transforms = ccd[
'transformDict'][
'transforms']
95 detectorConfig.transformDict.transforms =
None if transforms ==
'None' else transforms
96 detectorConfig.refpos_x, detectorConfig.refpos_y = ccd[
'refpos']
97 detectorConfig.offset_x, detectorConfig.offset_y = ccd[
'offset']
98 detectorConfig.transposeDetector = ccd[
'transposeDetector']
99 detectorConfig.pitchDeg = ccd[
'pitch']
100 detectorConfig.yawDeg = ccd[
'yaw']
101 detectorConfig.rollDeg = ccd[
'roll']
102 if 'crosstalk' in ccd:
103 detectorConfig.crosstalk = ccd[
'crosstalk']
105 return detectorConfigs
109 """Construct a list of AmplifierBuilder objects 113 amp = list(ccd[
'amplifiers'].values())[0]
116 xRawExtent, yRawExtent = rawBBox.getDimensions()
118 readCorners = {
"LL": ReadoutCorner.LL,
119 "LR": ReadoutCorner.LR,
120 "UL": ReadoutCorner.UL,
121 "UR": ReadoutCorner.UR} 124 for name, amp
in sorted(ccd[
'amplifiers'].items(), key=
lambda x: x[1][
'hdu']):
125 amplifier = Amplifier.Builder()
126 amplifier.setName(name)
129 perAmpData = amp[
'perAmpData']
133 x0, y0 = ix*xRawExtent, iy*yRawExtent
136 xDataExtent, yDataExtent = rawDataBBox.getDimensions()
137 amplifier.setBBox(geom.BoxI(
138 geom.PointI(ix*xDataExtent, iy*yDataExtent), rawDataBBox.getDimensions()))
141 rawBBox.shift(geom.ExtentI(x0, y0))
142 amplifier.setRawBBox(rawBBox)
145 rawDataBBox.shift(geom.ExtentI(x0, y0))
146 amplifier.setRawDataBBox(rawDataBBox)
149 rawSerialOverscanBBox.shift(geom.ExtentI(x0, y0))
150 amplifier.setRawHorizontalOverscanBBox(rawSerialOverscanBBox)
153 rawParallelOverscanBBox.shift(geom.ExtentI(x0, y0))
154 amplifier.setRawVerticalOverscanBBox(rawParallelOverscanBBox)
157 rawSerialPrescanBBox.shift(geom.ExtentI(x0, y0))
158 amplifier.setRawPrescanBBox(rawSerialPrescanBBox)
161 amplifier.setRawXYOffset(geom.Extent2I(ix*xRawExtent, iy*yRawExtent))
163 amplifier.setRawXYOffset(geom.Extent2I(0, 0))
165 amplifier.setReadoutCorner(readCorners[amp[
'readCorner']])
166 amplifier.setGain(amp[
'gain'])
167 amplifier.setReadNoise(amp[
'readNoise'])
168 amplifier.setSaturation(amp[
'saturation'])
171 flipX, flipY = amp.get(
"flipXY")
173 amplifier.setRawFlipX(flipX)
174 amplifier.setRawFlipY(flipY)
176 amplifier.setLinearityCoeffs([float(val)
for val
in amp[
'linearityCoeffs']])
177 amplifier.setLinearityType(amp[
'linearityType'])
178 amplifier.setLinearityThreshold(float(amp[
'linearityThreshold']))
179 amplifier.setLinearityMaximum(float(amp[
'linearityMax']))
180 amplifier.setLinearityUnits(
"DN")
181 amplifierList.append(amplifier)
186 """Backward compatible name. 192 """Given a list [(x0, y0), (xsize, ysize)], probably from a yaml file, 195 (x0, y0), (xsize, ysize) = ylist
196 return geom.BoxI(geom.PointI(x0, y0), geom.ExtentI(xsize, ysize))
200 """Make a dictionary of TransformPoint2ToPoint2s from yaml, mapping from nativeSys 204 nativeSys : `lsst.afw.cameraGeom.CameraSys` 205 transformDict : `dict` 206 A dict specifying parameters of transforms; keys are camera system names. 207 plateScale : `lsst.geom.Angle` 208 The size of a pixel in angular units/mm (e.g. 20 arcsec/mm for LSST) 213 A dict of `lsst.afw.cameraGeom.CameraSys` : `lsst.afw.geom.TransformPoint2ToPoint2` 215 The resulting dict's keys are `~lsst.afw.cameraGeom.CameraSys`, 216 and the values are Transforms *from* NativeSys *to* CameraSys 219 assert nativeSys == cameraGeom.FOCAL_PLANE,
"Cameras with nativeSys != FOCAL_PLANE are not supported." 223 for key, transform
in transformDict.items():
224 transformType = transform[
"transformType"]
225 knownTransformTypes = [
"affine",
"radial"]
226 if transformType
not in knownTransformTypes:
227 raise RuntimeError(
"Saw unknown transform type for %s: %s (known types are: [%s])" % (
228 key, transform[
"transformType"],
", ".join(knownTransformTypes)))
230 if transformType ==
"affine":
231 affine = geom.AffineTransform(np.array(transform[
"linear"]),
232 np.array(transform[
"translation"]))
234 transform = afwGeom.makeTransform(affine)
235 elif transformType ==
"radial":
240 radialCoeffs = np.array(transform[
"coeffs"])
242 radialCoeffs *= plateScale.asRadians()
243 transform = afwGeom.makeRadialTransform(radialCoeffs)
245 raise RuntimeError(
"Impossible condition \"%s\" is not in: [%s])" % (
246 transform[
"transformType"],
", ".join(knownTransformTypes)))
248 resMap[cameraGeom.CameraSys(key)] = transform
254 pupilFactoryClass=cameraGeom.pupil.PupilFactory):
255 """Construct a Camera instance from a dictionary of 256 detector name : `lsst.afw.cameraGeom.amplifier` 261 The name of the camera 262 detectorConfigList : `list` 263 A list of `lsst.afw.cameraGeom.cameraConfig.DetectorConfig` 264 nativeSys : `lsst.afw.cameraGeom.CameraSys` 265 The native transformation type; must be `lsst.afw.cameraGeom.FOCAL_PLANE` 266 transformDict : `dict` 267 A dict of lsst.afw.cameraGeom.CameraSys : `lsst.afw.geom.TransformPoint2ToPoint2` 268 amplifierDict : `dict` 269 A dictionary of detector name : 270 `lsst.afw.cameraGeom.Amplifier.Builder` 271 pupilFactoryClass : `type`, optional 272 Class to attach to camera; 273 `lsst.default afw.cameraGeom.PupilFactory` 277 camera : `lsst.afw.cameraGeom.Camera` 282 Copied from `lsst.afw.cameraGeom.cameraFactory` with permission and encouragement 291 assert nativeSys == cameraGeom.FOCAL_PLANE,
"Cameras with nativeSys != FOCAL_PLANE are not supported." 293 focalPlaneToField = transformDict[cameraGeom.FIELD_ANGLE]
295 cameraBuilder = Camera.Builder(cameraName)
296 cameraBuilder.setPupilFactoryClass(pupilFactoryClass)
299 for toSys, transform
in transformDict.items():
300 cameraBuilder.setTransformFromFocalPlaneTo(toSys, transform)
302 for detectorConfig
in detectorConfigList:
304 cameraGeom.addDetectorBuilderFromConfig(cameraBuilder, detectorConfig,
305 amplifierDict[detectorConfig.name],
312 detectorNativeSys = detectorConfig.transformDict.nativeSys
313 detectorNativeSys = (cameraGeom.PIXELS
if detectorNativeSys
is None else 314 cameraGeom.CameraSysPrefix(detectorNativeSys))
323 assert detectorNativeSys == cameraGeom.PIXELS, \
324 "Detectors with nativeSys != PIXELS are not supported." 325 detectorNativeSys = cameraGeom.CameraSys(detectorNativeSys, detectorConfig.name)
327 return cameraBuilder.finish()
def makeBBoxFromList(ylist)
def makeCamera(cameraFile)
def makeAmplifierList(ccd)
def makeDetectorConfigList(ccdParams)
def makeTransformDict(nativeSys, transformDict, plateScale)
def makeCameraFromCatalogs(cameraName, detectorConfigList, nativeSys, transformDict, amplifierDict, pupilFactoryClass=cameraGeom.pupil.PupilFactory)
def makeAmpInfoCatalog(ccd)