22 from __future__
import division, print_function
23 from builtins
import zip
27 import lsst.afw.cameraGeom
as cameraGeom
28 import lsst.afw.geom
as afwGeom
29 from lsst.afw.table
import AmpInfoCatalog, AmpInfoTable
30 from lsst.afw.cameraGeom.cameraFactory
import makeDetector
34 """The Commissioning Camera (comCam) 38 cameraYamlFile : `str` 39 Camera description YAML file. 43 with open(cameraYamlFile)
as fd:
44 cameraParams = yaml.load(fd, Loader=yaml.Loader)
46 plateScale = afwGeom.Angle(cameraParams[
"plateScale"], afwGeom.arcseconds)
51 radialCoeffs = np.array(cameraParams[
"radialCoeffs"])/plateScale.asRadians()
52 fieldAngleToFocalPlane = afwGeom.makeRadialTransform(radialCoeffs)
53 focalPlaneToFieldAngle = fieldAngleToFocalPlane.getInverse()
54 cameraTransformMap = cameraGeom.TransformMap(cameraGeom.FOCAL_PLANE,
55 {cameraGeom.FIELD_ANGLE: focalPlaneToFieldAngle})
56 detectorList = self.
_makeDetectorList(cameraParams[
"CCDs"], focalPlaneToFieldAngle)
57 cameraGeom.Camera.__init__(self, cameraParams[
"name"], detectorList, cameraTransformMap)
59 def _makeDetectorList(self, ccdParams, focalPlaneToFieldAngle):
60 """Make a list of detectors 65 Dict of YAML descriptions of CCDs. 66 focalPlaneToFieldAngle : `lsst.afw.geom.TransformPoint2ToPoint2` 67 Angle from FOCAL_PLANE to FIELD_ANGLE coordinates. 71 `list` of `lsst.afw.cameraGeom.Detector` 72 list of detectors in this camera. 76 for ccd, detectorConfig
in zip(ccdParams.values(), detectorConfigList):
78 detector = makeDetector(detectorConfig, ampInfoCatalog, focalPlaneToFieldAngle)
79 detectorList.append(detector)
82 def _makeDetectorConfigList(self, ccdParams):
83 """Make a list of detector configs 87 `list` of `lsst.afw.cameraGeom.DetectorConfig` 88 A list of detector configs. 91 for name, ccd
in ccdParams.items():
92 detectorConfig = cameraGeom.DetectorConfig()
93 detectorConfigs.append(detectorConfig)
95 detectorConfig.name = name
96 detectorConfig.id = ccd[
'id']
97 detectorConfig.serial = ccd[
'serial']
98 detectorConfig.detectorType = ccd[
'detectorType']
100 detectorConfig.bbox_x0, detectorConfig.bbox_y0 = ccd[
'bbox'][0]
101 detectorConfig.bbox_x1, detectorConfig.bbox_y1 = ccd[
'bbox'][1]
102 detectorConfig.pixelSize_x, detectorConfig.pixelSize_y = ccd[
'pixelSize']
103 detectorConfig.transformDict.nativeSys = ccd[
'transformDict'][
'nativeSys']
104 transforms = ccd[
'transformDict'][
'transforms']
105 detectorConfig.transformDict.transforms =
None if transforms ==
'None' else transforms
106 detectorConfig.refpos_x, detectorConfig.refpos_y = ccd[
'refpos']
107 detectorConfig.offset_x, detectorConfig.offset_y = ccd[
'offset']
108 detectorConfig.transposeDetector = ccd[
'transposeDetector']
109 detectorConfig.pitchDeg = ccd[
'pitch']
110 detectorConfig.yawDeg = ccd[
'yaw']
111 detectorConfig.rollDeg = ccd[
'roll']
112 if 'crosstalk' in ccd:
113 detectorConfig.crosstalk = ccd[
'crosstalk']
115 return detectorConfigs
118 def _makeBBoxFromList(ylist):
119 """Given a list [(x0, y0), (xsize, ysize)], probably from a yaml file, 122 (x0, y0), (xsize, ysize) = ylist
123 return afwGeom.BoxI(afwGeom.PointI(x0, y0), afwGeom.ExtentI(xsize, ysize))
125 def _makeAmpInfoCatalog(self, ccd):
126 """Construct an amplifier info catalog 129 assert len(ccd[
'amplifiers']) > 0
130 amp = list(ccd[
'amplifiers'].values())[0]
133 xRawExtent, yRawExtent = rawBBox.getDimensions()
135 from lsst.afw.table
import LL, LR, UL, UR
136 readCorners = dict(LL=LL, LR=LR, UL=UL, UR=UR)
138 schema = AmpInfoTable.makeMinimalSchema()
140 linThreshKey = schema.addField(
'linearityThreshold', type=float)
141 linMaxKey = schema.addField(
'linearityMaximum', type=float)
142 linUnitsKey = schema.addField(
'linearityUnits', type=str, size=9)
143 hduKey = schema.addField(
'hdu', type=np.int32)
146 ampCatalog = AmpInfoCatalog(schema)
147 for name, amp
in sorted(ccd[
'amplifiers'].items(), key=
lambda x: x[1][
'hdu']):
148 record = ampCatalog.addNew()
150 record.set(hduKey, amp[
'hdu'])
153 perAmpData = amp[
'perAmpData']
157 x0, y0 = ix*xRawExtent, iy*yRawExtent
160 xDataExtent, yDataExtent = rawDataBBox.getDimensions()
161 record.setBBox(afwGeom.BoxI(
162 afwGeom.PointI(ix*xDataExtent, iy*yDataExtent), rawDataBBox.getDimensions()))
165 rawBBox.shift(afwGeom.ExtentI(x0, y0))
166 record.setRawBBox(rawBBox)
169 rawDataBBox.shift(afwGeom.ExtentI(x0, y0))
170 record.setRawDataBBox(rawDataBBox)
173 rawSerialOverscanBBox.shift(afwGeom.ExtentI(x0, y0))
174 record.setRawHorizontalOverscanBBox(rawSerialOverscanBBox)
177 rawParallelOverscanBBox.shift(afwGeom.ExtentI(x0, y0))
178 record.setRawVerticalOverscanBBox(rawParallelOverscanBBox)
181 rawSerialPrescanBBox.shift(afwGeom.ExtentI(x0, y0))
182 record.setRawPrescanBBox(rawSerialPrescanBBox)
185 record.setRawXYOffset(afwGeom.Extent2I(ix*xRawExtent, iy*yRawExtent))
187 record.setRawXYOffset(afwGeom.Extent2I(0, 0))
189 record.setReadoutCorner(readCorners[amp[
'readCorner']])
190 record.setGain(amp[
'gain'])
191 record.setReadNoise(amp[
'readNoise'])
192 record.setSaturation(amp[
'saturation'])
193 record.setHasRawInfo(
True)
195 flipX, flipY = amp.get(
"flipXY")
197 record.setRawFlipX(flipX)
198 record.setRawFlipY(flipY)
200 record.setLinearityCoeffs([float(val)
for val
in amp[
'linearityCoeffs']])
201 record.setLinearityType(amp[
'linearityType'])
202 record.set(linThreshKey, float(amp[
'linearityThreshold']))
203 record.set(linMaxKey, float(amp[
'linearityMax']))
204 record.set(linUnitsKey,
"DN")
def _makeAmpInfoCatalog(self, ccd)
def _makeDetectorList(self, ccdParams, focalPlaneToFieldAngle)
def __init__(self, cameraYamlFile)
def _makeBBoxFromList(ylist)
def _makeDetectorConfigList(self, ccdParams)