22 __all__ = [
'assembleAmplifierImage',
'assembleAmplifierRawImage',
23 'makeUpdatedDetector']
29 False: slice(
None,
None, 1),
30 True: slice(
None,
None, -1),
34 def _insertPixelChunk(outView, inView, amplifier, hasArrays):
39 xSlice = _SliceDict[amplifier.getRawFlipX()]
40 ySlice = _SliceDict[amplifier.getRawFlipY()]
43 inArrList = inView.getArrays()
44 outArrList = outView.getArrays()
46 inArrList = [inView.getArray()]
47 outArrList = [outView.getArray()]
49 for inArr, outArr
in zip(inArrList, outArrList):
51 outArr[:] = inArr[ySlice, xSlice]
55 """Assemble the amplifier region of an image from a raw image.
59 destImage : `lsst.afw.image.Image` or `lsst.afw.image.MaskedImage`
60 Assembled image; the region amplifier.getBBox() is overwritten with
61 the assembled amplifier image.
62 rawImage : `lsst.afw.image.Image` or `lsst.afw.image.MaskedImage`
63 Raw image (same type as destImage).
64 amplifier : `lsst.afw.cameraGeom.Amplifier`
65 Amplifier geometry, with raw amplifier info.
70 Raised if image types do not match or amplifier has no raw amplifier info.
72 if not amplifier.getHasRawInfo():
73 raise RuntimeError(
"amplifier must contain raw amplifier info")
74 if type(destImage.Factory) !=
type(rawImage.Factory):
75 raise RuntimeError(f
"destImage type = {type(destImage.Factory).__name__} != "
76 f
"{type(rawImage.Factory).__name__} = rawImage type")
77 inView = rawImage.Factory(rawImage, amplifier.getRawDataBBox())
78 outView = destImage.Factory(destImage, amplifier.getBBox())
80 _insertPixelChunk(outView, inView, amplifier,
81 hasattr(rawImage,
"getArrays"))
85 """Assemble the amplifier region of a raw CCD image.
87 For most cameras this is a no-op: the raw image already is an assembled
89 However, it is useful for camera such as LSST for which each amplifier
90 image is a separate image.
94 destImage : `lsst.afw.image.Image` or `lsst.afw.image.MaskedImage`
95 CCD Image; the region amplifier.getRawAmplifier().getBBox()
96 is overwritten with the raw amplifier image.
97 rawImage : `lsst.afw.image.Image` or `lsst.afw.image.MaskedImage`
98 Raw image (same type as destImage).
99 amplifier : `lsst.afw.cameraGeom.Amplifier`
100 Amplifier geometry with raw amplifier info
105 Raised if image types do not match or amplifier has no raw amplifier info.
107 if not amplifier.getHasRawInfo():
108 raise RuntimeError(
"amplifier must contain raw amplifier info")
109 if type(destImage.Factory) !=
type(rawImage.Factory):
110 raise RuntimeError(f
"destImage type = {type(destImage.Factory).__name__} != "
111 f
"{type(rawImage.Factory).__name__} = rawImage type")
112 inBBox = amplifier.getRawBBox()
113 inView = rawImage.Factory(rawImage, inBBox)
114 outBBox = amplifier.getRawBBox()
115 outBBox.shift(amplifier.getRawXYOffset())
116 outView = destImage.Factory(destImage, outBBox)
118 _insertPixelChunk(outView, inView, amplifier,
119 hasattr(rawImage,
"getArrays"))
123 """Return a Detector that has had the definitions of amplifier geometry
124 updated post assembly.
128 ccd : `lsst.afw.image.Detector`
129 The detector to copy and update.
131 builder = ccd.rebuild()
132 for amp
in builder.getAmplifiers():
133 assert amp.getHasRawInfo()
135 bbox = amp.getRawBBox()
136 awidth, aheight = bbox.getDimensions()
140 boxMin0 = bbox.getMin()
141 if amp.getRawFlipX():
143 if amp.getRawFlipY():
145 shift = boxMin0 - bbox.getMin()
148 "HorizontalOverscan",
152 bbox = getattr(amp, f
"getRaw{bboxName}BBox")()
153 if amp.getRawFlipX():
155 if amp.getRawFlipY():
157 bbox.shift(amp.getRawXYOffset() + shift)
159 getattr(amp, f
"setRaw{bboxName}BBox")(bbox)
164 amp.setRawFlipX(
False)
165 amp.setRawFlipY(
False)
167 return builder.finish()