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) 40 with open(cameraYamlFile)
as fd:
41 cameraParams = yaml.load(fd, Loader=yaml.Loader)
43 plateScale = afwGeom.Angle(cameraParams[
"plateScale"], afwGeom.arcseconds)
48 radialCoeffs = np.array(cameraParams[
"radialCoeffs"])/plateScale.asRadians()
49 fieldAngleToFocalPlane = afwGeom.makeRadialTransform(radialCoeffs)
50 focalPlaneToFieldAngle = fieldAngleToFocalPlane.getInverse()
51 cameraTransformMap = cameraGeom.TransformMap(cameraGeom.FOCAL_PLANE,
52 {cameraGeom.FIELD_ANGLE: focalPlaneToFieldAngle})
53 detectorList = self.
_makeDetectorList(cameraParams[
"CCDs"], focalPlaneToFieldAngle)
54 cameraGeom.Camera.__init__(self, cameraParams[
"name"], detectorList, cameraTransformMap)
56 def _makeDetectorList(self, ccdParams, focalPlaneToFieldAngle):
57 """!Make a list of detectors 58 @param[in] ccdParams Dict of YAML descriptions of CCDs 59 @param[in] focalPlaneToFieldAngle lsst.afw.geom.TransformPoint2ToPoint2 60 from FOCAL_PLANE to FIELD_ANGLE coordinates 61 @return a list of detectors (lsst.afw.cameraGeom.Detector) 65 for ccd, detectorConfig
in zip(ccdParams.values(), detectorConfigList):
67 detector = makeDetector(detectorConfig, ampInfoCatalog, focalPlaneToFieldAngle)
68 detectorList.append(detector)
71 def _makeDetectorConfigList(self, ccdParams):
72 """!Make a list of detector configs 74 @return a list of detector configs (lsst.afw.cameraGeom.DetectorConfig) 77 for name, ccd
in ccdParams.items():
78 detectorConfig = cameraGeom.DetectorConfig()
79 detectorConfigs.append(detectorConfig)
81 detectorConfig.name = name
82 detectorConfig.id = ccd[
'id']
83 detectorConfig.serial = ccd[
'serial']
84 detectorConfig.detectorType = ccd[
'detectorType']
86 detectorConfig.bbox_x0, detectorConfig.bbox_y0 = ccd[
'bbox'][0]
87 detectorConfig.bbox_x1, detectorConfig.bbox_y1 = ccd[
'bbox'][1]
88 detectorConfig.pixelSize_x, detectorConfig.pixelSize_y = ccd[
'pixelSize']
89 detectorConfig.transformDict.nativeSys = ccd[
'transformDict'][
'nativeSys']
90 transforms = ccd[
'transformDict'][
'transforms']
91 detectorConfig.transformDict.transforms =
None if transforms ==
'None' else transforms
92 detectorConfig.refpos_x, detectorConfig.refpos_y = ccd[
'refpos']
93 detectorConfig.offset_x, detectorConfig.offset_y = ccd[
'offset']
94 detectorConfig.transposeDetector = ccd[
'transposeDetector']
95 detectorConfig.pitchDeg = ccd[
'pitch']
96 detectorConfig.yawDeg = ccd[
'yaw']
97 detectorConfig.rollDeg = ccd[
'roll']
98 if 'crosstalk' in ccd:
99 detectorConfig.crosstalk = ccd[
'crosstalk']
101 return detectorConfigs
104 def _makeBBoxFromList(ylist):
105 """Given a list [(x0, y0), (xsize, ysize)], probably from a yaml file, return a BoxI 107 (x0, y0), (xsize, ysize) = ylist
108 return afwGeom.BoxI(afwGeom.PointI(x0, y0), afwGeom.ExtentI(xsize, ysize))
110 def _makeAmpInfoCatalog(self, ccd):
111 """Construct an amplifier info catalog 114 assert len(ccd[
'amplifiers']) > 0
115 amp = list(ccd[
'amplifiers'].values())[0]
118 xRawExtent, yRawExtent = rawBBox.getDimensions()
120 from lsst.afw.table
import LL, LR, UL, UR
121 readCorners = dict(LL=LL, LR=LR, UL=UL, UR=UR)
123 schema = AmpInfoTable.makeMinimalSchema()
125 linThreshKey = schema.addField(
'linearityThreshold', type=float)
126 linMaxKey = schema.addField(
'linearityMaximum', type=float)
127 linUnitsKey = schema.addField(
'linearityUnits', type=str, size=9)
128 hduKey = schema.addField(
'hdu', type=np.int32)
131 ampCatalog = AmpInfoCatalog(schema)
132 for name, amp
in sorted(ccd[
'amplifiers'].items(), key=
lambda x: x[1][
'hdu']):
133 record = ampCatalog.addNew()
135 record.set(hduKey, amp[
'hdu'])
138 perAmpData = amp[
'perAmpData']
142 x0, y0 = ix*xRawExtent, iy*yRawExtent
145 xDataExtent, yDataExtent = rawDataBBox.getDimensions()
146 record.setBBox(afwGeom.BoxI(
147 afwGeom.PointI(ix*xDataExtent, iy*yDataExtent), rawDataBBox.getDimensions()))
150 rawBBox.shift(afwGeom.ExtentI(x0, y0))
151 record.setRawBBox(rawBBox)
154 rawDataBBox.shift(afwGeom.ExtentI(x0, y0))
155 record.setRawDataBBox(rawDataBBox)
158 rawSerialOverscanBBox.shift(afwGeom.ExtentI(x0, y0))
159 record.setRawHorizontalOverscanBBox(rawSerialOverscanBBox)
162 rawParallelOverscanBBox.shift(afwGeom.ExtentI(x0, y0))
163 record.setRawVerticalOverscanBBox(rawParallelOverscanBBox)
166 rawSerialPrescanBBox.shift(afwGeom.ExtentI(x0, y0))
167 record.setRawPrescanBBox(rawSerialPrescanBBox)
170 record.setRawXYOffset(afwGeom.Extent2I(ix*xRawExtent, iy*yRawExtent))
172 record.setRawXYOffset(afwGeom.Extent2I(0, 0))
174 record.setReadoutCorner(readCorners[amp[
'readCorner']])
175 record.setGain(amp[
'gain'])
176 record.setReadNoise(amp[
'readNoise'])
177 record.setSaturation(amp[
'saturation'])
178 record.setHasRawInfo(
True)
180 flipX, flipY = amp.get(
"flipXY")
182 record.setRawFlipX(flipX)
183 record.setRawFlipY(flipY)
185 record.setLinearityCoeffs([float(val)
for val
in amp[
'linearityCoeffs']])
186 record.setLinearityType(amp[
'linearityType'])
187 record.set(linThreshKey, float(amp[
'linearityThreshold']))
188 record.set(linMaxKey, float(amp[
'linearityMax']))
189 record.set(linUnitsKey,
"DN")
def _makeAmpInfoCatalog(self, ccd)
def _makeDetectorList(self, ccdParams, focalPlaneToFieldAngle)
Make a list of detectors.
def __init__(self, cameraYamlFile)
def _makeBBoxFromList(ylist)
def _makeDetectorConfigList(self, ccdParams)
Make a list of detector configs.