22 from builtins
import range
26 import lsst.afw.cameraGeom
as cameraGeom
27 import lsst.afw.geom
as afwGeom
28 from lsst.afw.table
import AmpInfoCatalog, AmpInfoTable
29 from lsst.afw.cameraGeom.cameraFactory
import makeDetector
32 """The Commissioning Camera (comCam)
38 with file(cameraYamlFile)
as fd:
39 cameraParams = yaml.load(fd, Loader=yaml.Loader)
41 plateScale = afwGeom.Angle(cameraParams[
"plateScale"], afwGeom.arcseconds)
42 radialCoeffs = np.array(cameraParams[
"radialCoeffs"])/plateScale.asRadians()
43 focalPlaneToPupil = afwGeom.RadialXYTransform(radialCoeffs)
44 pupilToFocalPlane = afwGeom.InvertedXYTransform(focalPlaneToPupil)
45 cameraTransformMap = cameraGeom.CameraTransformMap(cameraGeom.FOCAL_PLANE,
46 {cameraGeom.PUPIL: pupilToFocalPlane})
47 detectorList = self.
_makeDetectorList(cameraParams[
"CCDs"], pupilToFocalPlane, plateScale)
48 cameraGeom.Camera.__init__(self, cameraParams[
"name"], detectorList, cameraTransformMap)
50 def _makeDetectorList(self, ccdParams, focalPlaneToPupil, plateScale):
51 """!Make a list of detectors
52 @param[in] ccdParams Dict of YAML descriptions of CCDs
53 @param[in] focalPlaneToPupil lsst.afw.geom.XYTransform from FOCAL_PLANE to PUPIL coordinates
54 @param[in] plateScale plate scale, in angle on sky/mm
55 @return a list of detectors (lsst.afw.cameraGeom.Detector)
59 for ccd, detectorConfig
in zip(ccdParams.values(), detectorConfigList):
61 detector = makeDetector(detectorConfig, ampInfoCatalog, focalPlaneToPupil)
62 detectorList.append(detector)
65 def _makeDetectorConfigList(self, ccdParams):
66 """!Make a list of detector configs
68 @return a list of detector configs (lsst.afw.cameraGeom.DetectorConfig)
71 for name, ccd
in ccdParams.items():
72 detectorConfig = cameraGeom.DetectorConfig()
73 detectorConfigs.append(detectorConfig)
75 detectorConfig.name = name
76 detectorConfig.id = ccd[
'id']
77 detectorConfig.serial = ccd[
'serial']
78 detectorConfig.detectorType = ccd[
'detectorType']
80 detectorConfig.bbox_x0, detectorConfig.bbox_y0 = ccd[
'bbox'][0]
81 detectorConfig.bbox_x1, detectorConfig.bbox_y1 = ccd[
'bbox'][1]
82 detectorConfig.pixelSize_x, detectorConfig.pixelSize_y = ccd[
'pixelSize']
83 detectorConfig.transformDict.nativeSys = ccd[
'transformDict'][
'nativeSys']
84 transforms = ccd[
'transformDict'][
'transforms']
85 detectorConfig.transformDict.transforms =
None if transforms ==
'None' else transforms
86 detectorConfig.refpos_x, detectorConfig.refpos_y = ccd[
'refpos']
87 detectorConfig.offset_x, detectorConfig.offset_y = ccd[
'offset']
88 detectorConfig.transposeDetector = ccd[
'transposeDetector']
89 detectorConfig.pitchDeg = ccd[
'pitch']
90 detectorConfig.yawDeg = ccd[
'yaw']
91 detectorConfig.rollDeg = ccd[
'roll']
93 return detectorConfigs
96 def _makeBBoxFromList(ylist):
97 """Given a list [(x0, y0), (xsize, ysize)], probably from a yaml file, return a BoxI
99 (x0, y0), (xsize, ysize) = ylist
100 return afwGeom.BoxI(afwGeom.PointI(x0, y0), afwGeom.ExtentI(xsize, ysize))
102 def _makeAmpInfoCatalog(self, ccd):
103 """Construct an amplifier info catalog
106 assert len(ccd[
'amplifiers']) > 0
107 amp = ccd[
'amplifiers'].values()[0]
110 xRawExtent, yRawExtent = rawBBox.getDimensions()
112 from lsst.afw.table
import LL, LR, UL, UR
113 readCorners = dict(LL = LL, LR = LR, UL = UL, UR = UR)
115 schema = AmpInfoTable.makeMinimalSchema()
117 linThreshKey = schema.addField(
'linearityThreshold', type=float)
118 linMaxKey = schema.addField(
'linearityMaximum', type=float)
119 linUnitsKey = schema.addField(
'linearityUnits', type=str, size=9)
120 hduKey = schema.addField(
'hdu', type=np.int32)
123 ampCatalog = AmpInfoCatalog(schema)
124 for name, amp
in sorted(ccd[
'amplifiers'].items(), key=
lambda x : x[1][
'hdu']):
125 record = ampCatalog.addNew()
127 record.set(hduKey, amp[
'hdu'])
130 perAmpData = amp[
'perAmpData']
134 x0, y0 = ix*xRawExtent, iy*yRawExtent
137 xDataExtent, yDataExtent = rawDataBBox.getDimensions()
138 record.setBBox(afwGeom.BoxI(
139 afwGeom.PointI(ix*xDataExtent, iy*yDataExtent), rawDataBBox.getDimensions()))
142 rawBBox.shift(afwGeom.ExtentI(x0, y0))
143 record.setRawBBox(rawBBox)
146 rawDataBBox.shift(afwGeom.ExtentI(x0, y0))
147 record.setRawDataBBox(rawDataBBox)
150 rawSerialOverscanBBox.shift(afwGeom.ExtentI(x0, y0))
151 record.setRawHorizontalOverscanBBox(rawSerialOverscanBBox)
154 rawParallelOverscanBBox.shift(afwGeom.ExtentI(x0, y0))
155 record.setRawVerticalOverscanBBox(rawParallelOverscanBBox)
158 rawSerialPrescanBBox.shift(afwGeom.ExtentI(x0, y0))
159 record.setRawPrescanBBox(rawSerialPrescanBBox)
162 record.setRawXYOffset(afwGeom.Extent2I(ix*xRawExtent, iy*yRawExtent))
164 record.setRawXYOffset(afwGeom.Extent2I(0, 0))
166 record.setReadoutCorner(readCorners[amp[
'readCorner']])
167 record.setGain(amp[
'gain'])
168 record.setReadNoise(amp[
'readNoise'])
169 record.setSaturation(amp[
'saturation'])
170 record.setHasRawInfo(
True)
172 flipX, flipY = amp.get(
"flipXY")
174 record.setRawFlipX(flipX)
175 record.setRawFlipY(flipY)
177 record.setLinearityCoeffs([float(val)
for val
in amp[
'linearityCoeffs']])
178 record.setLinearityType(amp[
'linearityType'])
179 record.set(linThreshKey, float(amp[
'linearityThreshold']))
180 record.set(linMaxKey, float(amp[
'linearityMax']))
181 record.set(linUnitsKey,
"DN")
def _makeDetectorList
Make a list of detectors.
def _makeDetectorConfigList
Make a list of detector configs.